FAILURE MAP
← Case archive

FA-69551 / Orbital propagation / Open access

Velocity Verlet two-body propagation: Velocity kick uses only the new acceleration · case 01

The scheme becomes first order and energy drifts.

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

ROOT CAUSE

The velocity update applies h*a_new rather than the average of old and new accelerations.

VERIFIED REPAIR

Kick with h*(a+a_new)/2.

Unsuccessful approach: Halving the new-acceleration kick loses the old-acceleration half.

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]+h*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 fixtureActualExpectedOutcome
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12][5592.07041, 4186.229181, -4.513954, 5.903176, -29.450329][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][4129.10128, 6545.942265, -5.612464, 5.207957, -22.191247][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][-6524.091104, 6788.920813, -4.054048, -4.132252, -25.578716][-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.641811, -0.189197, 0.619967, -1.080337, -0.718765][-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.50136, 0.416525, 0.008929, -0.648172, -0.431717][-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.067752, -0.612278, 1.43327, 0.498214, -0.472098][-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][6113.905992, 3309.219948, -3.415234, 6.522103, -30.234972][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Failed

SHA-256 / e07077f7f306be15ec9cd953e6cf479fefff491d4d0fdcc2a95086f6d137ff80

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*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 fixtureActualExpectedOutcome
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12][6260.607029, 4352.308444, -2.136853, 6.815866, -26.765656][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][5567.332846, 7134.959103, -2.604349, 7.153238, -15.068437][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][-6998.460447, 8349.511052, -5.312026, -1.468868, -21.399306][-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.172205, 2.06703, -0.48563, 0.42653, -0.273233][-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][-0.743146, 4.149143, -0.375148, 0.666582, 0.055296][-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.711517, -0.834374, 0.664171, -0.500959, -0.565905][-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][6263.909725, 3355.907136, -2.239398, 6.971486, -29.283331][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Failed

SHA-256 / 35350f597fc4792673800e9c1b3b6afffff41dce63dcf4b912bf097fe21d2b40

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

Case digest / 9dbc3ef88ae629f14ae4870f7ae73d5c4285bb398d91dd045dd59a6c438662f6