@essrt/physics 1.7.0 → 1.8.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.7.0",
3
+ "version": "1.8.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",
@@ -52,6 +52,7 @@
52
52
  "./deltat/recession-history": "./src/deltat/recession-history.cjs",
53
53
  "./climate/l1-orbital": "./src/climate/l1-orbital.cjs",
54
54
  "./eclipse/finders": "./src/eclipse/finders.cjs",
55
+ "./eclipse/sun-planetary-completion": "./src/eclipse/sun-planetary-completion.cjs",
55
56
  "./reference/published-curves": "./src/reference/published-curves.cjs",
56
57
  "./sun/longitude-correction": "./src/sun/longitude-correction.cjs"
57
58
  },
@@ -57,6 +57,7 @@
57
57
  * @property {(dDaysTT: number) => {lonDeg: number, latDeg: number, distKm: number}} moonFullAtDaysTT
58
58
  * full-series Moon: ecliptic-of-date longitude/latitude (deg) + distance (km), TT axis (days since J2000)
59
59
  * @property {(jdUT: number) => number} sunLonDegAt - geometric mean sun longitude (deg), JD(UT) axis with the finder's internal ΔT
60
+ * @property {(T: number) => number} sunCompletionDeg - planetary completion (deg) at T centuries TT, SUBTRACTED from the finder sun (see eclipse/sun-planetary-completion.cjs; the finders deliberately stay without it — their fitted anchors and certified canon statistics were produced on the bare form, and elongation-class timing absorbs the omission into the fitted phases)
60
61
  * @property {(jd: number) => number} deltaTSecondsAt - framework ΔT (J2000-zeroed convention)
61
62
  * @property {(year: number) => number} obliquityDegAt - framework obliquity (deg) at calendar year
62
63
  * @property {(year: number) => number} eccentricityAt - framework Earth-orbit eccentricity at calendar year
