FAILURE MAP
← Case archive

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.

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

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

Case digest / fba256f5a8e89b420d666568a5d023c4fbff12a9ebcacaac584ba70e533b1ad7