FA-69511 / Orbital propagation / Open access
State vector from classical elements: Conic radius uses 1 - e cos nu · case 01
Periapsis and apoapsis distances are swapped.
ROOT CAUSE
The orbit equation denominator has the wrong sign.
VERIFIED REPAIR
Use r = p/(1+e cos nu).
Unsuccessful approach: Treating p as the semi-major axis inserts an extra 1-e^2.
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,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] | [[-3988.7932, 4753.6587, 3369.2902], [-5.8519873, -4.8671157, 0.0180033]] | [[-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] | [[-5361.6463, -3684.1897, 3251.47], [2.9260598, -1.8478178, 5.4659665]] | [[-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] | [[3383.6223, -3197.7041, -9473.7646], [1.3065909, -3.3947954, 4.0262806]] | [[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] | [[-453.663, -9481.9242, 2641.0743], [4.6015157, -1.3825381, -5.4145672]] | [[-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] | [[-35217.1157, -28626.9608, -70326.9549], [0.8127286, -6.3785031, 1.6229816]] | [[-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] | [[2988.6686, 3676.6897, -5372.5717], [6.1750334, -0.7296993, 3.1019243]] | [[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] | [[6003.1747, -4452.6722, 1929.8428], [3.0254103, 2.7095491, -1.8439078]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Failed |
SHA-256 / a16e081709e7d3172b5e9c1ce7f5733104b987cb5094c6bc26b237403e7caf3a
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=[math.radians(t) for t in (i,raan,w,nu)]
r=p*(1-e*e)/(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] | [[-3919.9064, 4671.5626, 3311.1023], [-5.8519873, -4.8671157, 0.0180033]] | [[-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] | [[-6290.9983, -4322.7826, 3815.0581], [2.9260598, -1.8478178, 5.4659665]] | [[-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] | [[3743.1819, -3537.5072, -10480.4913], [1.3065909, -3.3947954, 4.0262806]] | [[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] | [[-377.5353, -7890.7949, 2197.8846], [4.6015157, -1.3825381, -5.4145672]] | [[-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] | [[-3302.5557, -2684.5507, -6595.0513], [0.8127286, -6.3785031, 1.6229816]] | [[-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] | [[3275.149, 4029.1208, -5887.5624], [6.1750334, -0.7296993, 3.1019243]] | [[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] | [[10044.3979, -7450.1265, 3228.9763], [3.0254103, 2.7095491, -1.8439078]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Failed |
SHA-256 / 918ec347f64ed9429f0295d2808b75e2eec9fbf0b8060853fa788321315443b7
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.062993+00:00.
Case digest / fba256f5a8e89b420d666568a5d023c4fbff12a9ebcacaac584ba70e533b1ad7