Phugoid Mode Analysis (flight-mechanics/stability-control/phugoid-mode-analysis)
Use when the task is the phugoid, the long-period longitudinal mode
that shows up after a speed or thrust disturbance at cruise: the
aircraft slowly oscillates in airspeed and height while the angle of
attack stays nearly constant. This leaf implements the Lanchester
approximation, which needs only the cruise speed V and the
lift-to-drag ratio L/D, and derives the phugoid natural frequency,
period, drag-damping ratio, damped frequency, and the time to half
amplitude in seconds and in cycles. It complements the fast-mode
treatment of
flight-mechanics/stability-control/short-period-mode-analysis, the
derivative-based full evaluation of
flight-mechanics/stability-control/dynamic-stability, and the static
pitch stability background of
flight-mechanics/stability-control/longitudinal-stability.
Domain quick reference
Physics: the phugoid trades kinetic and potential energy along the
flight path at roughly constant angle of attack. After a speed
disturbance the airplane climbs as it slows, then dives and
accelerates back, so the disturbance shows up as a slow airspeed and
height-velocity exchange (height up when speed down) rather than as a
pitch oscillation. Lanchester modeled this exchange for small
perturbations at constant cruise speed V and constant lift
coefficient; drag does work each cycle and provides the damping. With
g0 = 9.80665 m/s^2:
- Natural frequency: omega_p = g0 * sqrt(2) / V, in rad/s.
- Period: T_p = 2 * pi / omega_p = 2 * pi * V / (g0 * sqrt(2)), in s.
- Damping ratio (drag-damping approximation): zeta_p =
1 / (sqrt(2) * (L/D)), dimensionless. Valid for large L/D; the
model assumes zeta_p is small (zeta_p at L/D 8 is about 0.088).
- Damped frequency: omega_d = omega_p * sqrt(1 - zeta_p^2), in rad/s.
For cruise L/D the damping is light, so omega_d is practically
equal to omega_p.
- Time to half amplitude: t_half = ln(2) / (zeta_p * omega_p), in s.
The decay-rate identity zeta_p * omega_p = g0 / (V * (L/D)) gives
the closed form t_half = ln(2) * V * (L/D) / g0.
- Cycles to half amplitude: N_half = t_half / T_p =
ln(2) * sqrt(2) * (L/D) / (2 * pi), about 0.156 * (L/D).
Independent of speed: only the lift-to-drag ratio sets how many
cycles the oscillation survives.
- Validity: L/D must be at least 8 for the small-damping
approximation to be credible; omega_p is assumed to sit well below
the short period frequency (the standard two-timescale longitudinal
split, stated as an assumption because this leaf does not compute
the short period mode).
Workflow
- Collect the cruise speed V in m/s and the cruise lift-to-drag
ratio L/D at the trim condition (from
flight-mechanics/stability-control/trim-analysis or cruise
performance data).
- Compute the natural frequency with phugoid_frequency and the
period with phugoid_period.
- Compute the drag-damping ratio with phugoid_damping_ratio and the
damped frequency with damped_frequency.
- Get the decay metrics: time_to_half_amplitude and
cycles_to_half_amplitude.
- Check validity with ld_valid_for_small_damping (L/D 8 floor) and
record the separation assumption that omega_p is well below the
short period frequency.
- Get the complete summary with phugoid_characteristics, which
returns omega_p, period, zeta_p, omega_d, t_half, cycles_half,
small_damping_valid, and the separation_assumption string.
- Confirm the deterministic checks with the contract test
scripts/test_phugoid_mode_analysis.py.
Worked example
A transport cruise configuration: V = 250 m/s, L/D = 18.
- omega_p = 9.80665 * 1.41421356237 / 250 = 0.05547 rad/s.
- T_p = 2 * pi / 0.05547 = 113.3 s.
- zeta_p = 1 / (1.41421356237 * 18) = 0.03928.
- Decay rate: zeta_p * omega_p = 0.03928 * 0.05547 = 0.002179 /s,
equal to g0 / (250 * 18) = 0.002179 /s.
- t_half = ln(2) / 0.002179 = 318.1 s.
- Cycles to half amplitude: N_half = 318.1 / 113.3 = 2.81.
- Validity: L/D = 18 is well above 8, and omega_p = 0.0555 rad/s is
about two orders below a typical short period frequency of several
rad/s, so the Lanchester model and the mode separation hold.
The interpretation: after a speed disturbance the airspeed oscillation
decays to half amplitude in about 5.3 minutes (2.81 cycles of a
roughly 1.9 minute period). Damping is light because the L/D of 18
means drag does little work per cycle.
Verification
- Confirm phugoid_frequency(250.0) returns 0.0554748 rad/s and
phugoid_period(250.0) returns 113.2620 s, both within 1% of the
worked example values.
- Confirm phugoid_damping_ratio(18.0) returns 0.0392837, t_half via
time_to_half_amplitude(250.0, 18.0) returns 318.0660 s (within 1%
of 318.1 s), and cycles_to_half_amplitude(18.0) returns 2.8082
(within 1% of 2.81).
- Confirm the identities: phugoid_frequency * phugoid_period equals
2 * pi; zeta_p * omega_p equals g0 / (V * (L/D)); the closed form
ln(2) * V * (L/D) / g0 equals the log form ln(2) / (zeta_p *
omega_p); cycles_half equals t_half / T_p; and omega_d is at or
below omega_p.
- Confirm ld_valid_for_small_damping returns True at and above L/D 8
and False below.
- Confirm ValueError on V <= 0, L/D < 1 (below the oscillatory
floor), non-numeric inputs, and non-positive gravity, across the
frequency, damping, time, and summary functions.
- Run the contract test offline: python3
scripts/test_phugoid_mode_analysis.py (34 tests, deterministic).
Pitfalls
- Applying the model below L/D 8: the drag-damping approximation assumes
small zeta, and ld_valid_for_small_damping returns False below L/D 8; the
numbers are not credible there (L/D below 1 raises ValueError outright).
- Quoting t_half without the closed form check: time to half amplitude must
satisfy ln(2)/(zetaomega) = ln(2)V(L/D)/g0; the decay-rate identity
zeta_pomega_p = g0/(V*(L/D)) is the cross-check.
- Reading cycles to half amplitude as speed dependent: N_half = t_half/T_p
depends only on L/D (about 0.156*(L/D)), so it is constant across cruise
speeds for a given configuration.
- Forgetting the two-timescale assumption: the leaf assumes omega_p sits
well below the short period frequency and records it as the
separation_assumption string, but does not compute the short period mode
itself.
- Non-positive V, L/D below 1, non-numeric inputs and non-positive gravity
raise ValueError across the frequency, damping, time and summary
functions.
Related leaves
- flight-mechanics/stability-control/longitudinal-stability: the
static pitch stability context (C_m_alpha, neutral point) in which
the phugoid operates.
- flight-mechanics/stability-control/short-period-mode-analysis: the
fast pitch mode of the same longitudinal split; its separation
check uses the Lanchester frequency from this leaf's model.
- flight-mechanics/stability-control/dynamic-stability: the full
longitudinal mode evaluation from stability derivatives, where the
phugoid frequency and damping are assessed against the
non-divergent criterion.
- flight-mechanics/stability-control/trim-analysis: the trimmed
cruise condition that fixes the speed and lift-to-drag inputs.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_phugoid_mode_analysis.py
The test covers the worked-example anchors (natural frequency 0.05547
rad/s, period 113.3 s, damping 0.03928, time to half 318.1 s, cycles
to half 2.81, all within 1%), the frequency and period round trip,
the speed scaling of frequency and period, the L/D 1 oscillatory
boundary, the decay-rate identity zeta_p * omega_p = g0 / (V * (L/D)),
the closed-form time to half, the cycles-to-period ratio, the L/D 8
validity floor, the summary dict consistency, and ValueError rejection
of non-positive and non-numeric inputs.
Compliance
- Standards referenced, not reproduced: FAR-25.181 and CS-25.181
require longitudinal dynamic stability characteristics for
transport aeroplanes, with the phugoid to be non-divergent and not
to increase pilot workload; the Lanchester model above is classical
engineering methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: phugoid-mode-analysis3description: Use when you must analyze the phugoid, the long-period longitudinal mode of an aircraft, with the Lanchester approximation from the cruise speed and the lift-to-drag ratio alone: compute the phugoid natural frequency omega_p = g0 * sqrt(2) / V and period, the drag-damping ratio zeta_p = 1 / (sqrt(2) * (L/D)), the damped frequency, the time to half amplitude, and the cycles to half amplitude of the airspeed oscillation, and check the small-damping validity floor of L/D 8. Produces the phugoid mode metrics and the height-velocity energy-exchange verdict. Trigger: phugoid, long-period mode, Lanchester, airspeed oscillation, time to half amplitude, height-velocity exchange, phugoid period, phugoid damping.4license: Apache-2.05---67# Phugoid Mode Analysis (flight-mechanics/stability-control/phugoid-mode-analysis)89Use when the task is the phugoid, the long-period longitudinal mode10that shows up after a speed or thrust disturbance at cruise: the11aircraft slowly oscillates in airspeed and height while the angle of12attack stays nearly constant. This leaf implements the Lanchester13approximation, which needs only the cruise speed V and the14lift-to-drag ratio L/D, and derives the phugoid natural frequency,15period, drag-damping ratio, damped frequency, and the time to half16amplitude in seconds and in cycles. It complements the fast-mode17treatment of18flight-mechanics/stability-control/short-period-mode-analysis, the19derivative-based full evaluation of20flight-mechanics/stability-control/dynamic-stability, and the static21pitch stability background of22flight-mechanics/stability-control/longitudinal-stability.2324## Domain quick reference2526Physics: the phugoid trades kinetic and potential energy along the27flight path at roughly constant angle of attack. After a speed28disturbance the airplane climbs as it slows, then dives and29accelerates back, so the disturbance shows up as a slow airspeed and30height-velocity exchange (height up when speed down) rather than as a31pitch oscillation. Lanchester modeled this exchange for small32perturbations at constant cruise speed V and constant lift33coefficient; drag does work each cycle and provides the damping. With34g0 = 9.80665 m/s^2:3536- Natural frequency: omega_p = g0 * sqrt(2) / V, in rad/s.37- Period: T_p = 2 * pi / omega_p = 2 * pi * V / (g0 * sqrt(2)), in s.38- Damping ratio (drag-damping approximation): zeta_p =39 1 / (sqrt(2) * (L/D)), dimensionless. Valid for large L/D; the40 model assumes zeta_p is small (zeta_p at L/D 8 is about 0.088).41- Damped frequency: omega_d = omega_p * sqrt(1 - zeta_p^2), in rad/s.42 For cruise L/D the damping is light, so omega_d is practically43 equal to omega_p.44- Time to half amplitude: t_half = ln(2) / (zeta_p * omega_p), in s.45 The decay-rate identity zeta_p * omega_p = g0 / (V * (L/D)) gives46 the closed form t_half = ln(2) * V * (L/D) / g0.47- Cycles to half amplitude: N_half = t_half / T_p =48 ln(2) * sqrt(2) * (L/D) / (2 * pi), about 0.156 * (L/D).49 Independent of speed: only the lift-to-drag ratio sets how many50 cycles the oscillation survives.51- Validity: L/D must be at least 8 for the small-damping52 approximation to be credible; omega_p is assumed to sit well below53 the short period frequency (the standard two-timescale longitudinal54 split, stated as an assumption because this leaf does not compute55 the short period mode).5657## Workflow58591. Collect the cruise speed V in m/s and the cruise lift-to-drag60 ratio L/D at the trim condition (from61 flight-mechanics/stability-control/trim-analysis or cruise62 performance data).632. Compute the natural frequency with phugoid_frequency and the64 period with phugoid_period.653. Compute the drag-damping ratio with phugoid_damping_ratio and the66 damped frequency with damped_frequency.674. Get the decay metrics: time_to_half_amplitude and68 cycles_to_half_amplitude.695. Check validity with ld_valid_for_small_damping (L/D 8 floor) and70 record the separation assumption that omega_p is well below the71 short period frequency.726. Get the complete summary with phugoid_characteristics, which73 returns omega_p, period, zeta_p, omega_d, t_half, cycles_half,74 small_damping_valid, and the separation_assumption string.757. Confirm the deterministic checks with the contract test76 scripts/test_phugoid_mode_analysis.py.7778## Worked example7980A transport cruise configuration: V = 250 m/s, L/D = 18.8182- omega_p = 9.80665 * 1.41421356237 / 250 = 0.05547 rad/s.83- T_p = 2 * pi / 0.05547 = 113.3 s.84- zeta_p = 1 / (1.41421356237 * 18) = 0.03928.85- Decay rate: zeta_p * omega_p = 0.03928 * 0.05547 = 0.002179 /s,86 equal to g0 / (250 * 18) = 0.002179 /s.87- t_half = ln(2) / 0.002179 = 318.1 s.88- Cycles to half amplitude: N_half = 318.1 / 113.3 = 2.81.89- Validity: L/D = 18 is well above 8, and omega_p = 0.0555 rad/s is90 about two orders below a typical short period frequency of several91 rad/s, so the Lanchester model and the mode separation hold.9293The interpretation: after a speed disturbance the airspeed oscillation94decays to half amplitude in about 5.3 minutes (2.81 cycles of a95roughly 1.9 minute period). Damping is light because the L/D of 1896means drag does little work per cycle.9798## Verification99100- Confirm phugoid_frequency(250.0) returns 0.0554748 rad/s and101 phugoid_period(250.0) returns 113.2620 s, both within 1% of the102 worked example values.103- Confirm phugoid_damping_ratio(18.0) returns 0.0392837, t_half via104 time_to_half_amplitude(250.0, 18.0) returns 318.0660 s (within 1%105 of 318.1 s), and cycles_to_half_amplitude(18.0) returns 2.8082106 (within 1% of 2.81).107- Confirm the identities: phugoid_frequency * phugoid_period equals108 2 * pi; zeta_p * omega_p equals g0 / (V * (L/D)); the closed form109 ln(2) * V * (L/D) / g0 equals the log form ln(2) / (zeta_p *110 omega_p); cycles_half equals t_half / T_p; and omega_d is at or111 below omega_p.112- Confirm ld_valid_for_small_damping returns True at and above L/D 8113 and False below.114- Confirm ValueError on V <= 0, L/D < 1 (below the oscillatory115 floor), non-numeric inputs, and non-positive gravity, across the116 frequency, damping, time, and summary functions.117- Run the contract test offline: python3118 scripts/test_phugoid_mode_analysis.py (34 tests, deterministic).119120## Pitfalls121122- Applying the model below L/D 8: the drag-damping approximation assumes123 small zeta, and ld_valid_for_small_damping returns False below L/D 8; the124 numbers are not credible there (L/D below 1 raises ValueError outright).125- Quoting t_half without the closed form check: time to half amplitude must126 satisfy ln(2)/(zeta*omega) = ln(2)*V*(L/D)/g0; the decay-rate identity127 zeta_p*omega_p = g0/(V*(L/D)) is the cross-check.128- Reading cycles to half amplitude as speed dependent: N_half = t_half/T_p129 depends only on L/D (about 0.156*(L/D)), so it is constant across cruise130 speeds for a given configuration.131- Forgetting the two-timescale assumption: the leaf assumes omega_p sits132 well below the short period frequency and records it as the133 separation_assumption string, but does not compute the short period mode134 itself.135- Non-positive V, L/D below 1, non-numeric inputs and non-positive gravity136 raise ValueError across the frequency, damping, time and summary137 functions.138139## Related leaves140141- flight-mechanics/stability-control/longitudinal-stability: the142 static pitch stability context (C_m_alpha, neutral point) in which143 the phugoid operates.144- flight-mechanics/stability-control/short-period-mode-analysis: the145 fast pitch mode of the same longitudinal split; its separation146 check uses the Lanchester frequency from this leaf's model.147- flight-mechanics/stability-control/dynamic-stability: the full148 longitudinal mode evaluation from stability derivatives, where the149 phugoid frequency and damping are assessed against the150 non-divergent criterion.151- flight-mechanics/stability-control/trim-analysis: the trimmed152 cruise condition that fixes the speed and lift-to-drag inputs.153154## Behavior contract (gate 3)155156Run the deterministic contract test (stdlib unittest, offline):157158 python3 scripts/test_phugoid_mode_analysis.py159160The test covers the worked-example anchors (natural frequency 0.05547161rad/s, period 113.3 s, damping 0.03928, time to half 318.1 s, cycles162to half 2.81, all within 1%), the frequency and period round trip,163the speed scaling of frequency and period, the L/D 1 oscillatory164boundary, the decay-rate identity zeta_p * omega_p = g0 / (V * (L/D)),165the closed-form time to half, the cycles-to-period ratio, the L/D 8166validity floor, the summary dict consistency, and ValueError rejection167of non-positive and non-numeric inputs.168169## Compliance170171- Standards referenced, not reproduced: FAR-25.181 and CS-25.181172 require longitudinal dynamic stability characteristics for173 transport aeroplanes, with the phugoid to be non-divergent and not174 to increase pilot workload; the Lanchester model above is classical175 engineering methodology, summary-only per standards-map.yaml.176- compliance: STANDARDS-REF, gated: false.