FA-69516 / Orbital propagation / Open access
State vector from classical elements: True anomaly is left in degrees · case 01
Positions are scattered around the orbit.
ROOT CAUSE
Only inclination, RAAN and argp are converted to radians.
VERIFIED REPAIR
Convert all four angles.
Unsuccessful approach: Converting with pi/360 halves every angle.
Case contract
Input [p, e, i, raan, argp, nu, mu] (km, degrees). Perifocal position r=p/(1+e cos nu)[cos nu, sin nu, 0] and velocity sqrt(mu/p)[-sin nu, e+cos nu, 0] are rotated to the inertial frame by R3(-raan)R1(-i)R3(-argp). Return [r rounded 4, v rounded 7].
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):
p,e,i,raan,w,nu,mu=x
i,raan,w=[math.radians(t) for t in (i,raan,w)]
r=p/(1+e*math.cos(nu))
rp=[r*math.cos(nu),r*math.sin(nu),0.0]
k=math.sqrt(mu/p)
vp=[-k*math.sin(nu),k*(e+math.cos(nu)),0.0]
cO,sO,cw,sw,ci,si=math.cos(raan),math.sin(raan),math.cos(w),math.sin(w),math.cos(i),math.sin(i)
R=[[cO*cw-sO*sw*ci,-cO*sw-sO*cw*ci,sO*si],
[sO*cw+cO*sw*ci,-sO*sw+cO*cw*ci,-cO*si],
[sw*si,cw*si,ci]]
rv=[sum(R[j][q]*rp[q] for q in range(3)) for j in range(3)]
vv=[sum(R[j][q]*vp[q] for q in range(3)) for j in range(3)]
return [[round(c,4) for c in rv],[round(c,7) for c in vv]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]])], [('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]])], [('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]]), ('state vector from classical elements [6800, 0.001, 45, 0, 0, 0, 398600.4418]', [6800, 0.001, 45, 0, 0, 0, 398600.4418], [[6793.2068, 0.0, 0.0], [0.0, 5.4191792, 5.4191792]]), ('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]])], [('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [6800, 0.001, 45, 0, 0, 0, 398600.4418]', [6800, 0.001, 45, 0, 0, 0, 398600.4418], [[6793.2068, 0.0, 0.0], [0.0, 5.4191792, 5.4191792]]), ('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]])], [('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]])]]
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 |
|---|---|---|---|
| state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418] | [[6417.2218, 2494.7121, -1202.0226], [-1.9640661, 6.4703118, 3.3766544]] | [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]] | Failed |
| state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418] | [[-4611.3588, 990.6175, -5008.4672], [-6.0994255, -4.1728548, 3.6645591]] | [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]] | Failed |
| state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418] | [[5368.6251, -7727.163, -5591.1454], [-0.1200678, -1.6200662, 6.503554]] | [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]] | Failed |
| state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418] | [[-3502.0742, 9051.598, 2368.2809], [-3.1498129, -2.4821775, 4.4575186]] | [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]] | Failed |
| state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418] | [[20647.218, 42936.9895, 41231.5417], [-0.9816158, 0.1663694, -1.9602414]] | [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]] | Failed |
| state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418] | [[5992.5775, -1290.5708, 4003.7468], [-4.4015184, -3.6140883, 4.8408509]] | [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]] | Failed |
| state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418] | [[-7691.1075, 1322.3109, 19.2401], [-1.8243912, -6.7953723, 4.0466119]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Failed |
SHA-256 / 64d74d57180e9a51c9607125e5e479d1f8ccb4bb7f8a52ab50112d3a13149d1e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
p,e,i,raan,w,nu,mu=x
i,raan,w,nu=[t*math.pi/360 for t in (i,raan,w,nu)]
r=p/(1+e*math.cos(nu))
rp=[r*math.cos(nu),r*math.sin(nu),0.0]
k=math.sqrt(mu/p)
vp=[-k*math.sin(nu),k*(e+math.cos(nu)),0.0]
cO,sO,cw,sw,ci,si=math.cos(raan),math.sin(raan),math.cos(w),math.sin(w),math.cos(i),math.sin(i)
R=[[cO*cw-sO*sw*ci,-cO*sw-sO*cw*ci,sO*si],
[sO*cw+cO*sw*ci,-sO*sw+cO*cw*ci,-cO*si],
[sw*si,cw*si,ci]]
rv=[sum(R[j][q]*rp[q] for q in range(3)) for j in range(3)]
vv=[sum(R[j][q]*vp[q] for q in range(3)) for j in range(3)]
return [[round(c,4) for c in rv],[round(c,7) for c in vv]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]])], [('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]])], [('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]]), ('state vector from classical elements [6800, 0.001, 45, 0, 0, 0, 398600.4418]', [6800, 0.001, 45, 0, 0, 0, 398600.4418], [[6793.2068, 0.0, 0.0], [0.0, 5.4191792, 5.4191792]]), ('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]])], [('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [6800, 0.001, 45, 0, 0, 0, 398600.4418]', [6800, 0.001, 45, 0, 0, 0, 398600.4418], [[6793.2068, 0.0, 0.0], [0.0, 5.4191792, 5.4191792]]), ('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]])], [('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]])]]
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 |
|---|---|---|---|
| state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418] | [[2981.617, 6141.7156, 1206.7404], [-6.8400125, 3.081437, 1.3295272]] | [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]] | Failed |
| state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418] | [[2797.0324, -6640.0935, -989.106], [6.4053635, 1.9708955, -4.1073053]] | [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]] | Failed |
| state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418] | [[8629.6954, -11321.029, 6314.891], [4.3416445, -0.4378333, -2.0610547]] | [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]] | Failed |
| state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418] | [[5654.4665, -7002.9269, -4270.0232], [4.623633, 3.8103641, -0.5282093]] | [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]] | Failed |
| state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418] | [[3586.8323, -14158.534, 4616.853], [6.0265166, 0.3589473, -2.7886473]] | [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]] | Failed |
| state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418] | [[-6691.994, 1313.1734, 3276.0392], [-3.6444692, -3.3700501, -5.2647237]] | [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]] | Failed |
| state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418] | [[8837.9636, -3305.0983, -2436.2988], [3.8700614, 5.452909, -0.9056903]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Failed |
SHA-256 / 8a7efb3da50ea3a3b60ddd258f56b0d35cd2030fb89f7a58dd2fbfd61f39c54e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
p,e,i,raan,w,nu,mu=x
i,raan,w,nu=[math.radians(t) for t in (i,raan,w,nu)]
r=p/(1+e*math.cos(nu))
rp=[r*math.cos(nu),r*math.sin(nu),0.0]
k=math.sqrt(mu/p)
vp=[-k*math.sin(nu),k*(e+math.cos(nu)),0.0]
cO,sO,cw,sw,ci,si=math.cos(raan),math.sin(raan),math.cos(w),math.sin(w),math.cos(i),math.sin(i)
R=[[cO*cw-sO*sw*ci,-cO*sw-sO*cw*ci,sO*si],
[sO*cw+cO*sw*ci,-sO*sw+cO*cw*ci,-cO*si],
[sw*si,cw*si,ci]]
rv=[sum(R[j][q]*rp[q] for q in range(3)) for j in range(3)]
vv=[sum(R[j][q]*vp[q] for q in range(3)) for j in range(3)]
return [[round(c,4) for c in rv],[round(c,7) for c in vv]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]])], [('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]])], [('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]]), ('state vector from classical elements [6800, 0.001, 45, 0, 0, 0, 398600.4418]', [6800, 0.001, 45, 0, 0, 0, 398600.4418], [[6793.2068, 0.0, 0.0], [0.0, 5.4191792, 5.4191792]]), ('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]])], [('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [6800, 0.001, 45, 0, 0, 0, 398600.4418]', [6800, 0.001, 45, 0, 0, 0, 398600.4418], [[6793.2068, 0.0, 0.0], [0.0, 5.4191792, 5.4191792]]), ('state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418]', [7000, 0.01, 28.5, 40, 60, 30, 398600.4418], [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]]), ('state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418]', [8000, 0.2, 63.4, 200, 270, 120, 398600.4418], [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]])], [('state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418]', [26000, 0.7, 63.4, 270, 280, 10, 398600.4418], [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]]), ('state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418]', [12000, 0.4, 98.0, 300, 45, 250, 398600.4418], [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]]), ('state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418]', [9000, 0.1, 51.6, 100, 190, 330, 398600.4418], [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]]), ('state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418]', [7500, 0.05, 120.0, 10, 100, 200, 398600.4418], [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]]), ('state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418]', [10000, 0.3, 30.0, 170, 340, 170, 398600.4418], [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]), ('state vector from classical elements [7200, 0.02, 85.0, 250, 20, 280, 398600.4418]', [7200, 0.02, 85.0, 250, 20, 280, 398600.4418], [[-1735.9191, -3185.9581, -6190.1572], [-1.8703175, -6.1223077, 3.8454015]]), ('state vector from classical elements [7000, 0.0, 0.0, 0, 0, 90, 398600.4418]', [7000, 0.0, 0.0, 0, 0, 90, 398600.4418], [[0.0, 7000.0, 0.0], [-7.5460533, 0.0, 0.0]])]]
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 |
|---|---|---|---|
| state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418] | [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]] | [[-3920.2985, 4672.0298, 3311.4335], [-5.8519873, -4.8671157, 0.0180033]] | Passed |
| state vector from classical elements [8000, 0.2, 63.4, 200, 270, 120, 398600.4418] | [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]] | [[-6553.1233, -4502.8986, 3974.0188], [2.9260598, -1.8478178, 5.4659665]] | Passed |
| state vector from classical elements [12000, 0.4, 98.0, 300, 45, 250, 398600.4418] | [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]] | [[4456.1689, -4211.3181, -12476.7753], [1.3065909, -3.3947954, 4.0262806]] | Passed |
| state vector from classical elements [9000, 0.1, 51.6, 100, 190, 330, 398600.4418] | [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]] | [[-381.3488, -7970.4999, 2220.0855], [4.6015157, -1.3825381, -5.4145672]] | Passed |
| state vector from classical elements [26000, 0.7, 63.4, 270, 280, 10, 398600.4418] | [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]] | [[-6475.5994, -5263.8249, -12931.4731], [0.8127286, -6.3785031, 1.6229816]] | Passed |
| state vector from classical elements [7500, 0.05, 120.0, 10, 100, 200, 398600.4418] | [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]] | [[3283.3574, 4039.2189, -5902.3182], [6.1750334, -0.7296993, 3.1019243]] | Passed |
| state vector from classical elements [10000, 0.3, 30.0, 170, 340, 170, 398600.4418] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Passed |
SHA-256 / 20cfeb349e6cc6241a263f39c2f17ccb5233a06d4f7c8349815abe11d51a493e
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:12.104677+00:00.
Case digest / 6f95db52e683789e35ed8a499cd16cc147a1448793b2e72011fb03936f46e0c2