FA-69751 / Orbital propagation / Open access
Clohessy-Wiltshire relative motion: Along-track velocity couples into radial motion with the wrong sign · case 01
A prograde burn appears to lower the chaser.
ROOT CAUSE
The x equation subtracts 2/n (1-cos nt) vy0.
VERIFIED REPAIR
Add 2/n (1-cos nt) vy0.
Unsuccessful approach: Using (1+cos nt) keeps the right sign but the wrong phase.
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/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, 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.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, 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.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.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 [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]), ('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.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, 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.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, 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])]]
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, 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] | 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, 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.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0] | [2.404865, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | Failed |
| 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] | [4.217884, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | Failed |
| 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 / 641e976d67f79b173face0f2f8c2a9e733e53212b1abb33a81a98f5f4bbcd261
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+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, 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.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, 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.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.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 [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]), ('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.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, 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.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, 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])]]
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, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0] | [2.147165, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0] | 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, 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.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0] | [1.313956, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05] | Failed |
| 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] | [-3.782116, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0] | Failed |
| 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 / 7551a391d04905f1620cb6ae442ff1f07dbb3249e9587e88f997985c2b46d05a
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, 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.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, 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.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.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 [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]), ('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.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, 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.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, 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])]]
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, 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.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, 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.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 / c80bd0d994e14e165a4e8e3a659da25009e8b8e01705659357de8a253ac8dee7
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.374137+00:00.
Case digest / d689cedaed22280d030e751ead7eda9db6b294905354cf03a21e1ac196b4a290