Astronomical engine precision

Continuous validation against JPL Horizons and canonical examples from Meeus 1998. Typical errors published here without sugar-coating. This page is updated at every engine release.

Executive summary

The OCSE-Lite (OC Scientific Lunar Engine) implements the analytical series ELP-2000/82B for the Moon, VSOP87D for the Sun, and auxiliary theories (IAU 2000A nutation, Espenak-Meeus 2006 ΔT, Bennett/Saemundsson refraction, WGS84 topocentric parallax). Every release runs through an automated validation suite against two reference datasets:

  • JPL Horizons (NASA / Jet Propulsion Laboratory): seed dataset with 322 points covering 1900-2050, with geocentric and topocentric Moon and Sun positions computed via DE numerical ephemerides.
  • Meeus 1998, Astronomical Algorithms, 2nd ed.: canonical book examples with explicit reference values (Examples 22.a, 25.b, 47.a among others).
Recommended use window: 1900-2100 with typical errors below 30 arcsec on lunar position. Outside that window, precision degrades in a controlled way down to ~arc-min at 4000 BC and 3000 AD via Espenak-Meeus extrapolation.

Typical errors against JPL Horizons

The values below come from test_phase11_jpl_horizons.php, run against the seeds benchmark/data/horizons_moon_seed.csv and horizons_sun_seed.csv. P95 = 95th percentile of the absolute error. Tolerance limits are defined before each run and are not adjusted post-hoc.

Metric Evaluated points P95 measured Max measured Tolerance limit Status
Moon RA (arcsec) 260 23.04 53.65 ≤ 35.00 (P95) / ≤ 60.00 (max) OK
Moon Dec (arcsec) 260 8.22 24.70 ≤ 12.00 (P95) / ≤ 30.00 (max) OK
Moon distance (km) 273 39.84 45.57 ≤ 50 (P95) / ≤ 55 (max) OK
Moon topocentric altitude (arcsec) 13 43.94 43.94 ≤ 60 (P95) / ≤ 75 (max) OK
Moon azimuth (arcsec) 13 15.54 15.54 ≤ 25 (P95) / ≤ 40 (max) OK
Moon illumination (pp points) 272 0.011 0.673 ≤ 0.05 (P95) / ≤ 1.0 (max) OK
Sun RA (arcsec) 49 1.92 2.28 ≤ 5 (P95) / ≤ 8 (max) OK
Sun Dec (arcsec) 49 0.54 0.54 ≤ 2 (P95) / ≤ 3 (max) OK
Sun distance (km) 49 1041.7 1328.5 ≤ 1500 (P95) / ≤ 2000 (max) OK

Total: 322 evaluated points, 9 metrics in parallel, all within tolerance. Result: 9 pass, 0 fail. Engine version: OC Scientific Lunar Engine v2.0.0.

Validation against Meeus 1998

The book Astronomical Algorithms (Jean Meeus, 2nd ed., Willmann-Bell, 1998) provides complete numerical examples for each algorithm. We reproduce the canonical examples:

Meeus example Algorithm Variable Meeus value Engine value Difference
22.a IAU 1980 nutation Δψ −3.788″ −3.788″ ~0″
22.a IAU 1980 nutation Δε +9.443″ +9.443″ ~0″
22.a Mean obliquity ε₀ 23°26′27.407″ 23°26′27.407″ ~0″
25.b VSOP87D Sun λ aparente 199.90988° 199.90611° −13.58″
25.b VSOP87D Sun Distancia 0.99766 AU 0.99760 AU −0.00006 AU
47.a ELP-2000 Moon λ ecliptica 133.162659° 133.162655° −0.02″
47.a ELP-2000 Moon β ecliptica −3.229127° −3.229126° +0.00″
47.a ELP-2000 Moon Distancia 368409.7 km 368409.7 km ~0 km
47.a ELP-2000 Moon Paralaxe horizontal 0.991990° 0.991990° ~0″

The Meeus 47.a example (Moon at 1992-04-12 00:00 TD) reproduces every book value with error below 0.02 arcsec, confirming the fidelity of the ELP-2000/82B series implemented (8467 terms preserved after truncation at 0.0001 arcsec).

Temporal coverage and precision degradation

The engine covers the range 4000 BC – 3000 AD, which is the theoretical limit of the Espenak-Meeus ΔT polynomial. Precision varies with the window:

Window Typical Moon error (arcsec) Typical Sun error (arcsec) Rise/set time error (s)
1980-2030 (high confidence) ~5 ~1 ~3
1900-2100 (useful window) ~10-30 ~2-5 ~5-30
1700-1900 ~30-60 ~5-10 ~30-60
1500-1700 ~60-120 ~10-20 ~60-120
500-1500 (medieval) ~120-300 ~20-60 ~120-600
500 BC – 500 AD (ancient) ~300-1000 ~60-180 ~600-3600
4000 BC and 3000 AD (extremes) ~1000-5000 ~180-600 ~3600+
Declared limitation: at the extremes of the window, the error comes mainly from ΔT uncertainty (Earth rotation variation, not mathematically predictable). The ELP-2000 series itself has consistent precision.

Known limitations

The engine does not currently implement:

  • JPL DE440/DE441 numerical ephemerides. We use analytical series, with typical arcsec precision instead of meters.
  • Full Hapke photometry model. Apparent lunar magnitude is estimated via a simplified formula (~0.2 mag uncertainty).
  • Full physical libration (IAU WGCCRE 2015). Optical libration is first-order. For precise selenography, physical libration would be added on top.
  • Polar motion (xp, yp) refreshed daily. We use a frozen model, with max error < 0.5 arcsec, below the dominant errors.
  • Real-time EOP (Earth Orientation Parameters). The engine is evergreen, with no external feed.

These limitations correspond to differences below the human-eye resolution (60 arcsec) and below typical amateur equipment precision. For recreational, educational, amateur observational and outreach use, the engine delivers precision with room to spare.

How to reproduce

All validation is auditable via scripts in the lua/calculadora-lunar/ directory:

php test_phase1_meeus_example.php       # Meeus 47.a (Moon)
php test_phase3_sun.php                 # Meeus 25.b (Sun)
php test_phase9_nutation.php            # Meeus 22.a (Nutation)
php test_phase11_jpl_horizons.php       # Horizons seed validation
php test_phase11_time_scales.php        # Time scales (UTC, UT1, TAI, TT, TDB)
php test_phase0_regression.php          # End-to-end regression

The Horizons seed files live at lua/calculadora-lunar/benchmark/data/.

Evaluated engine version

ComponentVersion
Engine OC Scientific Lunar Engine v2.0.0
Ephemerides model OCSE-Lite-2026A
Moon ELP-2000/82B full (8467 terms)
Sun VSOP87D truncated (58 terms)
Nutation IAU 1980 (66 terms) + IAU 2000A opt-in (1365 terms)
ΔT Espenak-Meeus 2006 (9 historical branches)
Refraction Bennett 1982 / Saemundsson 1986 / None
Parallax WGS84 topocentric ellipsoid

See the full methodology at /laboratorio/metodologia and the bibliography at /laboratorio/fontes.