FA-69561 / Orbital propagation / Open access
Velocity Verlet two-body propagation: Final energy uses the initial radius · case 01
Energy diagnostics hide integration drift because the potential never changes.
ROOT CAUSE
The potential term is evaluated at r0 instead of the propagated position.
VERIFIED REPAIR
Evaluate the potential at the final position.
Unsuccessful approach: Averaging the initial and final radii still mixes epochs.
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(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(r0[0]**2+r0[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.480047] | [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] | [4100.742247, 6612.678063, -5.690094, 5.333971, -26.528713] | [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] | [-6596.602558, 6758.244077, -4.170275, -4.186438, -26.830212] | [-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.993552, 0.151005, -0.14987, -0.983712, -0.504925] | [-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] | [-2.100327, 1.143517, -0.394254, -0.35669, -0.858668] | [-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.160223, -0.731051, 1.375248, 0.033556, 0.313762] | [-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] | [6111.297912, 3317.130164, -3.439136, 6.583207, -30.142625] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489] | Failed |
SHA-256 / 71517ab95d1d61a831e3638553dd7740b52ec4a418f03ff851a1c15fd772db77
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=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)+math.sqrt(r0[0]**2+r0[1]**2))/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.475952] | [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] | [4100.742247, 6612.678063, -5.690094, 5.333971, -23.520042] | [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] | [-6596.602558, 6758.244077, -4.170275, -4.186438, -25.764064] | [-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.993552, 0.151005, -0.14987, -0.983712, -0.50245] | [-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] | [-2.100327, 1.143517, -0.394254, -0.35669, -0.448388] | [-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.160223, -0.731051, 1.375248, 0.033556, 0.087679] | [-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] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.940854] | [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489] | Failed |
SHA-256 / e47face79172e60572a18c816938b7ffc3ccd12f9bdd0e2ca43d761e176e3182
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.581185+00:00.
Case digest / 18bfa22bdb31c98a9e1e16376811b2e7bcd0da79c8cde798c4777761300221fc