FA-69566 / Orbital propagation / Open access
Velocity Verlet two-body propagation: Initial acceleration is evaluated at the velocity vector · case 01
The first step is kicked in a nonsensical direction.
ROOT CAUSE
The seed acceleration is computed from v0 rather than r0.
VERIFIED REPAIR
Seed a from the initial position.
Unsuccessful approach: Seeding with zero acceleration drops the first half-kick.
Case contract
Input [r0, v0, mu, T, steps]; planar two-body. Velocity Verlet with h=T/steps: p += h v + h^2 a/2; a_new = a(p); v += h (a + a_new)/2; carry a_new. Return final [x,y,vx,vy] rounded to 6 plus specific energy v^2/2-mu/|r| rounded to 6.
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):
r0,v0,mu,T,steps=x
h=T/steps
def acc(q):
rr=(q[0]**2+q[1]**2)**1.5
return [-mu*q[0]/rr,-mu*q[1]/rr]
p=list(r0); v=list(v0)
a=acc(v)
for _ in range(steps):
p=[p[i]+h*v[i]+0.5*h*h*a[i] for i in range(2)]
an=acc(p)
v=[v[i]+0.5*h*(a[i]+an[i]) for i in range(2)]
a=an
en=(v[0]**2+v[1]**2)/2-mu/math.sqrt(p[0]**2+p[1]**2)
return [round(c,6) for c in p+v]+[round(en,6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489])], [('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856])], [('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038])]]
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 |
|---|---|---|---|
| velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12] | [7000.0, -104996955.432144, -0.0, -174994.92572, 15311612013.900763] | [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856] | Failed |
| velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20] | [6999.999999, -111710812.925911, -0.0, -124123.125473, 7703275138.605796] | [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351] | Failed |
| velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15] | [485548051.268468, -62642361.453996, 404623.376057, -52209.467878, 83222952493.97086] | [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038] | Failed |
| velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30] | [-0.81798, -0.095962, 0.171091, -1.141326, -0.548248] | [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988] | Failed |
| velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25] | [-1.726075, 0.677555, -0.21992, -0.568659, -0.353419] | [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826] | Failed |
| velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10] | [-0.27633, -0.460077, 1.648662, 0.149654, -0.493056] | [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962] | Failed |
| velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6] | [7859888.911826, -52828670.861378, 26176.963039, -176099.569538, 15848145892.680258] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489] | Failed |
SHA-256 / 863d98aaf44103099f7508d76f07b38a9cd4e79dd451374bb7b7783ee2d7055a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
r0,v0,mu,T,steps=x
h=T/steps
def acc(q):
rr=(q[0]**2+q[1]**2)**1.5
return [-mu*q[0]/rr,-mu*q[1]/rr]
p=list(r0); v=list(v0)
a=[0.0,0.0]
for _ in range(steps):
p=[p[i]+h*v[i]+0.5*h*h*a[i] for i in range(2)]
an=acc(p)
v=[v[i]+0.5*h*(a[i]+an[i]) for i in range(2)]
a=an
en=(v[0]**2+v[1]**2)/2-mu/math.sqrt(p[0]**2+p[1]**2)
return [round(c,6) for c in p+v]+[round(en,6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489])], [('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856])], [('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038])]]
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 |
|---|---|---|---|
| velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12] | [5722.255492, 4227.95803, -4.277817, 6.070259, -28.450547] | [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856] | Failed |
| velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20] | [4295.819446, 6641.558172, -5.439032, 5.441651, -20.796152] | [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351] | Failed |
| velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15] | [-6625.382286, 7038.802897, -4.260001, -3.896333, -24.570905] | [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038] | Failed |
| velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30] | [-0.958456, 0.35547, -0.296908, -0.933229, -0.498699] | [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988] | Failed |
| velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25] | [-1.84678, 1.644678, -0.450977, -0.248155, -0.271892] | [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826] | Failed |
| velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10] | [-0.281394, -0.749274, 1.301335, -0.088641, -0.398755] | [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962] | Failed |
| velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6] | [6175.017655, 3328.898502, -3.213991, 6.630095, -29.675955] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489] | Failed |
SHA-256 / 945d808c3aab81d1f7e5d7db5d09f71538e7fab879e2d90a3252fad492967066
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
r0,v0,mu,T,steps=x
h=T/steps
def acc(q):
rr=(q[0]**2+q[1]**2)**1.5
return [-mu*q[0]/rr,-mu*q[1]/rr]
p=list(r0); v=list(v0)
a=acc(p)
for _ in range(steps):
p=[p[i]+h*v[i]+0.5*h*h*a[i] for i in range(2)]
an=acc(p)
v=[v[i]+0.5*h*(a[i]+an[i]) for i in range(2)]
a=an
en=(v[0]**2+v[1]**2)/2-mu/math.sqrt(p[0]**2+p[1]**2)
return [round(c,6) for c in p+v]+[round(en,6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489])], [('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856])], [('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038])]]
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 |
|---|---|---|---|
| velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12] | [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856] | [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856] | Passed |
| velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20] | [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351] | [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351] | Passed |
| velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15] | [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038] | [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038] | Passed |
| velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30] | [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988] | [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988] | Passed |
| velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25] | [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826] | [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826] | Passed |
| velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10] | [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962] | [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962] | Passed |
| velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489] | Passed |
SHA-256 / 1f28a6014b215676f2f2a79a2e1707b4fc1e7dcaa1cf29a1bf9e877a2fdbeb0c
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.582338+00:00.
Case digest / b6cfd79d617049f37b0b525b91843492d64156b77faf44dfae977edcaba98193