@interstellar-tools/equations 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/compute-angle.int.spec.js +10 -10
- package/dist/__tests__/compute-angle.int.spec.js.map +1 -1
- package/dist/__tests__/eccentric-to-true-anomaly.spec.js +4 -4
- package/dist/__tests__/eccentric-to-true-anomaly.spec.js.map +1 -1
- package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts +2 -0
- package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +1 -0
- package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.js +92 -0
- package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +3 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -1
- package/dist/__tests__/helpers/index.js +13 -0
- package/dist/__tests__/helpers/index.js.map +1 -1
- package/dist/__tests__/solve-kepler-bisection.spec.js +76 -32
- package/dist/__tests__/solve-kepler-bisection.spec.js.map +1 -1
- package/dist/__tests__/solve-kepler-high-eccentricity.spec.js.map +1 -1
- package/dist/__tests__/solve-kepler-newton-raphson.spec.js +2 -2
- package/dist/__tests__/solve-kepler-newton-raphson.spec.js.map +1 -1
- package/dist/__tests__/solve-kepler.int.spec.js +3 -3
- package/dist/__tests__/solve-kepler.int.spec.js.map +1 -1
- package/dist/__tests__/true-to-mean-anomaly.spec.js +7 -7
- package/dist/__tests__/true-to-mean-anomaly.spec.js.map +1 -1
- package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts.map +1 -1
- package/dist/categories/anomalies/eccentric-to-true-anomaly.js +1 -1
- package/dist/categories/anomalies/eccentric-to-true-anomaly.js.map +1 -1
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.js.map +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts +4 -3
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts.map +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/kepler/solve-kepler-bisection.d.ts +17 -57
- package/dist/categories/kepler/solve-kepler-bisection.d.ts.map +1 -1
- package/dist/categories/kepler/solve-kepler-bisection.js +60 -69
- package/dist/categories/kepler/solve-kepler-bisection.js.map +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.js.map +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts.map +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.js.map +1 -1
- package/dist/categories/kepler/solve-kepler.js.map +1 -1
- package/dist/categories/orbits/flight-path-angle-from-true-anomaly.d.ts +30 -0
- package/dist/categories/orbits/flight-path-angle-from-true-anomaly.d.ts.map +1 -0
- package/dist/categories/orbits/flight-path-angle-from-true-anomaly.js +40 -0
- package/dist/categories/orbits/flight-path-angle-from-true-anomaly.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,34 +9,34 @@ describe('computeAngle', () => {
|
|
|
9
9
|
celestialBody: {
|
|
10
10
|
e: 0.0167,
|
|
11
11
|
angle: 0,
|
|
12
|
-
period: { value: 365.25, unit: '
|
|
12
|
+
period: { value: 365.25, unit: 'd' }
|
|
13
13
|
},
|
|
14
|
-
timeStep: { value: 1, unit: '
|
|
14
|
+
timeStep: { value: 1, unit: 'd' }
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
celestialBody: {
|
|
18
18
|
e: 0.1,
|
|
19
19
|
angle: Math.PI / 3,
|
|
20
|
-
period: { value: 687, unit: '
|
|
20
|
+
period: { value: 687, unit: 'd' }
|
|
21
21
|
},
|
|
22
|
-
timeStep: { value: 1, unit: '
|
|
22
|
+
timeStep: { value: 1, unit: 'd' }
|
|
23
23
|
},
|
|
24
24
|
// Retrograde motion test cases
|
|
25
25
|
{
|
|
26
26
|
celestialBody: {
|
|
27
27
|
e: 0.05,
|
|
28
28
|
angle: Math.PI / 2,
|
|
29
|
-
period: { value: -365.25, unit: '
|
|
29
|
+
period: { value: -365.25, unit: 'd' } // Retrograde motion
|
|
30
30
|
},
|
|
31
|
-
timeStep: { value: 1, unit: '
|
|
31
|
+
timeStep: { value: 1, unit: 'd' }
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
celestialBody: {
|
|
35
35
|
e: 0.2,
|
|
36
36
|
angle: -Math.PI / 4,
|
|
37
|
-
period: { value: -4332.59, unit: '
|
|
37
|
+
period: { value: -4332.59, unit: 'd' } // Retrograde motion
|
|
38
38
|
},
|
|
39
|
-
timeStep: { value: 10, unit: '
|
|
39
|
+
timeStep: { value: 10, unit: 'd' }
|
|
40
40
|
}
|
|
41
41
|
];
|
|
42
42
|
test('computes correct true anomaly', () => {
|
|
@@ -51,9 +51,9 @@ describe('computeAngle', () => {
|
|
|
51
51
|
e: 0.8,
|
|
52
52
|
q: 1.2,
|
|
53
53
|
angle: Math.PI / 4,
|
|
54
|
-
period: { value: 2000, unit: '
|
|
54
|
+
period: { value: 2000, unit: 'd' }
|
|
55
55
|
}; // Adding 'q' property to classify as comet
|
|
56
|
-
const timeStep = { value: 5, unit: '
|
|
56
|
+
const timeStep = { value: 5, unit: 'd' };
|
|
57
57
|
const expected = wrapAngle(computeAngle(comet, timeStep));
|
|
58
58
|
const result = wrapAngle(computeAngle(comet, timeStep));
|
|
59
59
|
assert.ok(Math.abs(result - expected) < 1e-4, `Expected comet angle ≈ ${expected}, but got ${result}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute-angle.int.spec.js","sourceRoot":"","sources":["../../src/__tests__/compute-angle.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAM3D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,aAAa;IACb,MAAM,SAAS,GAAG;QAChB;YACE,aAAa,EAAE;gBACb,CAAC,EAAE,MAAM;gBACT,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"compute-angle.int.spec.js","sourceRoot":"","sources":["../../src/__tests__/compute-angle.int.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,12 +22,12 @@ describe('eccentricToTrueAnomaly', () => {
|
|
|
22
22
|
assert.strictEqual(eccentricToTrueAnomaly(0, 1), 0); // Parabolic orbit case
|
|
23
23
|
});
|
|
24
24
|
test('throws on invalid eccentricity', () => {
|
|
25
|
-
assert.throws(() => eccentricToTrueAnomaly(Math.PI / 3, -0.1), RangeError);
|
|
26
|
-
assert.throws(() => eccentricToTrueAnomaly(Math.PI / 3, 1.2), RangeError);
|
|
25
|
+
assert.throws(() => eccentricToTrueAnomaly((Math.PI / 3), -0.1), RangeError);
|
|
26
|
+
assert.throws(() => eccentricToTrueAnomaly((Math.PI / 3), 1.2), RangeError);
|
|
27
27
|
});
|
|
28
28
|
test('ensures numerical stability near E = π', () => {
|
|
29
|
-
assert.strictEqual(eccentricToTrueAnomaly(Math.PI + 1e-11, 0.5), Math.PI);
|
|
30
|
-
assert.strictEqual(eccentricToTrueAnomaly(Math.PI - 1e-11, 0.5), Math.PI);
|
|
29
|
+
assert.strictEqual(eccentricToTrueAnomaly((Math.PI + 1e-11), 0.5), Math.PI);
|
|
30
|
+
assert.strictEqual(eccentricToTrueAnomaly((Math.PI - 1e-11), 0.5), Math.PI);
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
33
|
//# sourceMappingURL=eccentric-to-true-anomaly.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eccentric-to-true-anomaly.spec.js","sourceRoot":"","sources":["../../src/__tests__/eccentric-to-true-anomaly.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"eccentric-to-true-anomaly.spec.js","sourceRoot":"","sources":["../../src/__tests__/eccentric-to-true-anomaly.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flight-path-angle-from-true-anomaly.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/flight-path-angle-from-true-anomaly.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { flightPathAngleFromTrueAnomaly } from '../categories/orbits/flight-path-angle-from-true-anomaly';
|
|
4
|
+
import { absClose } from './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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flight-path-angle-from-true-anomaly.spec.js","sourceRoot":"","sources":["../../src/__tests__/flight-path-angle-from-true-anomaly.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,4 +6,7 @@ export declare const scale: (v: Vector3DTupleType, s: number) => Vector3DTupleTy
|
|
|
6
6
|
export declare const sub: (a: Vector3DTupleType, b: Vector3DTupleType) => Vector3DTupleType;
|
|
7
7
|
export declare const absClose: (a: number, b: number, eps?: number, msg?: string) => void;
|
|
8
8
|
export declare const dot: (a: Vector3DTupleType, b: Vector3DTupleType) => number;
|
|
9
|
+
export declare const norm2pi: (x: number) => number;
|
|
10
|
+
export declare const angleClose: (a: number, b: number, eps?: number) => void;
|
|
11
|
+
export declare const residual: (E: number, e: number, M: number) => number;
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,GAAG,IAAI,EAChB,GAAG,MAAM,EACT,YAAW,EACX,MAAM,MAAM,SAUb,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,GAAG,iBAAiB,EACpB,GAAG,iBAAiB,EACpB,YAAW,EACX,MAAM,MAAM,SAOb,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,GAAG,iBAAiB,WAExC,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,GAAG,iBAAiB,EAAE,GAAG,MAAM,KAAG,iBAEvD,CAAC;AAEF,eAAO,MAAM,GAAG,GACd,GAAG,iBAAiB,EACpB,GAAG,iBAAiB,KACnB,iBAEF,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,YAAW,EAAE,MAAM,MAAM,SAEvE,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,GAAG,iBAAiB,EAAE,GAAG,iBAAiB,WAE7D,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,MAEnC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,YAAW,SAI3D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,WAGvD,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TWO_PI } from '@interstellar-tools/constants';
|
|
1
2
|
import assert from 'node:assert/strict';
|
|
2
3
|
export const relClose = (a, b, eps = 1e-12, msg) => {
|
|
3
4
|
if (a === null) {
|
|
@@ -28,4 +29,16 @@ export const absClose = (a, b, eps = 1e-12, msg) => {
|
|
|
28
29
|
export const dot = (a, b) => {
|
|
29
30
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
30
31
|
};
|
|
32
|
+
export const norm2pi = (x) => {
|
|
33
|
+
return ((x % TWO_PI) + TWO_PI) % TWO_PI;
|
|
34
|
+
};
|
|
35
|
+
export const angleClose = (a, b, eps = 1e-12) => {
|
|
36
|
+
const da = Math.abs(norm2pi(a) - norm2pi(b));
|
|
37
|
+
const d = Math.min(da, TWO_PI - da);
|
|
38
|
+
assert.ok(d <= eps, `angles not close: |Δ|=${d} > ${eps}`);
|
|
39
|
+
};
|
|
40
|
+
export const residual = (E, e, M) => {
|
|
41
|
+
const Mm = norm2pi(M);
|
|
42
|
+
return E - e * Math.sin(E) - Mm;
|
|
43
|
+
};
|
|
31
44
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +1,85 @@
|
|
|
1
1
|
import assert from 'node:assert/strict';
|
|
2
2
|
import test, { describe } from 'node:test';
|
|
3
3
|
import { solveKeplerBisection } from '../categories/kepler/solve-kepler-bisection';
|
|
4
|
+
import { angleClose, norm2pi, residual } from './helpers';
|
|
5
|
+
import { TWO_PI } from '@interstellar-tools/constants';
|
|
4
6
|
describe('solveKeplerBisection', () => {
|
|
5
|
-
test(
|
|
6
|
-
const M = Math.PI / 4; // 45 degrees in radians
|
|
7
|
-
const e = 0.1;
|
|
8
|
-
const expected = solveKeplerBisection(M, e, 50, 1e-9);
|
|
9
|
-
const result = solveKeplerBisection(M, e, 50, 1e-9);
|
|
10
|
-
assert.ok(Math.abs(result - expected) < 1e-9, `Expected ${expected}, got ${result}`);
|
|
11
|
-
});
|
|
12
|
-
test("Solves Kepler's equation for moderate eccentricities", () => {
|
|
13
|
-
const M = Math.PI / 2; // 90 degrees in radians
|
|
7
|
+
test('basic correctness: residual close to 0 (e=0.5, M=1.234)', () => {
|
|
14
8
|
const e = 0.5;
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const e = 0.
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
9
|
+
const M = 1.234;
|
|
10
|
+
const tol = 1e-12;
|
|
11
|
+
const E = solveKeplerBisection(M, e, 200, tol);
|
|
12
|
+
assert.ok(E >= 0 && E < TWO_PI, 'E not in [0, 2π)');
|
|
13
|
+
assert.ok(Math.abs(residual(E, e, M)) < tol, 'residual not within tolerance');
|
|
14
|
+
});
|
|
15
|
+
test('circular case e=0 → E = M (mod 2π)', () => {
|
|
16
|
+
const e = 0;
|
|
17
|
+
const M = (7 * Math.PI); // maps to π
|
|
18
|
+
const E = solveKeplerBisection(M, e, 50, 1e-12);
|
|
19
|
+
angleClose(E, norm2pi(M), 1e-12);
|
|
20
|
+
});
|
|
21
|
+
test('near-parabolic (e≈1): convergence and residual check', () => {
|
|
22
|
+
const e = 0.999;
|
|
23
|
+
const M = (0.9 * Math.PI);
|
|
24
|
+
const E = solveKeplerBisection(M, e, 500, 1e-12);
|
|
25
|
+
assert.ok(E >= 0 && E < TWO_PI);
|
|
26
|
+
assert.ok(Math.abs(residual(E, e, M)) < 1e-12);
|
|
27
|
+
});
|
|
28
|
+
test('normalizes M to [0, 2π): negative M and large M match normalized result', () => {
|
|
29
|
+
const e = 0.3;
|
|
30
|
+
const M1 = (-3 * Math.PI); // ≡ π (mod 2π)
|
|
31
|
+
const M2 = (13 * Math.PI); // ≡ π (mod 2π)
|
|
32
|
+
const E1 = solveKeplerBisection(M1, e, 200, 1e-12);
|
|
33
|
+
const E2 = solveKeplerBisection(M2, e, 200, 1e-12);
|
|
34
|
+
const Enorm = solveKeplerBisection(Math.PI, e, 200, 1e-12);
|
|
35
|
+
angleClose(E1, Enorm, 1e-12);
|
|
36
|
+
angleClose(E2, Enorm, 1e-12);
|
|
37
|
+
});
|
|
38
|
+
test('early exit at endpoints: M≈0 and M≈2π both return ~0', () => {
|
|
39
|
+
const e = 0.42;
|
|
40
|
+
const tol = 1e-12;
|
|
41
|
+
const M0 = 1e-13; // |F(0)| < tol
|
|
42
|
+
const E0 = solveKeplerBisection(M0, e, 5, tol);
|
|
43
|
+
angleClose(E0, 0, 1e-12);
|
|
44
|
+
const M2pi = (2 * Math.PI - 1e-13); // |F(2π)| < tol ⇒ returns 0
|
|
45
|
+
const E2 = solveKeplerBisection(M2pi, e, 5, tol);
|
|
46
|
+
angleClose(E2, 0, 1e-12);
|
|
47
|
+
});
|
|
48
|
+
test('monotonic mapping: if M1 < M2 then E1 < E2 (same e)', () => {
|
|
34
49
|
const e = 0.7;
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
50
|
+
const M1 = 0.1;
|
|
51
|
+
const M2 = 3.0;
|
|
52
|
+
const E1 = solveKeplerBisection(M1, e, 300, 1e-12);
|
|
53
|
+
const E2 = solveKeplerBisection(M2, e, 300, 1e-12);
|
|
54
|
+
assert.ok(E1 < E2, `Expected E1 < E2 but got E1=${E1}, E2=${E2}`);
|
|
55
|
+
});
|
|
56
|
+
test('input validation: TypeError for non-number M', () => {
|
|
57
|
+
assert.throws(() => solveKeplerBisection('1.0', 0.2, 100, 1e-9), TypeError);
|
|
58
|
+
});
|
|
59
|
+
test('input validation: RangeError for non-finite M', () => {
|
|
60
|
+
assert.throws(() => solveKeplerBisection(NaN, 0.2, 100, 1e-9), RangeError);
|
|
61
|
+
assert.throws(() => solveKeplerBisection(Infinity, 0.2, 100, 1e-9), RangeError);
|
|
62
|
+
});
|
|
63
|
+
test('input validation: e out of domain throws RangeError', () => {
|
|
64
|
+
assert.throws(() => solveKeplerBisection(1, -0.1, 100, 1e-9), RangeError);
|
|
65
|
+
assert.throws(() => solveKeplerBisection(1, 1, 100, 1e-9), RangeError);
|
|
66
|
+
assert.throws(() => solveKeplerBisection(1, 1.2, 100, 1e-9), RangeError);
|
|
67
|
+
});
|
|
68
|
+
test('input validation: maxIter and tolerance must be positive finite', () => {
|
|
69
|
+
assert.throws(() => solveKeplerBisection(1, 0.1, 0, 1e-9), RangeError);
|
|
70
|
+
assert.throws(() => solveKeplerBisection(1, 0.1, -5, 1e-9), RangeError);
|
|
71
|
+
assert.throws(() => solveKeplerBisection(1, 0.1, '100', 1e-9), RangeError);
|
|
72
|
+
assert.throws(() => solveKeplerBisection(1, 0.1, 100, 0), RangeError);
|
|
73
|
+
assert.throws(() => solveKeplerBisection(1, 0.1, 100, '1e-9'), RangeError);
|
|
74
|
+
});
|
|
75
|
+
test('consistency across tolerances: tighter tol refines E (residual non-increasing)', () => {
|
|
76
|
+
const e = 0.45;
|
|
77
|
+
const M = 2.2;
|
|
78
|
+
const E1 = solveKeplerBisection(M, e, 100, 1e-6);
|
|
79
|
+
const E2 = solveKeplerBisection(M, e, 200, 1e-12);
|
|
80
|
+
const r1 = Math.abs(residual(E1, e, M));
|
|
81
|
+
const r2 = Math.abs(residual(E2, e, M));
|
|
82
|
+
assert.ok(r2 <= r1 + 1e-15, `expected residual to not increase: r1=${r1}, r2=${r2}`);
|
|
39
83
|
});
|
|
40
84
|
});
|
|
41
85
|
//# sourceMappingURL=solve-kepler-bisection.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-bisection.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-bisection.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAEnF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"solve-kepler-bisection.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-bisection.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-high-eccentricity.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-high-eccentricity.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAC;
|
|
1
|
+
{"version":3,"file":"solve-kepler-high-eccentricity.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-high-eccentricity.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,8 +37,8 @@ describe('solveKeplerNewtonRaphson', () => {
|
|
|
37
37
|
assertApproxEqual(result, 1.4904711747);
|
|
38
38
|
});
|
|
39
39
|
test('throws RangeError for invalid eccentricities', () => {
|
|
40
|
-
assert.throws(() => solveKeplerNewtonRaphson(Math.PI / 4, -0.1, 50, 1e-9), RangeError);
|
|
41
|
-
assert.throws(() => solveKeplerNewtonRaphson(Math.PI / 4, 1.2, 50, 1e-9), RangeError);
|
|
40
|
+
assert.throws(() => solveKeplerNewtonRaphson((Math.PI / 4), -0.1, 50, 1e-9), RangeError);
|
|
41
|
+
assert.throws(() => solveKeplerNewtonRaphson((Math.PI / 4), 1.2, 50, 1e-9), RangeError);
|
|
42
42
|
});
|
|
43
43
|
test('returns NaN if the method does not converge', () => {
|
|
44
44
|
const M = 3;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-newton-raphson.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-newton-raphson.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,kDAAkD,CAAC;
|
|
1
|
+
{"version":3,"file":"solve-kepler-newton-raphson.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-newton-raphson.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,11 +66,11 @@ describe('solveKepler', () => {
|
|
|
66
66
|
assert.ok(result >= 0 && result < 2 * Math.PI, `Expected result in range [0, 2π], got ${result}`);
|
|
67
67
|
});
|
|
68
68
|
test('Invalid Eccentricity (e < 0) Throws Error', () => {
|
|
69
|
-
assert.throws(() => solveKepler(Math.PI / 4, -0.1), RangeError);
|
|
69
|
+
assert.throws(() => solveKepler((Math.PI / 4), -0.1), RangeError);
|
|
70
70
|
});
|
|
71
71
|
test('Invalid Eccentricity (e >= 1) Throws Error', () => {
|
|
72
|
-
assert.throws(() => solveKepler(Math.PI / 4, 1), RangeError);
|
|
73
|
-
assert.throws(() => solveKepler(Math.PI / 4, 1.1), RangeError);
|
|
72
|
+
assert.throws(() => solveKepler((Math.PI / 4), 1), RangeError);
|
|
73
|
+
assert.throws(() => solveKepler((Math.PI / 4), 1.1), RangeError);
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
76
|
//# sourceMappingURL=solve-kepler.int.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler.int.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"solve-kepler.int.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler.int.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ describe('trueToMeanAnomaly', () => {
|
|
|
8
8
|
assert.ok(Math.abs(actual - expected) < EPSILON, `Expected ~${expected}, got ${actual}`);
|
|
9
9
|
};
|
|
10
10
|
test('Circular Orbit (e = 0)', () => {
|
|
11
|
-
const result = trueToMeanAnomaly(Math.PI / 3, 0); // e = 0 (should be identity)
|
|
11
|
+
const result = trueToMeanAnomaly((Math.PI / 3), 0); // e = 0 (should be identity)
|
|
12
12
|
assertApproxEqual(result, wrapAngle(Math.PI / 3));
|
|
13
13
|
});
|
|
14
14
|
test('Zero True Anomaly (V = 0)', () => {
|
|
@@ -16,7 +16,7 @@ describe('trueToMeanAnomaly', () => {
|
|
|
16
16
|
assertApproxEqual(result, 0);
|
|
17
17
|
});
|
|
18
18
|
test('True Anomaly at π/2 (90°)', () => {
|
|
19
|
-
const result = trueToMeanAnomaly(Math.PI / 2, 0.5);
|
|
19
|
+
const result = trueToMeanAnomaly((Math.PI / 2), 0.5);
|
|
20
20
|
const expectedM = 0.6141848493043778; // Corrected expected value
|
|
21
21
|
assertApproxEqual(result, expectedM);
|
|
22
22
|
});
|
|
@@ -26,20 +26,20 @@ describe('trueToMeanAnomaly', () => {
|
|
|
26
26
|
assertApproxEqual(result, expectedM);
|
|
27
27
|
});
|
|
28
28
|
test('True Anomaly at 3π/2 (270°)', () => {
|
|
29
|
-
const result = trueToMeanAnomaly((3 * Math.PI) / 2, 0.5);
|
|
29
|
+
const result = trueToMeanAnomaly(((3 * Math.PI) / 2), 0.5);
|
|
30
30
|
const expectedM = -0.6141848493043782; // Corrected expected value
|
|
31
31
|
assertApproxEqual(result, expectedM);
|
|
32
32
|
});
|
|
33
33
|
test('True Anomaly at 2π (Periapsis)', () => {
|
|
34
|
-
const result = trueToMeanAnomaly(2 * Math.PI, 0.5);
|
|
34
|
+
const result = trueToMeanAnomaly((2 * Math.PI), 0.5);
|
|
35
35
|
assertApproxEqual(result, 0); // Should return to zero
|
|
36
36
|
});
|
|
37
37
|
test('Eccentricity Out of Bounds Throws Error', () => {
|
|
38
|
-
assert.throws(() => trueToMeanAnomaly(Math.PI / 3, -0.1), RangeError);
|
|
39
|
-
assert.throws(() => trueToMeanAnomaly(Math.PI / 3, 1.1), RangeError);
|
|
38
|
+
assert.throws(() => trueToMeanAnomaly((Math.PI / 3), -0.1), RangeError);
|
|
39
|
+
assert.throws(() => trueToMeanAnomaly((Math.PI / 3), 1.1), RangeError);
|
|
40
40
|
});
|
|
41
41
|
test('Large Eccentricity (e close to 1)', () => {
|
|
42
|
-
const result = trueToMeanAnomaly(Math.PI / 4, 0.99);
|
|
42
|
+
const result = trueToMeanAnomaly((Math.PI / 4), 0.99);
|
|
43
43
|
assert.ok(result >= 0 && result < 2 * Math.PI, `Expected result in range [0, 2π], got ${result}`);
|
|
44
44
|
});
|
|
45
45
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"true-to-mean-anomaly.spec.js","sourceRoot":"","sources":["../../src/__tests__/true-to-mean-anomaly.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"true-to-mean-anomaly.spec.js","sourceRoot":"","sources":["../../src/__tests__/true-to-mean-anomaly.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eccentric-to-true-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/eccentric-to-true-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,eAAO,MAAM,sBAAsB,GAAI,GAAG,OAAO,EAAE,GAAG,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"eccentric-to-true-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/eccentric-to-true-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,eAAO,MAAM,sBAAsB,GAAI,GAAG,OAAO,EAAE,GAAG,MAAM,KAAG,OA+B9D,CAAC"}
|
|
@@ -49,7 +49,7 @@ export const eccentricToTrueAnomaly = (E, e) => {
|
|
|
49
49
|
}
|
|
50
50
|
// Handle parabolic orbit (e = 1)
|
|
51
51
|
if (e === 1) {
|
|
52
|
-
return 2 * Math.atan(E / 2); // Special formula for parabolic orbits
|
|
52
|
+
return (2 * Math.atan(E / 2)); // Special formula for parabolic orbits
|
|
53
53
|
}
|
|
54
54
|
// Handle numerical instability near E = π
|
|
55
55
|
const epsilon = 1e-10; // Small threshold for numerical stability
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eccentric-to-true-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/eccentric-to-true-anomaly.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAU,EAAE,CAAS,EAAW,EAAE;IACvE,8BAA8B;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAClB,yBAAyB,CAAC,6CAA6C,CACxE,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC,CAAC,4DAA4D;IACxE,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,uCAAuC;
|
|
1
|
+
{"version":3,"file":"eccentric-to-true-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/eccentric-to-true-anomaly.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAU,EAAE,CAAS,EAAW,EAAE;IACvE,8BAA8B;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAClB,yBAAyB,CAAC,6CAA6C,CACxE,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC,CAAC,4DAA4D;IACxE,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAY,CAAC,CAAC,uCAAuC;IACnF,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,0CAA0C;IAEjE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,EAAa,CAAC,CAAC,+BAA+B;IAC5D,CAAC;IAED,0EAA0E;IAC1E,OAAO,CAAC,CAAC;QACP,IAAI,CAAC,KAAK,CACR,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAClC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CACnC,CAAY,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mean-to-eccentric-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/mean-to-eccentric-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAOnE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAAuB,EACvB,QAA2B,EAClB,EAAE;IACX,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAClB,yBAAyB,CAAC,6CAA6C,CACxE,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,6DAA6D;IAC7D,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEzD,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"mean-to-eccentric-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/mean-to-eccentric-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAOnE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAAuB,EACvB,QAA2B,EAClB,EAAE;IACX,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAClB,yBAAyB,CAAC,6CAA6C,CACxE,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,6DAA6D;IAC7D,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEzD,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAa,CAAC;IACvB,CAAC;IAED,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,4BAA4B;IACtD,MAAM,iBAAiB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,6CAA6C;IAC1F,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,WAAW,EACX,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CACrE,CAAC;IACF,wEAAwE;IACxE,MAAM,KAAK,GAAG,EAAE,CAAC;IAEjB,IAAI,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,UAAU,GAAG,aAAa,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAe,CAAC;AACzB,CAAC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Radians } from '@interstellar-tools/types';
|
|
1
2
|
/**
|
|
2
3
|
* Converts **true anomaly** ($\nu$) to **mean anomaly** ($M$) using Kepler's equation.
|
|
3
4
|
*
|
|
@@ -35,10 +36,10 @@
|
|
|
35
36
|
*
|
|
36
37
|
* ---
|
|
37
38
|
*
|
|
38
|
-
* @param {
|
|
39
|
+
* @param {Radians} V - **True anomaly** ($\nu$) in radians.
|
|
39
40
|
* @param {number} e - **Eccentricity** of the orbit ($0 \leq e < 1$).
|
|
40
41
|
*
|
|
41
|
-
* @returns {
|
|
42
|
+
* @returns {Radians} The **mean anomaly** ($M$) in radians, wrapped to the range $[0, 2\pi]$.
|
|
42
43
|
*
|
|
43
44
|
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError | RangeError} If the **eccentricity** ($e$) is outside the valid range $0 \leq e < 1$.
|
|
44
45
|
*
|
|
@@ -70,5 +71,5 @@
|
|
|
70
71
|
* @see [Orbital Eccentricity (Wikipedia)](https://en.wikipedia.org/wiki/Orbital_eccentricity)
|
|
71
72
|
* @group Anomalies
|
|
72
73
|
*/
|
|
73
|
-
export declare const trueToMeanAnomaly: (V:
|
|
74
|
+
export declare const trueToMeanAnomaly: (V: Radians, e: number) => Radians;
|
|
74
75
|
//# sourceMappingURL=true-to-mean-anomaly.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"true-to-mean-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/true-to-mean-anomaly.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"true-to-mean-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/true-to-mean-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAIpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,eAAO,MAAM,iBAAiB,GAAI,GAAG,OAAO,EAAE,GAAG,MAAM,KAAG,OAuBzD,CAAC"}
|
|
@@ -36,10 +36,10 @@ import { wrapAngle } from '../angle/wrap-angle';
|
|
|
36
36
|
*
|
|
37
37
|
* ---
|
|
38
38
|
*
|
|
39
|
-
* @param {
|
|
39
|
+
* @param {Radians} V - **True anomaly** ($\nu$) in radians.
|
|
40
40
|
* @param {number} e - **Eccentricity** of the orbit ($0 \leq e < 1$).
|
|
41
41
|
*
|
|
42
|
-
* @returns {
|
|
42
|
+
* @returns {Radians} The **mean anomaly** ($M$) in radians, wrapped to the range $[0, 2\pi]$.
|
|
43
43
|
*
|
|
44
44
|
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError | RangeError} If the **eccentricity** ($e$) is outside the valid range $0 \leq e < 1$.
|
|
45
45
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"true-to-mean-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/true-to-mean-anomaly.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"true-to-mean-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/true-to-mean-anomaly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAU,EAAE,CAAS,EAAW,EAAE;IAClE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAClB,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAE7C,yDAAyD;IACzD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAChC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACvC,CAAC;IAED,oDAAoD;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE9B,0CAA0C;IAC1C,OAAO,SAAS,CAAC,CAAC,CAAY,CAAC;AACjC,CAAC,CAAC"}
|
|
@@ -1,74 +1,34 @@
|
|
|
1
1
|
import { Radians } from '@interstellar-tools/types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* when Newton-Raphson or other iterative solvers fail to converge.
|
|
3
|
+
* Solve **Kepler's equation** for the **eccentric anomaly** ($ E $) via **bisection** (elliptic case: ($ 0 \le e < 1 $)).
|
|
5
4
|
*
|
|
6
|
-
*
|
|
5
|
+
* **Equation**
|
|
7
6
|
*
|
|
8
|
-
* **Mathematical Explanation:**
|
|
9
|
-
*
|
|
10
|
-
* Kepler's equation for eccentric anomaly ($E$) is:
|
|
11
7
|
* $$
|
|
12
|
-
* M = E - e
|
|
8
|
+
* M = E - e\sin E,\qquad F(E)=E-e\sin E - M
|
|
13
9
|
* $$
|
|
14
|
-
* This equation cannot be solved analytically, and numerical methods must be used.
|
|
15
|
-
* When standard iterative solvers like **Newton-Raphson** fail due to poor convergence,
|
|
16
|
-
* the **bisection method** provides a robust alternative by performing a bracketed search.
|
|
17
|
-
*
|
|
18
|
-
* ---
|
|
19
|
-
*
|
|
20
|
-
* **Solving Strategy:**
|
|
21
|
-
* 1. **Initialize Bounds:**
|
|
22
|
-
* - The valid range for $E$ is **$[0, \pi]$** (as $E$ is symmetric around 0).
|
|
23
|
-
* - The midpoint $E_0$ is chosen as:
|
|
24
|
-
* $$
|
|
25
|
-
* E = \frac{E_{low} + E_{high}}{2}
|
|
26
|
-
* $$
|
|
27
|
-
*
|
|
28
|
-
* 2. **Bisection Iteration:**
|
|
29
|
-
* - Compute the function residual:
|
|
30
|
-
* $$
|
|
31
|
-
* F(E) = E - e \sin(E) - M
|
|
32
|
-
* $$
|
|
33
|
-
* - If $F(E)$ is sufficiently small (within tolerance), $E$ is returned as the solution.
|
|
34
|
-
* - Otherwise, the interval is **halved** by updating either:
|
|
35
|
-
* - The lower bound ($E_{low}$) if $F(E) < 0$
|
|
36
|
-
* - The upper bound ($E_{high}$) if $F(E) > 0$
|
|
37
10
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* $$
|
|
43
|
-
* (default tolerance is **1e-9**).
|
|
11
|
+
* **Bracketing & normalization**
|
|
12
|
+
* - Normalize ($ M $) to ($ [0,2\pi) $).
|
|
13
|
+
* - Use the bracket ($ [0,2\pi] $). Then ($ F(0)=-M\le 0 $) and ($ F(2\pi)=2\pi-M\ge 0 $).
|
|
14
|
+
* - For ($ 0\le e<1 $), ($ F'(E)=1-e\cos E \ge 1-e > 0 $) ⇒ **strictly increasing** ⇒ unique root.
|
|
44
15
|
*
|
|
45
|
-
*
|
|
16
|
+
* **Stopping criteria (either)**
|
|
17
|
+
* - **Residual**: ($ |F(E)| < \text{tolerance} $)
|
|
18
|
+
* - **Bracket width**: ($ \tfrac{1}{2}(E_{\text{high}}-E_{\text{low}}) < \text{tolerance} $)
|
|
46
19
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* @param {Radians} M - Mean anomaly ($M$) in **radians**.
|
|
54
|
-
* @param {number} e - Orbital eccentricity ($0 \leq e < 1$).
|
|
55
|
-
* @param {number} maxIter - Maximum number of **iterations** before failure.
|
|
56
|
-
* @param {number} tolerance - Convergence criterion for stopping the iteration.
|
|
57
|
-
* @returns {Radians} The **eccentric anomaly** ($E$) in **radians** (best approximation).
|
|
58
|
-
*
|
|
59
|
-
* ---
|
|
20
|
+
* @param {Radians} M Mean anomaly (radians). Can be any real; will be normalized to ($ [0,2\pi) $).
|
|
21
|
+
* @param {number} e Eccentricity, must satisfy ($ 0 \le e < 1 $) (elliptic).
|
|
22
|
+
* @param {number} maxIter Maximum iterations (must be > 0).
|
|
23
|
+
* @param {number} tolerance Convergence tolerance for both residual and half-interval (must be > 0, radians).
|
|
24
|
+
* @returns {Radians} Eccentric anomaly ($ E $) in **radians**, normalized to ($ [0,2\pi) $).
|
|
25
|
+
* @throws {TypeError|RangeError} If inputs are non-finite or out of domain.
|
|
60
26
|
*
|
|
61
27
|
* @example
|
|
62
28
|
* ```ts
|
|
63
|
-
* const
|
|
64
|
-
* const e = 0.5; // Orbital eccentricity
|
|
65
|
-
* console.log(solveKeplerBisection(M, e, 50, 1e-9)); // Output: Eccentric anomaly in radians
|
|
29
|
+
* const E = solveKeplerBisection((Math.PI/3) as Radians, 0.5, 100, 1e-12);
|
|
66
30
|
* ```
|
|
67
31
|
*
|
|
68
|
-
* ---
|
|
69
|
-
*
|
|
70
|
-
* @see [Kepler's Equation (Wikipedia)](https://en.wikipedia.org/wiki/Kepler%27s_equation)
|
|
71
|
-
* @see [Bisection Method (Wikipedia)](https://en.wikipedia.org/wiki/Bisection_method)
|
|
72
32
|
* @group Kepler Solvers
|
|
73
33
|
*/
|
|
74
34
|
export declare const solveKeplerBisection: (M: Radians, e: number, maxIter: number, tolerance: number) => Radians;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-bisection.d.ts","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-bisection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD
|
|
1
|
+
{"version":3,"file":"solve-kepler-bisection.d.ts","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-bisection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,oBAAoB,GAC/B,GAAG,OAAO,EACV,GAAG,MAAM,EACT,SAAS,MAAM,EACf,WAAW,MAAM,KAChB,OAqEF,CAAC"}
|
|
@@ -1,94 +1,85 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* when Newton-Raphson or other iterative solvers fail to converge.
|
|
2
|
+
* Solve **Kepler's equation** for the **eccentric anomaly** ($ E $) via **bisection** (elliptic case: ($ 0 \le e < 1 $)).
|
|
4
3
|
*
|
|
5
|
-
*
|
|
4
|
+
* **Equation**
|
|
6
5
|
*
|
|
7
|
-
* **Mathematical Explanation:**
|
|
8
|
-
*
|
|
9
|
-
* Kepler's equation for eccentric anomaly ($E$) is:
|
|
10
6
|
* $$
|
|
11
|
-
* M = E - e
|
|
7
|
+
* M = E - e\sin E,\qquad F(E)=E-e\sin E - M
|
|
12
8
|
* $$
|
|
13
|
-
* This equation cannot be solved analytically, and numerical methods must be used.
|
|
14
|
-
* When standard iterative solvers like **Newton-Raphson** fail due to poor convergence,
|
|
15
|
-
* the **bisection method** provides a robust alternative by performing a bracketed search.
|
|
16
|
-
*
|
|
17
|
-
* ---
|
|
18
|
-
*
|
|
19
|
-
* **Solving Strategy:**
|
|
20
|
-
* 1. **Initialize Bounds:**
|
|
21
|
-
* - The valid range for $E$ is **$[0, \pi]$** (as $E$ is symmetric around 0).
|
|
22
|
-
* - The midpoint $E_0$ is chosen as:
|
|
23
|
-
* $$
|
|
24
|
-
* E = \frac{E_{low} + E_{high}}{2}
|
|
25
|
-
* $$
|
|
26
|
-
*
|
|
27
|
-
* 2. **Bisection Iteration:**
|
|
28
|
-
* - Compute the function residual:
|
|
29
|
-
* $$
|
|
30
|
-
* F(E) = E - e \sin(E) - M
|
|
31
|
-
* $$
|
|
32
|
-
* - If $F(E)$ is sufficiently small (within tolerance), $E$ is returned as the solution.
|
|
33
|
-
* - Otherwise, the interval is **halved** by updating either:
|
|
34
|
-
* - The lower bound ($E_{low}$) if $F(E) < 0$
|
|
35
|
-
* - The upper bound ($E_{high}$) if $F(E) > 0$
|
|
36
|
-
*
|
|
37
|
-
* 3. **Convergence Check:**
|
|
38
|
-
* - The iteration stops when:
|
|
39
|
-
* $$
|
|
40
|
-
* |E_{n+1} - E_n| < \text{tolerance}
|
|
41
|
-
* $$
|
|
42
|
-
* (default tolerance is **1e-9**).
|
|
43
9
|
*
|
|
44
|
-
*
|
|
10
|
+
* **Bracketing & normalization**
|
|
11
|
+
* - Normalize ($ M $) to ($ [0,2\pi) $).
|
|
12
|
+
* - Use the bracket ($ [0,2\pi] $). Then ($ F(0)=-M\le 0 $) and ($ F(2\pi)=2\pi-M\ge 0 $).
|
|
13
|
+
* - For ($ 0\le e<1 $), ($ F'(E)=1-e\cos E \ge 1-e > 0 $) ⇒ **strictly increasing** ⇒ unique root.
|
|
45
14
|
*
|
|
46
|
-
* **
|
|
47
|
-
* - **
|
|
48
|
-
* - **
|
|
15
|
+
* **Stopping criteria (either)**
|
|
16
|
+
* - **Residual**: ($ |F(E)| < \text{tolerance} $)
|
|
17
|
+
* - **Bracket width**: ($ \tfrac{1}{2}(E_{\text{high}}-E_{\text{low}}) < \text{tolerance} $)
|
|
49
18
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* @param {
|
|
53
|
-
* @param {number}
|
|
54
|
-
* @
|
|
55
|
-
* @
|
|
56
|
-
* @returns {Radians} The **eccentric anomaly** ($E$) in **radians** (best approximation).
|
|
57
|
-
*
|
|
58
|
-
* ---
|
|
19
|
+
* @param {Radians} M Mean anomaly (radians). Can be any real; will be normalized to ($ [0,2\pi) $).
|
|
20
|
+
* @param {number} e Eccentricity, must satisfy ($ 0 \le e < 1 $) (elliptic).
|
|
21
|
+
* @param {number} maxIter Maximum iterations (must be > 0).
|
|
22
|
+
* @param {number} tolerance Convergence tolerance for both residual and half-interval (must be > 0, radians).
|
|
23
|
+
* @returns {Radians} Eccentric anomaly ($ E $) in **radians**, normalized to ($ [0,2\pi) $).
|
|
24
|
+
* @throws {TypeError|RangeError} If inputs are non-finite or out of domain.
|
|
59
25
|
*
|
|
60
26
|
* @example
|
|
61
27
|
* ```ts
|
|
62
|
-
* const
|
|
63
|
-
* const e = 0.5; // Orbital eccentricity
|
|
64
|
-
* console.log(solveKeplerBisection(M, e, 50, 1e-9)); // Output: Eccentric anomaly in radians
|
|
28
|
+
* const E = solveKeplerBisection((Math.PI/3) as Radians, 0.5, 100, 1e-12);
|
|
65
29
|
* ```
|
|
66
30
|
*
|
|
67
|
-
* ---
|
|
68
|
-
*
|
|
69
|
-
* @see [Kepler's Equation (Wikipedia)](https://en.wikipedia.org/wiki/Kepler%27s_equation)
|
|
70
|
-
* @see [Bisection Method (Wikipedia)](https://en.wikipedia.org/wiki/Bisection_method)
|
|
71
31
|
* @group Kepler Solvers
|
|
72
32
|
*/
|
|
73
33
|
export const solveKeplerBisection = (M, e, maxIter, tolerance) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
34
|
+
if (typeof M !== 'number')
|
|
35
|
+
throw new TypeError('M must be a number (radians).');
|
|
36
|
+
if (!Number.isFinite(M))
|
|
37
|
+
throw new RangeError('M must be finite (radians).');
|
|
38
|
+
if (typeof e !== 'number')
|
|
39
|
+
throw new TypeError('e must be a number.');
|
|
40
|
+
if (!Number.isFinite(e) || e < 0 || e >= 1)
|
|
41
|
+
throw new RangeError('e must satisfy 0 ≤ e < 1 (elliptic).');
|
|
42
|
+
if (!Number.isFinite(maxIter) || maxIter <= 0)
|
|
43
|
+
throw new RangeError('maxIter must be a positive number.');
|
|
44
|
+
if (!Number.isFinite(tolerance) || tolerance <= 0)
|
|
45
|
+
throw new RangeError('tolerance must be a finite, positive number (radians).');
|
|
46
|
+
const TWO_PI = 2 * Math.PI;
|
|
47
|
+
// Normalize M to [0, 2π)
|
|
48
|
+
const Mm = ((Number(M) % TWO_PI) + TWO_PI) % TWO_PI;
|
|
49
|
+
// Bracket [0, 2π]
|
|
50
|
+
let Elow = 0;
|
|
51
|
+
let Ehigh = TWO_PI;
|
|
52
|
+
// Early exit if an endpoint already solves it (normalize 2π → 0)
|
|
53
|
+
const Flow = -Mm; // F(0) = -M
|
|
54
|
+
if (Math.abs(Flow) < tolerance)
|
|
55
|
+
return 0;
|
|
56
|
+
const Fhigh = TWO_PI - Mm; // F(2π) = 2π - M
|
|
57
|
+
if (Math.abs(Fhigh) < tolerance)
|
|
58
|
+
return 0; // 2π ≡ 0
|
|
59
|
+
// Bisection
|
|
60
|
+
let E = (Elow + Ehigh) / 2;
|
|
61
|
+
for (let i = 0; i < maxIter; i++) {
|
|
62
|
+
const F = E - e * Math.sin(E) - Mm;
|
|
63
|
+
// Residual stop
|
|
80
64
|
if (Math.abs(F) < tolerance) {
|
|
81
|
-
return E
|
|
65
|
+
return (E % TWO_PI);
|
|
82
66
|
}
|
|
67
|
+
// Update bracket based on sign of F (monotone increasing ⇒ standard rule)
|
|
83
68
|
if (F > 0) {
|
|
84
|
-
|
|
69
|
+
Ehigh = E;
|
|
85
70
|
}
|
|
86
71
|
else {
|
|
87
|
-
|
|
72
|
+
Elow = E;
|
|
73
|
+
}
|
|
74
|
+
// Interval stop
|
|
75
|
+
const halfWidth = (Ehigh - Elow) / 2;
|
|
76
|
+
if (halfWidth < tolerance) {
|
|
77
|
+
const Emid = (Elow + Ehigh) / 2;
|
|
78
|
+
return (Emid % TWO_PI);
|
|
88
79
|
}
|
|
89
|
-
E = (
|
|
90
|
-
iter++;
|
|
80
|
+
E = (Elow + Ehigh) / 2;
|
|
91
81
|
}
|
|
92
|
-
|
|
82
|
+
// Best approximation if maxIter reached
|
|
83
|
+
return (E % TWO_PI);
|
|
93
84
|
};
|
|
94
85
|
//# sourceMappingURL=solve-kepler-bisection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-bisection.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-bisection.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"solve-kepler-bisection.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-bisection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-high-eccentricity.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-high-eccentricity.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"solve-kepler-high-eccentricity.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-high-eccentricity.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,5 +83,5 @@ import { Radians } from '@interstellar-tools/types';
|
|
|
83
83
|
* @see [Eccentric Anomaly (Wikipedia)](https://en.wikipedia.org/wiki/Mean_anomaly#Eccentric_anomaly)
|
|
84
84
|
* @group Kepler Solvers
|
|
85
85
|
*/
|
|
86
|
-
export declare const solveKeplerNewtonRaphson: (M: Radians, e: number, maxIter: number, tolerance: number) => Radians;
|
|
86
|
+
export declare const solveKeplerNewtonRaphson: (M: Radians, e: number, maxIter: number, tolerance: number) => Radians | number;
|
|
87
87
|
//# sourceMappingURL=solve-kepler-newton-raphson.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-newton-raphson.d.ts","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-newton-raphson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,eAAO,MAAM,wBAAwB,GACnC,GAAG,OAAO,EACV,GAAG,MAAM,EACT,SAAS,MAAM,EACf,WAAW,MAAM,KAChB,
|
|
1
|
+
{"version":3,"file":"solve-kepler-newton-raphson.d.ts","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-newton-raphson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,eAAO,MAAM,wBAAwB,GACnC,GAAG,OAAO,EACV,GAAG,MAAM,EACT,SAAS,MAAM,EACf,WAAW,MAAM,KAChB,OAAO,GAAG,MAwCZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler-newton-raphson.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-newton-raphson.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,CAAU,EACV,CAAS,EACT,OAAe,EACf,SAAiB,
|
|
1
|
+
{"version":3,"file":"solve-kepler-newton-raphson.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-newton-raphson.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,CAAU,EACV,CAAS,EACT,OAAe,EACf,SAAiB,EACC,EAAE;IACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,2BAA2B,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAS,CAAC;IAEd,sBAAsB;IACtB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACZ,CAAC,GAAG,CAAC,CAAC;IACR,CAAC;SAAM,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QACpB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB;IAC3C,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,GAAG,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,gBAAgB;QAExC,oDAAoD;QACpD,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAE1D,UAAU,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QAEjE,CAAC,IAAI,UAAU,CAAC;QAEhB,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC;YACrC,OAAO,CAAY,CAAC,CAAC,YAAY;QACnC,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC;IAED,OAAO,GAAG,CAAC,CAAC,mBAAmB;AACjC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-kepler.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAU,EACV,CAAS,EACT,OAAO,GAAG,EAAE,EACZ,SAAS,GAAG,IAAI,EACP,EAAE;IACX,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,2BAA2B,CAAC,CAAC;IAC9E,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACZ,OAAO,2BAA2B,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,+DAA+D;IAC/D,IAAI,CAAC,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"solve-kepler.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAU,EACV,CAAS,EACT,OAAO,GAAG,EAAE,EACZ,SAAS,GAAG,IAAI,EACP,EAAE;IACX,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,2BAA2B,CAAC,CAAC;IAC9E,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACZ,OAAO,2BAA2B,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,+DAA+D;IAC/D,IAAI,CAAC,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,CAAY,CAAC;AACjC,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Radians } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* **Flight-path angle** ($ \gamma $) from **true anomaly** ($ \nu $) and eccentricity ($ e $).
|
|
4
|
+
*
|
|
5
|
+
* **Definition**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \tan\gamma=\frac{e\sin\nu}{1+e\cos\nu}
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* ::: info Domain notes
|
|
12
|
+
*
|
|
13
|
+
* - **Elliptic / circular** ($ 0\le e<1 $): since $ 1+e\cos\nu \ge 1-e > 0 $ for all $ \nu $, we have $ \gamma\in(-\tfrac{\pi}{2},\tfrac{\pi}{2}) $.
|
|
14
|
+
* - **Parabolic** ($ e=1 $): at $ \nu=\pi $ the ratio is $ 0/0 $; by continuity $ \gamma\to 0 $ (this function returns $ 0 $ in that limit).
|
|
15
|
+
* - **Hyperbolic** ($ e>1$ ): only $ \nu $ with $ 1+e\cos\nu>0 $ are physical; when $ 1+e\cos\nu=0 $ the angle tends to $ \pm\tfrac{\pi}{2} $.
|
|
16
|
+
*
|
|
17
|
+
* :::
|
|
18
|
+
*
|
|
19
|
+
* **Conventions**
|
|
20
|
+
* - Returns ($ \gamma $) in **radians** (positive outbound $ 0<\nu<\pi $, negative inbound).
|
|
21
|
+
* - Uses `atan2(e sin ν, 1 + e cos ν)` for correct quadrant handling and robust behavior near asymptotes.
|
|
22
|
+
*
|
|
23
|
+
* @param {Radians} nu True anomaly ($ \nu $) in **radians**; must be finite.
|
|
24
|
+
* @param {number} e Eccentricity ($ e $), dimensionless, must be finite and **≥ 0**.
|
|
25
|
+
* @returns {Radians} Flight-path angle ($ \gamma $) in **radians**.
|
|
26
|
+
* @throws {Error} If inputs are non-finite or ($ e<0 $). Note: at the parabolic limit ($ e=1,\ \nu=\pi $) this function returns $ 0 $; at hyperbolic asymptotes ($ 1+e\cos\nu=0 $) it tends to $ \pm\pi/2 $.
|
|
27
|
+
* @group Orbits
|
|
28
|
+
*/
|
|
29
|
+
export declare const flightPathAngleFromTrueAnomaly: (nu: Radians, e: number) => Radians;
|
|
30
|
+
//# sourceMappingURL=flight-path-angle-from-true-anomaly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flight-path-angle-from-true-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/flight-path-angle-from-true-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,GACzC,IAAI,OAAO,EACX,GAAG,MAAM,KACR,OAaF,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Flight-path angle** ($ \gamma $) from **true anomaly** ($ \nu $) and eccentricity ($ e $).
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* \tan\gamma=\frac{e\sin\nu}{1+e\cos\nu}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* ::: info Domain notes
|
|
11
|
+
*
|
|
12
|
+
* - **Elliptic / circular** ($ 0\le e<1 $): since $ 1+e\cos\nu \ge 1-e > 0 $ for all $ \nu $, we have $ \gamma\in(-\tfrac{\pi}{2},\tfrac{\pi}{2}) $.
|
|
13
|
+
* - **Parabolic** ($ e=1 $): at $ \nu=\pi $ the ratio is $ 0/0 $; by continuity $ \gamma\to 0 $ (this function returns $ 0 $ in that limit).
|
|
14
|
+
* - **Hyperbolic** ($ e>1$ ): only $ \nu $ with $ 1+e\cos\nu>0 $ are physical; when $ 1+e\cos\nu=0 $ the angle tends to $ \pm\tfrac{\pi}{2} $.
|
|
15
|
+
*
|
|
16
|
+
* :::
|
|
17
|
+
*
|
|
18
|
+
* **Conventions**
|
|
19
|
+
* - Returns ($ \gamma $) in **radians** (positive outbound $ 0<\nu<\pi $, negative inbound).
|
|
20
|
+
* - Uses `atan2(e sin ν, 1 + e cos ν)` for correct quadrant handling and robust behavior near asymptotes.
|
|
21
|
+
*
|
|
22
|
+
* @param {Radians} nu True anomaly ($ \nu $) in **radians**; must be finite.
|
|
23
|
+
* @param {number} e Eccentricity ($ e $), dimensionless, must be finite and **≥ 0**.
|
|
24
|
+
* @returns {Radians} Flight-path angle ($ \gamma $) in **radians**.
|
|
25
|
+
* @throws {Error} If inputs are non-finite or ($ e<0 $). Note: at the parabolic limit ($ e=1,\ \nu=\pi $) this function returns $ 0 $; at hyperbolic asymptotes ($ 1+e\cos\nu=0 $) it tends to $ \pm\pi/2 $.
|
|
26
|
+
* @group Orbits
|
|
27
|
+
*/
|
|
28
|
+
export const flightPathAngleFromTrueAnomaly = (nu, e) => {
|
|
29
|
+
if (!Number.isFinite(nu))
|
|
30
|
+
throw new Error('nu must be finite (radians).');
|
|
31
|
+
if (!Number.isFinite(e) || e < 0)
|
|
32
|
+
throw new Error('e must be finite and ≥ 0.');
|
|
33
|
+
const y = e * Math.sin(nu);
|
|
34
|
+
const x = 1 + e * Math.cos(nu);
|
|
35
|
+
const tol = 1e-15;
|
|
36
|
+
if (Math.abs(x) < tol && Math.abs(y) < tol)
|
|
37
|
+
return 0;
|
|
38
|
+
return Math.atan2(y, x);
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=flight-path-angle-from-true-anomaly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flight-path-angle-from-true-anomaly.js","sourceRoot":"","sources":["../../../src/categories/orbits/flight-path-angle-from-true-anomaly.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,EAAW,EACX,CAAS,EACA,EAAE;IACX,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE/C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC;IAElB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;QAAE,OAAO,CAAY,CAAC;IAEhE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAY,CAAC;AACrC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -23,4 +23,5 @@ export * from './categories/orbits/kepler-period';
|
|
|
23
23
|
export * from './categories/orbits/specific-angular-momentum';
|
|
24
24
|
export * from './categories/orbits/specific-angular-momentum-from-elements';
|
|
25
25
|
export * from './categories/orbits/specific-mechanical-energy';
|
|
26
|
+
export * from './categories/orbits/flight-path-angle-from-true-anomaly';
|
|
26
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kCAAkC,CAAC;AAEjD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,kDAAkD,CAAC;AAEjE,cAAc,kDAAkD,CAAC;AAEjE,cAAc,6CAA6C,CAAC;AAG5D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,iDAAiD,CAAC;AAEhE,cAAc,4CAA4C,CAAC;AAE3D,cAAc,oDAAoD,CAAC;AAGnE,cAAc,8CAA8C,CAAC;AAE7D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,2CAA2C,CAAC;AAG1D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mCAAmC,CAAC;AAElD,cAAc,+CAA+C,CAAC;AAE9D,cAAc,6DAA6D,CAAC;AAE5E,cAAc,gDAAgD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kCAAkC,CAAC;AAEjD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,kDAAkD,CAAC;AAEjE,cAAc,kDAAkD,CAAC;AAEjE,cAAc,6CAA6C,CAAC;AAG5D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,iDAAiD,CAAC;AAEhE,cAAc,4CAA4C,CAAC;AAE3D,cAAc,oDAAoD,CAAC;AAGnE,cAAc,8CAA8C,CAAC;AAE7D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,2CAA2C,CAAC;AAG1D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mCAAmC,CAAC;AAElD,cAAc,+CAA+C,CAAC;AAE9D,cAAc,6DAA6D,CAAC;AAE5E,cAAc,gDAAgD,CAAC;AAE/D,cAAc,yDAAyD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -28,4 +28,5 @@ export * from './categories/orbits/kepler-period';
|
|
|
28
28
|
export * from './categories/orbits/specific-angular-momentum';
|
|
29
29
|
export * from './categories/orbits/specific-angular-momentum-from-elements';
|
|
30
30
|
export * from './categories/orbits/specific-mechanical-energy';
|
|
31
|
+
export * from './categories/orbits/flight-path-angle-from-true-anomaly';
|
|
31
32
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,cAAc,kCAAkC,CAAC;AAEjD,cAAc,+BAA+B,CAAC;AAE9C,uBAAuB;AACvB,cAAc,kDAAkD,CAAC;AAEjE,cAAc,kDAAkD,CAAC;AAEjE,cAAc,6CAA6C,CAAC;AAE5D,8BAA8B;AAC9B,cAAc,kCAAkC,CAAC;AAEjD,cAAc,iDAAiD,CAAC;AAEhE,cAAc,4CAA4C,CAAC;AAE3D,cAAc,oDAAoD,CAAC;AAEnE,qBAAqB;AACrB,cAAc,8CAA8C,CAAC;AAE7D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,2CAA2C,CAAC;AAE1D,oBAAoB;AACpB,cAAc,oCAAoC,CAAC;AAEnD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mCAAmC,CAAC;AAElD,cAAc,+CAA+C,CAAC;AAE9D,cAAc,6DAA6D,CAAC;AAE5E,cAAc,gDAAgD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,cAAc,kCAAkC,CAAC;AAEjD,cAAc,+BAA+B,CAAC;AAE9C,uBAAuB;AACvB,cAAc,kDAAkD,CAAC;AAEjE,cAAc,kDAAkD,CAAC;AAEjE,cAAc,6CAA6C,CAAC;AAE5D,8BAA8B;AAC9B,cAAc,kCAAkC,CAAC;AAEjD,cAAc,iDAAiD,CAAC;AAEhE,cAAc,4CAA4C,CAAC;AAE3D,cAAc,oDAAoD,CAAC;AAEnE,qBAAqB;AACrB,cAAc,8CAA8C,CAAC;AAE7D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,2CAA2C,CAAC;AAE1D,oBAAoB;AACpB,cAAc,oCAAoC,CAAC;AAEnD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mCAAmC,CAAC;AAElD,cAAc,+CAA+C,CAAC;AAE9D,cAAc,6DAA6D,CAAC;AAE5E,cAAc,gDAAgD,CAAC;AAE/D,cAAc,yDAAyD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interstellar-tools/equations",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Curated, well-tested orbital mechanics and dynamics formulas (e.g., Newtonian gravity, vis-viva, Kepler's 3rd law, escape/circular speeds, specific energy, specific angular momentum, peri/apoapsis radii).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"interstellar",
|