Cruise Performance Flight Test (flight-test-operations/performance/cruise-performance-flight-test)
Use when you must plan and reduce a cruise performance flight test
that measures fuel flow versus Mach number at constant altitude to
build the flight-test range performance curve: schedule the level
cruise test points across a Mach sweep with stabilized fuel-flow runs,
correct each measured fuel flow from the test weight to the reference
weight with the square-root weight correction, convert the corrected
fuel flow and the true airspeed into the range performance of each
point, fit a quadratic curve of range performance versus Mach by
ordinary least squares, and read off the maximum range cruise Mach and
the long range cruise speed. This leaf reduces MEASURED fuel-flow runs
from a dedicated cruise test; the analytic neighbors
flight-mechanics/performance/specific-range and breguet-range compute
cruise results from models instead, and level-acceleration-test and
engine-flight-test cover the other performance flight tests.
Domain quick reference
- ISA speed of sound: a = sqrt(gamma * R * T), gamma = 1.4, R = 287.05
J/(kg K); T = 288.15 - 0.0065 h below 11 km and T = 216.65 K in the
isothermal stratosphere. True airspeed: V = M * a.
- Square-root weight correction: Wf_corr = Wf_measured *
sqrt(W_ref / W_test). This is a documented engineering approximation
valid for small weight differences at constant Mach and altitude,
where induced drag dominates the cruise drag balance; it removes the
test-weight effect so all runs reduce to one reference weight.
- Range performance at a point: rp = V_tas / Wf_corr (distance per
unit fuel mass).
- Curve fit: rp(M) = c2M^2 + c1M + c0 fitted by ordinary least
squares (normal equations, 3x3 Gaussian elimination inside the
module; no external solver).
- Maximum range cruise Mach: M_mrc = -c1 / (2*c2), the parabola vertex,
reported only when c2 < 0 (downward-bowed data).
- Long range cruise Mach: the larger root of c2M^2 + c1M + c0 =
LRC_FRACTION * rp_max with LRC_FRACTION = 0.99, the faster Mach at
which range performance falls to 99 percent of its maximum. It must
sit above M_mrc (ordering verdict "lrc-faster").
- Units are SI throughout: m, s, kg, kg/s, m/s.
Workflow
- Build the test card with plan_test_matrix: the Mach sweep at the
cruise altitude, one stabilized run per Mach, with a linear
test-weight ramp from the start weight to the end weight across the
sweep (each run burns fuel).
- Fly the level stabilized runs and record wf_measured_kg_s, w_test_kg
and altitude_m per point at each Mach.
- Correct every measured fuel flow to the reference weight with
corrected_fuel_flow (weight_correction_factor gives the factor).
- Convert each point with range_performance using the true airspeed
from tas_from_mach (isa_speed_of_sound for the altitude).
- Reduce the whole set with reduce_cruise_test(points, w_ref) to get
the point table, the fitted coefficients, max_rp_mach, max_rp,
lrc_mach, residuals, and the reduction verdict.
- Confirm the ordering with verify_speed_ordering(max_rp_mach,
lrc_mach): the long range cruise speed is the faster 99 percent
point.
- Confirm the deterministic checks with the contract test.
Worked example
Reference W_ref = 200000 kg at 10668 m (a = 296.51 m/s), seven
stabilized runs across the Mach sweep 0.72 to 0.84 with test weights
ramping 209000 kg down to 197000 kg. The measured fuel-flow table is
built from an exact quadratic model rp(M) = 90 - 6000*(M - 0.8)^2, so
the reduction recovers it exactly.
- At M = 0.80, W_test = 201000 kg: V = 0.8 * 296.51 = 237.21 m/s, the
model gives rp = 90, Wf_corr = 237.21 / 90 = 2.6357 kg/s, and the
correction factor sqrt(201000 / 200000) = 1.00250, so
Wf_measured = 2.6423 kg/s. corrected_fuel_flow(2.6423, 201000,
- returns 2.6357 kg/s.
- reduce_cruise_test on the fixture returns max_rp_mach = 0.800000
(within 1e-6), max_rp = 90.0, coefficients c2 = -6000.0, c1 =
+9600.0, c0 = -3750.0 (within 1e-3), since 90 - 6000*(M - 0.8)^2 =
-6000M^2 + 9600M - 3750. Vertex M = -9600 / (2 * -6000) = 0.8.
- Long range cruise: solve -6000M^2 + 9600M - 3750 = 0.99 * 90 =
89.1; discriminant 21600, roots 0.78775 and 0.81225, so lrc_mach =
0.81225 (exact fitted root 0.812247), the larger root.
verify_speed_ordering(0.8, 0.81225) = "lrc-faster".
- Residuals are all below 1e-9 (noise-free parabola) and the verdict
is "maximum-found".
- Sanity case: range performance linear in Mach gives c2 near zero and
a "no-maximum" verdict with no reported vertex or LRC Mach.
Pitfalls
- Comparing raw fuel flows across runs at different test weights: the
reduction works on flows corrected to W_ref with the sqrt(W_test /
W_ref) factor (2.6423 kg/s at 201000 kg reduces to 2.6357 kg/s at
200000 kg), so un-corrected values mask the Mach trend.
- Reading the LRC Mach as the smaller parabola root: solving the 0.99 *
max equation gives roots 0.78775 and 0.81225, and lrc_mach is the
larger root 0.81225, the faster cruise point.
- Reporting a maximum where none exists: when range performance is
linear in Mach the quadratic coefficient goes to zero and the verdict
is "no-maximum" with no vertex or LRC Mach reported, not a fitted
corner.
- Fitting on too few or duplicate points: fewer than 3 points and
duplicate Mach values raise ValueError, as do negative altitude or
Mach, non-positive weights, non-positive fuel flow, and Mach outside
(0.3, 1.0).
- Forgetting the speed-of-sound basis of the reduction: V = M * a uses
the local speed of sound (296.51 m/s at 10668 m, 340.29 m/s at sea
level), so a wrong a shifts every specific-range point.
- Trusting the vertex without the residual check: on the noise-free
fixture the fit recovers the exact model (residuals below 1e-9) and
the verdict is "maximum-found"; real data needs the same verdict
logic rather than an eyeballed peak.
Verification
- Confirm isa_speed_of_sound returns 340.29 m/s at sea level and
296.51 m/s at 10668 m (within 0.1).
- Confirm corrected_fuel_flow(2.6423, 201000, 200000) returns 2.6357
kg/s within 1e-3 and that range_performance(237.21, 237.21/90.0)
returns 90 within 1e-6 (the exact-model round trip).
- Confirm the reduction recovers vertex 0.8, max 90, coefficients
-6000/9600/-3750, and the LRC root 0.81225, with residuals below
1e-9.
- Confirm the round trip: measured flow built as Wf_corr *
sqrt(W_test/W_ref) reduces back to exactly Wf_corr at every point.
- Confirm every non-physical input raises ValueError: negative
altitude or Mach, non-positive weights, non-positive fuel flow,
fewer than 3 points, duplicate Mach, Mach outside (0.3, 1.0).
- Run the contract test offline: python3
scripts/test_cruise_performance_flight_test.py (35 tests,
deterministic).
Related leaves
- flight-mechanics/performance/specific-range: analytic range
performance and fuel economy calculation, the model counterpart of
this measured-data reduction.
- flight-mechanics/performance/breguet-range: analytic cruise range
from the Breguet equation.
- flight-test-operations/performance/level-acceleration-test: the
accelerated level flight test that shares the cruise condition.
- flight-test-operations/performance/engine-flight-test: installed
thrust and fuel flow verification at altitude.
- flight-test-operations/performance/climb-performance-flight-test:
the climb side of the performance flight test campaign.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_cruise_performance_flight_test.py
The test covers the ISA speed of sound anchors at 0 m and 10668 m, the
true airspeed conversion, the weight correction factor and its inverse
round trip, the worked-example corrected fuel flow anchor, the range
performance conversion, the full fixture reduction (vertex 0.8, max
90, coefficients -6000/9600/-3750, LRC root, residuals below 1e-9,
point-table entries, verdicts), the linear-data no-maximum sanity
case, the test-card weight ramp from plan_test_matrix, the fixture
inverse-build consistency, and ValueError rejection of non-physical
inputs.
Compliance
- Standards referenced, not reproduced: FAR 25 and CS 25 frame the
cruise performance context for transport category airplanes
(performance and flight test data requirements); the relations above
are standard flight-test engineering methodology, summary-only per
standards-map.yaml. No verbatim regulatory text.
- compliance: STANDARDS-REF, gated: false.
1---2name: cruise-performance-flight-test3description: Use when you must plan and reduce a cruise performance flight test: schedule level cruise points across a Mach sweep at constant altitude with stabilized fuel flow runs, correct measured fuel flow from the test weight to the reference weight with the square-root weight correction, convert corrected fuel flow and true airspeed into range performance, fit a quadratic range performance curve versus Mach, and read off the maximum range cruise Mach at the vertex and the long range cruise speed at the 99 percent point. Produces the corrected fuel flow table, the fitted curve, the maximum range cruise Mach, the long range cruise Mach, and verdicts gating the cruise fuel economy flight test assessment. Trigger: cruise performance flight test, fuel flow versus Mach, Mach sweep at altitude, maximum range cruise speed, long range cruise speed.4license: Apache-2.05---67# Cruise Performance Flight Test (flight-test-operations/performance/cruise-performance-flight-test)89Use when you must plan and reduce a cruise performance flight test10that measures fuel flow versus Mach number at constant altitude to11build the flight-test range performance curve: schedule the level12cruise test points across a Mach sweep with stabilized fuel-flow runs,13correct each measured fuel flow from the test weight to the reference14weight with the square-root weight correction, convert the corrected15fuel flow and the true airspeed into the range performance of each16point, fit a quadratic curve of range performance versus Mach by17ordinary least squares, and read off the maximum range cruise Mach and18the long range cruise speed. This leaf reduces MEASURED fuel-flow runs19from a dedicated cruise test; the analytic neighbors20flight-mechanics/performance/specific-range and breguet-range compute21cruise results from models instead, and level-acceleration-test and22engine-flight-test cover the other performance flight tests.2324## Domain quick reference2526- ISA speed of sound: a = sqrt(gamma * R * T), gamma = 1.4, R = 287.0527 J/(kg K); T = 288.15 - 0.0065 h below 11 km and T = 216.65 K in the28 isothermal stratosphere. True airspeed: V = M * a.29- Square-root weight correction: Wf_corr = Wf_measured *30 sqrt(W_ref / W_test). This is a documented engineering approximation31 valid for small weight differences at constant Mach and altitude,32 where induced drag dominates the cruise drag balance; it removes the33 test-weight effect so all runs reduce to one reference weight.34- Range performance at a point: rp = V_tas / Wf_corr (distance per35 unit fuel mass).36- Curve fit: rp(M) = c2*M^2 + c1*M + c0 fitted by ordinary least37 squares (normal equations, 3x3 Gaussian elimination inside the38 module; no external solver).39- Maximum range cruise Mach: M_mrc = -c1 / (2*c2), the parabola vertex,40 reported only when c2 < 0 (downward-bowed data).41- Long range cruise Mach: the larger root of c2*M^2 + c1*M + c0 =42 LRC_FRACTION * rp_max with LRC_FRACTION = 0.99, the faster Mach at43 which range performance falls to 99 percent of its maximum. It must44 sit above M_mrc (ordering verdict "lrc-faster").45- Units are SI throughout: m, s, kg, kg/s, m/s.4647## Workflow48491. Build the test card with plan_test_matrix: the Mach sweep at the50 cruise altitude, one stabilized run per Mach, with a linear51 test-weight ramp from the start weight to the end weight across the52 sweep (each run burns fuel).532. Fly the level stabilized runs and record wf_measured_kg_s, w_test_kg54 and altitude_m per point at each Mach.553. Correct every measured fuel flow to the reference weight with56 corrected_fuel_flow (weight_correction_factor gives the factor).574. Convert each point with range_performance using the true airspeed58 from tas_from_mach (isa_speed_of_sound for the altitude).595. Reduce the whole set with reduce_cruise_test(points, w_ref) to get60 the point table, the fitted coefficients, max_rp_mach, max_rp,61 lrc_mach, residuals, and the reduction verdict.626. Confirm the ordering with verify_speed_ordering(max_rp_mach,63 lrc_mach): the long range cruise speed is the faster 99 percent64 point.657. Confirm the deterministic checks with the contract test.6667## Worked example6869Reference W_ref = 200000 kg at 10668 m (a = 296.51 m/s), seven70stabilized runs across the Mach sweep 0.72 to 0.84 with test weights71ramping 209000 kg down to 197000 kg. The measured fuel-flow table is72built from an exact quadratic model rp(M) = 90 - 6000*(M - 0.8)^2, so73the reduction recovers it exactly.7475- At M = 0.80, W_test = 201000 kg: V = 0.8 * 296.51 = 237.21 m/s, the76 model gives rp = 90, Wf_corr = 237.21 / 90 = 2.6357 kg/s, and the77 correction factor sqrt(201000 / 200000) = 1.00250, so78 Wf_measured = 2.6423 kg/s. corrected_fuel_flow(2.6423, 201000,79 200000) returns 2.6357 kg/s.80- reduce_cruise_test on the fixture returns max_rp_mach = 0.80000081 (within 1e-6), max_rp = 90.0, coefficients c2 = -6000.0, c1 =82 +9600.0, c0 = -3750.0 (within 1e-3), since 90 - 6000*(M - 0.8)^2 =83 -6000*M^2 + 9600*M - 3750. Vertex M = -9600 / (2 * -6000) = 0.8.84- Long range cruise: solve -6000*M^2 + 9600*M - 3750 = 0.99 * 90 =85 89.1; discriminant 21600, roots 0.78775 and 0.81225, so lrc_mach =86 0.81225 (exact fitted root 0.812247), the larger root.87 verify_speed_ordering(0.8, 0.81225) = "lrc-faster".88- Residuals are all below 1e-9 (noise-free parabola) and the verdict89 is "maximum-found".90- Sanity case: range performance linear in Mach gives c2 near zero and91 a "no-maximum" verdict with no reported vertex or LRC Mach.9293## Pitfalls9495- Comparing raw fuel flows across runs at different test weights: the96 reduction works on flows corrected to W_ref with the sqrt(W_test /97 W_ref) factor (2.6423 kg/s at 201000 kg reduces to 2.6357 kg/s at98 200000 kg), so un-corrected values mask the Mach trend.99- Reading the LRC Mach as the smaller parabola root: solving the 0.99 *100 max equation gives roots 0.78775 and 0.81225, and lrc_mach is the101 larger root 0.81225, the faster cruise point.102- Reporting a maximum where none exists: when range performance is103 linear in Mach the quadratic coefficient goes to zero and the verdict104 is "no-maximum" with no vertex or LRC Mach reported, not a fitted105 corner.106- Fitting on too few or duplicate points: fewer than 3 points and107 duplicate Mach values raise ValueError, as do negative altitude or108 Mach, non-positive weights, non-positive fuel flow, and Mach outside109 (0.3, 1.0).110- Forgetting the speed-of-sound basis of the reduction: V = M * a uses111 the local speed of sound (296.51 m/s at 10668 m, 340.29 m/s at sea112 level), so a wrong a shifts every specific-range point.113- Trusting the vertex without the residual check: on the noise-free114 fixture the fit recovers the exact model (residuals below 1e-9) and115 the verdict is "maximum-found"; real data needs the same verdict116 logic rather than an eyeballed peak.117118## Verification119120- Confirm isa_speed_of_sound returns 340.29 m/s at sea level and121 296.51 m/s at 10668 m (within 0.1).122- Confirm corrected_fuel_flow(2.6423, 201000, 200000) returns 2.6357123 kg/s within 1e-3 and that range_performance(237.21, 237.21/90.0)124 returns 90 within 1e-6 (the exact-model round trip).125- Confirm the reduction recovers vertex 0.8, max 90, coefficients126 -6000/9600/-3750, and the LRC root 0.81225, with residuals below127 1e-9.128- Confirm the round trip: measured flow built as Wf_corr *129 sqrt(W_test/W_ref) reduces back to exactly Wf_corr at every point.130- Confirm every non-physical input raises ValueError: negative131 altitude or Mach, non-positive weights, non-positive fuel flow,132 fewer than 3 points, duplicate Mach, Mach outside (0.3, 1.0).133- Run the contract test offline: python3134 scripts/test_cruise_performance_flight_test.py (35 tests,135 deterministic).136137## Related leaves138139- flight-mechanics/performance/specific-range: analytic range140 performance and fuel economy calculation, the model counterpart of141 this measured-data reduction.142- flight-mechanics/performance/breguet-range: analytic cruise range143 from the Breguet equation.144- flight-test-operations/performance/level-acceleration-test: the145 accelerated level flight test that shares the cruise condition.146- flight-test-operations/performance/engine-flight-test: installed147 thrust and fuel flow verification at altitude.148- flight-test-operations/performance/climb-performance-flight-test:149 the climb side of the performance flight test campaign.150151## Behavior contract (gate 3)152153Run the deterministic contract test (stdlib unittest, offline):154155 python3 scripts/test_cruise_performance_flight_test.py156157The test covers the ISA speed of sound anchors at 0 m and 10668 m, the158true airspeed conversion, the weight correction factor and its inverse159round trip, the worked-example corrected fuel flow anchor, the range160performance conversion, the full fixture reduction (vertex 0.8, max16190, coefficients -6000/9600/-3750, LRC root, residuals below 1e-9,162point-table entries, verdicts), the linear-data no-maximum sanity163case, the test-card weight ramp from plan_test_matrix, the fixture164inverse-build consistency, and ValueError rejection of non-physical165inputs.166167## Compliance168169- Standards referenced, not reproduced: FAR 25 and CS 25 frame the170 cruise performance context for transport category airplanes171 (performance and flight test data requirements); the relations above172 are standard flight-test engineering methodology, summary-only per173 standards-map.yaml. No verbatim regulatory text.174- compliance: STANDARDS-REF, gated: false.