A wing is a tilted, curved surface that pushes a huge amount of air downward every second. The air pushes back up on the wing just as hard. That push is lift. Three labs: watch a wing bend the airflow, use the lift equation to find how fast a plane must go, and see how drag sets the best speed and how far a plane can glide with its engine off.
Air is a fluid with weight: a cubic yard of it near the ground weighs about 2 lb. Tilt a wing slightly nose-up into the oncoming air (that tilt is the angle of attack) and the air bends to follow the wing's shape. It rises ahead of the wing and leaves the back edge heading slightly downward. To bend air downward the wing must push it down, so the air pushes the wing up. The same push shows up as lower pressure on top of the wing (blue) and higher pressure underneath (amber). Green lines are streamlines, the paths air follows.
Try this: press Release air parcels and watch the gold one reach the trailing edge well before the amber one.
Here a is the radius of the circle that maps onto the wing, β is set by the camber (zero for a symmetric wing), α is the angle of attack, ρ is the air density (1.225 kg/m³) and V the airspeed. Γ, the circulation, measures how much faster air goes over the top than underneath, summed around the wing. The chord (front-to-back length) is .
A popular explanation says air going over the curved top travels farther, so it must speed up to meet its partner from underneath at the back edge at the same moment. No law of physics makes the two parcels meet. Press Release air parcels: whenever the wing makes lift, the top parcel reaches the back edge first and keeps going, well ahead of its partner.
Air on top really is faster, and its pressure really is lower (Bernoulli's principle). The cause is the wing bending the flow. The equal-time idea also predicts far too little speed difference to hold up a plane, and it can't explain flat paper planes or aircraft flying upside down.
import numpy as np rho, V = 1.225, 50.0 # air density kg/m³, airspeed m/s alpha = np.radians(6) # angle of attack c, eps, my = 1.0, 0.10, 0.06 # Joukowski constant, thickness and camber offsets z0 = complex(-eps, my) # circle center a = abs(c - z0) # circle passes through zeta = c: sharp tail beta = np.arcsin(my / a) Gamma = 4*np.pi*a*V*np.sin(alpha + beta) # Kutta condition zeta = z0 + a*np.exp(1j*np.linspace(0, 2*np.pi, 2000)) z = zeta + c**2/zeta # the airfoil outline chord = z.real.max() - z.real.min() k = 1.5 / chord # scale so the chord is 1.5 m L = rho * V * Gamma * k # Kutta-Joukowski, N per m of span CL = 2*Gamma / (V*chord) def velocity(zeta): # returns u + i v at the image point z zp = zeta - z0 dW = V*(np.exp(-1j*alpha) - a**2*np.exp(1j*alpha)/zp**2) + 1j*Gamma/(2*np.pi*zp) return np.conj(dW / (1 - c**2/zeta**2)) print(f"L' = {L:.0f} N/m, CL = {CL:.3f}")
Lift grows with four things: how dense the air is, the square of the speed (twice as fast gives four times the lift), the wing's area, and how hard the wing turns the air, which is captured by one number called the lift coefficient CL. For small angles CL grows in step with the angle of attack. Tilt too far and the air can no longer follow the top of the wing: it breaks away, lift collapses, and the wing has stalled. Set a plane's weight and find the speed it needs.
How to read this: the gold curve shows how much the wing can hold up at each speed. Where it crosses the dashed weight line is the speed you need; if the amber dot sits above the line, the plane climbs. The second, smaller chart shows how hard the wing works at each tilt (its lift coefficient). It climbs steadily until about 15°, then falls off in the red zone: that's a stall.
Try this: drag Angle of attack past 15° and watch the dot turn red.
ρ is air density, V airspeed, S wing area, W = m·g the weight (g = 9.81 m/s²). Density falls with height. This lab uses the standard atmosphere for the lowest layer of the sky (up to about 36,000 ft): temperature drops 6.5 K per km, and pressure and density follow from that.
CL = 2πα comes from thin-airfoil theory for a symmetric 2D wing at small angles. Real wings are curved, so they make some lift at α = 0, and finite wings with tips have a somewhat smaller slope. The stall angle varies by wing; about 15° is a common figure. Past it, this lab draws lift falling off only as an illustration. Real stalls vary from gentle to abrupt.
Air thinning with height ties into W02 · Highs & lows. Higher up, a plane must fly faster to make the same lift, which is one reason airliners cruise so fast.
import math g = 9.81 def density(h): # standard atmosphere, 0-11 km, h in m T = 288.15 - 0.0065*h p = 101325 * (T/288.15)**5.2559 return p / (287.05*T) def CL(alpha_deg, stall=15): # thin airfoil, capped at stall return 2*math.pi*math.radians(min(alpha_deg, stall)) m, S, h, alpha = 1110, 16.2, 0, 8 # kg, m², m, degrees W, rho = m*g, density(h) V_need = math.sqrt(2*W / (rho*S*CL(alpha))) V_stall = math.sqrt(2*W / (rho*S*CL(15))) print(f"rho={rho:.3f} need {V_need:.1f} m/s stall {V_stall:.1f} m/s")
In steady level flight four forces balance: lift up equals weight down, and engine thrust forward equals drag backward. Drag comes in two kinds. Parasitic drag is air rubbing and pushing on the plane, and it grows with speed squared. Induced drag is the cost of making lift: at low speed the wing must tilt steeply, flinging air down and leaving swirling vortices at the wingtips, so it shrinks as speed goes up. Their sum has a lowest point. Cut the engine and the plane glides, trading height for distance.
The glide picture at the bottom is drawn with height stretched so you can see it; the real slope is much shallower.
Try this: press Fly best glide speed to jump to the bottom of the gold curve.
CD0 is the parasitic drag coefficient, A the aspect ratio (wingspan² / area, long thin wings score high), and e a wing efficiency factor near 0.7 to 0.9. Setting the derivative of D to zero gives the minimum-drag speed, which is exactly where the two kinds of drag are equal.
With no thrust, a little of the weight acts along the flight path and pulls the plane forward to balance drag. In a steady glide the slope is D/L, so each unit of height buys L/D units of distance in still air. The best glide comes at the minimum-drag speed. Flying faster or slower than that both shorten the glide. The best ratio depends only on the wing and the airframe, so a heavier plane glides just as far, only faster.
Long thin wings cut induced drag, which is why gliders look the way they do. The wind resistance a cyclist feels is the parasitic kind; for how the bike itself stays upright, see E01 · Why bikes stay up.
import math g = 9.81 # typical light aircraft: mass kg, wing area m², aspect ratio, e, CD0 m, S, A, e, CD0 = 1110, 16.2, 7.5, 0.75, 0.040 rho = 0.909 # density at 3,000 m, kg/m³ W = m*g def drag(V): q = 0.5*rho*V**2 # dynamic pressure parasitic = q*S*CD0 induced = 2*W**2 / (rho*V**2*S*math.pi*e*A) return parasitic + induced V_md = math.sqrt(2*W/(rho*S)) * (math.pi*e*A*CD0)**-0.25 LD_max = 0.5*math.sqrt(math.pi*e*A/CD0) print(f"V_md {V_md:.1f} m/s, L/D {LD_max:.1f}, W/D {W/drag(V_md):.1f}") print(f"glide from 3000 m: {3000*LD_max/1000:.1f} km")