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).
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+ |
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
| Component | Version |
|---|---|
| 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.