Steady Level Flight#

The discipline of Aircraft Flight Mechanics requires the formulation of relationships between aircraft forces, and aircraft motion. In order to define motion, it was necessary to define the different airspeeds in the preceding section.

Aircraft have six degrees of freedom - three translational (\(x, y, z\)), and three rotational (\(\phi, \theta, \psi\)), and in order to develop the expressions describing aircraft flight, nine coupled equations are required. This course will get to that point, and those equations will derived and utilised - but before that, some really handy relationships can be defined for flight constrained to a single direction.

The simplest flight regime is best to start with, which is steady, level (meaning no change in altitude) flight.

Let’s explore what this regime means, and the assumptions we make

  • We assume that the aircraft is a point mass, whereby we assume that the aircraft dimensions are negligible when compared to the dimensions of motion.

  • Steady flight means no acceleration, so we can infer from Newton’s first law that the sum of forces acting on the aircraft is zero \(\sum\vec{F}=0\) . This is the equilibrium steady flight condition.

The definition of forces on the aircraft can change depending on the purpose - and it is only be convention that we define lift and drag in the directions we do.

The semantics notwithstanding, it is traditional to define four mutually-orthogonal forces - see Equilibrium Forces.

  • Two aerodynamic; lift and drag.

  • One propulsive; thrust.

  • One inertial; weight.


Fig. 18 Equilibrium Forces#

For this regime, it is further assumed that the aerodynamic incidence is small, and that the thrust offset is negligible. Therefore we assume that lift and weight are perpendicular to aircraft motion, and that thrust and drag are parallel to aircraft motion.

Vertical Forces#

Looking at the vertical forces, \(\sum F_z =0\), therefore \(L=W\):

\[C_L = \frac{L}{\tfrac{1}{2}\rho V^2S}\]
\[ = \frac{W}{\tfrac{1}{2}\rho V^2S}\]

rearranging to find flight speed:

(5)#\[V = \sqrt{\frac{\frac{W}{S}}{\tfrac{1}{2}\rho C_L}}\]

Equation (5) is the Aircraft Speed Equation for steady level flight, and some basic aerodynamic behaviour may be inferred from it:

  • Slower flight is possible by reducing wing loading - reducing aircraft mass, or increasing wing area. Or by increasing \(C_L\) - increasing \(\alpha\)

  • The minimum possible flight speed occurs at \(C_{L_{max}}\) - just before stall

  • Flight speed may be increased by reducing \(\rho\) - by flying at increased altitude

Stall speed#

From (5), the stall speed may be determined if \(C_{L_{max}}\) is known.

Longitudinal Forces#

Looking at the longitudinal forces, \(\sum F_x =0\), therefore \(T=D\):

\[\begin{split}\begin{aligned} C_D &= \frac{D}{\tfrac{1}{2}\rho V^2S}\nonumber\\ &= \frac{T}{\tfrac{1}{2}\rho V^2S}\nonumber\end{aligned}\end{split}\]

Drag estimation is complex, and can be performed via a variety of means from datasheets, CFD, wind tunnel testing or - more commonly - a combination of all. A good breakdown of drag sources is given by MacCormick:cite:`MacCormick:1995wq`, and a reproduction of the breakdown given is found in the dropdown below - but this is far beyond the complexity required for Aircraft Performance.

In flight performance, we assume that the aircraft is operating in the region of linear aerodynamics, and utilise a drag model as given by Equation (6):

(6)#\[\begin{split} \underbrace{C_D}_{\text{Total Drag}} = \underbrace{C_{D0}}_{\substack{\text{Zero incidence} \\ \text{drag}}} + \underbrace{K\cdot C_L^2}_{\substack{\text{Induced Drag +} \\ \text{$\alpha$-dependent form drag}}}\end{split}\]


\[ K=\frac{k}{\pi AR} = \frac{1}{\pi\,e_0\,AR}\]

The first term represents the drag that is independent of aerodynamic incidence, whilst the second term is proportional to \(C_L^2\), which represents the induced drag and the component of form drag that varies with incidence.

The parameter \(k\sim 1.1-1.4\) for most aircraft, and \(AR\) is the wing aspect ratio \(AR = \frac{b^2}{S}\). \(K\), \(C_{D0}\) usually assumed constant, but can depend on:

  • configuration changes (flap deployment)

  • Reynolds Number (speed and height)

  • Compressibility (shock waves)

