FAILURE MAP
← Case archive

FA-69661 / Orbital propagation / Open access

Orbit energy classification: Kinetic energy lacks the one-half factor · case 01

Many bound orbits are classified as escaping.

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

ROOT CAUSE

eps uses v^2 instead of v^2/2.

VERIFIED REPAIR

Use v^2/2 - mu/r.

Unsuccessful approach: Halving the potential term instead still mis-scales energy.

Case contract

Input [r, v, mu, tol]. eps=v^2/2-mu/r. Parabolic when |eps|<=tol*mu/r, else elliptic (eps<0) or hyperbolic. a=-mu/(2 eps) (None if parabolic), escape speed sqrt(2mu/r), v_inf=sqrt(2 eps) for hyperbolic else None. Return [kind, a rounded 3, vesc rounded 6, vinf rounded 6].

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,v,mu,tol=x
    eps=v*v-mu/r
    if abs(eps)<=tol*mu/r: kind='parabolic'
    elif eps<0: kind='elliptic'
    else: kind='hyperbolic'
    a=None if kind=='parabolic' else round(-mu/(2*eps),3)
    vesc=math.sqrt(2*mu/r)
    vinf=round(math.sqrt(2*eps),6) if kind=='hyperbolic' else None
    return [kind,a,round(vesc,6),vinf]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214])], [('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787])], [('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566])], [('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None])]]
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
orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]['elliptic', 287623.603, 10.671731, None]['elliptic', 6915.843, 10.671731, None]Failed
orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]['hyperbolic', -3338.525, 10.671731, 10.926763]['hyperbolic', -144726.71, 10.671731, 1.659566]Failed
orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]['hyperbolic', -3502.272, 10.671731, 10.668269]['elliptic', 10790332.769, 10.671731, None]Failed
orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]['hyperbolic', -3500.565, 10.671731, 10.670869]['parabolic', None, 10.671731, None]Failed
orbit energy classification [1.0, 1.4142, 1.0, 0.001]['hyperbolic', -0.5, 1.414214, 1.414186]['parabolic', None, 1.414214, None]Failed
orbit energy classification [1.0, 1.0, 1.0, 0.001]['parabolic', None, 1.414214, None]['elliptic', 1.0, 1.414214, None]Failed
orbit energy classification [1.0, 2.0, 1.0, 0.001]['hyperbolic', -0.167, 1.414214, 2.44949]['hyperbolic', -0.5, 1.414214, 1.414214]Failed

SHA-256 / 1e04d2612db1fc9352cd1314196d65790cbe2d29c9c15951ffd59f5f18265d8c

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,v,mu,tol=x
    eps=v*v/2-mu/(2*r)
    if abs(eps)<=tol*mu/r: kind='parabolic'
    elif eps<0: kind='elliptic'
    else: kind='hyperbolic'
    a=None if kind=='parabolic' else round(-mu/(2*eps),3)
    vesc=math.sqrt(2*mu/r)
    vinf=round(math.sqrt(2*eps),6) if kind=='hyperbolic' else None
    return [kind,a,round(vesc,6),vinf]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214])], [('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787])], [('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566])], [('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None])]]
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
orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]['elliptic', 575247.206, 10.671731, None]['elliptic', 6915.843, 10.671731, None]Failed
orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]['hyperbolic', -6677.051, 10.671731, 7.726389]['hyperbolic', -144726.71, 10.671731, 1.659566]Failed
orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]['hyperbolic', -7004.544, 10.671731, 7.543605]['elliptic', 10790332.769, 10.671731, None]Failed
orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]['hyperbolic', -7001.131, 10.671731, 7.545444]['parabolic', None, 10.671731, None]Failed
orbit energy classification [1.0, 1.4142, 1.0, 0.001]['hyperbolic', -1.0, 1.414214, 0.999981]['parabolic', None, 1.414214, None]Failed
orbit energy classification [1.0, 1.0, 1.0, 0.001]['parabolic', None, 1.414214, None]['elliptic', 1.0, 1.414214, None]Failed
orbit energy classification [1.0, 2.0, 1.0, 0.001]['hyperbolic', -0.333, 1.414214, 1.732051]['hyperbolic', -0.5, 1.414214, 1.414214]Failed

SHA-256 / 1489202d169ab6a9082e17276d9a60f21f74069a4f3dbf9b7f73571a6feb68b6

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,v,mu,tol=x
    eps=v*v/2-mu/r
    if abs(eps)<=tol*mu/r: kind='parabolic'
    elif eps<0: kind='elliptic'
    else: kind='hyperbolic'
    a=None if kind=='parabolic' else round(-mu/(2*eps),3)
    vesc=math.sqrt(2*mu/r)
    vinf=round(math.sqrt(2*eps),6) if kind=='hyperbolic' else None
    return [kind,a,round(vesc,6),vinf]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214])], [('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787])], [('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566])], [('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None])]]
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
orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]['elliptic', 6915.843, 10.671731, None]['elliptic', 6915.843, 10.671731, None]Passed
orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]['hyperbolic', -144726.71, 10.671731, 1.659566]['hyperbolic', -144726.71, 10.671731, 1.659566]Passed
orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]['elliptic', 10790332.769, 10.671731, None]['elliptic', 10790332.769, 10.671731, None]Passed
orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]['parabolic', None, 10.671731, None]['parabolic', None, 10.671731, None]Passed
orbit energy classification [1.0, 1.4142, 1.0, 0.001]['parabolic', None, 1.414214, None]['parabolic', None, 1.414214, None]Passed
orbit energy classification [1.0, 1.0, 1.0, 0.001]['elliptic', 1.0, 1.414214, None]['elliptic', 1.0, 1.414214, None]Passed
orbit energy classification [1.0, 2.0, 1.0, 0.001]['hyperbolic', -0.5, 1.414214, 1.414214]['hyperbolic', -0.5, 1.414214, 1.414214]Passed

SHA-256 / 522ca6956a93a13e74b3af46a74f14625af10d100b8b691f51b8938a4e5d792a

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

Case digest / 55c86d9573c855826d32df9ad7f9db4b61e7b5a8a34ff7adac2ef58db30ade1d