@@ -122,8 +123,8 @@ function createBesselian(deps) {
122
123
  const jb = jdUT + K.ttBridgeSeconds / 86400; // finder-axis input → its internal ΔT lands on true TT
123
124
  const year = deps.yearFromJD(jb);
124
125
  const eps = deps.obliquityDegAt(year) * D2R;
125
- const sunLon = deps.sunLonDegAt(jb);
126
126
  const dTT = (jb - K.j2000JD) + deps.deltaTSecondsAt(jb) / 86400;
127
+ const sunLon = deps.sunLonDegAt(jb) - deps.sunCompletionDeg(dTT / K.julianCenturyDays);
127
128
  const moon = deps.moonFullAtDaysTT(dTT);
128
129
  return {
129
130
  S: eclToEq(sunLon, 0, sunDistanceKm(year, sunLon), eps),
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Sun planetary completion — the 20.3h location-tier term table.
3
+ *
4
+ * The finder Sun (framework linear rate + Kepler EoC + the fitted
5
+ * SUN_HARMONICS) omits the classical planetary perturbations of the
6
+ * geocentric Sun (the Newcomb Venus/Jupiter/Mars terms and the
7
+ * Earth-around-EMB wobble). Measured against JPL Horizons (ObsEcLon,
8
+ * geocentric, leading-nutation-bridged to mean-of-date) on 960
9
+ * deterministic all-phase epochs 1970–2049: the omission is 10.0″ RMS
10
+ * of Sun-longitude scatter; this table removes the coherent part,
11
+ * 10.0″ → 2.9″ RMS, with every term era-stable (amplitude and phase
12
+ * agree between the 1970–2009 and 2010–2049 half-samples).
13
+ *
14
+ * THE CONSTANT-ATTRIBUTION RULE (the 20.3h-lite trap, resolved here):
15
+ * the table carries NO constant term — the all-phase fit attributes the
16
+ * constant to the tier's existing anchors, so the terms ship without
17
+ * the +6″ syzygy-mean penalty that an eclipse-sample fit produced (at
18
+ * new moon the EMB argument D locks near 0 and its cos-component
19
+ * becomes a constant; fitting on eclipses alone poisons the mean).
20
+ * Verified on the 179-eclipse-syzygy sample: elongation mean stays
21
+ * +1.1″ → +1.5″ while RMS drops 10.6″ → 5.5″; and on the 15 NASA
22
+ * path-table centerline points: shadow-plane mean 6.0″ → 3.6″, max
23
+ * 10.1″ → 5.0″, every event improved.
24
+ *
25
+ * Arguments are of-date mean longitudes (IAU-class instrument
26
+ * polynomials, degrees/Julian-century TT). They are phase carriers for
27
+ * the fitted amplitudes — the framework-native derivation of these
28
+ * term tables is the 20.3e research item. Terms with ambiguous
29
+ * identifications (the ~8-yr band, the 414-day Venus/three-planet
30
+ * blend, E−M, E−S) are deliberately NOT shipped: each failed the
31
+ * half-sample stability test or has no unique two-planet argument at
32
+ * the window's frequency resolution (~1.5″ RSS accepted as floor).
33
+ *
34
+ * Sign convention: the table models (framework − truth), so consumers
35
+ * SUBTRACT the evaluation from the finder Sun longitude.
36
+ */
37
+
38
+ 'use strict';
39
+
40
+ /** Of-date mean-longitude polynomials, degrees per Julian century TT. */
41
+ const ARG_RATES = {
42
+ lV: [181.979801, 58517.815676], // Venus
43
+ lE: [100.466457, 36000.769780], // Earth (EMB)
44
+ lM: [355.433000, 19141.696300], // Mars
45
+ lJ: [34.351519, 3036.302389], // Jupiter
46
+ D: [297.8501921, 445267.1114034], // Moon mean elongation (EMB wobble carrier)
47
+ };
48
+
49
+ /**
50
+ * The fitted table: [k·lV, k·lE, k·lM, k·lJ, k·D, cosAmp″, sinAmp″].
51
+ * Fit: 960-epoch all-phase LSQ vs JPL Horizons DE441-class ObsEcLon,
52
+ * free constant excluded from shipment; SE 0.13″ per coefficient.
53
+ */
54
+ const TERMS = [
55
+ [1, -1, 0, 0, 0, 0, -5.08], // V−E (Venus synodic)
56
+ [2, -2, 0, 0, 0, 0, 5.55], // 2(V−E)
57
+ [3, -3, 0, 0, 0, 0, 0.68], // 3(V−E)
58
+ [2, -3, 0, 0, 0, -2.64, 0], // 2V−3E (the classic Newcomb Venus term)
59
+ [0, 1, 0, -1, 0, 0, 7.19], // E−J (Jupiter synodic)
60
+ [0, 2, 0, -2, 0, 0, -2.81], // 2(E−J)
61
+ [0, 1, 0, -2, 0, -1.34, 0.97],// E−2J
62
+ [0, 2, -2, 0, 0, 0, 2.05], // 2(E−M) (Mars)
63
+ [0, 2, 0, 0, 0, 0, 1.42], // 2lE (semiannual Kepler leftover)
64
+ [0, 0, 0, 0, 1, 0, -6.64], // D (Earth-around-EMB wobble, 6.44″ theory)
65
+ ];
66
+
67
+ const D2R = Math.PI / 180;
68
+
69
+ /**
70
+ * Planetary-completion correction to the finder Sun longitude.
71
+ * @param {number} T - Julian centuries TT from J2000
72
+ * @returns {number} degrees — SUBTRACT from the finder Sun longitude
73
+ */
74
+ function sunPlanetaryCompletionDeg(T) {
75
+ const lV = (ARG_RATES.lV[0] + ARG_RATES.lV[1] * T) * D2R;
76
+ const lE = (ARG_RATES.lE[0] + ARG_RATES.lE[1] * T) * D2R;
77
+ const lM = (ARG_RATES.lM[0] + ARG_RATES.lM[1] * T) * D2R;
78
+ const lJ = (ARG_RATES.lJ[0] + ARG_RATES.lJ[1] * T) * D2R;
79
+ const D = (ARG_RATES.D[0] + ARG_RATES.D[1] * T) * D2R;
80
+ let arcsec = 0;
81
+ for (const [kV, kE, kM, kJ, kD, cA, sA] of TERMS) {
82
+ const th = kV * lV + kE * lE + kM * lM + kJ * lJ + kD * D;
83
+ arcsec += cA * Math.cos(th) + sA * Math.sin(th);
84
+ }
85
+ return arcsec / 3600;
86
+ }
87
+
88
+ module.exports = { sunPlanetaryCompletionDeg };
package/src/model.js CHANGED
@@ -31,6 +31,7 @@ import { createMoonMonthChain } from './moon/month-chain.cjs';
31
31
  import { createChainCycleIntegrator } from './chain-cycles/index.cjs';
32
32
  import { createMoonArguments, jdToDecimalYear } from './moon/arguments.cjs';
33
33
  import { createMoonSeries } from './moon/series.cjs';
34
+ import { sunPlanetaryCompletionDeg } from './eclipse/sun-planetary-completion.cjs';
34
35
  import { createEclipseFinders } from './eclipse/finders.cjs';
35
36
  import { createBesselian } from './eclipse/besselian.cjs';
36
37
  import { driver2PeriodSecondsAtAge } from './planets/orbit-chain.cjs';
@@ -861,6 +862,7 @@ export function assembleModel(C, F) {
861
862
  return { lonDeg: ev.lonDeg, latDeg: ev.latDeg, distKm: ev.distKm };
862
863
  },
863
864
  sunLonDegAt: /** @param {number} jdUT */ (jdUT) => eclipseFinders.sunLonDegAt(jdUT),
865
+ sunCompletionDeg: sunPlanetaryCompletionDeg,
864
866
  deltaTSecondsAt: /** @param {number} jd */ (jd) => (jdTTFromUT(jd) - jd) * 86400,
865
867
  obliquityDegAt: obliquityDeg,
866
868
  eccentricityAt,