Or sometimes can be presented as the Oswold efficiency factor, \(e_0\), which can be related to \(K\) through the aspect ratio.

Equation (6) assumes that the minimum drag occurs at zero lift. This is the case for a symmetric aerofoil, but not for a cambered one. Since most airfcraft have a cambered wing, Equation (6) should be modified to

\[C_D = C_{D, min} + K\left(C_L - C_{L0}\right)^2\]

The second equation is more realistic for real aircraft - but adds complexity to the algebra, and the difference between \(C_{D0}\) and \(C_{D,min}\) is very small even for wings of moderate camber:cite:`Anderson:1999AP`. For simplicity, Equation (6) will be used in development of the Aircraft Performance Equations.

Equation (5) and Equation (6) underpin the basics of aircraft performance.

Drag Polar#

The relationship between lift and drag is given through the aircraft drag polar - often plotted as \(C_L\) vs \(C_D\). Values for \(C_L\) and \(C_D\) are commonplace in the literature - a quick search yielded data for the Cessna 172S :cite:`Haberkorn:2016bj`.

You will see that the drag model works well for low values of lift - that is, in the linear aerodynamic region. The behaviour at the ‘bottom’ of the curve is sometimes called the ‘drag bucket’ - and I spent many years collecting these data in a wind tunnel.

The drag polar shows the aerodynamic efficiency of a given aircraft - that is, it represents the lift-to-drag ratio. You can find the best (highest) lift to drag ratio as the tangent of a line drawn from the origin to the curve.

It would be great to be able to find the best lift to drag ratio without having to draw the drag polar. If you looka the source code for the image below, then it’s obvious that I haven’t drawn the tangent to find the best lift to drag ratio - rather I have drawn the tangent after having found the best lift to drag ratio.

Expand the code to see the source data and coefficients used in the drag model.

# Aircraft Drag polar
import numpy as np
import matplotlib.pyplot as plt

# Data for this graph has been taken from here: 

# Discrete points:
Cd = np.array([0.033099, 0.035185, 0.035214, 0.041961, 0.051143,\
0.064192, 0.080106, 0.096683, 0.104613, 0.11364, 0.121425, 0.130259, 0.138232])
Cl = np.array([0.1454, -0.09219, 0.38303, 0.6238, 0.86305, 1.09772,\
1.31082, 1.45757, 1.51784, 1.55342, 1.58437, 1.60452, 1.58455])

a = np.asarray([Cl, Cd])
np.savetxt("CessnaDragPolar.csv", a.transpose(), delimiter=",", header="Cl, Cd")

plt.plot(Cd, Cl, 'x', label='Data')

# Put the drag model on top
Clvector = np.linspace(min(Cl) - .2, max(Cl) + .2, int(1e3))
Cd0 = 0.033
Cl0 = 0.14
K = 0.035
Cdvector = Cd0 + K*(Clvector - Cl0)**2
plt.plot(Cdvector, Clvector, '-r', label="Drag Model")

plt.title('Drag Polar: Data vs. Drag Model');

# Determine minimum drag
Clmind = np.sqrt(Cd0/K + Cl0**2)
Cdmind =  Cd0 + K*(Clmind - Cl0)**2

# plot it
plt.plot(Cdmind, Clmind, 'ob', label="$\\frac{L}{D}_{max}$")

# show that this is the tangent
plt.plot([0, Cdmind*2], [0, Clmind*2], '-b', label="Tangent")
plt.gca().set_xlim(0, .14);
plt.gca().set_ylim(-.5, 2);
plt.axhline(0, color='black');

# Legend

Best lift to drag ratio#

The highest lift to drag ratio gives the position of best aerodynamic efficiency, and sets the best glide ratio for an aircraft.

In the following, the values of \(C_L\) and \(C_D\) for optimum aerodynamic efficiency - but before diving into the mathematics, some consideration of their significance might be necessary for some readers.

The best lift to drag ratio can be determined from Equation (6). Consider that the lift to drag ratio is equal in dimensional and coefficient form:


Into which Equation (6) may be inserted

\[\frac{L}{D}=\frac{C_L}{C_{D0} + K\cdot C_L^2}\]

