Tools › Orbit Visualizer › Validation
Orbit Visualizer Validation — Propagator Accuracy & Methodology
The three propagation models, honestly stated
The Orbit Visualizer offers three per-object propagators. Each has a different fidelity, and none is presented as more than it is:
SGP4/SDP4
The operational model used by Space-Track and NORAD two-line element sets, implemented as a faithful port of the published reference algorithm: Vallado, Crawford, Hujsak, and Kelso, “Revisiting Spacetrack Report #3” (AIAA 2006-6753) and Vallado’s reference code distribution. It includes atmospheric drag (B*), zonal harmonics through J4, and the SDP4 deep-space branch: lunar–solar periodics and 12-hour/24-hour geopotential resonance terms, so Molniya, GPS-class, and GEO-class orbits are propagated with the deep-space corrections the model requires.
SGP4/SDP4 (Vallado reference algorithm). Operational TLE propagation; accuracy degrades with TLE age (≈1–3 km at epoch, growing per day).
J2 secular
A first-order analytic model that adds the mean secular drift of the ascending node (Ω), argument of perigee (ω), and mean anomaly caused by Earth’s oblateness (J2 = 1.08262668×10−3, RE = 6378.137 km) on top of a Keplerian ellipse.
J2 secular model: mean RAAN/ω/M drift only — no drag, no higher-order gravity, no resonance effects.
Two-body
The ideal Keplerian ellipse: one central attraction, no perturbations of any kind.
Idealized two-body propagation — educational geometry only; real orbits diverge within hours.
Constants and frames
WGS-72 gravity constants for SGP4
The SGP4 module ships with the WGS-72 constant set (μ = 398600.8 km³/s², RE = 6378.135 km, and the matching J2/J3/J4 values) as its default. That is deliberate: TLEs are fitted by Space-Track against WGS-72 SGP4, and the published verification ephemerides assume it. These constants are intentionally distinct from the WGS-84 values the app uses for display and geodetic math — “harmonizing” them would make SGP4 output less correct.
TEME → J2000, and its accuracy
SGP4 states are natively in the TEME frame (True Equator, Mean Equinox). The visualizer’s scene frame is J2000 (EME2000), so every SGP4 state is rotated through an explicit conversion: IAU-76/FK5 precession (ζ, θ, z polynomials), the IAU-1980 nutation series truncated to its 6 largest terms, and the geometric equation of the equinoxes, per Vallado’s TEME chapter. The truncation leaves arcsecond-level frame error (< ~0.1″ in Δψ) — a few meters at LEO radius, far below SGP4’s own km-level physical accuracy. UTC is used in place of TT (≈69 s in 2026 → ~10−7 rad in the angles). Polar motion and the full IAU-2006/2000A reductions are out of scope.
Earth-fixed products use the standard pairing convention: TEME + GMST → ECEF (Vallado’s approximation, no polar motion); J2000 objects use the same GMST rotation.
SGP4/SDP4 verification against the published reference
The implementation is verified against the published Vallado verification set: the SGP4-VER.TLE element sets and the reference ephemeris output (tcppver.out, WGS-72) distributed with AIAA 2006-6753 via CelesTrak. Expected states are pinned into the repository verbatim from the published output — never computed, estimated, or typed by hand — and the table below is generated directly by the verification harness (dev/run-sgp4-verification.mjs --html).
Acceptance requires every fixture timestep to match the reference within |Δr| ≤ 10−4 km (0.1 m) and |Δv| ≤ 10−6 km/s per component. Measured agreement is around 10−9 km — float rounding, five orders of magnitude inside the tolerance. A separate full-coverage check runs every state row in the published output (33 runs, 666 states) with the same result.
| NORAD | Case category | Steps | max |Δr| (km) | max |Δv| (km/s) | Result |
|---|---|---|---|---|---|
| 00005 | near-earth | 5 | 4.73e-9 | 4.87e-10 | PASS |
| 04632 | deep-space 24-h | 5 | 5.00e-9 | 4.97e-10 | PASS |
| 06251 | near-earth drag | 5 | 4.64e-9 | 4.90e-10 | PASS |
| 08195 | deep-space 12-h resonance | 5 | 4.70e-9 | 4.41e-10 | PASS |
| 09880 | deep-space 12-h resonance | 5 | 4.85e-9 | 4.92e-10 | PASS |
| 11801 | deep-space 12-h resonance | 5 | 4.78e-9 | 4.79e-10 | PASS |
| 14128 | deep-space 24-h (GEO-class) | 5 | 4.85e-9 | 4.36e-10 | PASS |
| 16925 | deep-space low-perigee | 5 | 4.86e-9 | 4.83e-10 | PASS |
| 20413 | deep-space 24-h | 5 | 4.75e-9 | 4.62e-10 | PASS |
| 21897 | deep-space 12-h resonance | 5 | 4.64e-9 | 5.00e-10 | PASS |
| 22312 | near-earth high drag | 5 | 4.82e-9 | 4.63e-10 | PASS |
| 28626 | deep-space 24-h (GEO-class) | 5 | 4.93e-9 | 4.89e-10 | PASS |
| 29238 | near-earth low perigee | 5 | 4.89e-9 | 4.64e-10 | PASS |
| 88888 | near-earth | 5 | 4.32e-9 | 4.78e-10 | PASS |
Case 00005 is the classic Spacetrack Report #3 SGP4 test; 88888 is the original STR#3 near-earth case; 11801 the original SDP4 deep-space case. The 12-hour resonance rows are Molniya-class SDP4 cases; the 24-hour rows exercise the GEO-class synchronous-resonance branch.
Error-code behavior
The reference implementation defines specific error semantics (decayed satellites, out-of-range eccentricity, negative semi-latus rectum). The port must reproduce them — errors surface in the app as object badges, never as silent NaNs:
| NORAD | Published behavior | Expected code | Result |
|---|---|---|---|
| 28350 | mean eccentricity out of range (error 1) under drag decay | 1 | PASS |
| 33333 | semi-latus rectum < 0 (error 4) | 4 | PASS |
| 33334 | perturbed eccentricity out of range (error 3) at epoch | 3 | PASS |
| 28872 | sub-orbital, decays ~55 min after epoch (error 6) | 6 | PASS |
| 29141 | final decay phase, error 6 before 440 min | 6 | PASS |
J2 secular drift-rate checks
The J2 model uses the standard first-order secular rates
(Ω̇ = −1.5 n J2 (RE/p)² cos i,
ω̇ = 0.75 n J2 (RE/p)² (4 − 5 sin²i),
plus the J2 mean-motion correction). Two textbook cases pin the rates — the ISS-class nodal regression and the sun-synchronous design rate of +0.9856°/day — and the ω̇ sign flip across the critical inclination i = 63.43° is asserted. The numbers below are computed live by the same harness from the same module the app runs:
| Case | Expected (°/day) | Computed (°/day) | Result |
|---|---|---|---|
| ISS-class LEO (a=6778 km, e=0.0003, i=51.6°) | -5.00 ± 0.05 | -5.0027 | PASS |
| Sun-synchronous (a=7178 km, e=0.001, i=98.6°) | +0.986 ± 0.010 | 0.9854 | PASS |
| ω̇ sign flip across i = 63.43° (63° vs 64°, a=7000 km) | + / − | 0.110 / -0.141 °/day | PASS |
Reproducing these numbers
Everything on this page is produced by the repository’s verification harness, not typed by hand:
node dev/run-sgp4-verification.mjs— runs all pinned fixture cases and error cases; exits nonzero on any failure. Add--htmlto emit the exact table rows shown above.node dev/check-sgp4-full-tcppver.mjs— full-coverage check against every state row in the published reference output.- In the app itself, open DevTools and run
window.__exoOrbitVizSelfTest()— the same SGP4 fixture subset plus the geodesy, frame, and J2 checks run in your browser.
Verification data provenance: SGP4-VER.TLE and tcppver.out from the AIAA 2006-6753 distribution (CelesTrak), retrieved 2026-07-04; SHA-256 checksums are recorded alongside the pinned fixtures.