FA-69641 / Orbital propagation / Open access
Hohmann transfer budget: Transfer semi-major axis is the sum of radii · case 01
Transfer orbit is twice too large.
ROOT CAUSE
a is taken as r1+r2 instead of the mean.
VERIFIED REPAIR
Use (r1+r2)/2.
Unsuccessful approach: The geometric mean is not the ellipse semi-major axis.
Case contract
Input [r1, r2, mu] circular radii. Transfer a=(r1+r2)/2; burn 1 = |v_peri - v_circ1|, burn 2 = |v_circ2 - v_apo| using vis-viva at each end; time of flight is half the transfer period. Works inward (r2<r1) too. Return [dv1, dv2, total] rounded 6 and tof rounded 3.
Why this case matters
Orbit determination and mission planning chain many small conversions; one wrong branch or unit silently moves a spacecraft by kilometres.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
r1,r2,mu=x
at=r1+r2
v1=math.sqrt(mu/r1); v2=math.sqrt(mu/r2)
vp=math.sqrt(mu*(2/r1-1/at)); va=math.sqrt(mu*(2/r2-1/at))
dv1=abs(vp-v1); dv2=abs(v2-va)
tof=math.pi*math.sqrt(at**3/mu)
return [round(dv1,6),round(dv2,6),round(dv1+dv2,6),round(tof,3)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624])], [('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53])], [('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454])], [('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624])], [('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hohmann transfer budget [7000.0, 7500.0, 398600.4418] | [1.7489, 1.586968, 3.335868, 8688.264] | [0.129002, 0.126795, 0.255797, 3071.765] | Failed |
| hohmann transfer budget [1.0, 1.524, 1.0] | [0.266414, 0.14711, 0.413523, 12.597] | [0.098912, 0.088971, 0.187883, 4.454] | Failed |
| hohmann transfer budget [6778.0, 6778.0, 398600.4418] | [1.723487, 1.723487, 3.446973, 7853.773] | [0.0, 0.0, 0.0, 2776.728] | Failed |
| hohmann transfer budget [10000.0, 7000.0, 398600.4418] | [1.188052, 1.963876, 3.151928, 11029.463] | [0.58409, 0.638791, 1.222881, 3899.504] | Failed |
| hohmann transfer budget [7000.0, 8000.0, 398600.4418] | [1.798061, 1.489807, 3.287869, 9141.509] | [0.247477, 0.239347, 0.486825, 3232.011] | Failed |
| hohmann transfer budget [8000.0, 7000.0, 398600.4418] | [1.489807, 1.798061, 3.287869, 9141.509] | [0.239347, 0.247477, 0.486825, 3232.011] | Failed |
| hohmann transfer budget [1.0, 1.2, 1.0] | [0.243163, 0.188093, 0.431256, 10.251] | [0.044466, 0.042483, 0.086949, 3.624] | Failed |
SHA-256 / 16da4a5b7a22ed327da470141dd07ce68f713a6ca49e1ea0ce0821073c3a7901
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
r1,r2,mu=x
at=math.sqrt(r1*r2)
v1=math.sqrt(mu/r1); v2=math.sqrt(mu/r2)
vp=math.sqrt(mu*(2/r1-1/at)); va=math.sqrt(mu*(2/r2-1/at))
dv1=abs(vp-v1); dv2=abs(v2-va)
tof=math.pi*math.sqrt(at**3/mu)
return [round(dv1,6),round(dv2,6),round(dv1+dv2,6),round(tof,3)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624])], [('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53])], [('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454])], [('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624])], [('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hohmann transfer budget [7000.0, 7500.0, 398600.4418] | [0.12687, 0.129079, 0.255949, 3069.025] | [0.129002, 0.126795, 0.255797, 3071.765] | Failed |
| hohmann transfer budget [1.0, 1.524, 1.0] | [0.090852, 0.101315, 0.192167, 4.309] | [0.098912, 0.088971, 0.187883, 4.454] | Failed |
| hohmann transfer budget [6778.0, 6778.0, 398600.4418] | [0.0, 0.0, 0.0, 2776.728] | [0.0, 0.0, 0.0, 2776.728] | Passed |
| hohmann transfer budget [10000.0, 7000.0, 398600.4418] | [0.649717, 0.592987, 1.242704, 3808.066] | [0.58409, 0.638791, 1.222881, 3899.504] | Failed |
| hohmann transfer budget [7000.0, 8000.0, 398600.4418] | [0.239871, 0.248041, 0.487912, 3221.232] | [0.247477, 0.239347, 0.486825, 3232.011] | Failed |
| hohmann transfer budget [8000.0, 7000.0, 398600.4418] | [0.248041, 0.239871, 0.487912, 3221.232] | [0.239347, 0.247477, 0.486825, 3232.011] | Failed |
| hohmann transfer budget [1.0, 1.2, 1.0] | [0.042655, 0.044657, 0.087312, 3.602] | [0.044466, 0.042483, 0.086949, 3.624] | Failed |
SHA-256 / f2b0dca7a66d6ef90f6d1c20380426442809826df89baa1f13740d1896a6ccf0
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
r1,r2,mu=x
at=(r1+r2)/2
v1=math.sqrt(mu/r1); v2=math.sqrt(mu/r2)
vp=math.sqrt(mu*(2/r1-1/at)); va=math.sqrt(mu*(2/r2-1/at))
dv1=abs(vp-v1); dv2=abs(v2-va)
tof=math.pi*math.sqrt(at**3/mu)
return [round(dv1,6),round(dv2,6),round(dv1+dv2,6),round(tof,3)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624])], [('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53])], [('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454])], [('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624])], [('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hohmann transfer budget [7000.0, 7500.0, 398600.4418] | [0.129002, 0.126795, 0.255797, 3071.765] | [0.129002, 0.126795, 0.255797, 3071.765] | Passed |
| hohmann transfer budget [1.0, 1.524, 1.0] | [0.098912, 0.088971, 0.187883, 4.454] | [0.098912, 0.088971, 0.187883, 4.454] | Passed |
| hohmann transfer budget [6778.0, 6778.0, 398600.4418] | [0.0, 0.0, 0.0, 2776.728] | [0.0, 0.0, 0.0, 2776.728] | Passed |
| hohmann transfer budget [10000.0, 7000.0, 398600.4418] | [0.58409, 0.638791, 1.222881, 3899.504] | [0.58409, 0.638791, 1.222881, 3899.504] | Passed |
| hohmann transfer budget [7000.0, 8000.0, 398600.4418] | [0.247477, 0.239347, 0.486825, 3232.011] | [0.247477, 0.239347, 0.486825, 3232.011] | Passed |
| hohmann transfer budget [8000.0, 7000.0, 398600.4418] | [0.239347, 0.247477, 0.486825, 3232.011] | [0.239347, 0.247477, 0.486825, 3232.011] | Passed |
| hohmann transfer budget [1.0, 1.2, 1.0] | [0.044466, 0.042483, 0.086949, 3.624] | [0.044466, 0.042483, 0.086949, 3.624] | Passed |
SHA-256 / 515df430ed12a3665f5af58e948392f2a189fc8ac94f14e799664e72ef961e89
Verification & scope
A deterministic toy two-body model with stipulated constants and conventions; not flight dynamics software or a validated SGP4 implementation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:13.228570+00:00.
Case digest / 3618280d8067ac10dfd3037288a2bb8b962bc4aa5fe808a5eff43969f4664e92