Questions and Solutions
Contents
Questions and Solutions#
The following comprises the theory that I expect you to have absorbed and be fluent in over the preceding module. Some questions have wordy answers whilst others have numerical answers. The numerical answers are provided, and the method is hidden in dropdowns in some cases, and completely hidden in the source ipynb
notebooks in other cases.
A lot of the theory questions ask you to derive something. I do not include solutions to these questions - they are all ‘bookwork’ which is included in the notes. If you’re not able to answer them, ask on Slack.
Remember that you are expected to be writing your own code snippets rather than simply using this website as a calculator. I might be a real bastard and turn off the live code functionality during certain exams to enforce that.
Background Questions#
These are not directly taught in this course, per se, but will prove your abilities to analyse aircraft data in order to even start the problems in Module 1. The following will test your understanding of the drag polar.
WT Data#
A test is carried out on a 1:20 scale model of an aircraft in an atmospheric wind tunnel (ie \(\rho = \rho_{SL}\) in the working section) at a speed of 20m/s. The model has a rectangular wing with a span of 1.70m and a chord of 0.24m.
\(\alpha/^\circ\) |
-6 |
-3 |
0 |
3 |
6 |
9 |
12 |
15 |
18 |
---|---|---|---|---|---|---|---|---|---|
\(L\,\text{N}^{-1}\) |
-25 |
0 |
25 |
50 |
75 |
100 |
125 |
135 |
115 |
\(D\,\text{N}^{-1}\) |
1.9 |
1.6 |
1.9 |
2.8 |
4.3 |
6.4 |
9.1 |
13.8 |
19.2 |
Perform the following data analysis and presentation:
Evaluate \(C_L\) and \(C_D\) for each incidence.
Plot \(C_D\) against \(C_L\).
Plot lift/drag ratio \(C_L\)/\(C_D\) against \(C_L\)
Plot \(C_D\) against \(C_L^2\).
and using these graphs, estimate:
The lift curve slope \(a\).
The zero-lift incidence \(\alpha_{0L}\).
The lift coefficient at zero lift, \(C_{L0}\)
The induced drag factors \(K\) and \(k\).
The zero lift drag \(C_{D0}\) (you can assume camber is negligible)
The maximum lift/drag ratio.
The approximate stall angle \(\alpha_s\).
The maximum lift \(C_{Lmax}\)
Answers
import numpy as np
alfas = np.array([-6, -3, 0, 3, 6, 9, 12, 15, 18])
Ls = np.array([-25, 0, 25, 50, 75, 100, 125, 135, 115])
Ds = np.array([1.9, 1.6, 1.9, 2.8, 4.3, 6.4, 9.1, 13.8 ,19.2])
import numpy as np
import plotly.graph_objects as go
# Constants
b = 1.7
S = 1.7 * 0.24
V = 20
rho = 1.225
AR = b**2/S
den = 0.5 * rho * V**2 * S
# Make into coefficients
CL = Ls/den
CD = Ds/den
# Lift and Drag vs. Incidence
fig = go.Figure()
fig.add_trace(go.Scatter(x=alfas, y=CL,
mode='markers', marker_symbol="circle-open-dot", name="$C_L$",
showlegend=True))
fig.add_trace(go.Scatter(x=alfas, y=10*CD,
mode='markers', marker_symbol="circle-open-dot", name="$10\cdot C_D$",
showlegend=True))
fig.update_layout(
title="Wind tunnel dimensional lift vs. angle of attack", title_x=0.5,
xaxis_title="$\\alpha/\circ$",
yaxis_title="Aerodynamic Coefficients",
)
fig.show()
# Clearly stall occurs at some point beyond 12 degrees so a linear fit of data before 12 degrees will give the lift curve slop
linear_lift = np.polyfit(alfas[alfas < 13], CL[alfas < 13], 1)
print(f"The lift curve slope is a = {linear_lift[0]/np.pi*180:1.2f}/radian")
a = linear_lift[0]/np.pi*180
CL0 = CL[alfas == 0]
alpha0 = alfas[CL == 0]
## Now do the drag polar
fig_dragpolar = go.Figure()
fig_dragpolar.add_trace(go.Scatter(x=CD, y=CL,
mode='markers', marker_symbol="circle-open-dot", name="WT Data",
showlegend=True))
fig_dragpolar.update_layout(
title="Drag Polar", title_x=0.5,
xaxis_title="$C_D$",
yaxis_title="$C_L$",
)
fig_dragpolar.show()
## Now do the L/D vs CL
fig_CLCD = go.Figure()
fig_CLCD.add_trace(go.Scatter(x=CL, y=CL/CD,
mode='markers', marker_symbol="circle-open-dot", name="WT Data",
showlegend=True))
fig_CLCD.update_layout(
title="$\\text{Lift to drag ratio vs. }C_L$", title_x=0.5,
xaxis_title="$C_L$",
yaxis_title="$\\frac{C_L}{C_D}$",
)
fig_CLCD.show()
# This graph enables us to estimate the minimum drag - since we know that the lift to drag ratio will be maximum at CLmd
CLmd = CL[CL/CD == max(CL/CD)][0]
print(f"Estimated CL for minimum drag {CLmd:1.2f}, corresponding lift to drag ratio is {max(CL/CD):1.1f}")
## Now do the CD vs CL^2
fig = go.Figure()
fig.add_trace(go.Scatter(x=CL**2, y=CD,
mode='markers', marker_symbol="circle-open-dot",
showlegend=False))
fig.update_layout(
title="$\\text{Drag Coefficient vs. }C_L^2$", title_x=0.5,
xaxis_title="$C_L^2$",
yaxis_title="${C_D}$",
)
fig.show()
linear_drag_model = np.polyfit(CL[alfas < 15]**2, CD[alfas < 15], 1)
print(f"The linear drag model for this aircraft has CD0 = {linear_drag_model[1]:1.3f}, and K = {linear_drag_model[0]:1.3f}, or k={linear_drag_model[0]*np.pi*AR:1.3f}")
CD0 = linear_drag_model[1]
K = linear_drag_model[0]
# It looks like the points before stall show a learn trend - now this next bit is probably beyond what I'd
# expect you to be able to do, but we'll go through it anyway.
print("Beyond this point, this is further than what I'd expect but you should be able to understand the following.")
# Add the CLmd onto the data based on these
## Add the full drag polar based on the drag model
CL_vector = np.linspace(CL.min(), CL.max(), int(1e2))
CD_vector = CD0 + K * CL_vector ** 2
CLmd_model = np.sqrt(CD0/K)
CDmd_model = CD0 + K * CLmd_model**2
fig_CLCD.add_trace(go.Scatter(x=[CLmd_model], y=[CLmd_model/CDmd_model],
mode='markers', marker_symbol="circle-open-dot", name="Drag Model - Minimum Drag",
showlegend=True))
fig_CLCD.add_trace(go.Scatter(x=CL_vector, y=CL_vector/CD_vector,
mode='lines', marker_symbol="circle-open-dot", name="Drag Model",
showlegend=True))
fig_CLCD.show()
fig_dragpolar.add_trace(go.Scatter(x=[CDmd_model], y=[CLmd_model],
mode='markers', marker_symbol="circle-open-dot", name="Drag Model Minimum Drag",
showlegend=True))
fig_dragpolar.add_trace(go.Scatter(x=CD_vector, y=CL_vector,
mode='lines', name="Drag Model",
showlegend=True))
fig_dragpolar.show()