FA-69501 / Orbital propagation / Open access
State vector from classical elements: Perifocal radial velocity has the wrong sign · case 01
The spacecraft flies its orbit backwards in the radial direction.
ROOT CAUSE
The P component of velocity is +k sin(nu).
VERIFIED REPAIR
Use -k sin(nu).
Unsuccessful approach: Replacing it with -k cos(nu) mixes the transverse term into the radial one.
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] | [[-3920.2985, 4672.0298, 3311.4335], [-6.6532971, 1.9576355, 3.1362711]] | [[-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] | [[-6553.1233, -4502.8986, 3974.0188], [1.0537375, 3.2963455, -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] | [[4456.1689, -4211.3181, -12476.7753], [-1.5998364, 3.7711722, -3.558305]] | [[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] | [[-381.3488, -7970.4999, 2220.0855], [2.7565346, 4.9471354, -4.5089095]] | [[-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] | [[-6475.5994, -5263.8249, -12931.4731], [0.2131056, -6.614634, 0.4255621]] | [[-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] | [[3283.3574, 4039.2189, -5902.3182], [6.601428, 1.838874, -1.1511407]] | [[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] | [[11037.7999, -8186.9522, 3548.3256], [1.1090739, 3.7069284, -2.2188728]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Failed |
SHA-256 / 48142a5c23df47b4dbd24579bae6d2678c878e0b2d15bd8b57f045cc61166253
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*math.cos(nu))
rp=[r*math.cos(nu),r*math.sin(nu),0.0]
k=math.sqrt(mu/p)
vp=[-k*math.cos(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.5586876, -7.365148, -1.1233619]] | [[-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] | [[-6553.1233, -4502.8986, 3974.0188], [1.4494058, 2.2092559, -3.1557772]] | [[-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] | [[4456.1689, -4211.3181, -12476.7753], [0.3823037, -1.1159111, 1.6142695]] | [[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] | [[-381.3488, -7970.4999, 2220.0855], [2.0812246, 7.2639567, -4.1774158]] | [[-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] | [[-6475.5994, -5263.8249, -12931.4731], [2.2132327, -5.8269863, 4.4197237]] | [[-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] | [[3283.3574, 4039.2189, -5902.3182], [5.802476, -2.9739612, 6.8179919]] | [[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] | [[11037.7999, -8186.9522, 3548.3256], [-3.3667999, 6.0364483, -3.0946566]] | [[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]] | Failed |
SHA-256 / c4e8c1b45f21a26da136431d33ab33877a6fc90ec87b97f63a3521909c236142
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:11.934008+00:00.
Case digest / 29766c7fb552425765530c87d234af4cceedafae2418092fef2fc34de78e12f3