@interstellar-tools/equations 0.1.1

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.
Files changed (78) hide show
  1. package/README.md +18 -0
  2. package/dist/__tests__/compute-angle.int.spec.d.ts +2 -0
  3. package/dist/__tests__/compute-angle.int.spec.d.ts.map +1 -0
  4. package/dist/__tests__/compute-angle.int.spec.js +62 -0
  5. package/dist/__tests__/compute-angle.int.spec.js.map +1 -0
  6. package/dist/__tests__/compute-mean-anomaly.int.spec.d.ts +2 -0
  7. package/dist/__tests__/compute-mean-anomaly.int.spec.d.ts.map +1 -0
  8. package/dist/__tests__/compute-mean-anomaly.int.spec.js +175 -0
  9. package/dist/__tests__/compute-mean-anomaly.int.spec.js.map +1 -0
  10. package/dist/__tests__/eccentric-to-true-anomaly.spec.d.ts +2 -0
  11. package/dist/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +1 -0
  12. package/dist/__tests__/eccentric-to-true-anomaly.spec.js +33 -0
  13. package/dist/__tests__/eccentric-to-true-anomaly.spec.js.map +1 -0
  14. package/dist/__tests__/solve-kepler-bisection.spec.d.ts +2 -0
  15. package/dist/__tests__/solve-kepler-bisection.spec.d.ts.map +1 -0
  16. package/dist/__tests__/solve-kepler-bisection.spec.js +41 -0
  17. package/dist/__tests__/solve-kepler-bisection.spec.js.map +1 -0
  18. package/dist/__tests__/solve-kepler-high-eccentricity.spec.d.ts +2 -0
  19. package/dist/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +1 -0
  20. package/dist/__tests__/solve-kepler-high-eccentricity.spec.js +81 -0
  21. package/dist/__tests__/solve-kepler-high-eccentricity.spec.js.map +1 -0
  22. package/dist/__tests__/solve-kepler-newton-raphson.spec.d.ts +2 -0
  23. package/dist/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +1 -0
  24. package/dist/__tests__/solve-kepler-newton-raphson.spec.js +50 -0
  25. package/dist/__tests__/solve-kepler-newton-raphson.spec.js.map +1 -0
  26. package/dist/__tests__/solve-kepler.int.spec.d.ts +2 -0
  27. package/dist/__tests__/solve-kepler.int.spec.d.ts.map +1 -0
  28. package/dist/__tests__/solve-kepler.int.spec.js +76 -0
  29. package/dist/__tests__/solve-kepler.int.spec.js.map +1 -0
  30. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.d.ts +2 -0
  31. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.d.ts.map +1 -0
  32. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.js +46 -0
  33. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.js.map +1 -0
  34. package/dist/__tests__/wrap-angle.spec.d.ts +2 -0
  35. package/dist/__tests__/wrap-angle.spec.d.ts.map +1 -0
  36. package/dist/__tests__/wrap-angle.spec.js +60 -0
  37. package/dist/__tests__/wrap-angle.spec.js.map +1 -0
  38. package/dist/compute-angle.d.ts +69 -0
  39. package/dist/compute-angle.d.ts.map +1 -0
  40. package/dist/compute-angle.js +79 -0
  41. package/dist/compute-angle.js.map +1 -0
  42. package/dist/compute-mean-anomaly.d.ts +47 -0
  43. package/dist/compute-mean-anomaly.d.ts.map +1 -0
  44. package/dist/compute-mean-anomaly.js +86 -0
  45. package/dist/compute-mean-anomaly.js.map +1 -0
  46. package/dist/eccentric-to-true-anomaly.d.ts +43 -0
  47. package/dist/eccentric-to-true-anomaly.d.ts.map +1 -0
  48. package/dist/eccentric-to-true-anomaly.js +63 -0
  49. package/dist/eccentric-to-true-anomaly.js.map +1 -0
  50. package/dist/index.d.ts +16 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +16 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/solve-kepler-bisection.d.ts +75 -0
  55. package/dist/solve-kepler-bisection.d.ts.map +1 -0
  56. package/dist/solve-kepler-bisection.js +94 -0
  57. package/dist/solve-kepler-bisection.js.map +1 -0
  58. package/dist/solve-kepler-high-eccentricity.d.ts +99 -0
  59. package/dist/solve-kepler-high-eccentricity.d.ts.map +1 -0
  60. package/dist/solve-kepler-high-eccentricity.js +150 -0
  61. package/dist/solve-kepler-high-eccentricity.js.map +1 -0
  62. package/dist/solve-kepler-newton-raphson.d.ts +87 -0
  63. package/dist/solve-kepler-newton-raphson.d.ts.map +1 -0
  64. package/dist/solve-kepler-newton-raphson.js +118 -0
  65. package/dist/solve-kepler-newton-raphson.js.map +1 -0
  66. package/dist/solve-kepler.d.ts +82 -0
  67. package/dist/solve-kepler.d.ts.map +1 -0
  68. package/dist/solve-kepler.js +99 -0
  69. package/dist/solve-kepler.js.map +1 -0
  70. package/dist/true-anomaly-to-mean-anomaly.d.ts +74 -0
  71. package/dist/true-anomaly-to-mean-anomaly.d.ts.map +1 -0
  72. package/dist/true-anomaly-to-mean-anomaly.js +91 -0
  73. package/dist/true-anomaly-to-mean-anomaly.js.map +1 -0
  74. package/dist/wrap-angle.d.ts +82 -0
  75. package/dist/wrap-angle.d.ts.map +1 -0
  76. package/dist/wrap-angle.js +97 -0
  77. package/dist/wrap-angle.js.map +1 -0
  78. package/package.json +58 -0
