@interstellar-tools/equations 0.49.0 → 0.51.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,74 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { periApoapsisRadii } from '../peri-apoapsis-radii';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('periApoapsisRadii', () => {
|
|
6
|
-
test('ellipse: matches rp = a(1-e), ra = a(1+e)', () => {
|
|
7
|
-
const a = 7000e3; // m
|
|
8
|
-
const e = 0.01;
|
|
9
|
-
const { rp, ra } = periApoapsisRadii(a, e);
|
|
10
|
-
relClose(rp, a * (1 - e), 1e-15);
|
|
11
|
-
relClose(ra, a * (1 + e), 1e-15);
|
|
12
|
-
assert.ok(rp > 0 && ra > 0);
|
|
13
|
-
assert.ok(ra > rp);
|
|
14
|
-
});
|
|
15
|
-
test('circular: e = 0 → rp = ra = a', () => {
|
|
16
|
-
const a = 6778e3;
|
|
17
|
-
const e = 0;
|
|
18
|
-
const { rp, ra } = periApoapsisRadii(a, e);
|
|
19
|
-
relClose(rp, a, 1e-15);
|
|
20
|
-
relClose(ra, a, 1e-15);
|
|
21
|
-
});
|
|
22
|
-
test('ellipse with e close to 1 still yields positive rp and ra', () => {
|
|
23
|
-
const a = 10000000;
|
|
24
|
-
const e = 0.999999;
|
|
25
|
-
const { rp, ra } = periApoapsisRadii(a, e);
|
|
26
|
-
assert.ok(rp > 0 && ra > 0);
|
|
27
|
-
relClose(rp, a * (1 - e), 1e-12);
|
|
28
|
-
relClose(ra, a * (1 + e), 1e-12);
|
|
29
|
-
});
|
|
30
|
-
test('hyperbola: a < 0 and e > 1 → rp = |a|(e-1), ra = null', () => {
|
|
31
|
-
const a = -50000000; // m
|
|
32
|
-
const e = 1.2;
|
|
33
|
-
const { rp, ra } = periApoapsisRadii(a, e);
|
|
34
|
-
relClose(rp, Math.abs(a) * (e - 1), 1e-15);
|
|
35
|
-
assert.equal(ra, null);
|
|
36
|
-
assert.ok(rp > 0);
|
|
37
|
-
});
|
|
38
|
-
test('invalid combos: parabolic e=1 with a>0; and e>=1 for ellipse', () => {
|
|
39
|
-
const a = 7000e3;
|
|
40
|
-
assert.throws(() => periApoapsisRadii(a, 1), /Parabolic \(e=1\) is not defined with finite a/);
|
|
41
|
-
assert.throws(() => periApoapsisRadii(a, 1.1), /For a>0 \(elliptic\/circular\), eccentricity must satisfy 0 ≤ e < 1/);
|
|
42
|
-
});
|
|
43
|
-
test('invalid hyperbola: a < 0 with e ≤ 1 throws', () => {
|
|
44
|
-
const a = -20000000;
|
|
45
|
-
assert.throws(() => periApoapsisRadii(a, 1), /For a<0 \(hyperbolic\), eccentricity must satisfy e > 1/);
|
|
46
|
-
assert.throws(() => periApoapsisRadii(a, 0.5), /For a<0 \(hyperbolic\), eccentricity must satisfy e > 1/);
|
|
47
|
-
});
|
|
48
|
-
test('monotonicity (ellipse): increasing e decreases rp and increases ra', () => {
|
|
49
|
-
const a = 9000e3;
|
|
50
|
-
const e1 = 0.1;
|
|
51
|
-
const e2 = 0.3;
|
|
52
|
-
const r1 = periApoapsisRadii(a, e1);
|
|
53
|
-
const r2 = periApoapsisRadii(a, e2);
|
|
54
|
-
assert.ok(r2.rp < r1.rp); // rp decreases with e
|
|
55
|
-
assert.ok(r2.ra > r1.ra); // ra increases with e
|
|
56
|
-
});
|
|
57
|
-
test('input validation: a=0, non-finite a/e; negative e', () => {
|
|
58
|
-
const a = 7000e3;
|
|
59
|
-
const e = 0.1;
|
|
60
|
-
// a invalid
|
|
61
|
-
assert.throws(() => periApoapsisRadii(0, e), /non-zero/);
|
|
62
|
-
assert.throws(() => periApoapsisRadii(Number.NaN, e), /finite/);
|
|
63
|
-
// e invalid
|
|
64
|
-
assert.throws(() => periApoapsisRadii(a, -1e-3), /≥ 0/);
|
|
65
|
-
assert.throws(() => periApoapsisRadii(a, Number.NaN), /finite/);
|
|
66
|
-
});
|
|
67
|
-
test('numerical stability: very large magnitudes still finite', () => {
|
|
68
|
-
const { rp: rp1, ra: ra1 } = periApoapsisRadii(1e12, 0.2);
|
|
69
|
-
assert.ok(Number.isFinite(rp1) && Number.isFinite(ra1));
|
|
70
|
-
const { rp: rp2, ra: ra2 } = periApoapsisRadii(-1e12, 1.5);
|
|
71
|
-
assert.ok(Number.isFinite(rp2) && ra2 === null);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
//# sourceMappingURL=peri-apoapsis-radii.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"peri-apoapsis-radii.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/peri-apoapsis-radii.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specific-angular-momentum-from-elements.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { specificAngularMomentumFromElements } from '../specific-angular-momentum-from-elements';
|
|
5
|
-
describe('specificAngularMomentumFromElements', () => {
|
|
6
|
-
test('definition (elliptic): h = sqrt(μ a (1-e²))', () => {
|
|
7
|
-
const mu = 3.986004418e14; // m³/s² (Earth GM)
|
|
8
|
-
const a = 7000e3; // m
|
|
9
|
-
const e = 0.1; // -
|
|
10
|
-
const h = specificAngularMomentumFromElements(a, e, mu);
|
|
11
|
-
const expected = Math.sqrt(mu * a * (1 - e * e));
|
|
12
|
-
relClose(h, expected, 1e-15);
|
|
13
|
-
});
|
|
14
|
-
test('circular limit (e=0): h = sqrt(μ a)', () => {
|
|
15
|
-
const mu = 3.986004418e14;
|
|
16
|
-
const a = 6778e3;
|
|
17
|
-
const e = 0;
|
|
18
|
-
const h = specificAngularMomentumFromElements(a, e, mu);
|
|
19
|
-
const expected = Math.sqrt(mu * a);
|
|
20
|
-
relClose(h, expected, 1e-15);
|
|
21
|
-
});
|
|
22
|
-
test('hyperbolic case (a<0, e>1): radicand positive → valid h', () => {
|
|
23
|
-
const mu = 3.986004418e14;
|
|
24
|
-
const a = -50000000; // m
|
|
25
|
-
const e = 1.2; // -
|
|
26
|
-
const h = specificAngularMomentumFromElements(a, e, mu);
|
|
27
|
-
const expected = Math.sqrt(mu * a * (1 - e * e)); // positive since a<0 and (1-e²)<0
|
|
28
|
-
relClose(h, expected, 1e-15);
|
|
29
|
-
});
|
|
30
|
-
test('tolerance clamp: tiny negative radicand → returns ~0', () => {
|
|
31
|
-
const mu = 3.986004418e14;
|
|
32
|
-
const a = 7000e3; // m (positive)
|
|
33
|
-
// Function tolerance: tol = |1e-14 * mu * |a||
|
|
34
|
-
const tol = Math.abs(1e-14 * mu * Math.abs(a));
|
|
35
|
-
// Target radicand = -tol/2: μ*a*(1-e²) = -tol/2 => 1-e² = -(tol/2)/(μ*a)
|
|
36
|
-
const oneMinusE2 = -(tol / 2) / (mu * a);
|
|
37
|
-
const e = Math.sqrt(1 - oneMinusE2); // slightly > 1 (physically inconsistent with a>0), used only to hit tolerance path
|
|
38
|
-
const h = specificAngularMomentumFromElements(a, e, mu);
|
|
39
|
-
absClose(h, 0, 1e-12);
|
|
40
|
-
});
|
|
41
|
-
test('invalid: clearly negative radicand throws (a>0, e>1 far from 1)', () => {
|
|
42
|
-
const mu = 3.986004418e14;
|
|
43
|
-
const a = 7000e3; // m
|
|
44
|
-
const e = 1.1; // makes 1 - e² < 0 with a>0 → negative radicand
|
|
45
|
-
assert.throws(() => specificAngularMomentumFromElements(a, e, mu), /Invalid \(a,e\).*μ·a·\(1-e²\) < 0/);
|
|
46
|
-
});
|
|
47
|
-
test('μ = 0 → h = 0 (degenerate but mathematically consistent)', () => {
|
|
48
|
-
const mu = 0;
|
|
49
|
-
const a = 7000e3;
|
|
50
|
-
const e = 0.3;
|
|
51
|
-
const h = specificAngularMomentumFromElements(a, e, mu);
|
|
52
|
-
absClose(h, 0, 0);
|
|
53
|
-
});
|
|
54
|
-
test('scaling: for fixed e, h ∝ sqrt(|a|)', () => {
|
|
55
|
-
const mu = 3.986004418e14;
|
|
56
|
-
const e = 0.2;
|
|
57
|
-
const a1 = 8000e3;
|
|
58
|
-
const a2 = 2 * a1;
|
|
59
|
-
const h1 = specificAngularMomentumFromElements(a1, e, mu);
|
|
60
|
-
const h2 = specificAngularMomentumFromElements(a2, e, mu);
|
|
61
|
-
const expectedRatio = Math.sqrt(Math.abs(a2) / Math.abs(a1));
|
|
62
|
-
relClose(h2 / h1, expectedRatio, 1e-12);
|
|
63
|
-
});
|
|
64
|
-
test('input validation: a=0, non-finite a/e/μ, negative e, negative μ', () => {
|
|
65
|
-
const a = 7000e3;
|
|
66
|
-
const e = 0.1;
|
|
67
|
-
const mu = 3.986004418e14;
|
|
68
|
-
// a invalid
|
|
69
|
-
assert.throws(() => specificAngularMomentumFromElements(0, e, mu), /non-zero/);
|
|
70
|
-
assert.throws(() => specificAngularMomentumFromElements(Number.NaN, e, mu), /finite/);
|
|
71
|
-
// e invalid
|
|
72
|
-
assert.throws(() => specificAngularMomentumFromElements(a, -1e-3, mu), /≥ 0/);
|
|
73
|
-
assert.throws(() => specificAngularMomentumFromElements(a, Number.NaN, mu), /finite/);
|
|
74
|
-
// μ invalid
|
|
75
|
-
assert.throws(() => specificAngularMomentumFromElements(a, e, -1), /≥ 0/);
|
|
76
|
-
assert.throws(() => specificAngularMomentumFromElements(a, e, Number.NaN), /finite/);
|
|
77
|
-
});
|
|
78
|
-
test('numerical sanity: very large magnitudes still finite', () => {
|
|
79
|
-
const mu = 1e20;
|
|
80
|
-
const a = 1e9;
|
|
81
|
-
const e = 0.5;
|
|
82
|
-
const h = specificAngularMomentumFromElements(a, e, mu);
|
|
83
|
-
assert.ok(Number.isFinite(h) && h > 0);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
//# sourceMappingURL=specific-angular-momentum-from-elements.spec.js.map
|
package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specific-angular-momentum-from-elements.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specific-angular-momentum.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/specific-angular-momentum.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { specificAngularMomentum } from '../specific-angular-momentum';
|
|
5
|
-
import { dot, norm } from '../../helpers/misc';
|
|
6
|
-
describe('specificAngularMomentum', () => {
|
|
7
|
-
test('orthogonal state: r ⟂ v → h = r * v', () => {
|
|
8
|
-
const r = [6778e3, 0, 0]; // m
|
|
9
|
-
const v = [0, 7.67e3, 0]; // m/s
|
|
10
|
-
const h = specificAngularMomentum(r, v);
|
|
11
|
-
const expected = norm(r) * norm(v); // r*v_perp (since perp)
|
|
12
|
-
relClose(h, expected, 1e-14);
|
|
13
|
-
});
|
|
14
|
-
test('manual cross vs function: ||r×v|| matches', () => {
|
|
15
|
-
const r = [1.2e7, -3.4e6, 5.6e6];
|
|
16
|
-
const v = [-7.8e3, 9.1e3, 2.3e3];
|
|
17
|
-
const hx = r[1] * v[2] - r[2] * v[1];
|
|
18
|
-
const hy = r[2] * v[0] - r[0] * v[2];
|
|
19
|
-
const hz = r[0] * v[1] - r[1] * v[0];
|
|
20
|
-
const expected = Math.hypot(hx, hy, hz);
|
|
21
|
-
const h = specificAngularMomentum(r, v);
|
|
22
|
-
relClose(h, expected, 1e-15);
|
|
23
|
-
});
|
|
24
|
-
test('scalar identity: h = |r| |v| sin(theta)', () => {
|
|
25
|
-
const r = [7e6, 2e6, -1e6];
|
|
26
|
-
const v = [1e3, -7e3, 4e3];
|
|
27
|
-
const rr = norm(r);
|
|
28
|
-
const vv = norm(v);
|
|
29
|
-
const cosT = dot(r, v) / (rr * vv);
|
|
30
|
-
const sinT = Math.sqrt(Math.max(0, 1 - cosT * cosT));
|
|
31
|
-
const expected = rr * vv * sinT;
|
|
32
|
-
const h = specificAngularMomentum(r, v);
|
|
33
|
-
relClose(h, expected, 1e-12);
|
|
34
|
-
});
|
|
35
|
-
test('parallel vectors (purely radial) → h = 0', () => {
|
|
36
|
-
const r = [8e6, -2e6, 4e6];
|
|
37
|
-
const k = 3.5e-3; // arbitrary scale to mimic m/s
|
|
38
|
-
const v = [k * r[0], k * r[1], k * r[2]];
|
|
39
|
-
const h = specificAngularMomentum(r, v);
|
|
40
|
-
absClose(h, 0, 1e-12);
|
|
41
|
-
});
|
|
42
|
-
test('zero velocity → h = 0', () => {
|
|
43
|
-
const r = [7e6, 0, 0];
|
|
44
|
-
const v = [0, 0, 0];
|
|
45
|
-
const h = specificAngularMomentum(r, v);
|
|
46
|
-
absClose(h, 0, 1e-12);
|
|
47
|
-
});
|
|
48
|
-
test('rotation invariance of magnitude (rotate 90° about z)', () => {
|
|
49
|
-
const r = [5e6, 2e6, 0];
|
|
50
|
-
const v = [1e3, 3e3, 0];
|
|
51
|
-
const h1 = specificAngularMomentum(r, v);
|
|
52
|
-
// 90° rotation about z: (x,y) -> (-y, x)
|
|
53
|
-
const r2 = [-r[1], r[0], 0];
|
|
54
|
-
const v2 = [-v[1], v[0], 0];
|
|
55
|
-
const h2 = specificAngularMomentum(r2, v2);
|
|
56
|
-
relClose(h2, h1, 1e-15);
|
|
57
|
-
});
|
|
58
|
-
test('units sanity (circular identity): h ≈ sqrt(mu * r) with v_c = sqrt(mu/r)', () => {
|
|
59
|
-
const mu = 3.986004418e14; // Earth GM
|
|
60
|
-
const r = [6778e3, 0, 0];
|
|
61
|
-
const v = [0, Math.sqrt(mu / r[0]), 0];
|
|
62
|
-
const h = specificAngularMomentum(r, v);
|
|
63
|
-
const expected = Math.sqrt(mu * r[0]);
|
|
64
|
-
relClose(h, expected, 1e-12);
|
|
65
|
-
});
|
|
66
|
-
test('input validation: non-finite components throw', () => {
|
|
67
|
-
const rOK = [7e6, 0, 0];
|
|
68
|
-
const vOK = [0, 7.5e3, 0];
|
|
69
|
-
assert.throws(() => specificAngularMomentum([Number.NaN, 0, 0], vOK), /finite/);
|
|
70
|
-
assert.throws(() => specificAngularMomentum([Infinity, 0, 0], vOK), /finite/);
|
|
71
|
-
assert.throws(() => specificAngularMomentum(rOK, [0, Number.NaN, 0]), /finite/);
|
|
72
|
-
});
|
|
73
|
-
test('input validation: zero-length position vector throws', () => {
|
|
74
|
-
const rZero = [0, 0, 0];
|
|
75
|
-
const v = [1e3, 2e3, 3e3];
|
|
76
|
-
assert.throws(() => specificAngularMomentum(rZero, v), /non-zero/);
|
|
77
|
-
});
|
|
78
|
-
test('numerical stability: very large magnitudes still finite', () => {
|
|
79
|
-
const r = [1e9, 1e9, 1e9];
|
|
80
|
-
const v = [1e5, -2e5, 3e5];
|
|
81
|
-
const h = specificAngularMomentum(r, v);
|
|
82
|
-
assert.ok(Number.isFinite(h) && h >= 0);
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
//# sourceMappingURL=specific-angular-momentum.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specific-angular-momentum.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/specific-angular-momentum.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specific-mechanical-energy.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/specific-mechanical-energy.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { specificMechanicalEnergy } from '../specific-mechanical-energy';
|
|
4
|
-
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('specificMechanicalEnergy', () => {
|
|
6
|
-
test('circular orbit: ε = -μ/(2r) when v = sqrt(μ/r)', () => {
|
|
7
|
-
const mu = 3.986004418e14; // m³/s² (Earth GM)
|
|
8
|
-
const r = 6378e3 + 400e3; // m (LEO-ish)
|
|
9
|
-
const v = Math.sqrt(mu / r); // m/s
|
|
10
|
-
const eps = specificMechanicalEnergy(v, r, mu);
|
|
11
|
-
const expected = -mu / (2 * r);
|
|
12
|
-
relClose(eps, expected, 1e-12);
|
|
13
|
-
});
|
|
14
|
-
test('parabolic case: v = sqrt(2μ/r) → ε ≈ 0', () => {
|
|
15
|
-
const mu = 3.986004418e14; // m³/s²
|
|
16
|
-
const r = 7000e3; // m
|
|
17
|
-
const v = Math.sqrt((2 * mu) / r);
|
|
18
|
-
const eps = specificMechanicalEnergy(v, r, mu);
|
|
19
|
-
// Use absolute tolerance because the expected value is 0
|
|
20
|
-
absClose(eps, 0, 1e-9);
|
|
21
|
-
});
|
|
22
|
-
test('hyperbolic case: v slightly above escape → ε > 0', () => {
|
|
23
|
-
const mu = 3.986004418e14;
|
|
24
|
-
const r = 7000e3;
|
|
25
|
-
const v_escape = Math.sqrt((2 * mu) / r);
|
|
26
|
-
const v = 1.01 * v_escape;
|
|
27
|
-
const eps = specificMechanicalEnergy(v, r, mu);
|
|
28
|
-
assert.ok(eps > 0, 'ε should be positive for hyperbolic cases');
|
|
29
|
-
});
|
|
30
|
-
test('elliptic case: v below circular → ε < 0', () => {
|
|
31
|
-
const mu = 3.986004418e14;
|
|
32
|
-
const r = 7000e3;
|
|
33
|
-
const v_circ = Math.sqrt(mu / r);
|
|
34
|
-
const v = 0.95 * v_circ;
|
|
35
|
-
const eps = specificMechanicalEnergy(v, r, mu);
|
|
36
|
-
assert.ok(eps < 0, 'ε should be negative for bound (elliptic) cases');
|
|
37
|
-
});
|
|
38
|
-
test('semi-major axis identity: ε = -μ/(2a) (using vis-viva for v)', () => {
|
|
39
|
-
const mu = 3.986004418e14;
|
|
40
|
-
const a = 10000e3; // m (semi-major axis)
|
|
41
|
-
const r = 8000e3; // m (some point on the ellipse)
|
|
42
|
-
const v = Math.sqrt(mu * (2 / r - 1 / a)); // vis-viva
|
|
43
|
-
const eps = specificMechanicalEnergy(v, r, mu);
|
|
44
|
-
const expected = -mu / (2 * a);
|
|
45
|
-
relClose(eps, expected, 1e-12);
|
|
46
|
-
});
|
|
47
|
-
test('monotonic in speed: increasing v increases ε (same r, μ)', () => {
|
|
48
|
-
const mu = 3.986004418e14;
|
|
49
|
-
const r = 8000e3;
|
|
50
|
-
const v1 = 7000;
|
|
51
|
-
const v2 = 7500;
|
|
52
|
-
const eps1 = specificMechanicalEnergy(v1, r, mu);
|
|
53
|
-
const eps2 = specificMechanicalEnergy(v2, r, mu);
|
|
54
|
-
assert.ok(eps2 > eps1);
|
|
55
|
-
});
|
|
56
|
-
test('increases with radius for fixed v: larger r → larger ε (less negative)', () => {
|
|
57
|
-
const mu = 3.986004418e14;
|
|
58
|
-
const v = 7500;
|
|
59
|
-
const r1 = 7000e3;
|
|
60
|
-
const r2 = 8000e3;
|
|
61
|
-
const eps1 = specificMechanicalEnergy(v, r1, mu);
|
|
62
|
-
const eps2 = specificMechanicalEnergy(v, r2, mu);
|
|
63
|
-
assert.ok(eps2 > eps1);
|
|
64
|
-
});
|
|
65
|
-
test('throws on invalid inputs', () => {
|
|
66
|
-
const mu = 3.986004418e14;
|
|
67
|
-
const r = 7000e3;
|
|
68
|
-
const v = 7500;
|
|
69
|
-
// v invalid
|
|
70
|
-
assert.throws(() => specificMechanicalEnergy(Number.NaN, r, mu), /non-negative/);
|
|
71
|
-
assert.throws(() => specificMechanicalEnergy(-1, r, mu), /non-negative/);
|
|
72
|
-
// r invalid
|
|
73
|
-
assert.throws(() => specificMechanicalEnergy(v, Number.NaN, mu), /positive/);
|
|
74
|
-
assert.throws(() => specificMechanicalEnergy(v, 0, mu), /positive/);
|
|
75
|
-
assert.throws(() => specificMechanicalEnergy(v, -1, mu), /positive/);
|
|
76
|
-
// mu invalid
|
|
77
|
-
assert.throws(() => specificMechanicalEnergy(v, r, Number.NaN), /non-negative/);
|
|
78
|
-
assert.throws(() => specificMechanicalEnergy(v, r, -1), /non-negative/);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
//# sourceMappingURL=specific-mechanical-energy.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specific-mechanical-energy.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/specific-mechanical-energy.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAE9E,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,mBAAmB;QAC9C,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;QAEnC,MAAM,GAAG,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,QAAQ;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAElC,MAAM,GAAG,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,yDAAyD;QACzD,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,EAAE,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC;QAE1B,MAAM,GAAG,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,2CAA2C,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;QAExB,MAAM,GAAG,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,iDAAiD,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,sBAAsB;QACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,gCAAgC;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QAEtD,MAAM,GAAG,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,EAAE,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC;QAEhB,MAAM,IAAI,GAAG,wBAAwB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,wBAAwB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEjD,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAClF,MAAM,EAAE,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC;QACf,MAAM,EAAE,GAAG,MAAM,CAAC;QAClB,MAAM,EAAE,GAAG,MAAM,CAAC;QAElB,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjD,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,EAAE,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC;QAEf,YAAY;QACZ,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EACjD,cAAc,CACf,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;QAEzE,YAAY;QACZ,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,EACjD,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAErE,aAAa;QACb,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAChD,cAAc,CACf,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sphere-of-influence-radius.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/sphere-of-influence-radius.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { sphereOfInfluenceRadius } from '../sphere-of-influence-radius';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('sphereOfInfluenceRadius', () => {
|
|
6
|
-
test('computes rSOI = a * (m/M)^(2/5) for typical inputs (Earth around Sun, km-based)', () => {
|
|
7
|
-
const aKm = 149597870.7; // km
|
|
8
|
-
const mEarth = 5.972e24; // kg
|
|
9
|
-
const mSun = 1.9885e30; // kg
|
|
10
|
-
const rSoi = sphereOfInfluenceRadius(aKm, mEarth, mSun);
|
|
11
|
-
const expected = aKm * Math.pow(mEarth / mSun, 2 / 5);
|
|
12
|
-
relClose(rSoi, expected);
|
|
13
|
-
assert.ok(rSoi > 0);
|
|
14
|
-
});
|
|
15
|
-
test('scales linearly with a (doubling a doubles rSOI)', () => {
|
|
16
|
-
const a = 10;
|
|
17
|
-
const m = 2;
|
|
18
|
-
const M = 100;
|
|
19
|
-
const r1 = sphereOfInfluenceRadius(a, m, M);
|
|
20
|
-
const r2 = sphereOfInfluenceRadius(2 * a, m, M);
|
|
21
|
-
relClose(r2, 2 * r1);
|
|
22
|
-
});
|
|
23
|
-
test('increases with secondary mass m (all else equal)', () => {
|
|
24
|
-
const a = 10;
|
|
25
|
-
const M = 100;
|
|
26
|
-
const rSmall = sphereOfInfluenceRadius(a, 1, M);
|
|
27
|
-
const rLarge = sphereOfInfluenceRadius(a, 10, M);
|
|
28
|
-
assert.ok(rLarge > rSmall, `expected rSOI to increase with m: ${rSmall} -> ${rLarge}`);
|
|
29
|
-
});
|
|
30
|
-
test('decreases with primary mass M (all else equal)', () => {
|
|
31
|
-
const a = 10;
|
|
32
|
-
const m = 10;
|
|
33
|
-
const rSmallM = sphereOfInfluenceRadius(a, m, 100);
|
|
34
|
-
const rLargeM = sphereOfInfluenceRadius(a, m, 1000);
|
|
35
|
-
assert.ok(rLargeM < rSmallM, `expected rSOI to decrease with M: ${rSmallM} -> ${rLargeM}`);
|
|
36
|
-
});
|
|
37
|
-
test('throws TypeError when a is not finite (NaN)', () => {
|
|
38
|
-
assert.throws(() => sphereOfInfluenceRadius(Number.NaN, 1, 1), (err) => err instanceof TypeError &&
|
|
39
|
-
err.message === 'a must be a finite number. Received: NaN');
|
|
40
|
-
});
|
|
41
|
-
test('throws TypeError when m is not finite (Infinity)', () => {
|
|
42
|
-
assert.throws(() => sphereOfInfluenceRadius(1, Number.POSITIVE_INFINITY, 1), (err) => err instanceof TypeError &&
|
|
43
|
-
err.message === 'm must be a finite number. Received: Infinity');
|
|
44
|
-
});
|
|
45
|
-
test('throws TypeError when M is not finite (-Infinity)', () => {
|
|
46
|
-
assert.throws(() => sphereOfInfluenceRadius(1, 1, Number.NEGATIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
47
|
-
err.message === 'M must be a finite number. Received: -Infinity');
|
|
48
|
-
});
|
|
49
|
-
test('throws RangeError when a <= 0', () => {
|
|
50
|
-
assert.throws(() => sphereOfInfluenceRadius(0, 1, 1), (err) => err instanceof RangeError &&
|
|
51
|
-
err.message === 'a must be > 0. Received: 0');
|
|
52
|
-
});
|
|
53
|
-
test('throws RangeError when m <= 0', () => {
|
|
54
|
-
assert.throws(() => sphereOfInfluenceRadius(1, 0, 1), (err) => err instanceof RangeError &&
|
|
55
|
-
err.message === 'm must be > 0. Received: 0');
|
|
56
|
-
});
|
|
57
|
-
test('throws RangeError when M <= 0', () => {
|
|
58
|
-
assert.throws(() => sphereOfInfluenceRadius(1, 1, 0), (err) => err instanceof RangeError &&
|
|
59
|
-
err.message === 'M must be > 0. Received: 0');
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
//# sourceMappingURL=sphere-of-influence-radius.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sphere-of-influence-radius.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/sphere-of-influence-radius.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vis-viva-speed.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/vis-viva-speed.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { visVivaSpeed } from '../vis-viva-speed';
|
|
5
|
-
describe('visVivaSpeed', () => {
|
|
6
|
-
test('circular orbit: a = r → v = sqrt(μ/r)', () => {
|
|
7
|
-
const mu = 3.986004418e14; // m³/s² (Earth GM)
|
|
8
|
-
const r = 6778e3; // m (LEO-ish)
|
|
9
|
-
const a = r;
|
|
10
|
-
const v = visVivaSpeed(r, a, mu);
|
|
11
|
-
const expected = Math.sqrt(mu / r);
|
|
12
|
-
relClose(v, expected, 1e-12);
|
|
13
|
-
});
|
|
14
|
-
test('parabolic trajectory: a = Infinity → v = sqrt(2μ/r)', () => {
|
|
15
|
-
const mu = 3.986004418e14;
|
|
16
|
-
const r = 7000e3;
|
|
17
|
-
const v = visVivaSpeed(r, Infinity, mu);
|
|
18
|
-
const expected = Math.sqrt((2 * mu) / r);
|
|
19
|
-
relClose(v, expected, 1e-12);
|
|
20
|
-
});
|
|
21
|
-
test('hyperbolic case: a < 0 uses same formula and yields valid speed', () => {
|
|
22
|
-
const mu = 3.986004418e14;
|
|
23
|
-
const r = 10000e3;
|
|
24
|
-
const a = -15000e3; // negative semi-major axis
|
|
25
|
-
const v = visVivaSpeed(r, a, mu);
|
|
26
|
-
const expected = Math.sqrt(mu * (2 / r - 1 / a));
|
|
27
|
-
relClose(v, expected, 1e-12);
|
|
28
|
-
});
|
|
29
|
-
test('radicand zero boundary: choose a such that 2/r - 1/a = 0 → v = 0', () => {
|
|
30
|
-
const mu = 3.986004418e14;
|
|
31
|
-
const r = 8000e3;
|
|
32
|
-
const a = r / 2; // 1/a = 2/r
|
|
33
|
-
const v = visVivaSpeed(r, a, mu);
|
|
34
|
-
absClose(v, 0, 1e-12);
|
|
35
|
-
});
|
|
36
|
-
test('tiny negative radicand (within tolerance) is clamped to v ≈ 0', () => {
|
|
37
|
-
const mu = 3.986004418e14;
|
|
38
|
-
const r = 8000e3;
|
|
39
|
-
// Function's tolerance: tol = |1e-14 * mu / r|
|
|
40
|
-
const tol = Math.abs((1e-14 * mu) / r);
|
|
41
|
-
const delta = tol / (2 * mu); // makes radicand = μ*(2/r - 1/a) = -tol/2
|
|
42
|
-
// Choose 1/a = 2/r + delta → a = 1 / (2/r + delta)
|
|
43
|
-
const a = 1 / (2 / r + delta);
|
|
44
|
-
const v = visVivaSpeed(r, a, mu);
|
|
45
|
-
absClose(v, 0, 1e-12);
|
|
46
|
-
});
|
|
47
|
-
test('significantly negative radicand throws (physically impossible state)', () => {
|
|
48
|
-
const mu = 3.986004418e14;
|
|
49
|
-
const r = 8000e3;
|
|
50
|
-
const a = r / 4; // 1/a = 4/r -> 2/r - 1/a = -2/r (negative)
|
|
51
|
-
assert.throws(() => visVivaSpeed(r, a, mu), /Invalid state: μ\*\(2\/r - 1\/a\) < 0/);
|
|
52
|
-
});
|
|
53
|
-
test('monotonic with radius for fixed a, μ: larger r → smaller v (ellipse domain)', () => {
|
|
54
|
-
const mu = 3.986004418e14;
|
|
55
|
-
const a = 10000e3; // ellipse: r must be < 2a
|
|
56
|
-
const r1 = 8000e3;
|
|
57
|
-
const r2 = 15000e3; // < 2a = 20000 km
|
|
58
|
-
const v1 = visVivaSpeed(r1, a, mu);
|
|
59
|
-
const v2 = visVivaSpeed(r2, a, mu);
|
|
60
|
-
assert.ok(v1 > v2, 'speed should decrease as radius increases (for fixed a)');
|
|
61
|
-
});
|
|
62
|
-
test('input validation: r<=0, mu<0/NaN, a non-finite (except +Infinity), a=0', () => {
|
|
63
|
-
const mu = 3.986004418e14;
|
|
64
|
-
const r = 7000e3;
|
|
65
|
-
const a = r;
|
|
66
|
-
// r invalid
|
|
67
|
-
assert.throws(() => visVivaSpeed(0, a, mu), /positive/);
|
|
68
|
-
assert.throws(() => visVivaSpeed(-1, a, mu), /positive/);
|
|
69
|
-
assert.throws(() => visVivaSpeed(Number.NaN, a, mu), /finite/);
|
|
70
|
-
// mu invalid
|
|
71
|
-
assert.throws(() => visVivaSpeed(r, a, -1), /non-negative/);
|
|
72
|
-
assert.throws(() => visVivaSpeed(r, a, Number.NaN), /finite/);
|
|
73
|
-
// a invalid (non-finite other than +Infinity)
|
|
74
|
-
assert.throws(() => visVivaSpeed(r, Number.NaN, mu), /finite/);
|
|
75
|
-
assert.throws(() => visVivaSpeed(r, Number.NEGATIVE_INFINITY, mu), /finite/);
|
|
76
|
-
// a = 0 invalid
|
|
77
|
-
assert.throws(() => visVivaSpeed(r, 0, mu), /non-zero/);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
//# sourceMappingURL=vis-viva-speed.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vis-viva-speed.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/vis-viva-speed.spec.ts"],"names":[],"mappings":"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"}
|