Pitch Bandwidth Criteria (flight-mechanics/handling-qualities/pitch-bandwidth-criteria)
Use when the task is assessing pitch-axis flying qualities with the
MIL-STD-1797A bandwidth and phase-delay criterion, the frequency-domain
method that grades the pitch attitude response directly from its open
loop frequency response. This leaf models the pitch attitude transfer
function as a short period mode plus a control anticipation numerator
time constant and an actuator lag, evaluates the response, extracts the
bandwidth frequency omega_BW and the phase delay tau_p, and returns the
Level 1, 2 or 3 verdict with the limiting criterion. It is the
companion to the modal level tables in the mil-std-1797a leaf: same
standard, different assessment method (frequency-domain bandwidth
instead of per-mode damping tables). Implementation is pure Python,
stdlib only, deterministic and offline.
Domain quick reference
- Pitch attitude model (K normalized to 1.0, the criterion uses phase
and gain ratio only): G(s) = (1 + T_th2s) / (s * (s^2 + 2zetawns +
wn^2) * (1 + s/w_act)), with wn the short period natural frequency
(rad/s), zeta the short period damping, T_th2 the control anticipation
time constant (s) and w_act the actuator lag frequency (rad/s).
- Unwrapped phase: phase = atan(wT_th2) - 90 - atan2(2zetawnw,
wn^2 - w^2) - atan(w/w_act) degrees, continuous from -90 degrees at
the origin (the lead term can lift it a fraction of a degree just
above zero before the mode lag dominates). The module unwraps the
principal phase numerically over a fine 0.01 rad/s grid and refines
every crossing with a bisection root finder.
- Bandwidth definition: omega_BW is the lower of the frequency at
which the phase margin is 45 degrees (phase equals -135 degrees,
omega_135) and the 6 dB gain margin frequency (omega_GM6). A -6 dB
gain crossing counts only when it sits at or beyond the -180 degree
phase crossing, the region where gain margin actually limits the
loop; the low frequency crossing of the normalized response (phase
near -93 degrees) never limits bandwidth and is reported as None.
Documented assumption of this leaf, recorded because the gain is
normalized to unity.
- Phase delay: tau_p = -(phase(2omega_180) + 180) / (2omega_180) *
(pi/180) seconds, from the unwrapped phase at twice the -180 degree
frequency. None when omega_180 does not exist.
- Level boundaries (representative Category A pitch values from
MIL-STD-1797A 4.5.1, class dependent in the standard; verify against
the current revision before certifying an airframe): Level 1 needs
omega_BW >= 3.5 rad/s and tau_p <= 0.2 s; Level 2 needs omega_BW >=
2.5 rad/s and tau_p <= 0.2 s; otherwise Level 3. The limiting
criterion is bandwidth, phase delay or both.
- ValueErrors: wn <= 0, zeta <= 0 or >= 1, T_th2 <= 0, w_act <= wn,
and a non-positive evaluation frequency are rejected.
Workflow
- Fix the airframe response parameters: short period wn and zeta
(from the stability leaves or a flight test short period fit), the
control anticipation time constant T_th2 and the actuator lag
frequency w_act. Check that w_act > wn.
- Evaluate the criterion metrics with bandwidth(wn, zeta, T_th2,
w_act): it returns omega_135, omega_GM6, omega_BW, omega_180 and
tau_p. The unwrapped phase comes from phase_deg and the magnitude
from mag_db; crossings are located by find_root_phase over the dense
unwrapped phase table with bisection refinement.
- Grade the result with level_verdict(omega_BW, tau_p), which returns
the level, the limiting criterion (bandwidth, phase delay or both)
and any metric that could not be computed. Verify the numerical
building blocks separately when needed: transfer for the complex
response and unwrap_phase_deg for phase series continuity.
- State the verdict with the governing metric. When the level
boundaries sit near the computed values, recheck the aircraft class
and flight phase category against the current MIL-STD-1797A revision
because the representative boundaries used here are Category A
values and are class dependent.
- Confirm the deterministic checks with the contract test
scripts/test_pitch_bandwidth_criteria.py.
Worked example
Case A: wn = 4.0 rad/s, zeta = 0.7, T_th2 = 0.5 s, w_act = 25 rad/s.
- omega_135 = 4.58 rad/s: the 45 degree phase margin crossing. The
6 dB gain margin crossing is not reached in the stability relevant
band (omega_GM6 is None), so omega_BW = omega_135 = 4.58 rad/s.
- omega_180 = 10.13 rad/s; the phase at twice omega_180 gives
tau_p = 0.0247 s.
- Verdict: Level 1 (omega_BW 4.58 >= 3.5 and tau_p 0.0247 <= 0.2),
limiting criterion bandwidth.
Case B: wn = 3.0 rad/s, zeta = 0.6, T_th2 = 0.7 s, w_act = 20 rad/s.
- omega_135 = 3.43 rad/s, omega_BW = 3.43 rad/s, omega_180 = 7.23
rad/s, tau_p = 0.0325 s.
- Verdict: Level 2 (omega_BW 3.43 is below the Level 1 floor of 3.5
but above 2.5; tau_p is fine), limiting criterion bandwidth.
Verification
- bandwidth(4.0, 0.7, 0.5, 25.0) returns omega_135 4.5832 rad/s,
omega_180 10.1290 rad/s, tau_p 0.0246 s, omega_GM6 None and omega_BW
equal to omega_135; level_verdict gives Level 1, limiting bandwidth.
- bandwidth(3.0, 0.6, 0.7, 20.0) returns omega_135 3.4315 rad/s,
omega_180 7.2257 rad/s, tau_p 0.0325 s and a Level 2 verdict.
- Confirm the lightly damped trend: at zeta 0.35 the phase drops faster
and omega_135 is below the zeta 0.7 value at the same wn.
- Confirm every non-positive wn and w, zeta outside (0, 1), T_th2 <= 0
and w_act <= wn raises ValueError.
- Run the contract test offline: python3
scripts/test_pitch_bandwidth_criteria.py (35 tests, deterministic,
passes in under a second).
Pitfalls
- Treating the level boundaries as universal: the 3.5/2.5 rad/s bandwidth
floors and 0.2 s phase-delay limit are representative Category A values
and are class dependent in MIL-STD-1797A; recheck class and category
against the current revision before a certification-grade verdict,
especially when the computed metrics sit near a boundary.
- Reading omega_GM6 = None as zero: the -6 dB gain crossing counts only when
it sits at or beyond the -180 degree crossing; the low-frequency crossing
of the normalized response never limits bandwidth and is reported None, so
None means 'not bandwidth limiting', not a 0 rad/s limit.
- Computing tau_p without omega_180: the phase delay is read from the
unwrapped phase at twice the -180 degree frequency and is None when
omega_180 does not exist; evaluating the formula at an arbitrary frequency
gives a meaningless number.
- Ignoring the w_act > wn constraint: an actuator lag at or below the short
period frequency is rejected (ValueError), and a marginally separated
w_act distorts the high-frequency phase that sets omega_180 and tau_p.
- Trusting principal phase without unwrapping: crossings are located on the
numerically unwrapped phase table with bisection refinement; wrapping
artifacts around -180 degrees would shift omega_180 and the phase delay.
Related leaves
- flight-mechanics/handling-qualities/mil-std-1797a: the modal level
table companion criterion from the same standard; this leaf applies
the frequency-domain bandwidth method instead of the per-mode tables.
- flight-mechanics/handling-qualities/pilot-induced-oscillation:
phase-related neighbor for pilot-in-the-loop coupling risk.
- flight-mechanics/handling-qualities/cooper-harper-rating: pilot
rating scale for the piloted evaluation that complements the level
verdicts.
- flight-mechanics/stability-control/short-period-mode-analysis: source
of the short period wn and zeta inputs to the model.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_pitch_bandwidth_criteria.py
The test covers the Case A and Case B worked examples against the spec
reference numbers within tolerance, the lightly damped and low
frequency trends, the gain margin branch (very low wn), the unwrapped
phase helper and its consistency with the branch-corrected analytic
phase, the bisection root finder on reachable and unreachable targets,
magnitude versus transfer self consistency, the Level 1/2/3 verdict
boundaries and missing metric reporting, and ValueError rejection of
non-physical parameters and frequencies.
Compliance
- Standards referenced, not reproduced: MIL-STD-1797A section 4.5.1
frames the bandwidth and phase-delay criterion. The level boundaries
coded in this leaf are representative Category A values and are class
dependent in the standard, so verify them against the current
revision before a certification-grade assessment. The transfer model
and relations above are standard engineering methodology,
summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: pitch-bandwidth-criteria3description: Use when you must assess the pitch-axis flying qualities of an aircraft with the MIL-STD-1797A bandwidth and phase-delay criterion: model the pitch attitude response as a short period transfer function with a control anticipation numerator time constant and an actuator lag, evaluate the frequency response, find the bandwidth frequency omega_BW as the lower of the 45 degree phase margin frequency and the 6 dB gain margin frequency, read the -180 degree frequency, compute the phase delay tau_p from the phase at twice omega_180, and grade the Category A Level 1, 2 and 3 boundaries. Produces omega_BW, omega_180, tau_p, the flying qualities level and the limiting criterion. Trigger: pitch bandwidth criterion, phase delay tau, bandwidth frequency, phase margin 45 degrees, mil-std-1797a bandwidth, short period transfer function, actuator lag, flying qualities level.4license: Apache-2.05---67# Pitch Bandwidth Criteria (flight-mechanics/handling-qualities/pitch-bandwidth-criteria)89Use when the task is assessing pitch-axis flying qualities with the10MIL-STD-1797A bandwidth and phase-delay criterion, the frequency-domain11method that grades the pitch attitude response directly from its open12loop frequency response. This leaf models the pitch attitude transfer13function as a short period mode plus a control anticipation numerator14time constant and an actuator lag, evaluates the response, extracts the15bandwidth frequency omega_BW and the phase delay tau_p, and returns the16Level 1, 2 or 3 verdict with the limiting criterion. It is the17companion to the modal level tables in the mil-std-1797a leaf: same18standard, different assessment method (frequency-domain bandwidth19instead of per-mode damping tables). Implementation is pure Python,20stdlib only, deterministic and offline.2122## Domain quick reference2324- Pitch attitude model (K normalized to 1.0, the criterion uses phase25 and gain ratio only): G(s) = (1 + T_th2*s) / (s * (s^2 + 2*zeta*wn*s +26 wn^2) * (1 + s/w_act)), with wn the short period natural frequency27 (rad/s), zeta the short period damping, T_th2 the control anticipation28 time constant (s) and w_act the actuator lag frequency (rad/s).29- Unwrapped phase: phase = atan(w*T_th2) - 90 - atan2(2*zeta*wn*w,30 wn^2 - w^2) - atan(w/w_act) degrees, continuous from -90 degrees at31 the origin (the lead term can lift it a fraction of a degree just32 above zero before the mode lag dominates). The module unwraps the33 principal phase numerically over a fine 0.01 rad/s grid and refines34 every crossing with a bisection root finder.35- Bandwidth definition: omega_BW is the lower of the frequency at36 which the phase margin is 45 degrees (phase equals -135 degrees,37 omega_135) and the 6 dB gain margin frequency (omega_GM6). A -6 dB38 gain crossing counts only when it sits at or beyond the -180 degree39 phase crossing, the region where gain margin actually limits the40 loop; the low frequency crossing of the normalized response (phase41 near -93 degrees) never limits bandwidth and is reported as None.42 Documented assumption of this leaf, recorded because the gain is43 normalized to unity.44- Phase delay: tau_p = -(phase(2*omega_180) + 180) / (2*omega_180) *45 (pi/180) seconds, from the unwrapped phase at twice the -180 degree46 frequency. None when omega_180 does not exist.47- Level boundaries (representative Category A pitch values from48 MIL-STD-1797A 4.5.1, class dependent in the standard; verify against49 the current revision before certifying an airframe): Level 1 needs50 omega_BW >= 3.5 rad/s and tau_p <= 0.2 s; Level 2 needs omega_BW >=51 2.5 rad/s and tau_p <= 0.2 s; otherwise Level 3. The limiting52 criterion is bandwidth, phase delay or both.53- ValueErrors: wn <= 0, zeta <= 0 or >= 1, T_th2 <= 0, w_act <= wn,54 and a non-positive evaluation frequency are rejected.5556## Workflow57581. Fix the airframe response parameters: short period wn and zeta59 (from the stability leaves or a flight test short period fit), the60 control anticipation time constant T_th2 and the actuator lag61 frequency w_act. Check that w_act > wn.622. Evaluate the criterion metrics with bandwidth(wn, zeta, T_th2,63 w_act): it returns omega_135, omega_GM6, omega_BW, omega_180 and64 tau_p. The unwrapped phase comes from phase_deg and the magnitude65 from mag_db; crossings are located by find_root_phase over the dense66 unwrapped phase table with bisection refinement.673. Grade the result with level_verdict(omega_BW, tau_p), which returns68 the level, the limiting criterion (bandwidth, phase delay or both)69 and any metric that could not be computed. Verify the numerical70 building blocks separately when needed: transfer for the complex71 response and unwrap_phase_deg for phase series continuity.724. State the verdict with the governing metric. When the level73 boundaries sit near the computed values, recheck the aircraft class74 and flight phase category against the current MIL-STD-1797A revision75 because the representative boundaries used here are Category A76 values and are class dependent.775. Confirm the deterministic checks with the contract test78 scripts/test_pitch_bandwidth_criteria.py.7980## Worked example8182Case A: wn = 4.0 rad/s, zeta = 0.7, T_th2 = 0.5 s, w_act = 25 rad/s.8384- omega_135 = 4.58 rad/s: the 45 degree phase margin crossing. The85 6 dB gain margin crossing is not reached in the stability relevant86 band (omega_GM6 is None), so omega_BW = omega_135 = 4.58 rad/s.87- omega_180 = 10.13 rad/s; the phase at twice omega_180 gives88 tau_p = 0.0247 s.89- Verdict: Level 1 (omega_BW 4.58 >= 3.5 and tau_p 0.0247 <= 0.2),90 limiting criterion bandwidth.9192Case B: wn = 3.0 rad/s, zeta = 0.6, T_th2 = 0.7 s, w_act = 20 rad/s.9394- omega_135 = 3.43 rad/s, omega_BW = 3.43 rad/s, omega_180 = 7.2395 rad/s, tau_p = 0.0325 s.96- Verdict: Level 2 (omega_BW 3.43 is below the Level 1 floor of 3.597 but above 2.5; tau_p is fine), limiting criterion bandwidth.9899## Verification100101- bandwidth(4.0, 0.7, 0.5, 25.0) returns omega_135 4.5832 rad/s,102 omega_180 10.1290 rad/s, tau_p 0.0246 s, omega_GM6 None and omega_BW103 equal to omega_135; level_verdict gives Level 1, limiting bandwidth.104- bandwidth(3.0, 0.6, 0.7, 20.0) returns omega_135 3.4315 rad/s,105 omega_180 7.2257 rad/s, tau_p 0.0325 s and a Level 2 verdict.106- Confirm the lightly damped trend: at zeta 0.35 the phase drops faster107 and omega_135 is below the zeta 0.7 value at the same wn.108- Confirm every non-positive wn and w, zeta outside (0, 1), T_th2 <= 0109 and w_act <= wn raises ValueError.110- Run the contract test offline: python3111 scripts/test_pitch_bandwidth_criteria.py (35 tests, deterministic,112 passes in under a second).113114## Pitfalls115116- Treating the level boundaries as universal: the 3.5/2.5 rad/s bandwidth117 floors and 0.2 s phase-delay limit are representative Category A values118 and are class dependent in MIL-STD-1797A; recheck class and category119 against the current revision before a certification-grade verdict,120 especially when the computed metrics sit near a boundary.121- Reading omega_GM6 = None as zero: the -6 dB gain crossing counts only when122 it sits at or beyond the -180 degree crossing; the low-frequency crossing123 of the normalized response never limits bandwidth and is reported None, so124 None means 'not bandwidth limiting', not a 0 rad/s limit.125- Computing tau_p without omega_180: the phase delay is read from the126 unwrapped phase at twice the -180 degree frequency and is None when127 omega_180 does not exist; evaluating the formula at an arbitrary frequency128 gives a meaningless number.129- Ignoring the w_act > wn constraint: an actuator lag at or below the short130 period frequency is rejected (ValueError), and a marginally separated131 w_act distorts the high-frequency phase that sets omega_180 and tau_p.132- Trusting principal phase without unwrapping: crossings are located on the133 numerically unwrapped phase table with bisection refinement; wrapping134 artifacts around -180 degrees would shift omega_180 and the phase delay.135136## Related leaves137138- flight-mechanics/handling-qualities/mil-std-1797a: the modal level139 table companion criterion from the same standard; this leaf applies140 the frequency-domain bandwidth method instead of the per-mode tables.141- flight-mechanics/handling-qualities/pilot-induced-oscillation:142 phase-related neighbor for pilot-in-the-loop coupling risk.143- flight-mechanics/handling-qualities/cooper-harper-rating: pilot144 rating scale for the piloted evaluation that complements the level145 verdicts.146- flight-mechanics/stability-control/short-period-mode-analysis: source147 of the short period wn and zeta inputs to the model.148149## Behavior contract (gate 3)150151Run the deterministic contract test (stdlib unittest, offline):152153 python3 scripts/test_pitch_bandwidth_criteria.py154155The test covers the Case A and Case B worked examples against the spec156reference numbers within tolerance, the lightly damped and low157frequency trends, the gain margin branch (very low wn), the unwrapped158phase helper and its consistency with the branch-corrected analytic159phase, the bisection root finder on reachable and unreachable targets,160magnitude versus transfer self consistency, the Level 1/2/3 verdict161boundaries and missing metric reporting, and ValueError rejection of162non-physical parameters and frequencies.163164## Compliance165166- Standards referenced, not reproduced: MIL-STD-1797A section 4.5.1167 frames the bandwidth and phase-delay criterion. The level boundaries168 coded in this leaf are representative Category A values and are class169 dependent in the standard, so verify them against the current170 revision before a certification-grade assessment. The transfer model171 and relations above are standard engineering methodology,172 summary-only per standards-map.yaml.173- compliance: STANDARDS-REF, gated: false.