@interstellar-tools/equations 0.48.0 → 0.50.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/dist/categories/angle/compute-angle.d.ts +1 -1
- package/dist/categories/angle/compute-angle.js +4 -4
- package/dist/categories/angle/compute-angle.js.map +1 -1
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.d.ts +1 -1
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.js +4 -4
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.js.map +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.js +2 -2
- package/dist/categories/anomalies/true-to-mean-anomaly.js.map +1 -1
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js +3 -3
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js.map +1 -1
- package/dist/categories/gravity/acceleration-on1-by2.js +1 -1
- package/dist/categories/gravity/acceleration-on1-by2.js.map +1 -1
- package/dist/categories/gravity/force-on1-by2.js +1 -1
- package/dist/categories/gravity/force-on1-by2.js.map +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.js +2 -2
- package/dist/categories/kepler/solve-kepler-high-eccentricity.js.map +1 -1
- package/dist/categories/kepler/solve-kepler.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler.js +5 -5
- package/dist/categories/kepler/solve-kepler.js.map +1 -1
- package/dist/index.d.ts +49 -49
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -49
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/__tests__/helpers/index.d.ts +0 -9
- package/dist/__tests__/helpers/index.d.ts.map +0 -1
- package/dist/__tests__/helpers/index.js +0 -45
- package/dist/__tests__/helpers/index.js.map +0 -1
- package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts +0 -2
- package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts.map +0 -1
- package/dist/categories/angle/__tests__/compute-angle.int.spec.js +0 -62
- package/dist/categories/angle/__tests__/compute-angle.int.spec.js.map +0 -1
- package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts +0 -2
- package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts.map +0 -1
- package/dist/categories/angle/__tests__/wrap-angle.spec.js +0 -60
- package/dist/categories/angle/__tests__/wrap-angle.spec.js.map +0 -1
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts +0 -2
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js +0 -33
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js.map +0 -1
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts +0 -2
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js +0 -197
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js.map +0 -1
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts +0 -2
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js +0 -46
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js +0 -56
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js +0 -60
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js +0 -60
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js +0 -73
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js +0 -69
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js +0 -103
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js +0 -87
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js +0 -107
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force.spec.js +0 -106
- package/dist/categories/gravity/__tests__/gravitational-force.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js +0 -75
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js +0 -79
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/det-3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/det-3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/det-3.spec.js +0 -73
- package/dist/categories/helpers/__tests__/det-3.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/mat-mul3.spec.js +0 -86
- package/dist/categories/helpers/__tests__/mat-mul3.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/misc.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/misc.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/misc.spec.js +0 -101
- package/dist/categories/helpers/__tests__/misc.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/radians.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/radians.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/radians.spec.js +0 -37
- package/dist/categories/helpers/__tests__/radians.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/rot-1.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/rot-1.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/rot-1.spec.js +0 -59
- package/dist/categories/helpers/__tests__/rot-1.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/rot-3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/rot-3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/rot-3.spec.js +0 -65
- package/dist/categories/helpers/__tests__/rot-3.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js +0 -86
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js +0 -81
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js +0 -50
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js +0 -76
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js +0 -103
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js +0 -89
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js +0 -101
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js +0 -71
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js +0 -90
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js +0 -84
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js +0 -65
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js +0 -71
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js +0 -36
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/circular-speed.spec.js +0 -69
- package/dist/categories/orbits/__tests__/circular-speed.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js +0 -64
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/escape-speed.spec.js +0 -79
- package/dist/categories/orbits/__tests__/escape-speed.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js +0 -92
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js +0 -64
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js +0 -104
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js +0 -99
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/kepler-period.spec.js +0 -72
- package/dist/categories/orbits/__tests__/kepler-period.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/mean-motion.spec.js +0 -48
- package/dist/categories/orbits/__tests__/mean-motion.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js +0 -74
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js +0 -86
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js +0 -85
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js +0 -81
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js +0 -62
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js +0 -80
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js.map +0 -1
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { flightPathAngleFromTrueAnomaly } from '../flight-path-angle-from-true-anomaly';
|
|
4
|
-
import { absClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
const EPS = 1e-12;
|
|
6
|
-
const PI = Math.PI;
|
|
7
|
-
describe('flightPathAngleFromTrueAnomaly', () => {
|
|
8
|
-
test('e = 0 (circular): gamma = 0 for any ν', () => {
|
|
9
|
-
const e = 0;
|
|
10
|
-
const nus = [
|
|
11
|
-
0,
|
|
12
|
-
(PI / 6),
|
|
13
|
-
(PI / 2),
|
|
14
|
-
PI,
|
|
15
|
-
-1.1
|
|
16
|
-
];
|
|
17
|
-
for (const nu of nus) {
|
|
18
|
-
const g = flightPathAngleFromTrueAnomaly(nu, e);
|
|
19
|
-
absClose(g, 0, EPS, `gamma(ν=${nu}, e=0) should be 0`);
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
test('elliptic examples: tan(γ) ≈ (e sin ν) / (1 + e cos ν)', () => {
|
|
23
|
-
const cases = [
|
|
24
|
-
{ nu: 0.7, e: 0.2 },
|
|
25
|
-
{ nu: 1.2, e: 0.7 },
|
|
26
|
-
{ nu: 2.0, e: 0.5 }
|
|
27
|
-
];
|
|
28
|
-
for (const { nu, e } of cases) {
|
|
29
|
-
const gamma = flightPathAngleFromTrueAnomaly(nu, e);
|
|
30
|
-
const ratio = (e * Math.sin(nu)) / (1 + e * Math.cos(nu));
|
|
31
|
-
// Avoiding points too close to denom=0 by choice of cases above
|
|
32
|
-
absClose(Math.tan(gamma), ratio, 1e-11, `tan(gamma) mismatch for ν=${nu}, e=${e}`);
|
|
33
|
-
// For 0 ≤ e < 1, |γ| < π/2
|
|
34
|
-
assert.ok(Math.abs(gamma) < PI / 2 - 1e-15, 'elliptic γ must be in (-π/2, π/2)');
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
test('sign symmetry: γ(-ν) = -γ(ν) for elliptic case', () => {
|
|
38
|
-
const e = 0.4;
|
|
39
|
-
const nu = 0.8;
|
|
40
|
-
const g1 = flightPathAngleFromTrueAnomaly(nu, e);
|
|
41
|
-
const g2 = flightPathAngleFromTrueAnomaly(-nu, e);
|
|
42
|
-
absClose(g1, -g2, 1e-12);
|
|
43
|
-
});
|
|
44
|
-
test('limits: ν = 0 and ν = π both yield γ = 0 for 0 ≤ e < 1', () => {
|
|
45
|
-
const es = [0, 0.1, 0.5, 0.9];
|
|
46
|
-
for (const e of es) {
|
|
47
|
-
const g0 = flightPathAngleFromTrueAnomaly(0, e);
|
|
48
|
-
absClose(g0, 0);
|
|
49
|
-
const gpi = flightPathAngleFromTrueAnomaly(PI, e);
|
|
50
|
-
absClose(gpi, 0);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
test('parabolic special-case: e = 1 and ν = π returns 0 by design', () => {
|
|
54
|
-
const e = 1;
|
|
55
|
-
const nu = PI;
|
|
56
|
-
const g = flightPathAngleFromTrueAnomaly(nu, e);
|
|
57
|
-
absClose(g, 0);
|
|
58
|
-
});
|
|
59
|
-
test('parabolic (e=1): for general ν, γ ≈ ν/2 (principal value), away from ν=π', () => {
|
|
60
|
-
const e = 1;
|
|
61
|
-
const nus = [0.6, 1.0, -1.2];
|
|
62
|
-
for (const nu of nus) {
|
|
63
|
-
const g = flightPathAngleFromTrueAnomaly(nu, e);
|
|
64
|
-
// Using identity tan γ = sin ν / (1 + cos ν) = tan(ν/2)
|
|
65
|
-
// γ = atan2(sin(ν/2), cos(ν/2)) → principal value ≈ ν/2 for |ν| < π
|
|
66
|
-
absClose(g, nu / 2, 1e-12, `parabolic γ ≈ ν/2 failed for ν=${nu}`);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
test('hyperbolic asymptote: e > 1 and ν = arccos(-1/e) ⇒ γ → +π/2', () => {
|
|
70
|
-
const e = 1.5;
|
|
71
|
-
const nu0 = Math.acos(-1 / e); // 1 + e cos ν0 = 0
|
|
72
|
-
const g = flightPathAngleFromTrueAnomaly(nu0, e);
|
|
73
|
-
absClose(g, PI / 2, 1e-12);
|
|
74
|
-
});
|
|
75
|
-
test('hyperbolic asymptote (negative): e > 1 and ν = -arccos(-1/e) ⇒ γ → -π/2', () => {
|
|
76
|
-
const e = 1.5;
|
|
77
|
-
const nu0 = -Math.acos(-1 / e);
|
|
78
|
-
const g = flightPathAngleFromTrueAnomaly(nu0, e);
|
|
79
|
-
absClose(g, -PI / 2, 1e-12);
|
|
80
|
-
});
|
|
81
|
-
test('input validation: throws on non-finite ν or negative e', () => {
|
|
82
|
-
// non-finite nu
|
|
83
|
-
assert.throws(() => flightPathAngleFromTrueAnomaly(NaN, 0.3), /finite/);
|
|
84
|
-
assert.throws(() => flightPathAngleFromTrueAnomaly(Infinity, 0.3), /finite/);
|
|
85
|
-
// negative e
|
|
86
|
-
assert.throws(() => flightPathAngleFromTrueAnomaly(1, -0.01), /≥ 0/);
|
|
87
|
-
// non-finite e
|
|
88
|
-
assert.throws(() => flightPathAngleFromTrueAnomaly(1, NaN), /finite/);
|
|
89
|
-
assert.throws(() => flightPathAngleFromTrueAnomaly(1, Infinity), /finite/);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
//# sourceMappingURL=flight-path-angle-from-true-anomaly.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flight-path-angle-from-true-anomaly.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hyperbolic-periapsis-speed.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { hyperbolicPeriapsisSpeed } from '../hyperbolic-periapsis-speed';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('hyperbolicPeriapsisSpeed', () => {
|
|
6
|
-
test('returns sqrt(vInf² + 2mu/rp) for typical inputs (Earth, km-based example)', () => {
|
|
7
|
-
const vInf = 3.2; // km/s
|
|
8
|
-
const mu = 398600.4418; // km³/s²
|
|
9
|
-
const rp = 6678; // km
|
|
10
|
-
const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
|
|
11
|
-
const expected = Math.sqrt(vInf * vInf + (2 * mu) / rp);
|
|
12
|
-
relClose(vp, expected);
|
|
13
|
-
});
|
|
14
|
-
test('when vInfinity is 0, reduces to escape speed at rp: sqrt(2mu/rp)', () => {
|
|
15
|
-
const vInf = 0;
|
|
16
|
-
const mu = 398600.4418;
|
|
17
|
-
const rp = 6678;
|
|
18
|
-
const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
|
|
19
|
-
const expected = Math.sqrt((2 * mu) / rp);
|
|
20
|
-
relClose(vp, expected);
|
|
21
|
-
});
|
|
22
|
-
test('is always >= vInfinity for valid inputs', () => {
|
|
23
|
-
const vInf = 5;
|
|
24
|
-
const mu = 1e5;
|
|
25
|
-
const rp = 1e3;
|
|
26
|
-
const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
|
|
27
|
-
assert.ok(vp >= vInf, `expected vp (${vp}) >= vInfinity (${vInf})`);
|
|
28
|
-
});
|
|
29
|
-
test('throws TypeError when vInfinity is NaN', () => {
|
|
30
|
-
assert.throws(() => hyperbolicPeriapsisSpeed(Number.NaN, 1, 1), (err) => err instanceof TypeError &&
|
|
31
|
-
err.message === 'vInfinity must be a finite number. Received: NaN');
|
|
32
|
-
});
|
|
33
|
-
test('throws TypeError when mu is Infinity', () => {
|
|
34
|
-
assert.throws(() => hyperbolicPeriapsisSpeed(1, Number.POSITIVE_INFINITY, 1), (err) => err instanceof TypeError &&
|
|
35
|
-
err.message === 'mu must be a finite number. Received: Infinity');
|
|
36
|
-
});
|
|
37
|
-
test('throws TypeError when rp is undefined/NaN-ish (NaN)', () => {
|
|
38
|
-
assert.throws(() => hyperbolicPeriapsisSpeed(1, 1, Number.NaN), (err) => err instanceof TypeError &&
|
|
39
|
-
err.message === 'rp must be a finite number. Received: NaN');
|
|
40
|
-
});
|
|
41
|
-
test('throws RangeError when vInfinity < 0', () => {
|
|
42
|
-
assert.throws(() => hyperbolicPeriapsisSpeed(-0.0001, 1, 1), (err) => err instanceof RangeError &&
|
|
43
|
-
err.message === 'vInfinity must be >= 0. Received: -0.0001');
|
|
44
|
-
});
|
|
45
|
-
test('throws RangeError when mu <= 0 (mu === 0)', () => {
|
|
46
|
-
assert.throws(() => hyperbolicPeriapsisSpeed(0, 0, 1), (err) => err instanceof RangeError &&
|
|
47
|
-
err.message === 'mu must be > 0. Received: 0');
|
|
48
|
-
});
|
|
49
|
-
test('throws RangeError when rp <= 0 (rp === 0)', () => {
|
|
50
|
-
assert.throws(() => hyperbolicPeriapsisSpeed(0, 1, 0), (err) => err instanceof RangeError &&
|
|
51
|
-
err.message === 'rp must be > 0. Received: 0');
|
|
52
|
-
});
|
|
53
|
-
test('for large rp, vp - vInfinity ≈ mu / (rp * vInfinity)', () => {
|
|
54
|
-
const vInf = 12.345;
|
|
55
|
-
const mu = 3.986004418e5;
|
|
56
|
-
const rp = 1e12;
|
|
57
|
-
const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
|
|
58
|
-
const delta = vp - vInf;
|
|
59
|
-
const approx = mu / (rp * vInf);
|
|
60
|
-
// approximation, so use a looser tolerance than exact comparisons
|
|
61
|
-
relClose(delta, approx, 1e-6);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
//# sourceMappingURL=hyperbolic-periapsis-speed.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hyperbolic-periapsis-speed.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"j2-argument-of-perigee-rate.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { j2ArgumentOfPerigeeRate } from '../j2-argument-of-perigee-rate';
|
|
5
|
-
import { rad } from '../../helpers/radians';
|
|
6
|
-
describe('j2ArgumentOfPerigeeRate', () => {
|
|
7
|
-
test('computes ωdot from the reference formula (typical Earth-ish LEO inputs)', () => {
|
|
8
|
-
const J2 = 1.08262668e-3;
|
|
9
|
-
const n = 0.001078; // rad/s
|
|
10
|
-
const Re = 6378.137; // km
|
|
11
|
-
const a = 7000; // km
|
|
12
|
-
const i = rad((63.4 * Math.PI) / 180);
|
|
13
|
-
const e = 0.001;
|
|
14
|
-
const omegaDot = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, e);
|
|
15
|
-
const oneMinusESq = 1 - e * e;
|
|
16
|
-
const expected = (0.75 *
|
|
17
|
-
J2 *
|
|
18
|
-
n *
|
|
19
|
-
Math.pow(Re / a, 2) *
|
|
20
|
-
(5 * Math.pow(Math.cos(i), 2) - 1)) /
|
|
21
|
-
Math.pow(oneMinusESq, 2);
|
|
22
|
-
relClose(omegaDot, expected);
|
|
23
|
-
});
|
|
24
|
-
test('critical inclination: ωdot ~ 0 when 5cos^2(i) - 1 = 0', () => {
|
|
25
|
-
// 5 cos^2(i) - 1 = 0 => cos^2(i)=1/5 => i = arccos(sqrt(1/5)) ≈ 63.4349°
|
|
26
|
-
const icrit = rad(Math.acos(Math.sqrt(1 / 5)));
|
|
27
|
-
const J2 = 1e-3;
|
|
28
|
-
const n = 0.001;
|
|
29
|
-
const Re = 6000;
|
|
30
|
-
const a = 7000;
|
|
31
|
-
const e = 0;
|
|
32
|
-
const omegaDot = j2ArgumentOfPerigeeRate(J2, n, Re, a, icrit, e);
|
|
33
|
-
relClose(omegaDot, 0, 1e-12);
|
|
34
|
-
});
|
|
35
|
-
test('equatorial orbit (i = 0) yields positive ωdot for J2 > 0', () => {
|
|
36
|
-
const omegaDot = j2ArgumentOfPerigeeRate(1e-3, 0.001, 6000, 7000, rad(0), 0);
|
|
37
|
-
assert.ok(omegaDot > 0, `expected ωdot > 0, got ${omegaDot}`);
|
|
38
|
-
});
|
|
39
|
-
test('polar orbit (i = 90°) yields negative ωdot for J2 > 0', () => {
|
|
40
|
-
// cos(i)=0 => (5cos^2 - 1) = -1 => ωdot negative
|
|
41
|
-
const omegaDot = j2ArgumentOfPerigeeRate(1e-3, 0.001, 6000, 7000, rad(Math.PI / 2), 0);
|
|
42
|
-
assert.ok(omegaDot < 0, `expected ωdot < 0, got ${omegaDot}`);
|
|
43
|
-
});
|
|
44
|
-
test('with e = 0, denominator is 1 (matches simplified circular-orbit form)', () => {
|
|
45
|
-
const J2 = 1e-3;
|
|
46
|
-
const n = 0.001;
|
|
47
|
-
const Re = 6000;
|
|
48
|
-
const a = 7000;
|
|
49
|
-
const i = rad((40 * Math.PI) / 180);
|
|
50
|
-
const e = 0;
|
|
51
|
-
const omegaDot = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, e);
|
|
52
|
-
const expected = 0.75 * J2 * n * Math.pow(Re / a, 2) * (5 * Math.pow(Math.cos(i), 2) - 1);
|
|
53
|
-
relClose(omegaDot, expected);
|
|
54
|
-
});
|
|
55
|
-
test('as e increases, |ωdot| increases due to (1 - e^2)^-2', () => {
|
|
56
|
-
const J2 = 1e-3;
|
|
57
|
-
const n = 0.001;
|
|
58
|
-
const Re = 6000;
|
|
59
|
-
const a = 7000;
|
|
60
|
-
const i = rad((30 * Math.PI) / 180);
|
|
61
|
-
const omegaDot0 = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, 0);
|
|
62
|
-
const omegaDot5 = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, 0.5);
|
|
63
|
-
assert.ok(Math.abs(omegaDot5) > Math.abs(omegaDot0), `expected |ωdot| to increase with e: ${omegaDot0} -> ${omegaDot5}`);
|
|
64
|
-
});
|
|
65
|
-
test('throws TypeError when any input is not finite', () => {
|
|
66
|
-
const J2 = 1e-3;
|
|
67
|
-
const n = 0.001;
|
|
68
|
-
const Re = 6000;
|
|
69
|
-
const a = 7000;
|
|
70
|
-
const i = rad(0);
|
|
71
|
-
const e = 0;
|
|
72
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(Number.NaN, n, Re, a, i, e), (err) => err instanceof TypeError &&
|
|
73
|
-
err.message === 'J2 must be a finite number. Received: NaN');
|
|
74
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(J2, Number.POSITIVE_INFINITY, Re, a, i, e), (err) => err instanceof TypeError &&
|
|
75
|
-
err.message === 'n must be a finite number. Received: Infinity');
|
|
76
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Number.NEGATIVE_INFINITY, a, i, e), (err) => err instanceof TypeError &&
|
|
77
|
-
err.message === 'Re must be a finite number. Received: -Infinity');
|
|
78
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Re, Number.NaN, i, e), (err) => err instanceof TypeError &&
|
|
79
|
-
err.message === 'a must be a finite number. Received: NaN');
|
|
80
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Re, a, rad(Number.NaN), e), (err) => err instanceof TypeError &&
|
|
81
|
-
err.message === 'i must be a finite number. Received: NaN');
|
|
82
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Re, a, i, Number.NaN), (err) => err instanceof TypeError &&
|
|
83
|
-
err.message === 'e must be a finite number. Received: NaN');
|
|
84
|
-
});
|
|
85
|
-
test('throws RangeError when n < 0', () => {
|
|
86
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, -1e-9, 6000, 7000, rad(0), 0), (err) => err instanceof RangeError &&
|
|
87
|
-
err.message === 'n must be >= 0. Received: -1e-9');
|
|
88
|
-
});
|
|
89
|
-
test('throws RangeError when Re <= 0', () => {
|
|
90
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 0, 7000, rad(0), 0), (err) => err instanceof RangeError &&
|
|
91
|
-
err.message === 'Re must be > 0. Received: 0');
|
|
92
|
-
});
|
|
93
|
-
test('throws RangeError when a <= 0', () => {
|
|
94
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 6000, 0, rad(0), 0), (err) => err instanceof RangeError &&
|
|
95
|
-
err.message === 'a must be > 0. Received: 0');
|
|
96
|
-
});
|
|
97
|
-
test('throws RangeError when e is outside [0, 1)', () => {
|
|
98
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 6000, 7000, rad(0), -1e-9), (err) => err instanceof RangeError &&
|
|
99
|
-
err.message === 'e must be in [0, 1]. Received: -1e-9');
|
|
100
|
-
assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 6000, 7000, rad(0), 1), (err) => err instanceof RangeError &&
|
|
101
|
-
err.message === 'e must be in [0, 1]. Received: 1');
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
//# sourceMappingURL=j2-argument-of-perigee-rate.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"j2-argument-of-perigee-rate.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"j2-nodal-precession-rate.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-nodal-precession-rate.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { j2NodalPrecessionRate } from '../j2-nodal-precession-rate';
|
|
5
|
-
import { rad } from '../../helpers/radians';
|
|
6
|
-
describe('j2NodalPrecessionRate', () => {
|
|
7
|
-
test('computes Ωdot from the reference formula (typical Earth-ish LEO inputs)', () => {
|
|
8
|
-
const J2 = 1.08262668e-3;
|
|
9
|
-
const n = 0.001078; // rad/s
|
|
10
|
-
const Re = 6378.137; // km
|
|
11
|
-
const a = 7000; // km
|
|
12
|
-
const i = rad((98 * Math.PI) / 180);
|
|
13
|
-
const e = 0.001;
|
|
14
|
-
const omegaDot = j2NodalPrecessionRate(J2, n, Re, a, i, e);
|
|
15
|
-
const expected = (-1.5 * J2 * n * Math.pow(Re / a, 2) * Math.cos(i)) /
|
|
16
|
-
Math.pow(1 - e * e, 2);
|
|
17
|
-
relClose(omegaDot, expected);
|
|
18
|
-
});
|
|
19
|
-
test('sign check: prograde (i < 90°) gives negative Ωdot; retrograde (i > 90°) gives positive Ωdot', () => {
|
|
20
|
-
const J2 = 1e-3;
|
|
21
|
-
const n = 0.001;
|
|
22
|
-
const Re = 6000;
|
|
23
|
-
const a = 7000;
|
|
24
|
-
const e = 0;
|
|
25
|
-
const prograde = j2NodalPrecessionRate(J2, n, Re, a, rad((30 * Math.PI) / 180), e);
|
|
26
|
-
const retrograde = j2NodalPrecessionRate(J2, n, Re, a, rad((120 * Math.PI) / 180), e);
|
|
27
|
-
assert.ok(prograde < 0, `expected prograde Ωdot < 0, got ${prograde}`);
|
|
28
|
-
assert.ok(retrograde > 0, `expected retrograde Ωdot > 0, got ${retrograde}`);
|
|
29
|
-
});
|
|
30
|
-
test('polar orbit (i = 90°) gives ~0 Ωdot', () => {
|
|
31
|
-
const J2 = 1e-3;
|
|
32
|
-
const n = 0.001;
|
|
33
|
-
const Re = 6000;
|
|
34
|
-
const a = 7000;
|
|
35
|
-
const e = 0;
|
|
36
|
-
const omegaDot = j2NodalPrecessionRate(J2, n, Re, a, rad(Math.PI / 2), e);
|
|
37
|
-
relClose(omegaDot, 0, 1e-12);
|
|
38
|
-
});
|
|
39
|
-
test('with e = 0, denominator is 1 (matches simplified circular-orbit form)', () => {
|
|
40
|
-
const J2 = 1.08262668e-3;
|
|
41
|
-
const n = 0.001;
|
|
42
|
-
const Re = 6378.137;
|
|
43
|
-
const a = 7000;
|
|
44
|
-
const i = rad((45 * Math.PI) / 180);
|
|
45
|
-
const e = 0;
|
|
46
|
-
const omegaDot = j2NodalPrecessionRate(J2, n, Re, a, i, e);
|
|
47
|
-
const expected = -1.5 * J2 * n * Math.pow(Re / a, 2) * Math.cos(i);
|
|
48
|
-
relClose(omegaDot, expected);
|
|
49
|
-
});
|
|
50
|
-
test('throws TypeError when any input is not finite', () => {
|
|
51
|
-
const J2 = 1e-3;
|
|
52
|
-
const n = 0.001;
|
|
53
|
-
const Re = 6000;
|
|
54
|
-
const a = 7000;
|
|
55
|
-
const i = rad(0);
|
|
56
|
-
const e = 0;
|
|
57
|
-
assert.throws(() => j2NodalPrecessionRate(Number.NaN, n, Re, a, i, e), (err) => err instanceof TypeError &&
|
|
58
|
-
err.message === 'J2 must be a finite number. Received: NaN');
|
|
59
|
-
assert.throws(() => j2NodalPrecessionRate(J2, Number.POSITIVE_INFINITY, Re, a, i, e), (err) => err instanceof TypeError &&
|
|
60
|
-
err.message === 'n must be a finite number. Received: Infinity');
|
|
61
|
-
assert.throws(() => j2NodalPrecessionRate(J2, n, Number.NEGATIVE_INFINITY, a, i, e), (err) => err instanceof TypeError &&
|
|
62
|
-
err.message === 'Re must be a finite number. Received: -Infinity');
|
|
63
|
-
assert.throws(() => j2NodalPrecessionRate(J2, n, Re, Number.NaN, i, e), (err) => err instanceof TypeError &&
|
|
64
|
-
err.message === 'a must be a finite number. Received: NaN');
|
|
65
|
-
assert.throws(() => j2NodalPrecessionRate(J2, n, Re, a, rad(Number.NaN), e), (err) => err instanceof TypeError &&
|
|
66
|
-
err.message === 'i must be a finite number. Received: NaN');
|
|
67
|
-
assert.throws(() => j2NodalPrecessionRate(J2, n, Re, a, i, Number.NaN), (err) => err instanceof TypeError &&
|
|
68
|
-
err.message === 'e must be a finite number. Received: NaN');
|
|
69
|
-
});
|
|
70
|
-
test('throws RangeError when n < 0', () => {
|
|
71
|
-
assert.throws(() => j2NodalPrecessionRate(1e-3, -1e-9, 6000, 7000, rad(0), 0), (err) => err instanceof RangeError &&
|
|
72
|
-
err.message === 'n must be >= 0. Received: -1e-9');
|
|
73
|
-
});
|
|
74
|
-
test('throws RangeError when Re <= 0', () => {
|
|
75
|
-
assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 0, 7000, rad(0), 0), (err) => err instanceof RangeError &&
|
|
76
|
-
err.message === 'Re must be > 0. Received: 0');
|
|
77
|
-
});
|
|
78
|
-
test('throws RangeError when a <= 0', () => {
|
|
79
|
-
assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 6000, 0, rad(0), 0), (err) => err instanceof RangeError &&
|
|
80
|
-
err.message === 'a must be > 0. Received: 0');
|
|
81
|
-
});
|
|
82
|
-
test('throws RangeError when e is outside [0, 1]', () => {
|
|
83
|
-
assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 6000, 7000, rad(0), -1e-9), (err) => err instanceof RangeError &&
|
|
84
|
-
err.message === 'e must be in [0, 1]. Received: -1e-9');
|
|
85
|
-
assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 6000, 7000, rad(0), 1), (err) => err instanceof RangeError &&
|
|
86
|
-
err.message === 'e must be in [0, 1]. Received: 1');
|
|
87
|
-
});
|
|
88
|
-
test('as e increases, |Ωdot| increases due to (1 - e²)⁻²', () => {
|
|
89
|
-
const J2 = 1e-3;
|
|
90
|
-
const n = 0.001;
|
|
91
|
-
const Re = 6000;
|
|
92
|
-
const a = 7000;
|
|
93
|
-
const i = rad((60 * Math.PI) / 180);
|
|
94
|
-
const omegaDot0 = j2NodalPrecessionRate(J2, n, Re, a, i, 0);
|
|
95
|
-
const omegaDot5 = j2NodalPrecessionRate(J2, n, Re, a, i, 0.5);
|
|
96
|
-
assert.ok(Math.abs(omegaDot5) > Math.abs(omegaDot0), `expected |Ωdot| to increase with e: ${omegaDot0} -> ${omegaDot5}`);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=j2-nodal-precession-rate.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"j2-nodal-precession-rate.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-nodal-precession-rate.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kepler-period.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/kepler-period.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { keplerPeriod } from '../kepler-period';
|
|
5
|
-
describe('keplerPeriod', () => {
|
|
6
|
-
test('GEO sanity: a ≈ 42,164 km around Earth → T ≈ 86,164 s', () => {
|
|
7
|
-
const a = 42164e3; // m
|
|
8
|
-
const muEarth = 3.986004418e14; // m³/s²
|
|
9
|
-
const T = keplerPeriod(a, muEarth);
|
|
10
|
-
const ref = 86164.0905; // sidereal day (s)
|
|
11
|
-
// Keep tolerance modest: orbit isn't exactly Keplerian in reality; our formula is ideal
|
|
12
|
-
relClose(T, ref, 1e-3); // 0.1% relative tolerance
|
|
13
|
-
});
|
|
14
|
-
test('LEO circular (~400 km): a = Re + 400 km → T ~ 5550 s', () => {
|
|
15
|
-
const a = 6378e3 + 400e3; // m
|
|
16
|
-
const muEarth = 3.986004418e14; // m³/s²
|
|
17
|
-
const T = keplerPeriod(a, muEarth);
|
|
18
|
-
const ref = 5550; // ~92.5 min
|
|
19
|
-
relClose(T, ref, 5e-2); // 5% slack; depends on precise constants
|
|
20
|
-
});
|
|
21
|
-
test('Scaling with semi-major axis: T ∝ a^(3/2) (same μ)', () => {
|
|
22
|
-
const mu = 3.986004418e14;
|
|
23
|
-
const a1 = 7000e3;
|
|
24
|
-
const a2 = 2 * a1;
|
|
25
|
-
const T1 = keplerPeriod(a1, mu);
|
|
26
|
-
const T2 = keplerPeriod(a2, mu);
|
|
27
|
-
const expectedRatio = Math.pow(2, 1.5); // 2^(3/2)
|
|
28
|
-
relClose(T2 / T1, expectedRatio, 1e-12);
|
|
29
|
-
});
|
|
30
|
-
test('Scaling with μ: doubling μ reduces T by 1/√2 (same a)', () => {
|
|
31
|
-
const a = 10000e3;
|
|
32
|
-
const mu = 3.986004418e14;
|
|
33
|
-
const T1 = keplerPeriod(a, mu);
|
|
34
|
-
const T2 = keplerPeriod(a, 2 * mu);
|
|
35
|
-
const expectedRatio = 1 / Math.SQRT2;
|
|
36
|
-
relClose(T2 / T1, expectedRatio, 1e-12);
|
|
37
|
-
});
|
|
38
|
-
test('Heliocentric: a = 1 AU around Sun → T ≈ 365.256 days', () => {
|
|
39
|
-
const AU = 149597870700; // m (IAU 2012)
|
|
40
|
-
const muSun = 1.32712440018e20; // m³/s²
|
|
41
|
-
const T = keplerPeriod(AU, muSun);
|
|
42
|
-
const siderealYear = 365.256363004 * 86400; // s
|
|
43
|
-
relClose(T, siderealYear, 1e-3); // 0.1% tolerance
|
|
44
|
-
});
|
|
45
|
-
test('Input validation: a <= 0, μ <= 0, or non-finite throws', () => {
|
|
46
|
-
const a = 7000e3;
|
|
47
|
-
const mu = 3.986004418e14;
|
|
48
|
-
// a invalid
|
|
49
|
-
assert.throws(() => keplerPeriod(0, mu), /positive/);
|
|
50
|
-
assert.throws(() => keplerPeriod(-1, mu), /positive/);
|
|
51
|
-
assert.throws(() => keplerPeriod(Number.NaN, mu), /finite/);
|
|
52
|
-
// μ invalid
|
|
53
|
-
assert.throws(() => keplerPeriod(a, 0), /positive/);
|
|
54
|
-
assert.throws(() => keplerPeriod(a, -1), /positive/);
|
|
55
|
-
assert.throws(() => keplerPeriod(a, Number.NaN), /finite/);
|
|
56
|
-
});
|
|
57
|
-
test('Numerical stability: very large a still yields finite result', () => {
|
|
58
|
-
const a = 1e9; // 1,000,000 km
|
|
59
|
-
const muEarth = 3.986004418e14; // m³/s²
|
|
60
|
-
const T = keplerPeriod(a, muEarth);
|
|
61
|
-
assert.ok(Number.isFinite(T) && T > 0);
|
|
62
|
-
});
|
|
63
|
-
// Optional tight identity test against the formula directly
|
|
64
|
-
test('Definition check: T = 2π * sqrt(a^3/μ)', () => {
|
|
65
|
-
const a = 12345678; // m
|
|
66
|
-
const mu = 7.654321e13; // m³/s²
|
|
67
|
-
const T = keplerPeriod(a, mu);
|
|
68
|
-
const expected = 2 * Math.PI * Math.sqrt((a * a * a) / mu);
|
|
69
|
-
relClose(T, expected, 1e-15);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=kepler-period.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kepler-period.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/kepler-period.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mean-motion.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/mean-motion.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { meanMotion } from '../mean-motion';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('meanMotion', () => {
|
|
6
|
-
test('computes n = sqrt(mu / a^3) for a typical Earth orbit (km-based)', () => {
|
|
7
|
-
const mu = 398600.4418; // km³/s²
|
|
8
|
-
const a = 7000; // km
|
|
9
|
-
const n = meanMotion(mu, a);
|
|
10
|
-
const expected = Math.sqrt(mu / (a * a * a));
|
|
11
|
-
relClose(n, expected);
|
|
12
|
-
assert.ok(n > 0);
|
|
13
|
-
});
|
|
14
|
-
test('scales as a^(-3/2): doubling a reduces n by 2^(3/2)', () => {
|
|
15
|
-
const mu = 398600.4418;
|
|
16
|
-
const a1 = 7000;
|
|
17
|
-
const a2 = 2 * a1;
|
|
18
|
-
const n1 = meanMotion(mu, a1);
|
|
19
|
-
const n2 = meanMotion(mu, a2);
|
|
20
|
-
const expectedRatio = 1 / Math.pow(2, 3 / 2); // n2/n1
|
|
21
|
-
relClose(n2 / n1, expectedRatio);
|
|
22
|
-
});
|
|
23
|
-
test('scales as sqrt(mu): quadrupling mu doubles n', () => {
|
|
24
|
-
const mu1 = 100;
|
|
25
|
-
const mu2 = 4 * mu1;
|
|
26
|
-
const a = 10;
|
|
27
|
-
const n1 = meanMotion(mu1, a);
|
|
28
|
-
const n2 = meanMotion(mu2, a);
|
|
29
|
-
relClose(n2 / n1, 2);
|
|
30
|
-
});
|
|
31
|
-
test('throws TypeError when mu is not finite (NaN)', () => {
|
|
32
|
-
assert.throws(() => meanMotion(Number.NaN, 1), (err) => err instanceof TypeError &&
|
|
33
|
-
err.message === 'mu must be finite. Received: NaN');
|
|
34
|
-
});
|
|
35
|
-
test('throws TypeError when a is not finite (Infinity)', () => {
|
|
36
|
-
assert.throws(() => meanMotion(1, Number.POSITIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
37
|
-
err.message === 'a must be finite. Received: Infinity');
|
|
38
|
-
});
|
|
39
|
-
test('throws RangeError when mu <= 0 (mu === 0)', () => {
|
|
40
|
-
assert.throws(() => meanMotion(0, 1), (err) => err instanceof RangeError &&
|
|
41
|
-
err.message === 'mu must be > 0. Received: 0');
|
|
42
|
-
});
|
|
43
|
-
test('throws RangeError when a <= 0 (a === 0)', () => {
|
|
44
|
-
assert.throws(() => meanMotion(1, 0), (err) => err instanceof RangeError &&
|
|
45
|
-
err.message === 'a must be > 0. Received: 0');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
//# sourceMappingURL=mean-motion.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mean-motion.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/mean-motion.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"peri-apoapsis-radii.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/peri-apoapsis-radii.spec.ts"],"names":[],"mappings":""}
|