FA-69761 / Orbital propagation / Open access
Clohessy-Wiltshire relative motion: Cross-track velocity term lacks the 1/n scale · case 01
Out-of-plane excursions are scaled by the mean motion.
ROOT CAUSE
z uses sin(nt) vz0 instead of sin(nt)/n vz0.
VERIFIED REPAIR
Use sin(nt)/n vz0.
Unsuccessful approach: A linear vz0 t term ignores the out-of-plane oscillation.
Case contract
Input [x0,y0,z0,vx0,vy0,vz0,n,t] with x radial, y along-track, z cross-track about a circular reference orbit of mean motion n. Return [x,y,z,vx,vy,vz] from the closed-form HCW solution, 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):
x0,y0,z0,vx,vy,vz,n,t=x
s=math.sin(n*t); c=math.cos(n*t)
X=(4-3*c)*x0+s/n*vx+2/n*(1-c)*vy
Y=6*(s-n*t)*x0+y0-2/n*(1-c)*vx+(4*s-3*n*t)/n*vy
Z=c*z0+s*vz
VX=3*n*s*x0+c*vx+2*s*vy
VY=6*n*(c-1)*x0-2*s*vx+(4*c-3)*vy
VZ=-n*s*z0+c*vz
return [round(q,6) for q in (X,Y,Z,VX,VY,VZ)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0])], [('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0] | [0.0, 0.0, -0.317807, 0.0, -0.0, -0.000563] | [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563] | Failed |
| clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0] | [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0] | [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | Passed |
| clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0] | [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0] | [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0] | Passed |
| clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0] | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] | Passed |
SHA-256 / cc19b176c45beb136a19fcceec7b6d68663ee14cba7a609714a5e616baec64b5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
x0,y0,z0,vx,vy,vz,n,t=x
s=math.sin(n*t); c=math.cos(n*t)
X=(4-3*c)*x0+s/n*vx+2/n*(1-c)*vy
Y=6*(s-n*t)*x0+y0-2/n*(1-c)*vx+(4*s-3*n*t)/n*vy
Z=c*z0+vz*t
VX=3*n*s*x0+c*vx+2*s*vy
VY=6*n*(c-1)*x0-2*s*vx+(4*c-3)*vy
VZ=-n*s*z0+c*vz
return [round(q,6) for q in (X,Y,Z,VX,VY,VZ)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0])], [('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0] | [0.0, 0.0, 0.082039, 0.0, -0.0, -0.000563] | [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563] | Failed |
| clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0] | [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0] | [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | Passed |
| clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0] | [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0] | [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0] | Passed |
| clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0] | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] | Passed |
SHA-256 / 8d6c538298a7881bb7fe686e19f8c4de4f735b80acc6089ca50956413dcbd4fa
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
x0,y0,z0,vx,vy,vz,n,t=x
s=math.sin(n*t); c=math.cos(n*t)
X=(4-3*c)*x0+s/n*vx+2/n*(1-c)*vy
Y=6*(s-n*t)*x0+y0-2/n*(1-c)*vx+(4*s-3*n*t)/n*vy
Z=c*z0+s/n*vz
VX=3*n*s*x0+c*vx+2*s*vy
VY=6*n*(c-1)*x0-2*s*vx+(4*c-3)*vy
VZ=-n*s*z0+c*vz
return [round(q,6) for q in (X,Y,Z,VX,VY,VZ)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0])], [('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0] | [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563] | [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563] | Passed |
| clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0] | [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0] | [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | Passed |
| clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0] | [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0] | [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0] | Passed |
| clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | Passed |
| clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0] | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] | Passed |
SHA-256 / 3e01beca76a2253d7ded8eaa6990ec2c0365dfd3210a19cd918c19242333060c
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:14.462245+00:00.
Case digest / 12f5cb11d0fc4887937dabe84c153f8313d497fae1161b928c5dc793bed2a078