@interstellar-tools/equations 0.10.0 → 0.12.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__/combine-burns-delta-v.spec.d.ts +2 -0
- package/dist/__tests__/combine-burns-delta-v.spec.d.ts.map +1 -0
- package/dist/__tests__/combine-burns-delta-v.spec.js +102 -0
- package/dist/__tests__/combine-burns-delta-v.spec.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +2 -1
- package/dist/__tests__/helpers/index.d.ts.map +1 -1
- package/dist/__tests__/helpers/index.js +1 -0
- package/dist/__tests__/helpers/index.js.map +1 -1
- package/dist/__tests__/oberth-energy-gain.spec.d.ts +2 -0
- package/dist/__tests__/oberth-energy-gain.spec.d.ts.map +1 -0
- package/dist/__tests__/oberth-energy-gain.spec.js +71 -0
- package/dist/__tests__/oberth-energy-gain.spec.js.map +1 -0
- package/dist/__tests__/plane-change-delta-v.spec.d.ts +2 -0
- package/dist/__tests__/plane-change-delta-v.spec.d.ts.map +1 -0
- package/dist/__tests__/plane-change-delta-v.spec.js +89 -0
- package/dist/__tests__/plane-change-delta-v.spec.js.map +1 -0
- package/dist/categories/manoeuvres/combine-burns-delta-v.d.ts +69 -0
- package/dist/categories/manoeuvres/combine-burns-delta-v.d.ts.map +1 -0
- package/dist/categories/manoeuvres/combine-burns-delta-v.js +93 -0
- package/dist/categories/manoeuvres/combine-burns-delta-v.js.map +1 -0
- package/dist/categories/manoeuvres/hohmann-transfer.d.ts +0 -5
- package/dist/categories/manoeuvres/hohmann-transfer.d.ts.map +1 -1
- package/dist/categories/manoeuvres/hohmann-transfer.js +0 -5
- package/dist/categories/manoeuvres/hohmann-transfer.js.map +1 -1
- package/dist/categories/manoeuvres/oberth-energy-gain.d.ts +66 -0
- package/dist/categories/manoeuvres/oberth-energy-gain.d.ts.map +1 -0
- package/dist/categories/manoeuvres/oberth-energy-gain.js +78 -0
- package/dist/categories/manoeuvres/oberth-energy-gain.js.map +1 -0
- package/dist/categories/manoeuvres/plane-change-delta-v.d.ts +57 -0
- package/dist/categories/manoeuvres/plane-change-delta-v.d.ts.map +1 -0
- package/dist/categories/manoeuvres/plane-change-delta-v.js +69 -0
- package/dist/categories/manoeuvres/plane-change-delta-v.js.map +1 -0
- package/dist/index.d.ts +12 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combine-burns-delta-v.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/combine-burns-delta-v.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { combineBurnsDeltaV } from '../categories/manoeuvres/combine-burns-delta-v';
|
|
4
|
+
import { absClose, toRad } from './helpers';
|
|
5
|
+
const PI = Math.PI;
|
|
6
|
+
const relClose = (a, b, rel = 1e-12, abs = 1e-12, msg) => {
|
|
7
|
+
const denom = Math.max(1, Math.abs(a), Math.abs(b));
|
|
8
|
+
assert.ok(Math.abs(a - b) <= Math.max(abs, rel * denom), msg);
|
|
9
|
+
};
|
|
10
|
+
describe('combineBurnsDeltaV', () => {
|
|
11
|
+
test('collinear same direction (Δθ=0): Δv = |v1 - v2|', () => {
|
|
12
|
+
const v1 = 3000;
|
|
13
|
+
const v2 = 800;
|
|
14
|
+
const dv = combineBurnsDeltaV(v1, v2, 0);
|
|
15
|
+
absClose(dv, Math.abs(v1 - v2));
|
|
16
|
+
});
|
|
17
|
+
test('collinear opposite (Δθ=π): Δv = v1 + v2', () => {
|
|
18
|
+
const v1 = 2500;
|
|
19
|
+
const v2 = 900;
|
|
20
|
+
const dv = combineBurnsDeltaV(v1, v2, PI);
|
|
21
|
+
absClose(dv, v1 + v2);
|
|
22
|
+
});
|
|
23
|
+
test('quadrature (Δθ=90°): Δv = sqrt(v1^2 + v2^2)', () => {
|
|
24
|
+
const v1 = 2100;
|
|
25
|
+
const v2 = 1400;
|
|
26
|
+
const dv = combineBurnsDeltaV(v1, v2, toRad(90));
|
|
27
|
+
absClose(dv, Math.hypot(v1, v2));
|
|
28
|
+
});
|
|
29
|
+
test('general case matches law of cosines', () => {
|
|
30
|
+
const cases = [
|
|
31
|
+
{ v1: 1000, v2: 500, deg: 35 },
|
|
32
|
+
{ v1: 2800, v2: 1200, deg: 60 },
|
|
33
|
+
{ v1: 750, v2: 750, deg: 123 }
|
|
34
|
+
];
|
|
35
|
+
for (const { v1, v2, deg } of cases) {
|
|
36
|
+
const th = toRad(deg);
|
|
37
|
+
const expected = Math.sqrt(v1 * v1 + v2 * v2 - 2 * v1 * v2 * Math.cos(th));
|
|
38
|
+
const dv = combineBurnsDeltaV(v1, v2, th);
|
|
39
|
+
relClose(dv, expected, 1e-12, 1e-12, `mismatch for v1=${v1}, v2=${v2}, Δθ=${deg}°`);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
test('symmetry: swapping v1 and v2 gives same Δv', () => {
|
|
43
|
+
const v1 = 1900;
|
|
44
|
+
const v2 = 1300;
|
|
45
|
+
const th = toRad(47);
|
|
46
|
+
const a = combineBurnsDeltaV(v1, v2, th);
|
|
47
|
+
const b = combineBurnsDeltaV(v2, v1, th);
|
|
48
|
+
absClose(a, b);
|
|
49
|
+
});
|
|
50
|
+
test('zero burn in either vector returns the other magnitude (Δθ arbitrary)', () => {
|
|
51
|
+
const v = 1234;
|
|
52
|
+
const angles = [0, 0.4, 1.2, Math.PI];
|
|
53
|
+
for (const th of angles) {
|
|
54
|
+
absClose(combineBurnsDeltaV(0, v, th), v);
|
|
55
|
+
absClose(combineBurnsDeltaV(v, 0, th), v);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// ---------------- monotonic / bounds ----------------
|
|
59
|
+
test('for fixed v1 = v2 = v, Δv increases monotonically with Δθ on [0, π]', () => {
|
|
60
|
+
const v = 1500;
|
|
61
|
+
const seq = [0, 15, 30, 60, 90, 135, 180].map(toRad);
|
|
62
|
+
let last = -1;
|
|
63
|
+
for (const th of seq) {
|
|
64
|
+
const dv = combineBurnsDeltaV(v, v, th);
|
|
65
|
+
assert.ok(dv >= last - 1e-12, `not monotone at Δθ=${(th * 180) / PI}°`);
|
|
66
|
+
last = dv;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
test('bounds: result in [|v1-v2|, v1+v2]', () => {
|
|
70
|
+
const v1 = 2600, v2 = 900;
|
|
71
|
+
for (const deg of [0, 20, 45, 100, 150, 180]) {
|
|
72
|
+
const dv = combineBurnsDeltaV(v1, v2, toRad(deg));
|
|
73
|
+
assert.ok(dv >= Math.abs(v1 - v2) - 1e-12, 'below lower bound');
|
|
74
|
+
assert.ok(dv <= v1 + v2 + 1e-12, 'above upper bound');
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// ---------------- numerical guard ----------------
|
|
78
|
+
test('FP guard: tiny negative radicand clamps to 0 near Δθ=0 with equal burns', () => {
|
|
79
|
+
const v = 2000;
|
|
80
|
+
// angle so small that theoretical Δv ≈ 0; numerical should return ~0 (not throw)
|
|
81
|
+
const th = 1e-12;
|
|
82
|
+
const dv = combineBurnsDeltaV(v, v, th);
|
|
83
|
+
assert.ok(dv >= 0, 'Δv should be non-negative');
|
|
84
|
+
assert.ok(dv < 1e-6, `Δv should be ~0, got ${dv}`);
|
|
85
|
+
});
|
|
86
|
+
// ---------------- validation ----------------
|
|
87
|
+
test('TypeError on non-number inputs', () => {
|
|
88
|
+
assert.throws(() => combineBurnsDeltaV('1000', 200, 0), TypeError);
|
|
89
|
+
assert.throws(() => combineBurnsDeltaV(1000, '200', 0), TypeError);
|
|
90
|
+
assert.throws(() => combineBurnsDeltaV(1000, 200, '0'), TypeError);
|
|
91
|
+
});
|
|
92
|
+
test('RangeError on non-finite or out-of-domain values', () => {
|
|
93
|
+
assert.throws(() => combineBurnsDeltaV(NaN, 200, 0), RangeError);
|
|
94
|
+
assert.throws(() => combineBurnsDeltaV(1000, Infinity, 0), RangeError);
|
|
95
|
+
assert.throws(() => combineBurnsDeltaV(-1, 200, 0), RangeError);
|
|
96
|
+
assert.throws(() => combineBurnsDeltaV(1000, -1, 0), RangeError);
|
|
97
|
+
assert.throws(() => combineBurnsDeltaV(1000, 200, NaN), RangeError);
|
|
98
|
+
assert.throws(() => combineBurnsDeltaV(1000, 200, -1e-6), RangeError);
|
|
99
|
+
assert.throws(() => combineBurnsDeltaV(1000, 200, (PI + 1e-6)), RangeError);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=combine-burns-delta-v.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combine-burns-delta-v.spec.js","sourceRoot":"","sources":["../../src/__tests__/combine-burns-delta-v.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Vector3DTupleType } from '@interstellar-tools/types';
|
|
1
|
+
import { Radians, Vector3DTupleType } from '@interstellar-tools/types';
|
|
2
2
|
export declare const relClose: (a: number | null, b: number, eps?: number, msg?: string) => void;
|
|
3
3
|
export declare const vecRelClose: (a: Vector3DTupleType, b: Vector3DTupleType, eps?: number, msg?: string) => void;
|
|
4
4
|
export declare const norm: (v: Vector3DTupleType) => number;
|
|
@@ -9,4 +9,5 @@ export declare const dot: (a: Vector3DTupleType, b: Vector3DTupleType) => number
|
|
|
9
9
|
export declare const norm2pi: (x: number) => number;
|
|
10
10
|
export declare const angleClose: (a: number, b: number, eps?: number) => void;
|
|
11
11
|
export declare const residual: (E: number, e: number, M: number) => number;
|
|
12
|
+
export declare const toRad: (deg: number) => Radians;
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,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;AAEF,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,KAAgC,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oberth-energy-gain.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/oberth-energy-gain.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { oberthEnergyGain } from '../categories/manoeuvres/oberth-energy-gain';
|
|
4
|
+
import { absClose } from './helpers';
|
|
5
|
+
const relClose = (a, b, rel = 1e-12, abs = 1e-12, msg) => {
|
|
6
|
+
const denom = Math.max(1, Math.abs(a), Math.abs(b));
|
|
7
|
+
assert.ok(Math.abs(a - b) <= Math.max(abs, rel * denom), msg);
|
|
8
|
+
};
|
|
9
|
+
describe('oberthEnergyGain', () => {
|
|
10
|
+
test('basic: Δε ≈ v·Δv', () => {
|
|
11
|
+
const v = 7800; // m/s (LEO-ish)
|
|
12
|
+
const dv = 100; // m/s
|
|
13
|
+
const dE = oberthEnergyGain(v, dv);
|
|
14
|
+
absClose(dE, v * dv);
|
|
15
|
+
});
|
|
16
|
+
test('zeros: dv=0 → 0; v=0 → 0', () => {
|
|
17
|
+
absClose(oberthEnergyGain(7500, 0), 0);
|
|
18
|
+
absClose(oberthEnergyGain(0, 25), 0);
|
|
19
|
+
});
|
|
20
|
+
test('scaling: scale v and dv by k ⇒ Δε scales by k^2', () => {
|
|
21
|
+
const v = 5000, dv = 20;
|
|
22
|
+
const k = 3.5;
|
|
23
|
+
const base = oberthEnergyGain(v, dv);
|
|
24
|
+
const scaled = oberthEnergyGain(k * v, k * dv);
|
|
25
|
+
relClose(scaled, k * k * base, 1e-12, 1e-12);
|
|
26
|
+
});
|
|
27
|
+
test('monotonicity: Δε increases with v for fixed dv', () => {
|
|
28
|
+
const dv = 15;
|
|
29
|
+
const values = [2000, 4000, 8000, 12000].map((v) => oberthEnergyGain(v, dv));
|
|
30
|
+
for (let i = 1; i < values.length; i++) {
|
|
31
|
+
assert.ok(values[i] > values[i - 1]);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
test('monotonicity: Δε increases with dv for fixed v', () => {
|
|
35
|
+
const v = 9000;
|
|
36
|
+
const values = [1, 5, 25, 50, 100].map((dv) => oberthEnergyGain(v, dv));
|
|
37
|
+
for (let i = 1; i < values.length; i++) {
|
|
38
|
+
assert.ok(values[i] > values[i - 1]);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// ---------------- approximation sanity vs. exact small-impulse energy change ----------------
|
|
42
|
+
test('approximation check vs. exact Δε = v·Δv + 0.5·Δv² (prograde)', () => {
|
|
43
|
+
const v = 9000; // m/s
|
|
44
|
+
const dv = 10; // small impulse
|
|
45
|
+
const approx = oberthEnergyGain(v, dv);
|
|
46
|
+
const exact = v * dv + 0.5 * dv * dv; // neglecting gravity/curvature during the burn
|
|
47
|
+
// The approximation should be lower than exact by ~0.5*dv^2
|
|
48
|
+
absClose(exact - approx, 0.5 * dv * dv);
|
|
49
|
+
});
|
|
50
|
+
// ---------------- validation ----------------
|
|
51
|
+
test('TypeError on non-number inputs', () => {
|
|
52
|
+
assert.throws(() => oberthEnergyGain('7800', 50), TypeError);
|
|
53
|
+
assert.throws(() => oberthEnergyGain(7800, '50'), TypeError);
|
|
54
|
+
});
|
|
55
|
+
test('RangeError on non-finite/negative v or dv', () => {
|
|
56
|
+
assert.throws(() => oberthEnergyGain(NaN, 10), RangeError);
|
|
57
|
+
assert.throws(() => oberthEnergyGain(7500, NaN), RangeError);
|
|
58
|
+
assert.throws(() => oberthEnergyGain(Infinity, 10), RangeError);
|
|
59
|
+
assert.throws(() => oberthEnergyGain(7500, Infinity), RangeError);
|
|
60
|
+
assert.throws(() => oberthEnergyGain(-1, 10), RangeError);
|
|
61
|
+
assert.throws(() => oberthEnergyGain(7500, -0.1), RangeError);
|
|
62
|
+
});
|
|
63
|
+
// ---------------- large but finite values ----------------
|
|
64
|
+
test('handles large finite numbers without overflow', () => {
|
|
65
|
+
const v = 1e6; // m/s (synthetic test)
|
|
66
|
+
const dv = 1e3; // m/s
|
|
67
|
+
const dE = oberthEnergyGain(v, dv);
|
|
68
|
+
absClose(dE, v * dv);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=oberth-energy-gain.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oberth-energy-gain.spec.js","sourceRoot":"","sources":["../../src/__tests__/oberth-energy-gain.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plane-change-delta-v.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/plane-change-delta-v.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { planeChangeDeltaV } from '../categories/manoeuvres/plane-change-delta-v';
|
|
4
|
+
import { absClose, relClose, toRad } from './helpers';
|
|
5
|
+
const PI = Math.PI;
|
|
6
|
+
describe('planeChangeDeltaV', () => {
|
|
7
|
+
test('Δi = 0 → Δv = 0', () => {
|
|
8
|
+
const v = 7600; // m/s
|
|
9
|
+
const dv = planeChangeDeltaV(v, 0);
|
|
10
|
+
absClose(dv, 0);
|
|
11
|
+
});
|
|
12
|
+
test('Δi = π (180°) → Δv = 2v', () => {
|
|
13
|
+
const v = 7600;
|
|
14
|
+
const dv = planeChangeDeltaV(v, PI);
|
|
15
|
+
absClose(dv, 2 * v);
|
|
16
|
+
});
|
|
17
|
+
test('Δi = 90° → Δv = 2 v sin(45°) = √2 v', () => {
|
|
18
|
+
const v = 7600;
|
|
19
|
+
const dv = planeChangeDeltaV(v, toRad(90));
|
|
20
|
+
relClose(dv, Math.SQRT2 * v, 1e-12);
|
|
21
|
+
});
|
|
22
|
+
test('correctness for several angles (equality with formula)', () => {
|
|
23
|
+
const v = 7500;
|
|
24
|
+
const angles = [
|
|
25
|
+
toRad(5),
|
|
26
|
+
toRad(10),
|
|
27
|
+
toRad(30),
|
|
28
|
+
toRad(60),
|
|
29
|
+
toRad(120)
|
|
30
|
+
];
|
|
31
|
+
for (const di of angles) {
|
|
32
|
+
const expected = 2 * v * Math.sin(di / 2);
|
|
33
|
+
const dv = planeChangeDeltaV(v, di);
|
|
34
|
+
absClose(dv, expected, 1e-12, `mismatch for Δi=${di}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
test('monotonicity: Δv increases with Δi on [0, π]', () => {
|
|
38
|
+
const v = 8000;
|
|
39
|
+
const seq = [
|
|
40
|
+
toRad(0),
|
|
41
|
+
toRad(10),
|
|
42
|
+
toRad(30),
|
|
43
|
+
toRad(60),
|
|
44
|
+
toRad(120),
|
|
45
|
+
toRad(180)
|
|
46
|
+
];
|
|
47
|
+
let last = -1;
|
|
48
|
+
for (const di of seq) {
|
|
49
|
+
const dv = planeChangeDeltaV(v, di);
|
|
50
|
+
assert.ok(dv >= last - 1e-12, `not monotone at Δi=${di}: ${dv} < ${last}`);
|
|
51
|
+
last = dv;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
test('scales linearly with speed v', () => {
|
|
55
|
+
const di = toRad(25);
|
|
56
|
+
const v1 = 6000;
|
|
57
|
+
const v2 = 9000;
|
|
58
|
+
const dv1 = planeChangeDeltaV(v1, di);
|
|
59
|
+
const dv2 = planeChangeDeltaV(v2, di);
|
|
60
|
+
absClose(dv2 / dv1, v2 / v1, 1e-12);
|
|
61
|
+
});
|
|
62
|
+
test('input validation: TypeError for non-number v', () => {
|
|
63
|
+
assert.throws(() => planeChangeDeltaV('7600', toRad(10)), TypeError);
|
|
64
|
+
});
|
|
65
|
+
test('input validation: RangeError for v non-finite or negative', () => {
|
|
66
|
+
assert.throws(() => planeChangeDeltaV(NaN, toRad(10)), RangeError);
|
|
67
|
+
assert.throws(() => planeChangeDeltaV(Infinity, toRad(10)), RangeError);
|
|
68
|
+
assert.throws(() => planeChangeDeltaV(-1, toRad(10)), RangeError);
|
|
69
|
+
});
|
|
70
|
+
test('input validation: TypeError for non-number deltaI', () => {
|
|
71
|
+
assert.throws(() => planeChangeDeltaV(7600, '0.1'), TypeError);
|
|
72
|
+
});
|
|
73
|
+
test('input validation: RangeError for deltaI non-finite', () => {
|
|
74
|
+
assert.throws(() => planeChangeDeltaV(7600, NaN), RangeError);
|
|
75
|
+
assert.throws(() => planeChangeDeltaV(7600, Infinity), RangeError);
|
|
76
|
+
});
|
|
77
|
+
test('input validation: RangeError for deltaI out of [0, π]', () => {
|
|
78
|
+
assert.throws(() => planeChangeDeltaV(7600, -1e-6), RangeError);
|
|
79
|
+
assert.throws(() => planeChangeDeltaV(7600, (PI + 1e-6)), RangeError);
|
|
80
|
+
});
|
|
81
|
+
test('edge tolerances: very small Δi returns ≈ 2 v * (Δi/2) = v*Δi', () => {
|
|
82
|
+
const v = 7800;
|
|
83
|
+
const di = 1e-9;
|
|
84
|
+
const dv = planeChangeDeltaV(v, di);
|
|
85
|
+
const smallAngleApprox = v * di;
|
|
86
|
+
absClose(dv, smallAngleApprox, 1e-12);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=plane-change-delta-v.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plane-change-delta-v.spec.js","sourceRoot":"","sources":["../../src/__tests__/plane-change-delta-v.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Radians } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* **Combine non-collinear burns** (vector law / law of cosines for velocities).
|
|
4
|
+
*
|
|
5
|
+
* **Definition**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \Delta v=\sqrt{v_1^2+v_2^2-2\,v_1 v_2\cos\Delta\theta}
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* where:
|
|
12
|
+
* - ($ v_1 $) and ($ v_2 $) are the **magnitudes** of two impulsive burns, and
|
|
13
|
+
* - ($ \Delta\theta $) is the **angle between their directions** (radians).
|
|
14
|
+
*
|
|
15
|
+
* **Units**
|
|
16
|
+
* - Inputs: ($ v_1,v_2 $) in **m/s**, ($ \Delta\theta $) in **radians**.
|
|
17
|
+
* - Output: ($ \Delta v $) in **m/s**.
|
|
18
|
+
*
|
|
19
|
+
* **Domain**
|
|
20
|
+
* - ($ v_1 \ge 0,\ v_2 \ge 0,\ \Delta\theta \in [0,\pi] $).
|
|
21
|
+
*
|
|
22
|
+
* ::: info Notes
|
|
23
|
+
*
|
|
24
|
+
* - Special cases:
|
|
25
|
+
* - ($ \Delta\theta=0 $) (same direction) → ($ \Delta v = |v_1 - v_2| $).
|
|
26
|
+
* - ($ \Delta\theta=\pi $) (opposite) → ($ \Delta v = v_1 + v_2 $).
|
|
27
|
+
* - This computes the **single equivalent impulse** from two burns applied
|
|
28
|
+
* with mutual angle ($ \Delta\theta $) (i.e., magnitude of the vector sum).
|
|
29
|
+
*
|
|
30
|
+
* :::
|
|
31
|
+
*
|
|
32
|
+
* @param {number} v1 Magnitude of burn 1 (m/s). Must be finite and ≥ 0.
|
|
33
|
+
* @param {number} v2 Magnitude of burn 2 (m/s). Must be finite and ≥ 0.
|
|
34
|
+
* @param {Radians} deltaTheta Angle between burn directions (radians), in [0, π].
|
|
35
|
+
* @returns {number} Equivalent single ($ \Delta v $) (m/s).
|
|
36
|
+
* @throws {TypeError} If any input is not a number.
|
|
37
|
+
* @throws {RangeError} If inputs are non-finite or out of domain.
|
|
38
|
+
* @group Manoeuvres
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { combineBurnsDeltaV } from "@interstellar-tools/equations";
|
|
42
|
+
* import type { Radians } from "@interstellar-tools/types";
|
|
43
|
+
*
|
|
44
|
+
* // Helper: degrees → branded radians
|
|
45
|
+
* const toRadians = (deg: number): Radians => ((deg * Math.PI) / 180) as Radians;
|
|
46
|
+
*
|
|
47
|
+
* // Two burns (magnitudes in m/s)
|
|
48
|
+
* const v1 = 500; // first impulse
|
|
49
|
+
* const v2 = 300; // second impulse
|
|
50
|
+
*
|
|
51
|
+
* // 1) Same direction (Δθ = 0°) → Δv = |v1 - v2|
|
|
52
|
+
* const dv_same = combineBurnsDeltaV(v1, v2, toRadians(0));
|
|
53
|
+
* console.log("Δθ = 0° → Δv =", dv_same.toFixed(3), "m/s");
|
|
54
|
+
*
|
|
55
|
+
* // 2) Opposite directions (Δθ = 180°) → Δv = v1 + v2
|
|
56
|
+
* const dv_opp = combineBurnsDeltaV(v1, v2, toRadians(180));
|
|
57
|
+
* console.log("Δθ = 180° → Δv =", dv_opp.toFixed(3), "m/s");
|
|
58
|
+
*
|
|
59
|
+
* // 3) General non-collinear case (e.g., Δθ = 60°)
|
|
60
|
+
* const dv_60 = combineBurnsDeltaV(v1, v2, toRadians(60));
|
|
61
|
+
* console.log("Δθ = 60° → Δv =", dv_60.toFixed(3), "m/s");
|
|
62
|
+
*
|
|
63
|
+
* // 4) Another example (Δθ = 25°)
|
|
64
|
+
* const dv_25 = combineBurnsDeltaV(1200, 800, toRadians(25));
|
|
65
|
+
* console.log("Δθ = 25° → Δv =", dv_25.toFixed(3), "m/s");
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare const combineBurnsDeltaV: (v1: number, v2: number, deltaTheta: Radians) => number;
|
|
69
|
+
//# sourceMappingURL=combine-burns-delta-v.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combine-burns-delta-v.d.ts","sourceRoot":"","sources":["../../../src/categories/manoeuvres/combine-burns-delta-v.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,eAAO,MAAM,kBAAkB,GAC7B,IAAI,MAAM,EACV,IAAI,MAAM,EACV,YAAY,OAAO,KAClB,MAkCF,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/* node:coverage disable */
|
|
2
|
+
/**
|
|
3
|
+
* **Combine non-collinear burns** (vector law / law of cosines for velocities).
|
|
4
|
+
*
|
|
5
|
+
* **Definition**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \Delta v=\sqrt{v_1^2+v_2^2-2\,v_1 v_2\cos\Delta\theta}
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* where:
|
|
12
|
+
* - ($ v_1 $) and ($ v_2 $) are the **magnitudes** of two impulsive burns, and
|
|
13
|
+
* - ($ \Delta\theta $) is the **angle between their directions** (radians).
|
|
14
|
+
*
|
|
15
|
+
* **Units**
|
|
16
|
+
* - Inputs: ($ v_1,v_2 $) in **m/s**, ($ \Delta\theta $) in **radians**.
|
|
17
|
+
* - Output: ($ \Delta v $) in **m/s**.
|
|
18
|
+
*
|
|
19
|
+
* **Domain**
|
|
20
|
+
* - ($ v_1 \ge 0,\ v_2 \ge 0,\ \Delta\theta \in [0,\pi] $).
|
|
21
|
+
*
|
|
22
|
+
* ::: info Notes
|
|
23
|
+
*
|
|
24
|
+
* - Special cases:
|
|
25
|
+
* - ($ \Delta\theta=0 $) (same direction) → ($ \Delta v = |v_1 - v_2| $).
|
|
26
|
+
* - ($ \Delta\theta=\pi $) (opposite) → ($ \Delta v = v_1 + v_2 $).
|
|
27
|
+
* - This computes the **single equivalent impulse** from two burns applied
|
|
28
|
+
* with mutual angle ($ \Delta\theta $) (i.e., magnitude of the vector sum).
|
|
29
|
+
*
|
|
30
|
+
* :::
|
|
31
|
+
*
|
|
32
|
+
* @param {number} v1 Magnitude of burn 1 (m/s). Must be finite and ≥ 0.
|
|
33
|
+
* @param {number} v2 Magnitude of burn 2 (m/s). Must be finite and ≥ 0.
|
|
34
|
+
* @param {Radians} deltaTheta Angle between burn directions (radians), in [0, π].
|
|
35
|
+
* @returns {number} Equivalent single ($ \Delta v $) (m/s).
|
|
36
|
+
* @throws {TypeError} If any input is not a number.
|
|
37
|
+
* @throws {RangeError} If inputs are non-finite or out of domain.
|
|
38
|
+
* @group Manoeuvres
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { combineBurnsDeltaV } from "@interstellar-tools/equations";
|
|
42
|
+
* import type { Radians } from "@interstellar-tools/types";
|
|
43
|
+
*
|
|
44
|
+
* // Helper: degrees → branded radians
|
|
45
|
+
* const toRadians = (deg: number): Radians => ((deg * Math.PI) / 180) as Radians;
|
|
46
|
+
*
|
|
47
|
+
* // Two burns (magnitudes in m/s)
|
|
48
|
+
* const v1 = 500; // first impulse
|
|
49
|
+
* const v2 = 300; // second impulse
|
|
50
|
+
*
|
|
51
|
+
* // 1) Same direction (Δθ = 0°) → Δv = |v1 - v2|
|
|
52
|
+
* const dv_same = combineBurnsDeltaV(v1, v2, toRadians(0));
|
|
53
|
+
* console.log("Δθ = 0° → Δv =", dv_same.toFixed(3), "m/s");
|
|
54
|
+
*
|
|
55
|
+
* // 2) Opposite directions (Δθ = 180°) → Δv = v1 + v2
|
|
56
|
+
* const dv_opp = combineBurnsDeltaV(v1, v2, toRadians(180));
|
|
57
|
+
* console.log("Δθ = 180° → Δv =", dv_opp.toFixed(3), "m/s");
|
|
58
|
+
*
|
|
59
|
+
* // 3) General non-collinear case (e.g., Δθ = 60°)
|
|
60
|
+
* const dv_60 = combineBurnsDeltaV(v1, v2, toRadians(60));
|
|
61
|
+
* console.log("Δθ = 60° → Δv =", dv_60.toFixed(3), "m/s");
|
|
62
|
+
*
|
|
63
|
+
* // 4) Another example (Δθ = 25°)
|
|
64
|
+
* const dv_25 = combineBurnsDeltaV(1200, 800, toRadians(25));
|
|
65
|
+
* console.log("Δθ = 25° → Δv =", dv_25.toFixed(3), "m/s");
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
/* node:coverage enable */
|
|
69
|
+
export const combineBurnsDeltaV = (v1, v2, deltaTheta) => {
|
|
70
|
+
if (typeof v1 !== 'number' || typeof v2 !== 'number')
|
|
71
|
+
throw new TypeError('v1 and v2 must be numbers (m/s).');
|
|
72
|
+
if (typeof deltaTheta !== 'number')
|
|
73
|
+
throw new TypeError('deltaTheta must be a number (radians).');
|
|
74
|
+
if (!Number.isFinite(v1) || v1 < 0)
|
|
75
|
+
throw new RangeError('v1 must be finite and ≥ 0 (m/s).');
|
|
76
|
+
if (!Number.isFinite(v2) || v2 < 0)
|
|
77
|
+
throw new RangeError('v2 must be finite and ≥ 0 (m/s).');
|
|
78
|
+
if (!Number.isFinite(deltaTheta))
|
|
79
|
+
throw new RangeError('deltaTheta must be finite (radians).');
|
|
80
|
+
if (deltaTheta < 0 || deltaTheta > Math.PI)
|
|
81
|
+
throw new RangeError('deltaTheta must be in [0, π] radians.');
|
|
82
|
+
const c = Math.cos(deltaTheta);
|
|
83
|
+
const radicand = v1 * v1 + v2 * v2 - 2 * v1 * v2 * c;
|
|
84
|
+
// FP guard: clamp tiny negative to zero
|
|
85
|
+
if (radicand < 0) {
|
|
86
|
+
const tol = 1e-12 * (v1 * v1 + v2 * v2);
|
|
87
|
+
if (radicand > -tol)
|
|
88
|
+
return 0;
|
|
89
|
+
throw new RangeError(`Numerically invalid radicand for given inputs (v1=${v1}, v2=${v2}, Δθ=${deltaTheta}).`);
|
|
90
|
+
}
|
|
91
|
+
return Math.sqrt(radicand);
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=combine-burns-delta-v.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combine-burns-delta-v.js","sourceRoot":"","sources":["../../../src/categories/manoeuvres/combine-burns-delta-v.ts"],"names":[],"mappings":"AAEA,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,EAAU,EACV,EAAU,EACV,UAAmB,EACX,EAAE;IACV,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ;QAClD,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAE1D,IAAI,OAAO,UAAU,KAAK,QAAQ;QAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAEhE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAE3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAE3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;IAE/D,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,EAAE;QACxC,MAAM,IAAI,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAEhE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAErD,wCAAwC;IACxC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAExC,IAAI,QAAQ,GAAG,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QAE9B,MAAM,IAAI,UAAU,CAClB,qDAAqD,EAAE,QAAQ,EAAE,QAAQ,UAAU,IAAI,CACxF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -43,11 +43,6 @@ export type HohmannTransferReturnType = {
|
|
|
43
43
|
* @throws {TypeError} If an input is not a number.
|
|
44
44
|
* @throws {RangeError} If ($ r_1\le 0 $), ($ r_2\le 0 $), or ($ \mu\le 0 $), or a value is non-finite.
|
|
45
45
|
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```ts
|
|
48
|
-
* // No code example here by request; see package docs for usage.
|
|
49
|
-
* ```
|
|
50
|
-
*
|
|
51
46
|
* @group Manoeuvres
|
|
52
47
|
*/
|
|
53
48
|
export declare const hohmannTransfer: (r1: number, r2: number, mu: number) => HohmannTransferReturnType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hohmann-transfer.d.ts","sourceRoot":"","sources":["../../../src/categories/manoeuvres/hohmann-transfer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;CAC1C,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"hohmann-transfer.d.ts","sourceRoot":"","sources":["../../../src/categories/manoeuvres/hohmann-transfer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;CAC1C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,eAAe,GAC1B,IAAI,MAAM,EACV,IAAI,MAAM,EACV,IAAI,MAAM,KACT,yBAkDF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,MAU7D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC9B,IAAI,MAAM,EACV,IAAI,MAAM,EACV,IAAI,MAAM,KACT,MASF,CAAC"}
|
|
@@ -34,11 +34,6 @@
|
|
|
34
34
|
* @throws {TypeError} If an input is not a number.
|
|
35
35
|
* @throws {RangeError} If ($ r_1\le 0 $), ($ r_2\le 0 $), or ($ \mu\le 0 $), or a value is non-finite.
|
|
36
36
|
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```ts
|
|
39
|
-
* // No code example here by request; see package docs for usage.
|
|
40
|
-
* ```
|
|
41
|
-
*
|
|
42
37
|
* @group Manoeuvres
|
|
43
38
|
*/
|
|
44
39
|
export const hohmannTransfer = (r1, r2, mu) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hohmann-transfer.js","sourceRoot":"","sources":["../../../src/categories/manoeuvres/hohmann-transfer.ts"],"names":[],"mappings":"AAUA
|
|
1
|
+
{"version":3,"file":"hohmann-transfer.js","sourceRoot":"","sources":["../../../src/categories/manoeuvres/hohmann-transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Oberth effect (specific energy gain near periapsis)**.
|
|
3
|
+
*
|
|
4
|
+
* **Approximation**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* \Delta \varepsilon \;\approx\; v\,\Delta v
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* where:
|
|
11
|
+
* - ($ v $) is the instantaneous **speed** at the burn point (typically periapsis),
|
|
12
|
+
* - ($ \Delta v $) is the **impulsive** prograde burn magnitude,
|
|
13
|
+
* - ($ \Delta \varepsilon $) is the change in **specific mechanical energy** (J/kg ≡ m²/s²).
|
|
14
|
+
*
|
|
15
|
+
* **Units**
|
|
16
|
+
* - Inputs: ($ v $) in **m/s**, ($ \Delta v $) in **m/s**.
|
|
17
|
+
* - Output: ($ \Delta \varepsilon $) in **J/kg** (m²/s²).
|
|
18
|
+
*
|
|
19
|
+
* ::: info Notes
|
|
20
|
+
*
|
|
21
|
+
* - This approximation assumes a **small**, **prograde** impulse (aligned with velocity) and
|
|
22
|
+
* neglects higher-order terms ($ \tfrac{1}{2}(\Delta v)^2 $).
|
|
23
|
+
* - A more general small-angle form is ($ \Delta \varepsilon \approx v\,\Delta v\cos\phi $),
|
|
24
|
+
* where ($ \phi $) is the angle between the velocity vector and the burn direction.
|
|
25
|
+
*
|
|
26
|
+
* :::
|
|
27
|
+
*
|
|
28
|
+
* @param {number} v Instantaneous speed at burn point (m/s). Must be finite and ≥ 0.
|
|
29
|
+
* @param {number} dv Impulsive prograde Δv magnitude (m/s). Must be finite and ≥ 0.
|
|
30
|
+
* @returns {number} Specific energy gain ($ \Delta \varepsilon $) (J/kg).
|
|
31
|
+
* @throws {TypeError} If inputs are not numbers.
|
|
32
|
+
* @throws {RangeError} If inputs are non-finite or negative.
|
|
33
|
+
* @group Manoeuvres
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { oberthEnergyGain, circularSpeed } from "@interstellar-tools/equations";
|
|
37
|
+
*
|
|
38
|
+
* // Earth's GM (μ) in m^3/s^2
|
|
39
|
+
* const muEarth = 3.986004418e14;
|
|
40
|
+
*
|
|
41
|
+
* // Example: small prograde burn at LEO periapsis (~400 km altitude)
|
|
42
|
+
* const rLEO = 6378e3 + 400e3; // m
|
|
43
|
+
* const vLEO = circularSpeed(rLEO, muEarth); // m/s ≈ 7670
|
|
44
|
+
*
|
|
45
|
+
* // Suppose guidance commands a small impulsive burn Δv = 50 m/s at periapsis
|
|
46
|
+
* const dv = 50; // m/s
|
|
47
|
+
*
|
|
48
|
+
* // Oberth approximation: Δε ≈ v · Δv (specific energy gain, J/kg ≡ m^2/s^2)
|
|
49
|
+
* const deltaEps = oberthEnergyGain(vLEO, dv);
|
|
50
|
+
*
|
|
51
|
+
* // For intuition, translate Δε to an approximate change in semi-major axis (elliptic case):
|
|
52
|
+
* // ε = -μ/(2a) ⇒ Δa ≈ (a^2 / μ) · Δε (valid for small changes around circular LEO)
|
|
53
|
+
* const aLEO = rLEO; // circular → a = r
|
|
54
|
+
* const deltaA = (aLEO * aLEO / muEarth) * deltaEps; // meters
|
|
55
|
+
*
|
|
56
|
+
* console.log(`LEO speed v ≈ ${vLEO.toFixed(1)} m/s`);
|
|
57
|
+
* console.log(`Prograde Δv = ${dv.toFixed(1)} m/s`);
|
|
58
|
+
* console.log(`Specific energy gain Δε ≈ ${deltaEps.toFixed(0)} J/kg`);
|
|
59
|
+
* console.log(`Approx. semi-major axis change Δa ≈ ${deltaA.toFixed(0)} m`);
|
|
60
|
+
*
|
|
61
|
+
* // Tip: If the burn is not perfectly prograde by angle φ (in radians),
|
|
62
|
+
* // scale by cos φ: Δε ≈ v · Δv · cos φ (small-angle approximation).
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare const oberthEnergyGain: (v: number, dv: number) => number;
|
|
66
|
+
//# sourceMappingURL=oberth-energy-gain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oberth-energy-gain.d.ts","sourceRoot":"","sources":["../../../src/categories/manoeuvres/oberth-energy-gain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,KAAG,MAexD,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Oberth effect (specific energy gain near periapsis)**.
|
|
3
|
+
*
|
|
4
|
+
* **Approximation**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* \Delta \varepsilon \;\approx\; v\,\Delta v
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* where:
|
|
11
|
+
* - ($ v $) is the instantaneous **speed** at the burn point (typically periapsis),
|
|
12
|
+
* - ($ \Delta v $) is the **impulsive** prograde burn magnitude,
|
|
13
|
+
* - ($ \Delta \varepsilon $) is the change in **specific mechanical energy** (J/kg ≡ m²/s²).
|
|
14
|
+
*
|
|
15
|
+
* **Units**
|
|
16
|
+
* - Inputs: ($ v $) in **m/s**, ($ \Delta v $) in **m/s**.
|
|
17
|
+
* - Output: ($ \Delta \varepsilon $) in **J/kg** (m²/s²).
|
|
18
|
+
*
|
|
19
|
+
* ::: info Notes
|
|
20
|
+
*
|
|
21
|
+
* - This approximation assumes a **small**, **prograde** impulse (aligned with velocity) and
|
|
22
|
+
* neglects higher-order terms ($ \tfrac{1}{2}(\Delta v)^2 $).
|
|
23
|
+
* - A more general small-angle form is ($ \Delta \varepsilon \approx v\,\Delta v\cos\phi $),
|
|
24
|
+
* where ($ \phi $) is the angle between the velocity vector and the burn direction.
|
|
25
|
+
*
|
|
26
|
+
* :::
|
|
27
|
+
*
|
|
28
|
+
* @param {number} v Instantaneous speed at burn point (m/s). Must be finite and ≥ 0.
|
|
29
|
+
* @param {number} dv Impulsive prograde Δv magnitude (m/s). Must be finite and ≥ 0.
|
|
30
|
+
* @returns {number} Specific energy gain ($ \Delta \varepsilon $) (J/kg).
|
|
31
|
+
* @throws {TypeError} If inputs are not numbers.
|
|
32
|
+
* @throws {RangeError} If inputs are non-finite or negative.
|
|
33
|
+
* @group Manoeuvres
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { oberthEnergyGain, circularSpeed } from "@interstellar-tools/equations";
|
|
37
|
+
*
|
|
38
|
+
* // Earth's GM (μ) in m^3/s^2
|
|
39
|
+
* const muEarth = 3.986004418e14;
|
|
40
|
+
*
|
|
41
|
+
* // Example: small prograde burn at LEO periapsis (~400 km altitude)
|
|
42
|
+
* const rLEO = 6378e3 + 400e3; // m
|
|
43
|
+
* const vLEO = circularSpeed(rLEO, muEarth); // m/s ≈ 7670
|
|
44
|
+
*
|
|
45
|
+
* // Suppose guidance commands a small impulsive burn Δv = 50 m/s at periapsis
|
|
46
|
+
* const dv = 50; // m/s
|
|
47
|
+
*
|
|
48
|
+
* // Oberth approximation: Δε ≈ v · Δv (specific energy gain, J/kg ≡ m^2/s^2)
|
|
49
|
+
* const deltaEps = oberthEnergyGain(vLEO, dv);
|
|
50
|
+
*
|
|
51
|
+
* // For intuition, translate Δε to an approximate change in semi-major axis (elliptic case):
|
|
52
|
+
* // ε = -μ/(2a) ⇒ Δa ≈ (a^2 / μ) · Δε (valid for small changes around circular LEO)
|
|
53
|
+
* const aLEO = rLEO; // circular → a = r
|
|
54
|
+
* const deltaA = (aLEO * aLEO / muEarth) * deltaEps; // meters
|
|
55
|
+
*
|
|
56
|
+
* console.log(`LEO speed v ≈ ${vLEO.toFixed(1)} m/s`);
|
|
57
|
+
* console.log(`Prograde Δv = ${dv.toFixed(1)} m/s`);
|
|
58
|
+
* console.log(`Specific energy gain Δε ≈ ${deltaEps.toFixed(0)} J/kg`);
|
|
59
|
+
* console.log(`Approx. semi-major axis change Δa ≈ ${deltaA.toFixed(0)} m`);
|
|
60
|
+
*
|
|
61
|
+
* // Tip: If the burn is not perfectly prograde by angle φ (in radians),
|
|
62
|
+
* // scale by cos φ: Δε ≈ v · Δv · cos φ (small-angle approximation).
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export const oberthEnergyGain = (v, dv) => {
|
|
66
|
+
if (typeof v !== 'number' || typeof dv !== 'number') {
|
|
67
|
+
throw new TypeError('v and dv must be numbers (m/s).');
|
|
68
|
+
}
|
|
69
|
+
if (!Number.isFinite(v) || v < 0) {
|
|
70
|
+
throw new RangeError('v must be finite and ≥ 0 (m/s).');
|
|
71
|
+
}
|
|
72
|
+
if (!Number.isFinite(dv) || dv < 0) {
|
|
73
|
+
throw new RangeError('dv must be finite and ≥ 0 (m/s).');
|
|
74
|
+
}
|
|
75
|
+
// Δε ≈ v · Δv (prograde, small-Δv approximation)
|
|
76
|
+
return v * dv;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=oberth-energy-gain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oberth-energy-gain.js","sourceRoot":"","sources":["../../../src/categories/manoeuvres/oberth-energy-gain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAE,EAAU,EAAU,EAAE;IAChE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IAED,kDAAkD;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Radians } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* **Inclination (plane) change** Δv at speed ($ v $).
|
|
4
|
+
*
|
|
5
|
+
* **Definition**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \Delta v = 2\,v\,\sin\!\left(\frac{\Delta i}{2}\right)
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* **Units**
|
|
12
|
+
* - Inputs: ($ v $) in **m/s**, ($ \Delta i $) in **radians**.
|
|
13
|
+
* - Output: ($ \Delta v $) in **m/s**.
|
|
14
|
+
*
|
|
15
|
+
* ::: info Notes
|
|
16
|
+
*
|
|
17
|
+
* - Valid for an **instantaneous** plane change (impulsive) performed at speed ($ v $)
|
|
18
|
+
* (e.g., at a node). For best efficiency, perform at **apogee** (lowest speed) when possible.
|
|
19
|
+
* - Domain for ($ \Delta i $) is ( $[0,\pi] $) (0–180°). Larger angles can be reduced modulo ($ 2\pi $).
|
|
20
|
+
*
|
|
21
|
+
* :::
|
|
22
|
+
*
|
|
23
|
+
* @param {number} v Current speed magnitude (m/s). Must be finite and ≥ 0.
|
|
24
|
+
* @param {Radians} deltaI Inclination change angle Δi (radians). Must be finite and 0 ≤ Δi ≤ π.
|
|
25
|
+
* @returns {number} Required impulsive Δv (m/s).
|
|
26
|
+
* @throws {TypeError} If `v` is not a number or `deltaI` not a number (radians).
|
|
27
|
+
* @throws {RangeError} If `v` is non-finite or < 0; if `deltaI` is non-finite or outside [0, π].
|
|
28
|
+
* @group Manoeuvres
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { planeChangeDeltaV, circularSpeed } from "@interstellar-tools/equations";
|
|
32
|
+
* import type { Radians } from "@interstellar-tools/types";
|
|
33
|
+
*
|
|
34
|
+
* // Helper: degrees → radians (branded)
|
|
35
|
+
* const toRadians = (deg: number): Radians => ((deg * Math.PI) / 180) as Radians;
|
|
36
|
+
*
|
|
37
|
+
* // Earth’s GM (μ) in m^3/s^2
|
|
38
|
+
* const muEarth = 3.986004418e14;
|
|
39
|
+
*
|
|
40
|
+
* // Example: instantaneous plane change at LEO (~400 km altitude)
|
|
41
|
+
* const rLEO = 6378e3 + 400e3; // meters
|
|
42
|
+
* const vLEO = circularSpeed(rLEO, muEarth); // m/s
|
|
43
|
+
*
|
|
44
|
+
* // Change from 28.5° (Kennedy inclination) to equatorial (0°) → Δi = 28.5°
|
|
45
|
+
* const deltaI = toRadians(28.5);
|
|
46
|
+
* const dv_LEO = planeChangeDeltaV(vLEO, deltaI);
|
|
47
|
+
*
|
|
48
|
+
* console.log(`LEO speed: ${vLEO.toFixed(1)} m/s`);
|
|
49
|
+
* console.log(`Δi: 28.5° → Δv ≈ ${dv_LEO.toFixed(1)} m/s`);
|
|
50
|
+
*
|
|
51
|
+
* // Another quick check: a modest 10° plane change at the same altitude
|
|
52
|
+
* const dv_10deg = planeChangeDeltaV(vLEO, toRadians(10));
|
|
53
|
+
* console.log(`Δi: 10° → Δv ≈ ${dv_10deg.toFixed(1)} m/s`);
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare const planeChangeDeltaV: (v: number, deltaI: Radians) => number;
|
|
57
|
+
//# sourceMappingURL=plane-change-delta-v.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plane-change-delta-v.d.ts","sourceRoot":"","sources":["../../../src/categories/manoeuvres/plane-change-delta-v.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,EAAE,QAAQ,OAAO,KAAG,MAiB9D,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Inclination (plane) change** Δv at speed ($ v $).
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* \Delta v = 2\,v\,\sin\!\left(\frac{\Delta i}{2}\right)
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* **Units**
|
|
11
|
+
* - Inputs: ($ v $) in **m/s**, ($ \Delta i $) in **radians**.
|
|
12
|
+
* - Output: ($ \Delta v $) in **m/s**.
|
|
13
|
+
*
|
|
14
|
+
* ::: info Notes
|
|
15
|
+
*
|
|
16
|
+
* - Valid for an **instantaneous** plane change (impulsive) performed at speed ($ v $)
|
|
17
|
+
* (e.g., at a node). For best efficiency, perform at **apogee** (lowest speed) when possible.
|
|
18
|
+
* - Domain for ($ \Delta i $) is ( $[0,\pi] $) (0–180°). Larger angles can be reduced modulo ($ 2\pi $).
|
|
19
|
+
*
|
|
20
|
+
* :::
|
|
21
|
+
*
|
|
22
|
+
* @param {number} v Current speed magnitude (m/s). Must be finite and ≥ 0.
|
|
23
|
+
* @param {Radians} deltaI Inclination change angle Δi (radians). Must be finite and 0 ≤ Δi ≤ π.
|
|
24
|
+
* @returns {number} Required impulsive Δv (m/s).
|
|
25
|
+
* @throws {TypeError} If `v` is not a number or `deltaI` not a number (radians).
|
|
26
|
+
* @throws {RangeError} If `v` is non-finite or < 0; if `deltaI` is non-finite or outside [0, π].
|
|
27
|
+
* @group Manoeuvres
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { planeChangeDeltaV, circularSpeed } from "@interstellar-tools/equations";
|
|
31
|
+
* import type { Radians } from "@interstellar-tools/types";
|
|
32
|
+
*
|
|
33
|
+
* // Helper: degrees → radians (branded)
|
|
34
|
+
* const toRadians = (deg: number): Radians => ((deg * Math.PI) / 180) as Radians;
|
|
35
|
+
*
|
|
36
|
+
* // Earth’s GM (μ) in m^3/s^2
|
|
37
|
+
* const muEarth = 3.986004418e14;
|
|
38
|
+
*
|
|
39
|
+
* // Example: instantaneous plane change at LEO (~400 km altitude)
|
|
40
|
+
* const rLEO = 6378e3 + 400e3; // meters
|
|
41
|
+
* const vLEO = circularSpeed(rLEO, muEarth); // m/s
|
|
42
|
+
*
|
|
43
|
+
* // Change from 28.5° (Kennedy inclination) to equatorial (0°) → Δi = 28.5°
|
|
44
|
+
* const deltaI = toRadians(28.5);
|
|
45
|
+
* const dv_LEO = planeChangeDeltaV(vLEO, deltaI);
|
|
46
|
+
*
|
|
47
|
+
* console.log(`LEO speed: ${vLEO.toFixed(1)} m/s`);
|
|
48
|
+
* console.log(`Δi: 28.5° → Δv ≈ ${dv_LEO.toFixed(1)} m/s`);
|
|
49
|
+
*
|
|
50
|
+
* // Another quick check: a modest 10° plane change at the same altitude
|
|
51
|
+
* const dv_10deg = planeChangeDeltaV(vLEO, toRadians(10));
|
|
52
|
+
* console.log(`Δi: 10° → Δv ≈ ${dv_10deg.toFixed(1)} m/s`);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export const planeChangeDeltaV = (v, deltaI) => {
|
|
56
|
+
if (typeof v !== 'number')
|
|
57
|
+
throw new TypeError('v must be a number (m/s).');
|
|
58
|
+
if (!Number.isFinite(v) || v < 0)
|
|
59
|
+
throw new RangeError('v must be finite and ≥ 0 (m/s).');
|
|
60
|
+
if (typeof deltaI !== 'number')
|
|
61
|
+
throw new TypeError('deltaI must be a number (radians).');
|
|
62
|
+
if (!Number.isFinite(deltaI))
|
|
63
|
+
throw new RangeError('deltaI must be finite (radians).');
|
|
64
|
+
if (deltaI < 0 || deltaI > Math.PI)
|
|
65
|
+
throw new RangeError('deltaI must be in [0, π] radians.');
|
|
66
|
+
// Δv = 2 v sin(Δi / 2)
|
|
67
|
+
return 2 * v * Math.sin(deltaI / 2);
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=plane-change-delta-v.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plane-change-delta-v.js","sourceRoot":"","sources":["../../../src/categories/manoeuvres/plane-change-delta-v.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,MAAe,EAAU,EAAE;IACtE,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAE5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAE1D,IAAI,OAAO,MAAM,KAAK,QAAQ;QAC5B,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAE5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAE3D,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE;QAChC,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAE5D,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAE,MAAiB,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,24 +5,27 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export * from './categories/angle/compute-angle';
|
|
7
7
|
export * from './categories/angle/wrap-angle';
|
|
8
|
-
export * from './categories/anomalies/mean-to-eccentric-anomaly';
|
|
9
8
|
export * from './categories/anomalies/eccentric-to-true-anomaly';
|
|
9
|
+
export * from './categories/anomalies/mean-to-eccentric-anomaly';
|
|
10
10
|
export * from './categories/anomalies/true-to-mean-anomaly';
|
|
11
|
-
export * from './categories/kepler/solve-kepler';
|
|
12
|
-
export * from './categories/kepler/solve-kepler-newton-raphson';
|
|
13
11
|
export * from './categories/kepler/solve-kepler-bisection';
|
|
14
12
|
export * from './categories/kepler/solve-kepler-high-eccentricity';
|
|
15
|
-
export * from './categories/
|
|
16
|
-
export * from './categories/
|
|
17
|
-
export * from './categories/gravity/force-on1-by2';
|
|
13
|
+
export * from './categories/kepler/solve-kepler-newton-raphson';
|
|
14
|
+
export * from './categories/kepler/solve-kepler';
|
|
18
15
|
export * from './categories/gravity/acceleration-on1-by2';
|
|
19
|
-
export * from './categories/
|
|
16
|
+
export * from './categories/gravity/force-on1-by2';
|
|
17
|
+
export * from './categories/gravity/gravitational-force';
|
|
18
|
+
export * from './categories/gravity/gravitational-parameter';
|
|
20
19
|
export * from './categories/orbits/circular-speed';
|
|
21
20
|
export * from './categories/orbits/escape-speed';
|
|
21
|
+
export * from './categories/orbits/flight-path-angle-from-true-anomaly';
|
|
22
22
|
export * from './categories/orbits/kepler-period';
|
|
23
|
-
export * from './categories/orbits/specific-angular-momentum';
|
|
24
23
|
export * from './categories/orbits/specific-angular-momentum-from-elements';
|
|
24
|
+
export * from './categories/orbits/specific-angular-momentum';
|
|
25
25
|
export * from './categories/orbits/specific-mechanical-energy';
|
|
26
|
-
export * from './categories/orbits/
|
|
26
|
+
export * from './categories/orbits/vis-viva-speed';
|
|
27
|
+
export * from './categories/manoeuvres/combine-burns-delta-v';
|
|
27
28
|
export * from './categories/manoeuvres/hohmann-transfer';
|
|
29
|
+
export * from './categories/manoeuvres/oberth-energy-gain';
|
|
30
|
+
export * from './categories/manoeuvres/plane-change-delta-v';
|
|
28
31
|
//# 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;
|
|
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;AAI9C,cAAc,kDAAkD,CAAC;AAEjE,cAAc,kDAAkD,CAAC;AAEjE,cAAc,6CAA6C,CAAC;AAI5D,cAAc,4CAA4C,CAAC;AAE3D,cAAc,oDAAoD,CAAC;AAEnE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,kCAAkC,CAAC;AAIjD,cAAc,2CAA2C,CAAC;AAE1D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,0CAA0C,CAAC;AAEzD,cAAc,8CAA8C,CAAC;AAI7D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yDAAyD,CAAC;AAExE,cAAc,mCAAmC,CAAC;AAElD,cAAc,6DAA6D,CAAC;AAE5E,cAAc,+CAA+C,CAAC;AAE9D,cAAc,gDAAgD,CAAC;AAE/D,cAAc,oCAAoC,CAAC;AAInD,cAAc,+CAA+C,CAAC;AAE9D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,8CAA8C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,28 +7,31 @@
|
|
|
7
7
|
export * from './categories/angle/compute-angle';
|
|
8
8
|
export * from './categories/angle/wrap-angle';
|
|
9
9
|
// categories/anomalies
|
|
10
|
-
export * from './categories/anomalies/mean-to-eccentric-anomaly';
|
|
11
10
|
export * from './categories/anomalies/eccentric-to-true-anomaly';
|
|
11
|
+
export * from './categories/anomalies/mean-to-eccentric-anomaly';
|
|
12
12
|
export * from './categories/anomalies/true-to-mean-anomaly';
|
|
13
13
|
// categories/kepler (solvers)
|
|
14
|
-
export * from './categories/kepler/solve-kepler';
|
|
15
|
-
export * from './categories/kepler/solve-kepler-newton-raphson';
|
|
16
14
|
export * from './categories/kepler/solve-kepler-bisection';
|
|
17
15
|
export * from './categories/kepler/solve-kepler-high-eccentricity';
|
|
16
|
+
export * from './categories/kepler/solve-kepler-newton-raphson';
|
|
17
|
+
export * from './categories/kepler/solve-kepler';
|
|
18
18
|
// categories/gravity
|
|
19
|
-
export * from './categories/gravity/gravitational-parameter';
|
|
20
|
-
export * from './categories/gravity/gravitational-force';
|
|
21
|
-
export * from './categories/gravity/force-on1-by2';
|
|
22
19
|
export * from './categories/gravity/acceleration-on1-by2';
|
|
20
|
+
export * from './categories/gravity/force-on1-by2';
|
|
21
|
+
export * from './categories/gravity/gravitational-force';
|
|
22
|
+
export * from './categories/gravity/gravitational-parameter';
|
|
23
23
|
// categories/orbits
|
|
24
|
-
export * from './categories/orbits/vis-viva-speed';
|
|
25
24
|
export * from './categories/orbits/circular-speed';
|
|
26
25
|
export * from './categories/orbits/escape-speed';
|
|
26
|
+
export * from './categories/orbits/flight-path-angle-from-true-anomaly';
|
|
27
27
|
export * from './categories/orbits/kepler-period';
|
|
28
|
-
export * from './categories/orbits/specific-angular-momentum';
|
|
29
28
|
export * from './categories/orbits/specific-angular-momentum-from-elements';
|
|
29
|
+
export * from './categories/orbits/specific-angular-momentum';
|
|
30
30
|
export * from './categories/orbits/specific-mechanical-energy';
|
|
31
|
-
export * from './categories/orbits/
|
|
31
|
+
export * from './categories/orbits/vis-viva-speed';
|
|
32
32
|
// categories/manoeuvres
|
|
33
|
+
export * from './categories/manoeuvres/combine-burns-delta-v';
|
|
33
34
|
export * from './categories/manoeuvres/hohmann-transfer';
|
|
35
|
+
export * from './categories/manoeuvres/oberth-energy-gain';
|
|
36
|
+
export * from './categories/manoeuvres/plane-change-delta-v';
|
|
34
37
|
//# 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;
|
|
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;AAEvB,cAAc,kDAAkD,CAAC;AAEjE,cAAc,kDAAkD,CAAC;AAEjE,cAAc,6CAA6C,CAAC;AAE5D,8BAA8B;AAE9B,cAAc,4CAA4C,CAAC;AAE3D,cAAc,oDAAoD,CAAC;AAEnE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,kCAAkC,CAAC;AAEjD,qBAAqB;AAErB,cAAc,2CAA2C,CAAC;AAE1D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,0CAA0C,CAAC;AAEzD,cAAc,8CAA8C,CAAC;AAE7D,oBAAoB;AAEpB,cAAc,oCAAoC,CAAC;AAEnD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yDAAyD,CAAC;AAExE,cAAc,mCAAmC,CAAC;AAElD,cAAc,6DAA6D,CAAC;AAE5E,cAAc,+CAA+C,CAAC;AAE9D,cAAc,gDAAgD,CAAC;AAE/D,cAAc,oCAAoC,CAAC;AAEnD,wBAAwB;AAExB,cAAc,+CAA+C,CAAC;AAE9D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,8CAA8C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interstellar-tools/equations",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.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",
|