I wanted to add to the very detailed and helpful answer above to clarify some things as hopefully it might help someone. Most pilot ground studies courses approach this from the viewpoint of how to go from IAS to CAS to EAS to TAS but skip a lot of detail, which I think is what is frustrating the OP. So here's a deep dive. Also, the previous answer ends with "Solving it for EAS = f(CAS) is left to the reader". Since that's sort of what the OP was asking I thought it might be worth a crack at it, although from a different angle.
IAS (Indicated Air Speed)
This is the speed that the air speed indicator in the cockpit displays. The best way to think of the ASI it that it's a pressure gauge that measures differential pressure (pitot minus static) only it's calibrated in knots (or whatever.) As you say in your question, IAS is a function of (p_total - p_static). Is to what that function is, we'll come to that in a moment.
CAS (Calibrated Air Speed)
What the instrument should have read if the instrument and the pitot/static system were perfect. In other words, the IAS after correcting for position errors (e.g. effect of flap setting on pitot/static system) and instrument errors. CAS can be derived from IAS by using look-up tables but these are aicraft-specific. In modern systems, this is done automatically by the Air Data Computer, so the ASI will directly read CAS. In other words, CAS = f(IAS, hardware errors, Mach, AoA, flap setting, ...) To find out this function, you have to do computational fluid dynamics, wind tunnel testing, flight testing or all three. So it's non-trivial. I can't just give you an equation for it. The good news is, in straight and level flight, the errors aren't usually very big.
EAS (Equivalent Air Speed)
This is where things get weird and annoying. Many aviation courses and textbooks treat EAS as a "stepping stone" to TAS but it's almost never used that way in reality and these sources never tell you how to calculate EAS from CAS. It's usually easier to go straight to TAS from CAS, e.g. using a CRP-5 flight computer (a kind of circular slide rule) or by let the aircraft work it out for you via the Air Data Computer. As a pilot, you very rarely need to actually calculate EAS. CAS, TAS and Mach number are usually far more useful.
EAS is supposed to be a version of CAS corrected for "compressibility errors". This might lead you to think EAS is necessary because the ASI uses some simple non-compressible flow assumptions, which need to be corrected at higher Mach numbers. However, at sea level, EAS is the same as CAS, regardless of airspeed, by definition Wikipedia's definition. I.e. you can be in a very compressible flow regime, like Mach 0.8, and EAS is still the same as CAS. This initially makes no sense until you realise that the definition of EAS has to make an assumption about how an air speed indicator actually works.
One might think the airspeed indicator is calibrated by simply reversing the well-known formula (from Bernoulli) for static pressure, namely:
$q = \frac{1}{2}\rho v^2 $,
like this:
$v_{IAS} = \sqrt{\frac{2q}{\rho}} $,
where $\rho$ is the air density and $q$ is the dynamic (pitot minus static) pressure.
This is not so. Here's where we get to "things they don't tell you in ATPL ground exam courses." It seems that the standard definitions of EAS makes the assumption that the airspeed indicator actually works by using isentropic flow relations. This would require it to know things like the static pressure (it only senses differential) and the local speed of sound (which requires knowledge of outside air temperature.) However, it is still possible to use this approach if you "cheat" and put in sea level values for all the things the instrument doesn't know. In other words, the ASI calculates IAS according to:
$v_{IAS} = a_0 * \sqrt{5\left[\left(\frac{q}{p_0}+1\right)^{\frac{2}{7}} - 1\right]} $
Where $a_0$ is the ISA (international standard atmosphere) sea level speed of sound (340 m/s), $q$ the dynamic pressure as before (aka impact pressure) and $p_0$ is the ISA sea level pressure (101325 Pa).
Note that the magic numbers 5 and 2/7 arise because of the value of $\gamma$ (gamma), the ratio of specific heats for air, which equals 1.4. The more general form is:
$v_{IAS} = a_0 * \sqrt{\frac{2}{\gamma-1}\left[\left(\frac{q}{p_0}+1\right)^{\frac{\gamma-1}{\gamma}} - 1\right]} $
This relation is a well known thing but I don't know how to derive it. Yet. (In any case, this answer is already long enough.)
It turns out that if you take a binomial approximation of the 2/7 power and neglect second order terms and higher, you get this:
$q \approx \frac{1}{2} 1.227 v^2$
The value 1.227 being very close to the ISA sea level density of 1.225, so it is equivalent to Bernoulli for low Mach numbers. Anyway, I digress.
Calculating EAS
From here on, we'll asssume IAS=CAS. Now let us assume you want to find the EAS given only the IAS/CAS and the altitude. Normally, as a pilot, perhaps tackling an ATPL exam question, you'd use a CRP-5, but let's assume we are proper nerds and we want to code this (e.g. in python) or get a better undersanding of how an ADC (Air Data Computer) or ADIRU (Air Data Inertial Reference Unit) works.
The EAS is a function of the CAS, the dynamic pressure and the static pressure.
Finding static pressure from altitude
The static pressure can be inferred from the altitude using the International Standard Atmosphere. For the troposphere (i.e. up to 11km or 36,080ft) the pressure is calculated by solving the hydrostatic equation for a constant lapse rate. Dealing with the tropopause and above is left as an exercise for the reader :-P
$p_s = p_0 \left( \frac{T_s}{T_0}\right)^{\frac{g}{L R}} $,
where $p_s$ is the static pressure at altitude, $p_0$ is the ISA sea level pressure (101325 Pa), $T_0$ is the ISA sea level temperature (288.15K, $g$ is the acceleration due to gravity (9.81m/s2), $L$ is the lapse rate (0.0065K/m), $R$ is the specific gas constant for air (287 J/K/Kg) and $T_s$ is the static temperature at altitude:
$T_s = T_0 - L h$,
were $h$ is the altitude in metres.
Finding the dynamic pressure from CAS
Note that the ASI does not tell you (the pilot) the dynamic pressure directly, it only tells you it in terms of the IAS/CAS. So we have to "reverse" the formula above:
$q = \left[\frac{\left(\frac{v_{CAS}}{a_0}\right)^2}{5} + 1\right]^\frac{7}{2} - 1$
Finding the Mach number
Next we need to find the Mach number. Note that this is a very similar equation to how the ASI calculates airspeed, but this time we use the real static pressure, not the sea-level value:
$M = \sqrt{5\left[\left(\frac{q}{p_s}+1\right)^{\frac{2}{7}} - 1\right]} $
The EAS is then defined as:
$v_{EAS} = a_0 M \sqrt{\frac{p_s}{p_0}} $
In other words, EAS uses the real Mach number but the sea level speed of sound to obtain a speed, and then multiplies this by the root of the pressure ratio. Putting this all together:
$v_{EAS} = a_0 \sqrt{5\left[\left(\frac{q}{p_s}+1\right)^{\frac{2}{7}} - 1\right]} \sqrt{\frac{p_s}{p_0}} $
Epic.
TAS
TAS can be obtained from EAS, which in effect gives another formal definition of EAS:
$v_{TAS} = v_{EAS} \sqrt{\frac{\rho_0}{\rho}} $,
where $\rho$ (rho) is the actual air density at altitude (which can be calculated from temperature and pressure using the ideal gas law ($\rho = \frac{p_s}{R T_s}$) and $\rho_0$ is the ISA sea level density (1.225 kg/m3.) In other words, TAS is just the EAS divided by the root of the density ratio.
However, it's actually easier just to calculate TAS directly, which saves knowing about densities:
$v_{TAS} = a M $
where $M$ is the Mach number as calcuated above and $a$ is the local speed of sound (not the sea level value like the in the EAS formula,) which can be calculated from $a = \sqrt{\gamma R T_s}$.
#!/usr/bin/env python3
#
# Calculate EAS and TAS, given CAS and a pressure altitude
# Warning: only works in troposphere, i.e. below 11km
#
# By Halzephron 2020
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
from math import pi, sqrt
import sys
ms_per_kt = 0.51444
feet_per_metre = 3.28
T_0C = 273.15 # 0 degrees C in Kelvin
# Some useful constants
g=9.81 # Acceleration due to gravity
R=287 # Specific gas constant for air
L=0.0065 # Lapse rate in K/m
T0 = 288.15 # ISA sea level temp in K
p0 = 101325 # ISA sea level pressure in Pa
k = 1.4 # k is a shorthand for Gamma, the ratio of specific heats for air
lss0 = sqrt(k*R*T0) # ISA sea level speed sound
rho0 = 1.225 # ISA sea level density in Kg/m3
# Return knots given m/s
def kt(m):
return m/ms_per_kt
# Return pressure ratio given a Mach number and static pressure,
# assuming compressible flow
def compressible_pitot(M):
return (M*M*(k-1)/2 + 1) ** (k/(k-1)) - 1
# Return Mach number, given a pressure ratio d=p_d/p_s
def pitot_to_Mach(d):
return sqrt(((d+1)**((k-1)/k) - 1)*2/(k-1))
# Given an altitude h, return the temperature, assuming we're
# using the International Standard Atmosphere and are flying
# in the troposphere.
def temperature(h):
return T0 - h*L
# Given an altitude h, return the local spead of sound, assuming
# we're using the International Standard Atmosphere and are flying
# in the troposphere.
def lss(h):
return sqrt(k*R*temperature(h))
# Given an altitude h, return the pressure, assuming we're
# using the International Standard Atmosphere and are flying
# in the troposphere.
def pressure(h):
return p0 * (temperature(h) / T0) ** (g / L / R)
# Given an altitude h, return the density, assuming we're
# using the International Standard Atmosphere and are flying
# in the troposphere.
def density(h):
return pressure(h) / (R * temperature(h))
if len(sys.argv) < 2:
print("usage: {} CAS ALT".format(sys.argv[0]))
exit(0)
cas = float(sys.argv[1])*ms_per_kt # Convert kts to m/s
alt = float(sys.argv[2])/feet_per_metre # Convert ft to m
ps = pressure(alt)
lss = lss(alt)
oat = temperature(alt)
rho = density(alt)
# First we need to "reverse" the air speed indicator to find the dynamic
# or "impact" pressure. It is tempting to assume that an airspeed
# indicator relates airspeed to dynamic pressure using Bernoulli's
# 0.5 * rho * v**2, but it that is not the case here. Instead,
# a sort of modified compressible flow equation is used. A "pseudo"
# mach number is found as a function of a pressure ratio, assuming the
# static pressure is equal to ISA conditions. The airspeed is then found
# by assuming the local speed of sound is that of ISA sea level.
pd = compressible_pitot(cas/lss0) * p0
# Find Mach number
M = pitot_to_Mach(pd / ps)
# Calculate EAS (equivalent air speed)
eas = lss0 * M * sqrt(ps/p0)
# Calculate TAS (true air speed)
tas = lss * M
# Or we could have used tas = eas / sqrt(rho/rho0)
print(f"Pressure Altitude: {alt*feet_per_metre:5.0f} ft")
print(f"Static Temperature: {oat-T_0C:5.1f} C")
print(f"Density Ratio: {rho/rho0:6.3f}")
print(f"Pressure Ratio: {ps/p0:6.3f}")
print(f"Static Pressure: {ps/1e2:6.1f} mb")
print(f"Dynamic Pressure: {pd/1e2:6.1f} mb")
print(f"Total Pressure: {(pd+ps)/1e2:6.1f} mb")
print(f"CAS: {kt(cas):6.1f} kt")
print(f"EAS: {kt(eas):6.1f} kt")
print(f"TAS: {kt(tas):6.1f} kt")
print(f"LSS: {kt(lss):6.1f} kt")
print(f"Mach: {M:4.2f}")