Validation
Checking the model against something other than itself
A tool that agrees with itself has proved nothing. Every quantity below is computed twice, by methods that share no code, and the two answers are put side by side. The comparison runs on every build and fails it on disagreement.
The independent implementations live in a separate module that imports nothing from the engine, restates the physical constants rather than sharing them, and reaches each answer by a different route: closed forms replaced by numerical solutions, composed rotations replaced by explicit matrices, a fixed time grid replaced by random sampling. Where an external fact exists, such as a published orbital period, the check is anchored to that instead.
This is not a comparison against full-fidelity tooling. It shows the arithmetic is right, not that the model is complete. The model still has no J2 drift, no drag, no real ephemerides, no beam patterns and no capacity, andthe method page lists what that costs you.
1. Orbital period, against published values
The engine works in mean motion. This computes the period from Kepler's third law and compares it with the figures published for circular orbits at these altitudes.
| Altitude | Kepler | Published | Difference |
|---|---|---|---|
| 420 km | 92.82 min | 92.8 min | 0.02 min |
| 550 km | 95.50 min | 95.6 min | 0.10 min |
| 780 km | 100.30 min | 100.4 min | 0.10 min |
| 1200 km | 109.27 min | 109.4 min | 0.13 min |
2. Coverage half-angle, algebra against arithmetic
The engine uses a closed form. This solves the same question by placing a satellite and a site as three-dimensional vectors, computing the elevation between them directly, and bisecting on the separation until the elevation equals the mask. No half-angle formula is involved.
| Case | Closed form | Bisection | Difference |
|---|---|---|---|
| 400 km, mask 10° | 12.084592° | 12.084592° | below 1e-6° |
| 520 km, mask 25° | 8.079178° | 8.079178° | below 1e-6° |
| 780 km, mask 25° | 11.152305° | 11.152305° | below 1e-6° |
| 1200 km, mask 40° | 9.862304° | 9.862304° | below 1e-6° |
| 1500 km, mask 5° | 31.259466° | 31.259466° | below 1e-6° |
3. The geometric horizon
With a zero mask the coverage circle reduces to the geometric horizon, where the line of sight is tangent to the sphere. That has its own short closed form, which the general expression has to reproduce exactly.
| Altitude | General formula at 0° | Tangent horizon | Difference |
|---|---|---|---|
| 420 km | 20.256273° | 20.256273° | exact |
| 520 km | 22.401019° | 22.401019° | exact |
| 800 km | 27.322189° | 27.322189° | exact |
| 1400 km | 34.930919° | 34.930919° | exact |
4. Coverage fraction, fixed steps against random sampling
The engine measures coverage on a fixed grid of times, and a fixed grid can alias against a periodic system. This estimates the same quantity from 20,000 times and longitudes drawn at random, using the independent propagator. Agreement inside the sampling error means the step is not biasing the answer.
| Configuration | Engine | Random sampling | Difference | Sampling error |
|---|---|---|---|---|
| 12 sats, 520 km, 53°, lat 50° | 13.70% | 13.69% | 0.00 pp | ±0.48 pp |
| 48 sats, 520 km, 53°, lat 50° | 54.07% | 54.27% | 0.20 pp | ±0.69 pp |
| 22 sats, 550 km, 97.5°, lat 60° | 30.57% | 30.70% | 0.13 pp | ±0.64 pp |
Sampling error is the 95% confidence half-width for a proportion at this sample size. Random draws use a seeded generator, so the figures are reproducible.
5. Satellite positions
The engine composes its rotation inline; the independent version multiplies named matrices in the standard sequence. Across 144 sampled positions spanning three altitudes, four planes and a range of times, the largest disagreement is below one nanometre, which is floating-point noise rather than a difference.
6. How much the time step costs
Not a cross-check but a measurement. The site quotes figures sampled at 20 second steps and states they are stable to roughly one step. This computes a reference at 5 seconds and shows what each coarser step actually does to the answer, so that claim is measured rather than asserted.
| Fleet | Step | Worst outage | Error against 5 s reference |
|---|---|---|---|
| 12 sats | 10 s | 1750 s | +5 s |
| 20 s | 1760 s | +15 s | |
| 40 s | 1760 s | +15 s | |
| 60 s | 1800 s | +55 s | |
| 48 sats | 10 s | 340 s | none |
| 20 s | 340 s | none | |
| 40 s | 360 s | +20 s | |
| 60 s | 360 s | +20 s |
The highlighted rows are the step the site publishes.
What is still missing
The comparison worth having, and the one not here, is against full-fidelity tooling with J2 drift and drag enabled. Two-body propagation in a package like GMAT would agree with this engine almost exactly, because it is the same physics, and would prove only that the arithmetic is right, which the checks above already show. The valuable number is how far the simplification moves the answer once perturbations are switched on. Until that exists, treat everything here as geometry done correctly rather than as coverage predicted accurately.