FAILURE MAP
← Case archive

FA-69836 / Orbital propagation / Open access

Hyperbolic departure from a parking orbit: Turn angle is half its value · case 01

Flyby bending is underestimated by half.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

delta is asin(1/e) without the factor two.

VERIFIED REPAIR

Use 2 asin(1/e).

Unsuccessful approach: Using 2 acos(1/e) returns the supplementary geometry.

Case contract

Input [r, vinf, mu]: circular parking radius and required hyperbolic excess speed. Periapsis speed vp=sqrt(vinf^2+2mu/r); burn dv=vp-sqrt(mu/r); eccentricity e=1+r vinf^2/mu; turn angle delta=2 asin(1/e) in degrees. Return [vp, dv, e rounded 6, delta rounded 4].

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):
    r,vinf,mu=x
    vp=math.sqrt(vinf*vinf+2*mu/r)
    dv=vp-math.sqrt(mu/r)
    e=1+r*vinf*vinf/mu
    delta=math.degrees(math.asin(1/e))
    return [round(vp,6),round(dv,6),round(e,6),round(delta,4)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853])], [('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792])], [('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0])], [('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0])], [('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565])]]
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 fixtureActualExpectedOutcome
hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418][11.330366, 3.604526, 1.150783, 60.3396][11.330366, 3.604526, 1.150783, 120.6792]Failed
hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418][10.937422, 3.211582, 1.004188, 84.7651][10.937422, 3.211582, 1.004188, 169.5303]Failed
hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418][12.242787, 4.696734, 1.632212, 37.7825][12.242787, 4.696734, 1.632212, 75.565]Failed
hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418][4.59969, 1.525023, 1.238005, 53.8768][4.59969, 1.525023, 1.238005, 107.7536]Failed
hyperbolic departure from a parking orbit [1.0, 1.0, 1.0][1.732051, 0.732051, 2.0, 30.0][1.732051, 0.732051, 2.0, 60.0]Failed
hyperbolic departure from a parking orbit [2.0, 0.3, 1.0][1.044031, 0.336924, 1.18, 57.9362][1.044031, 0.336924, 1.18, 115.8724]Failed
hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418][15.562519, 7.778176, 2.996832, 19.4926][15.562519, 7.778176, 2.996832, 38.9853]Failed

SHA-256 / 43cace94c212bf7443d4ba559abd32ef6d1867a135ea7765025bafc4fd4ba4ce

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,vinf,mu=x
    vp=math.sqrt(vinf*vinf+2*mu/r)
    dv=vp-math.sqrt(mu/r)
    e=1+r*vinf*vinf/mu
    delta=math.degrees(2*math.acos(1/e))
    return [round(vp,6),round(dv,6),round(e,6),round(delta,4)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853])], [('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792])], [('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0])], [('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0])], [('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565])]]
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 fixtureActualExpectedOutcome
hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418][11.330366, 3.604526, 1.150783, 59.3208][11.330366, 3.604526, 1.150783, 120.6792]Failed
hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418][10.937422, 3.211582, 1.004188, 10.4697][10.937422, 3.211582, 1.004188, 169.5303]Failed
hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418][12.242787, 4.696734, 1.632212, 104.435][12.242787, 4.696734, 1.632212, 75.565]Failed
hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418][4.59969, 1.525023, 1.238005, 72.2464][4.59969, 1.525023, 1.238005, 107.7536]Failed
hyperbolic departure from a parking orbit [1.0, 1.0, 1.0][1.732051, 0.732051, 2.0, 120.0][1.732051, 0.732051, 2.0, 60.0]Failed
hyperbolic departure from a parking orbit [2.0, 0.3, 1.0][1.044031, 0.336924, 1.18, 64.1276][1.044031, 0.336924, 1.18, 115.8724]Failed
hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418][15.562519, 7.778176, 2.996832, 141.0147][15.562519, 7.778176, 2.996832, 38.9853]Failed

SHA-256 / edaa02657f7c23d779707833627f1eafdbd7744abe990c59fd3e596cc6c0557a

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,vinf,mu=x
    vp=math.sqrt(vinf*vinf+2*mu/r)
    dv=vp-math.sqrt(mu/r)
    e=1+r*vinf*vinf/mu
    delta=math.degrees(2*math.asin(1/e))
    return [round(vp,6),round(dv,6),round(e,6),round(delta,4)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853])], [('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792])], [('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0])], [('hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418]', [42164.0, 1.5, 398600.4418], [4.59969, 1.525023, 1.238005, 107.7536]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565]), ('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0])], [('hyperbolic departure from a parking orbit [1.0, 1.0, 1.0]', [1.0, 1.0, 1.0], [1.732051, 0.732051, 2.0, 60.0]), ('hyperbolic departure from a parking orbit [2.0, 0.3, 1.0]', [2.0, 0.3, 1.0], [1.044031, 0.336924, 1.18, 115.8724]), ('hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418]', [6578.0, 11.0, 398600.4418], [15.562519, 7.778176, 2.996832, 38.9853]), ('hyperbolic departure from a parking orbit [1.0, 0.0, 1.0]', [1.0, 0.0, 1.0], [1.414214, 0.414214, 1.0, 180.0]), ('hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418]', [6678.0, 3.0, 398600.4418], [11.330366, 3.604526, 1.150783, 120.6792]), ('hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418]', [6678.0, 0.5, 398600.4418], [10.937422, 3.211582, 1.004188, 169.5303]), ('hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418]', [7000.0, 6.0, 398600.4418], [12.242787, 4.696734, 1.632212, 75.565])]]
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 fixtureActualExpectedOutcome
hyperbolic departure from a parking orbit [6678.0, 3.0, 398600.4418][11.330366, 3.604526, 1.150783, 120.6792][11.330366, 3.604526, 1.150783, 120.6792]Passed
hyperbolic departure from a parking orbit [6678.0, 0.5, 398600.4418][10.937422, 3.211582, 1.004188, 169.5303][10.937422, 3.211582, 1.004188, 169.5303]Passed
hyperbolic departure from a parking orbit [7000.0, 6.0, 398600.4418][12.242787, 4.696734, 1.632212, 75.565][12.242787, 4.696734, 1.632212, 75.565]Passed
hyperbolic departure from a parking orbit [42164.0, 1.5, 398600.4418][4.59969, 1.525023, 1.238005, 107.7536][4.59969, 1.525023, 1.238005, 107.7536]Passed
hyperbolic departure from a parking orbit [1.0, 1.0, 1.0][1.732051, 0.732051, 2.0, 60.0][1.732051, 0.732051, 2.0, 60.0]Passed
hyperbolic departure from a parking orbit [2.0, 0.3, 1.0][1.044031, 0.336924, 1.18, 115.8724][1.044031, 0.336924, 1.18, 115.8724]Passed
hyperbolic departure from a parking orbit [6578.0, 11.0, 398600.4418][15.562519, 7.778176, 2.996832, 38.9853][15.562519, 7.778176, 2.996832, 38.9853]Passed

SHA-256 / a660df3c29dafa74ead4391cd4a2c171faedf30600a8b571d39378b1631f3524

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:15.162667+00:00.

Case digest / 05c52827d24facdd654492b415a3a654e4718984f97c3ee33750b3a26c5e2fe0