FAILURE MAP
← Case archive

FA-69506 / Orbital propagation / Open access

State vector from classical elements: Velocity scale uses the current radius · case 01

Speeds are wrong everywhere except on circular orbits.

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

ROOT CAUSE

The perifocal velocity scale is sqrt(mu/r) instead of sqrt(mu/p).

VERIFIED REPAIR

Scale by sqrt(mu/p).

Unsuccessful approach: Scaling by sqrt(mu/a) treats the semilatus rectum as a semi-major axis.

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/r)
    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 fixtureActualExpectedOutcome
state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418][[-3920.2985, 4672.0298, 3311.4335], [-5.8772725, -4.8881455, 0.0180811]][[-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], [2.7759041, -1.7529938, 5.1854711]][[-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.213929, -3.1540407, 3.7407417]][[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], [4.7966305, -1.4411609, -5.6441573]][[-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], [1.0563489, -8.2904972, 2.1094799]][[-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.0282224, -0.7123508, 3.0281763]][[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], [2.5394669, 2.2743395, -1.5477381]][[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]Failed

SHA-256 / 5270a2a0b7289e178737a92af630cf1fec7623183c3306d1409326100cf08136

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*(1-e*e)/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 fixtureActualExpectedOutcome
state vector from classical elements [7000, 0.01, 28.5, 40, 60, 30, 398600.4418][[-3920.2985, 4672.0298, 3311.4335], [-5.8516947, -4.8668723, 0.0180024]][[-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], [2.8669414, -1.8104843, 5.3555315]][[-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.1975103, -3.1113814, 3.6901471]][[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], [4.5784503, -1.3756081, -5.3874264]][[-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.5804043, -4.5551624, 1.1590407]][[-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.1673098, -0.7287866, 3.0980445]][[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], [2.8860575, 2.5847451, -1.7589759]][[11037.7999, -8186.9522, 3548.3256], [3.0254103, 2.7095491, -1.8439078]]Failed

SHA-256 / cd72515806c6c1df0670ff1ba066c7144c3ed46dc1a4e1b24f88fab2802cb7fc

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

Case digest / b9c05ab04a3ed439dcf02aa290b9077d45ecc2de3832ab8d0ba80c3cc9b6a3ef