The best lift to drag ratio can then be found from minimising \(\frac{D}{L}\), so differentiate by \(C_L\):

\[\left.\frac{D}{L}\right|_{min}=\left.\frac{C_{D0} + K\cdot C_L^2}{C_L}\right|_{min}\]

A bit of elementary calculus gives the minima of the right hand side as given by

\[C_{L, md}=\sqrt{\frac{C_{D0}}{K}}\]

Thrust required#

The drag equation can be multiplied by the numerator of the lift and drag coefficients, \(\frac{1}{2}\rho\,V^2S\), to yield dimensional drag - this can be considered as the thrust required in order to fly at a certain speed:

\[ C_D\cdot \frac{1}{2}\rho\,V^2S = C_{D0}\cdot\frac{1}{2}\rho\,V^2S + K\cdot C_L^2\cdot\frac{1}{2}\rho\,V^2S\]

In steady level flight, \(L=W\), so the lift coefficient can be expressed as

\[C_L = \frac{W}{\frac{1}{2}\rho\,V^2S}\]

and hence

\[D = C_{D0}\frac{1}{2}\rho\,V^2S + \frac{K\,W^2}{\frac{1}{2}\rho\,V^2S}\]


\[D = A\,V^2 + B\,V^{-2}\]

where \(A\) and \(B\) are functions of density (and therefore functions of altitude).

  • \(A=C_{D0}\frac{1}{2}\rho S\) represents the profile drag, which gets larger with forward speed squared

  • \(B=\frac{K\,W^2}{\frac{1}{2}\rho S}\) represents the induced drag, which gets smaller with forward speed squared

The above should make sense to you intuitively. Profile drag is largely viscous drag, which will get larger in proportion to the dynamic pressure. The induced drag is proportional to the bound vortex maintaining lift, which will be proportional to \(C_L\) which, for a steady flight, is inversely proportional to the dynamic pressure.

Minimum drag speed#

From the drag equation in dimensional form, the minmum drag speed can be shown

\[D = A\,V^2 + B\,V^{-2}\]
\[\frac{\text{d} D}{\text{d} V} = 2\cdot A\,V - 2 B\,V^{-3}\]
\[\implies V_{md} = \left[\frac{B}{A}\right]^{\frac{1}{4}}\]

For a set of parameters, the drag equation can be plotted from the aircraft stall speed. You can zoom in on the plot, or expand the source to see how the plot was made.

import as pio
import as px
import plotly.offline as py
import plotly.graph_objects as go
from ambiance import Atmosphere
import numpy as np

# Define constants
CD0=0.016 # Zero incidence drag
K=0.045 # Induced drag factor
S=50 # Wing area, m^2
W=160e3 # Aircarft weight, Newtons
Clmax = 1.5

alt=0; # Altitude

mosphere = Atmosphere(alt*1000)
rho = mosphere.density

# Determine stall speed
Vstall = np.sqrt(W / (0.5 * rho * S * Clmax))

# Determine A and B
A = CD0 * 0.5 * rho * S
B = K * W ** 2 / 0.5 / rho / S

# Flight speed vector
Vs = np.linspace(Vstall[0], 200, 1000)

# Define drags
Dind = B * Vs**-2
Dprof = A * Vs**2
D = Dind + Dprof

# Get minimum drag
Vmd = (B/A)**.25
md = A * Vmd**2 + B * Vmd**-2

fig = go.Figure()
fig.add_trace(go.Scatter(x=Vs, y=Dind, name="Induced Drag"))
fig.add_trace(go.Scatter(x=Vs, y=Dprof, name="Profile Drag"))
fig.add_trace(go.Scatter(x=Vs, y=D, name="Total Drag"))
fig.add_trace(go.Scatter(x=Vmd, y=md, mode="markers+text", text="Minimum Drag", textposition="top center", name="Annotation"))

    title=f"Variation of Profile, Induced, and Total Drag - CD0 = {CD0}, K={K}, altitude={alt}km, S={S}m^2, W={W/1e3}",
    xaxis_title="TAS / (m/s)",
    yaxis_title="Drag / N",
    legend_title="Drag Breakdown",

for trace in fig['data']: 
    if(trace['name'] == "Annotation"): trace['showlegend'] = False

fig.update_xaxes(range=[0, 200])
fig.update_yaxes(range=[0, 20e3])