@essrt/physics 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@essrt/physics",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "ESSRT (Expanding Solar System Resonance Theory) physics core \u2014 pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
|
|
5
5
|
"essrt": {
|
|
6
6
|
"modelVersion": "v11.0",
|
|
@@ -766,8 +766,8 @@ export const REFERENCE_DATA = Object.freeze({
|
|
|
766
766
|
"sunSiderealYearDiffSeconds": 0.02,
|
|
767
767
|
"frameworkSunVsJplRmsArcsec": 0.95,
|
|
768
768
|
"meeusCh25SunVsJplRmsArcsec": 1.28,
|
|
769
|
-
"moonSeriesLonVsJplRmsArcsec": 2.
|
|
770
|
-
"moonSeriesLatVsJplRmsArcsec": 0.
|
|
769
|
+
"moonSeriesLonVsJplRmsArcsec": 2.92,
|
|
770
|
+
"moonSeriesLatVsJplRmsArcsec": 0.61,
|
|
771
771
|
"mercuryNewtonianArcsecCy": 532,
|
|
772
772
|
"mercuryObservedICRFArcsecCy": 575,
|
|
773
773
|
"mercuryPark2017RateArcsecCy": 575.31,
|
|
@@ -235,4 +235,16 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy })
|
|
|
235
235
|
* landings. */
|
|
236
236
|
const PAIRED_SUN_HARMONICS_SHA256 = 'e2cf42e9770c9e0a';
|
|
237
237
|
|
|
238
|
-
|
|
238
|
+
/** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
|
|
239
|
+
* full-precision carrier rates (deg/cy TT) the TERMS table was extracted
|
|
240
|
+
* under at N3. The model wiring recomputes the rates live from the planet
|
|
241
|
+
* records, so a planet-period / year / month input change moves the
|
|
242
|
+
* carriers automatically while the table stays frozen — a silent few-
|
|
243
|
+
* arcsec stale below the api gate's ≤8″ backstop. test:model recomputes
|
|
244
|
+
* this fingerprint from live constants (identical arithmetic to model.js)
|
|
245
|
+
* and fails on mismatch: re-run the N3 extraction chain
|
|
246
|
+
* (tools/explore/n2-sun-framework-carriers.mjs →
|
|
247
|
+
* n3-carrier-swap-preview.mjs), re-embed TERMS, and update this value. */
|
|
248
|
+
const PAIRED_CARRIER_RATES_SHA256 = '893e055ee12343bd';
|
|
249
|
+
|
|
250
|
+
module.exports = { createSunPlanetaryCompletion, PAIRED_SUN_HARMONICS_SHA256, PAIRED_CARRIER_RATES_SHA256 };
|
|
@@ -56,6 +56,30 @@
|
|
|
56
56
|
* (max 6.2″). Coefficients are stored with the run→real argument
|
|
57
57
|
* mapping already applied (the extraction's heliocentric-planet vs
|
|
58
58
|
* geocentric-sun π-offset is folded into the signs).
|
|
59
|
+
*
|
|
60
|
+
* THE J2 NODE FAMILY (FQ-7 Round 3, plan §12i) — five derived terms on
|
|
61
|
+
* Ω-family arguments (NOT expressible on the integer Delaunay lattice,
|
|
62
|
+
* which is why every earlier extraction missed them; the 200-yr band
|
|
63
|
+
* probe named them, the dense 2-day JPL sample confirmed them real, and
|
|
64
|
+
* the channel isolation identified them as EARTH'S J2 acting on the
|
|
65
|
+
* lunar orbit — the same channel whose secular piece DLT-1 derives as
|
|
66
|
+
* the Earth-figure +0.1925″/cy² T² term). Extracted from the B−A
|
|
67
|
+
* differential of epoch-phased 3-body twin integrations (J2 on vs off,
|
|
68
|
+
* identical ICs; per-run fits on each run's OWN mean angles — fitting
|
|
69
|
+
* the raw differential leaks A·δrate·t quadrature, measured as 2.4″
|
|
70
|
+
* fake rows), dt-halving converged ≤0.003″. TWO DOCUMENTED CONTROLS
|
|
71
|
+
* certify the channel and calibrate the run→instrument frame mapping:
|
|
72
|
+
* the derived pure-Ω λ term reproduces the Meeus flattening additive
|
|
73
|
+
* (+1962e-6 sin(Lp−F)) at 1.028, and the derived β sin(Lp) reproduces
|
|
74
|
+
* the −2235e-6 additive at 0.971 — both already shipped via the
|
|
75
|
+
* catalog additive family and therefore NOT re-shipped here. JPL
|
|
76
|
+
* out-of-sample (validation only, never fit): official all-phase λ
|
|
77
|
+
* 2.964 → 2.922″, β 0.653 → 0.606″; dense 2-day λ 2.378 → 2.321″,
|
|
78
|
+
* β 0.655 → 0.601″; syzygy-fleet elongation improves. Instruments:
|
|
79
|
+
* fq7-band-probe.mjs · fq7-jpl-band.mjs · fq7-j2-node.mjs ·
|
|
80
|
+
* fq7-r3-ship.mjs · fq7-r3-preview.mjs. The Ω carrier polynomial is an
|
|
81
|
+
* IAU-class instrument literal — the same DECLARED-INPUT status as the
|
|
82
|
+
* Delaunay carriers above (Ω ≡ Lp − F of the same catalog class).
|
|
59
83
|
*/
|
|
60
84
|
|
|
61
85
|
'use strict';
|
|
@@ -198,6 +222,27 @@ const PLANETARY_LON_TERMS = [
|
|
|
198
222
|
[[0, 1, 0, -1, 0, 0, -1], -0.0077, 0.2235],
|
|
199
223
|
];
|
|
200
224
|
|
|
225
|
+
/** Lunar mean-node polynomial [deg at J2000, deg/cy, deg/cy²] TT —
|
|
226
|
+
* the Ω carrier for the J2 node family (declared input, see header). */
|
|
227
|
+
const OMEGA = [125.0445479, -1934.1362891, 0.0020754];
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* The J2 node family (see header): [[kD,kM,kMp,kF,kΩ], sin″] — pure
|
|
231
|
+
* sin-parity (the derivation's cos components read ≤0.005″), ADD-composed
|
|
232
|
+
* like the Delaunay tail.
|
|
233
|
+
* @type {Array<[number[], number]>}
|
|
234
|
+
*/
|
|
235
|
+
const NODE_LON_TERMS = [
|
|
236
|
+
[[0, 0, 1, 0, -1], -0.544],
|
|
237
|
+
[[0, 0, 1, 0, 1], 0.546],
|
|
238
|
+
[[0, 0, 0, 2, 1], 0.371],
|
|
239
|
+
[[2, 0, 0, 0, 1], 0.103],
|
|
240
|
+
];
|
|
241
|
+
/** @type {Array<[number[], number]>} */
|
|
242
|
+
const NODE_LAT_TERMS = [
|
|
243
|
+
[[0, 0, 0, 1, -1], -0.375],
|
|
244
|
+
];
|
|
245
|
+
|
|
201
246
|
const D2R = Math.PI / 180;
|
|
202
247
|
|
|
203
248
|
/**
|
|
@@ -219,6 +264,9 @@ function moonSeriesExtensionDeg(T) {
|
|
|
219
264
|
const th = k[0] * l[0] + k[1] * l[1] + k[2] * l[2] + k[3] * l[3] + k[4] * l[4] + k[5] * D + k[6] * Mp;
|
|
220
265
|
lon += cA * Math.cos(th) + sA * Math.sin(th);
|
|
221
266
|
}
|
|
267
|
+
const Om = poly(OMEGA);
|
|
268
|
+
for (const [k, s] of NODE_LON_TERMS) lon += s * Math.sin(k[0] * D + k[1] * M + k[2] * Mp + k[3] * F + k[4] * Om);
|
|
269
|
+
for (const [k, s] of NODE_LAT_TERMS) lat += s * Math.sin(k[0] * D + k[1] * M + k[2] * Mp + k[3] * F + k[4] * Om);
|
|
222
270
|
return { dLonDeg: lon / 3600, dLatDeg: lat / 3600 };
|
|
223
271
|
}
|
|
224
272
|
|