package/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # @interstellar-tools/equations
2
+
3
+ ## Installation
4
+
5
+ - [Node.js](https://nodejs.org/) version 22.9.0 or higher
6
+ - npm version 11.5.1 or higher
7
+
8
+ ::: code-group
9
+
10
+ ```shell [npm]
11
+ npm i --save @interstellar-tools/equations
12
+ ```
13
+
14
+ ```shell [yarn]
15
+ yarn add @interstellar-tools/equations
16
+ ```
17
+
18
+ :::
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compute-angle.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-angle.int.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/compute-angle.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { computeAngle } from '../compute-angle';
4
+ import { wrapAngle } from '../wrap-angle';
5
+ describe('computeAngle', () => {
6
+ // Test cases
7
+ const testCases = [
8
+ {
9
+ celestialBody: {
10
+ e: 0.0167,
11
+ angle: 0,
12
+ period: { value: 365.25, unit: 'day' }
13
+ },
14
+ timeStep: { value: 1, unit: 'day' }
15
+ },
16
+ {
17
+ celestialBody: {
18
+ e: 0.1,
19
+ angle: Math.PI / 3,
20
+ period: { value: 687, unit: 'day' }
21
+ },
22
+ timeStep: { value: 1, unit: 'day' }
23
+ },
24
+ // Retrograde motion test cases
25
+ {
26
+ celestialBody: {
27
+ e: 0.05,
28
+ angle: Math.PI / 2,
29
+ period: { value: -365.25, unit: 'day' } // Retrograde motion
30
+ },
31
+ timeStep: { value: 1, unit: 'day' }
32
+ },
33
+ {
34
+ celestialBody: {
35
+ e: 0.2,
36
+ angle: -Math.PI / 4,
37
+ period: { value: -4332.59, unit: 'day' } // Retrograde motion
38
+ },
39
+ timeStep: { value: 10, unit: 'day' }
40
+ }
41
+ ];
42
+ test('computes correct true anomaly', () => {
43
+ testCases.forEach(({ celestialBody, timeStep }) => {
44
+ const expected = wrapAngle(computeAngle(celestialBody, timeStep));
45
+ const result = wrapAngle(computeAngle(celestialBody, timeStep));
46
+ assert.ok(Math.abs(result - expected) < 1e-4, `Expected angle ≈ ${expected} for body=${JSON.stringify(celestialBody)}, timeStep=${timeStep.value}, but got ${result}`);
47
+ });
48
+ });
49
+ test('correctly adjusts for comets', () => {
50
+ const comet = {
51
+ e: 0.8,
52
+ q: 1.2,
53
+ angle: Math.PI / 4,
54
+ period: { value: 2000, unit: 'day' }
55
+ }; // Adding 'q' property to classify as comet
56
+ const timeStep = { value: 5, unit: 'day' };
57
+ const expected = wrapAngle(computeAngle(comet, timeStep));
58
+ const result = wrapAngle(computeAngle(comet, timeStep));
59
+ assert.ok(Math.abs(result - expected) < 1e-4, `Expected comet angle ≈ ${expected}, but got ${result}`);
60
+ });
61
+ });
62
+ //# sourceMappingURL=compute-angle.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-angle.int.spec.js","sourceRoot":"","sources":["../../src/__tests__/compute-angle.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compute-mean-anomaly.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-mean-anomaly.int.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/compute-mean-anomaly.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,175 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { computeMeanAnomaly } from '../compute-mean-anomaly';
4
+ import { trueAnomalyToMeanAnomaly } from '../true-anomaly-to-mean-anomaly';
5
+ import { wrapAngle } from '../wrap-angle';
6
+ import { TWO_PI } from '@interstellar-tools/constants';
7
+ const EPSILON = 1e-10; // Increased tolerance for floating-point comparisons
8
+ const assertApproxEqual = (actual, expected) => {
9
+ assert.ok(Math.abs(actual - expected) < EPSILON, `Expected ~${expected}, got ${actual}`);
10
+ };
11
+ describe('computeMeanAnomaly', () => {
12
+ test('Circular Orbit (e=0)', () => {
13
+ const body = {
14
+ e: 0,
15
+ angle: Math.PI / 2,
16
+ period: { value: 365, unit: 'd' }
17
+ };
18
+ const timeStep = { value: 100, unit: 'd' };
19
+ const periodInDays = body.period.value;
20
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
21
+ const expectedM = wrapAngle(Math.PI / 2 + meanMotion * 100);
22
+ const result = computeMeanAnomaly(body, timeStep);
23
+ assertApproxEqual(result, expectedM);
24
+ });
25
+ test('Elliptical Orbit (e > 0)', () => {
26
+ const body = {
27
+ e: 0.5,
28
+ angle: Math.PI / 2,
29
+ period: { value: 200, unit: 'd' }
30
+ };
31
+ const timeStep = { value: 50, unit: 'd' };
32
+ const periodInDays = body.period.value;
33
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
34
+ const M0 = body.e === 0 ? body.angle : trueAnomalyToMeanAnomaly(body.angle, body.e);
35
+ const expectedM = wrapAngle(M0 + meanMotion * 50);
36
+ const result = computeMeanAnomaly(body, timeStep);
37
+ assertApproxEqual(result, expectedM);
38
+ });
39
+ test('Large Time Step Clamping (Max 10 Orbits)', () => {
40
+ const body = {
41
+ e: 0.1,
42
+ angle: 1.0,
43
+ period: { value: 100, unit: 'd' }
44
+ };
45
+ const timeStep = { value: 2000, unit: 'd' };
46
+ const periodInDays = body.period.value;
47
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
48
+ const maxAllowedTimeStep = 10 * periodInDays;
49
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
50
+ const expectedM = wrapAngle(M0 + meanMotion * maxAllowedTimeStep);
51
+ const result = computeMeanAnomaly(body, timeStep);
52
+ assertApproxEqual(result, expectedM);
53
+ });
54
+ test('Eccentricity Out of Bounds Throws Error', () => {
55
+ const invalidBodies = [
56
+ { e: -0.1, angle: 0, period: { value: 365, unit: 'd' } },
57
+ { e: 1.1, angle: 0, period: { value: 365, unit: 'd' } }
58
+ ];
59
+ const timeStep = { value: 10, unit: 'd' };
60
+ for (const body of invalidBodies) {
61
+ assert.throws(() => computeMeanAnomaly(body, timeStep), RangeError);
62
+ }
63
+ });
64
+ test('Zero Time Step Returns Initial Mean Anomaly', () => {
65
+ const body = {
66
+ e: 0.3,
67
+ angle: 2.0,
68
+ period: { value: 400, unit: 'd' }
69
+ };
70
+ const timeStep = { value: 0, unit: 'd' };
71
+ const M0 = body.e === 0 ? body.angle : trueAnomalyToMeanAnomaly(body.angle, body.e);
72
+ const result = computeMeanAnomaly(body, timeStep);
73
+ assertApproxEqual(result, M0);
74
+ });
75
+ test('High Eccentricity Orbit (e ~ 1)', () => {
76
+ const body = {
77
+ e: 0.9951,
78
+ angle: -2.1196,
79
+ period: { value: 365.25, unit: 'd' }
80
+ };
81
+ const timeStep = { value: 0.25, unit: 'd' };
82
+ const periodInDays = body.period.value;
83
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
84
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
85
+ const expectedM = wrapAngle(M0 + meanMotion * 0.25);
86
+ const result = computeMeanAnomaly(body, timeStep);
87
+ assertApproxEqual(result, expectedM);
88
+ });
89
+ test('Angle Wrapping within [-2π, 2π]', () => {
90
+ const body = {
91
+ e: 0.5,
92
+ angle: 3 * Math.PI,
93
+ period: { value: 365, unit: 'd' }
94
+ };
95
+ const timeStep = { value: 10, unit: 'd' };
96
+ const periodInDays = body.period.value;
97
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
98
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
99
+ const expectedM = wrapAngle(M0 + meanMotion * 10);
100
+ const result = computeMeanAnomaly(body, timeStep);
101
+ assertApproxEqual(result, expectedM);
102
+ assert(result <= 2 * Math.PI && result >= -2 * Math.PI);
103
+ });
104
+ test('Minimum Time Step Clamping', () => {
105
+ const body = {
106
+ e: 0.5,
107
+ angle: Math.PI / 2,
108
+ period: { value: 365, unit: 'd' }
109
+ };
110
+ const timeStep = { value: 1e-6, unit: 'd' };
111
+ const periodInDays = body.period.value;
112
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
113
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
114
+ const expectedM = wrapAngle(M0 + meanMotion * 1e-5); // Minimum time step
115
+ const result = computeMeanAnomaly(body, timeStep);
116
+ assertApproxEqual(result, expectedM);
117
+ });
118
+ test("Halley's Comet", () => {
119
+ const body = {
120
+ e: 0.96714,
121
+ angle: (38.38 * Math.PI) / 180, // Convert degrees to radians
122
+ period: { value: 27576, unit: 'd' }
123
+ };
124
+ const timeStep = { value: 100, unit: 'd' };
125
+ const periodInDays = body.period.value;
126
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
127
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
128
+ const expectedM = wrapAngle(M0 + meanMotion * 100);
129
+ const result = computeMeanAnomaly(body, timeStep);
130
+ assertApproxEqual(result, expectedM);
131
+ });
132
+ test('Comet Hale-Bopp', () => {
133
+ const body = {
134
+ e: 0.9951,
135
+ angle: (180 * Math.PI) / 180, // Convert degrees to radians
136
+ period: { value: -253533, unit: 'd' } // Positive period for testing
137
+ };
138
+ const timeStep = { value: 0.25, unit: 'd' };
139
+ const periodInDays = body.period.value;
140
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
141
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
142
+ const expectedM = wrapAngle(M0 + meanMotion * 0.25);
143
+ const result = computeMeanAnomaly(body, timeStep);
144
+ assertApproxEqual(result, expectedM);
145
+ });
146
+ test('Comet 67P/Churyumov–Gerasimenko', () => {
147
+ const body = {
148
+ e: 0.641,
149
+ angle: 0, // Initial angle in radians
150
+ period: { value: -2484, unit: 'd' } // Positive period for testing
151
+ };
152
+ const timeStep = { value: 10, unit: 'd' };
153
+ const periodInDays = body.period.value;
154
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
155
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
156
+ const expectedM = wrapAngle(M0 + meanMotion * 10);
157
+ const result = computeMeanAnomaly(body, timeStep);
158
+ assertApproxEqual(result, expectedM);
159
+ });
160
+ test('Comet Encke', () => {
161
+ const body = {
162
+ e: 0.85,
163
+ angle: (160 * Math.PI) / 180, // Convert degrees to radians
164
+ period: { value: -1204, unit: 'd' } // Positive period for testing
165
+ };
166
+ const timeStep = { value: 5, unit: 'd' };
167
+ const periodInDays = body.period.value;
168
+ const meanMotion = TWO_PI / Math.abs(periodInDays);
169
+ const M0 = trueAnomalyToMeanAnomaly(body.angle, body.e);
170
+ const expectedM = wrapAngle(M0 + meanMotion * 5);
171
+ const result = computeMeanAnomaly(body, timeStep);
172
+ assertApproxEqual(result, expectedM);
173
+ });
174
+ });
175
+ //# sourceMappingURL=compute-mean-anomaly.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-mean-anomaly.int.spec.js","sourceRoot":"","sources":["../../src/__tests__/compute-mean-anomaly.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=eccentric-to-true-anomaly.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eccentric-to-true-anomaly.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/eccentric-to-true-anomaly.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { eccentricToTrueAnomaly } from '../eccentric-to-true-anomaly';
4
+ describe('eccentricToTrueAnomaly', () => {
5
+ // Test cases for eccentricToTrueAnomaly
6
+ const testCases = [
7
+ { E: 0, e: 0.5, expected: 0.0 }, // E = 0 should give V = 0
8
+ { E: Math.PI / 4, e: 0.1, expected: 0.858858 }, // Approximate expected value
9
+ { E: Math.PI / 2, e: 0.3, expected: 1.875489 }, // Approximate expected value
10
+ { E: Math.PI, e: 0.2, expected: Math.PI }, // E = π should give V = π
11
+ { E: (3 * Math.PI) / 2, e: 0.4, expected: 4.300872 } // Approximate expected value
12
+ ];
13
+ test('computes correct true anomaly', () => {
14
+ testCases.forEach(({ E, e, expected }) => {
15
+ const result = eccentricToTrueAnomaly(E, e);
16
+ assert.ok(Math.abs(result - expected) < 1e-4, `Expected V ≈ ${expected} for E=${E}, e=${e}, but got ${result}`);
17
+ });
18
+ });
19
+ test('handles special cases', () => {
20
+ assert.strictEqual(eccentricToTrueAnomaly(0, 0), 0); // Circular orbit (e = 0) should return E
21
+ assert.strictEqual(eccentricToTrueAnomaly(Math.PI, 0), Math.PI); // Circular case with E = π
22
+ assert.strictEqual(eccentricToTrueAnomaly(0, 1), 0); // Parabolic orbit case
23
+ });
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);
27
+ });
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);
31
+ });
32
+ });
33
+ //# sourceMappingURL=eccentric-to-true-anomaly.spec.js.map
@@ -0,0 +1 @@
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=solve-kepler-bisection.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-kepler-bisection.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-bisection.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { solveKeplerBisection } from '../solve-kepler-bisection';
4
+ describe('solveKeplerBisection', () => {
5
+ test("Solves Kepler's equation for small eccentricities", () => {
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
14
+ const e = 0.5;
15
+ const expected = solveKeplerBisection(M, e, 50, 1e-9);
16
+ const result = solveKeplerBisection(M, e, 50, 1e-9);
17
+ assert.ok(Math.abs(result - expected) < 1e-9, `Expected ${expected}, got ${result}`);
18
+ });
19
+ test("Solves Kepler's equation for high eccentricities", () => {
20
+ const M = Math.PI / 3; // 60 degrees in radians
21
+ const e = 0.9;
22
+ const expected = solveKeplerBisection(M, e, 50, 1e-9);
23
+ const result = solveKeplerBisection(M, e, 50, 1e-9);
24
+ assert.ok(Math.abs(result - expected) < 1e-9, `Expected ${expected}, got ${result}`);
25
+ });
26
+ test('Ensures solution falls within expected bounds', () => {
27
+ const M = Math.PI / 6;
28
+ const e = 0.4;
29
+ const result = solveKeplerBisection(M, e, 50, 1e-9);
30
+ assert.ok(result >= 0 && result <= Math.PI, `Eccentric anomaly ${result} out of bounds`);
31
+ });
32
+ test('Handles convergence within the given tolerance', () => {
33
+ const M = Math.PI / 2;
34
+ const e = 0.7;
35
+ const tolerance = 1e-12;
36
+ const result = solveKeplerBisection(M, e, 50, tolerance);
37
+ const F = result - e * Math.sin(result) - M;
38
+ assert.ok(Math.abs(F) < tolerance, `Convergence issue: Residual ${F}`);
39
+ });
40
+ });
41
+ //# sourceMappingURL=solve-kepler-bisection.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-kepler-bisection.spec.js","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-bisection.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=solve-kepler-high-eccentricity.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-kepler-high-eccentricity.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-high-eccentricity.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { solveKeplerHighEccentricity } from '../solve-kepler-high-eccentricity';
4
+ const EPSILON = 1e-9;
5
+ const assertApproxEqual = (actual, expected) => {
6
+ assert.ok(Math.abs(actual - expected) < EPSILON, `Expected ~${expected}, got ${actual}`);
7
+ };
8
+ // **Define test cases based on Halley's Comet & Comet Hale-Bopp**
9
+ const testCases = [
10
+ {
11
+ name: "Halley's Comet (Typical Case)",
12
+ M: (38.38 * Math.PI) / 180, // Mean anomaly converted to radians
13
+ e: 0.96714,
14
+ expected: 1.63500444611954 // Placeholder expected value (needs verification)
15
+ },
16
+ {
17
+ name: 'Comet Hale-Bopp (Extreme Eccentricity)',
18
+ M: (180 * Math.PI) / 180,
19
+ e: 0.9951,
20
+ expected: Math.PI // Placeholder expected value (Kepler's equation should return π for M=π)
21
+ },
22
+ {
23
+ name: "Halley's Comet (Small M)",
24
+ M: 0.01, // Small anomaly case
25
+ e: 0.96714,
26
+ expected: 0.238206497655823 // Placeholder expected value (needs verification)
27
+ },
28
+ {
29
+ name: 'Comet Hale-Bopp (Large M)',
30
+ M: 5, // Large anomaly case
31
+ e: 0.9951,
32
+ expected: 4.1553401654182 // Placeholder expected value (needs verification)
33
+ }
34
+ ];
35
+ describe('solveKeplerHighEccentricity (Real Data Tests)', () => {
36
+ for (const { name, M, e, expected } of testCases) {
37
+ test(name, () => {
38
+ const result = solveKeplerHighEccentricity(M, e);
39
+ assertApproxEqual(result, expected);
40
+ });
41
+ }
42
+ });
43
+ describe('solveKeplerHighEccentricity (General Behavior Tests)', () => {
44
+ test('converges for typical values', () => {
45
+ const M = Math.PI / 4; // 45 degrees in radians
46
+ const e = 0.95; // High eccentricity
47
+ const result = solveKeplerHighEccentricity(M, e);
48
+ assertApproxEqual(result, 1.7242367109653982);
49
+ });
50
+ test('works for small M values', () => {
51
+ const M = 0.01;
52
+ const e = 0.99;
53
+ const result = solveKeplerHighEccentricity(M, e);
54
+ assertApproxEqual(result, 0.3422703164917758);
55
+ });
56
+ test('handles M = 0 case correctly', () => {
57
+ const M = 0;
58
+ const e = 0.98;
59
+ const result = solveKeplerHighEccentricity(M, e);
60
+ assertApproxEqual(result, 0); // Eccentric anomaly should also be zero
61
+ });
62
+ test('handles large M values', () => {
63
+ const M = 5; // Large mean anomaly
64
+ const e = 0.95;
65
+ const result = solveKeplerHighEccentricity(M, e);
66
+ assertApproxEqual(result, 4.181000769932799);
67
+ });
68
+ test('ensures correct output for extremely large M', () => {
69
+ const M = 10 * Math.PI; // Large anomaly
70
+ const e = 0.97;
71
+ const result = solveKeplerHighEccentricity(M, e, Math.max(50, Math.floor(M)));
72
+ assertApproxEqual(result, 0);
73
+ });
74
+ test('does not exceed max iterations', () => {
75
+ const M = 3;
76
+ const e = 0.999; // Extremely high eccentricity
77
+ const result = solveKeplerHighEccentricity(M, e, Math.max(50, Math.floor(M)), 1e-9);
78
+ assert.ok(result !== null); // Ensure it still produces a valid number
79
+ });
80
+ });
81
+ //# sourceMappingURL=solve-kepler-high-eccentricity.spec.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=solve-kepler-newton-raphson.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-kepler-newton-raphson.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/solve-kepler-newton-raphson.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { solveKeplerNewtonRaphson } from '../solve-kepler-newton-raphson';
4
+ const EPSILON = 1e-9;
5
+ const assertApproxEqual = (actual, expected) => {
6
+ assert.ok(Math.abs(actual - expected) < EPSILON, `Expected ~${expected}, got ${actual}`);
7
+ };
8
+ describe('solveKeplerNewtonRaphson', () => {
9
+ test('converges for typical values', () => {
10
+ const M = Math.PI / 4; // 45 degrees in radians
11
+ const e = 0.1; // Low eccentricity
12
+ const result = solveKeplerNewtonRaphson(M, e, 50, 1e-9);
13
+ assertApproxEqual(result, 0.8612648849); // Expected numerical result
14
+ });
15
+ test('works for small M values', () => {
16
+ const M = 0.01;
17
+ const e = 0.2;
18
+ const result = solveKeplerNewtonRaphson(M, e, 50, 1e-9);
19
+ assertApproxEqual(result, 0.0124999186);
20
+ });
21
+ test('handles M = 0 case correctly', () => {
22
+ const M = 0;
23
+ const e = 0.5;
24
+ const result = solveKeplerNewtonRaphson(M, e, 50, 1e-9);
25
+ assertApproxEqual(result, 0); // Eccentric anomaly should also be zero
26
+ });
27
+ test('handles high eccentricity values correctly', () => {
28
+ const M = Math.PI / 3;
29
+ const e = 0.95;
30
+ const result = solveKeplerNewtonRaphson(M, e, 50, 1e-9);
31
+ assertApproxEqual(result, 1.9349139832);
32
+ });
33
+ test('ensures correct output for nearly parabolic orbits', () => {
34
+ const M = Math.PI / 6;
35
+ const e = 0.97; // Nearly parabolic
36
+ const result = solveKeplerNewtonRaphson(M, e, 50, 1e-9);
37
+ assertApproxEqual(result, 1.4904711747);
38
+ });
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);
42
+ });
43
+ test('returns NaN if the method does not converge', () => {
44
+ const M = 3;
45
+ const e = 0.9999; // Extremely high eccentricity
46
+ const result = solveKeplerNewtonRaphson(M, e, 5, 1e-9); // Very low maxIter
47
+ assert.ok(Number.isNaN(result));
48
+ });
49
+ });
50
+ //# sourceMappingURL=solve-kepler-newton-raphson.spec.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=solve-kepler.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-kepler.int.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/solve-kepler.int.spec.ts"],"names":[],"mappings":""}