@interstellar-tools/equations 0.1.2 → 0.3.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__/circular-speed.spec.d.ts +2 -0
- package/dist/__tests__/circular-speed.spec.d.ts.map +1 -0
- package/dist/__tests__/circular-speed.spec.js +69 -0
- package/dist/__tests__/circular-speed.spec.js.map +1 -0
- package/dist/__tests__/compute-angle.int.spec.js +2 -2
- package/dist/__tests__/compute-angle.int.spec.js.map +1 -1
- package/dist/__tests__/eccentric-to-true-anomaly.spec.js +1 -1
- package/dist/__tests__/eccentric-to-true-anomaly.spec.js.map +1 -1
- package/dist/__tests__/escape-speed.spec.d.ts +2 -0
- package/dist/__tests__/escape-speed.spec.d.ts.map +1 -0
- package/dist/__tests__/escape-speed.spec.js +79 -0
- package/dist/__tests__/escape-speed.spec.js.map +1 -0
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts +2 -0
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +1 -0
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js +86 -0
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +1 -0
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.d.ts +2 -0
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +1 -0
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.js +106 -0
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.js.map +1 -0
- package/dist/__tests__/gravitational-force.spec.d.ts +2 -0
- package/dist/__tests__/gravitational-force.spec.d.ts.map +1 -0
- package/dist/__tests__/gravitational-force.spec.js +105 -0
- package/dist/__tests__/gravitational-force.spec.js.map +1 -0
- package/dist/__tests__/gravitational-parameters.spec.d.ts +2 -0
- package/dist/__tests__/gravitational-parameters.spec.d.ts.map +1 -0
- package/dist/__tests__/gravitational-parameters.spec.js +75 -0
- package/dist/__tests__/gravitational-parameters.spec.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +9 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -0
- package/dist/__tests__/helpers/index.js +31 -0
- package/dist/__tests__/helpers/index.js.map +1 -0
- package/dist/__tests__/kepler-period.spec.d.ts +2 -0
- package/dist/__tests__/kepler-period.spec.d.ts.map +1 -0
- package/dist/__tests__/kepler-period.spec.js +72 -0
- package/dist/__tests__/kepler-period.spec.js.map +1 -0
- package/dist/__tests__/mean-to-eccentric-anomaly.spec.d.ts +2 -0
- package/dist/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +1 -0
- package/dist/__tests__/{compute-mean-anomaly.int.spec.js → mean-to-eccentric-anomaly.spec.js} +49 -27
- package/dist/__tests__/mean-to-eccentric-anomaly.spec.js.map +1 -0
- package/dist/__tests__/peri-apoapsis-radii.spec.d.ts +2 -0
- package/dist/__tests__/peri-apoapsis-radii.spec.d.ts.map +1 -0
- package/dist/__tests__/peri-apoapsis-radii.spec.js +74 -0
- package/dist/__tests__/peri-apoapsis-radii.spec.js.map +1 -0
- package/dist/__tests__/solve-kepler-bisection.spec.js +1 -1
- package/dist/__tests__/solve-kepler-bisection.spec.js.map +1 -1
- package/dist/__tests__/solve-kepler-high-eccentricity.spec.js +1 -1
- package/dist/__tests__/solve-kepler-high-eccentricity.spec.js.map +1 -1
- package/dist/__tests__/solve-kepler-newton-raphson.spec.js +1 -1
- package/dist/__tests__/solve-kepler-newton-raphson.spec.js.map +1 -1
- package/dist/__tests__/solve-kepler.int.spec.js +1 -1
- package/dist/__tests__/solve-kepler.int.spec.js.map +1 -1
- package/dist/__tests__/specific-angular-momentum-from-elements.spec.d.ts +2 -0
- package/dist/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +1 -0
- package/dist/__tests__/specific-angular-momentum-from-elements.spec.js +86 -0
- package/dist/__tests__/specific-angular-momentum-from-elements.spec.js.map +1 -0
- package/dist/__tests__/specific-angular-momentum.spec.d.ts +2 -0
- package/dist/__tests__/specific-angular-momentum.spec.d.ts.map +1 -0
- package/dist/__tests__/specific-angular-momentum.spec.js +84 -0
- package/dist/__tests__/specific-angular-momentum.spec.js.map +1 -0
- package/dist/__tests__/specific-mechanical-energy.spec.d.ts +2 -0
- package/dist/__tests__/specific-mechanical-energy.spec.d.ts.map +1 -0
- package/dist/__tests__/specific-mechanical-energy.spec.js +81 -0
- package/dist/__tests__/specific-mechanical-energy.spec.js.map +1 -0
- package/dist/__tests__/true-to-mean-anomaly.spec.d.ts +2 -0
- package/dist/__tests__/true-to-mean-anomaly.spec.d.ts.map +1 -0
- package/dist/__tests__/{true-anomaly-to-mean-anomaly.int.spec.js → true-to-mean-anomaly.spec.js} +13 -13
- package/dist/__tests__/true-to-mean-anomaly.spec.js.map +1 -0
- package/dist/__tests__/vis-viva-speed.spec.d.ts +2 -0
- package/dist/__tests__/vis-viva-speed.spec.d.ts.map +1 -0
- package/dist/__tests__/vis-viva-speed.spec.js +80 -0
- package/dist/__tests__/vis-viva-speed.spec.js.map +1 -0
- package/dist/__tests__/wrap-angle.spec.js +1 -1
- package/dist/__tests__/wrap-angle.spec.js.map +1 -1
- package/dist/{compute-angle.d.ts → categories/angle/compute-angle.d.ts} +1 -1
- package/dist/categories/angle/compute-angle.d.ts.map +1 -0
- package/dist/{compute-angle.js → categories/angle/compute-angle.js} +5 -5
- package/dist/categories/angle/compute-angle.js.map +1 -0
- package/dist/{wrap-angle.d.ts → categories/angle/wrap-angle.d.ts} +1 -1
- package/dist/categories/angle/wrap-angle.d.ts.map +1 -0
- package/dist/{wrap-angle.js → categories/angle/wrap-angle.js} +1 -1
- package/dist/categories/angle/wrap-angle.js.map +1 -0
- package/dist/{eccentric-to-true-anomaly.d.ts → categories/anomalies/eccentric-to-true-anomaly.d.ts} +2 -2
- package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts.map +1 -0
- package/dist/{eccentric-to-true-anomaly.js → categories/anomalies/eccentric-to-true-anomaly.js} +2 -2
- package/dist/categories/anomalies/eccentric-to-true-anomaly.js.map +1 -0
- package/dist/{compute-mean-anomaly.d.ts → categories/anomalies/mean-to-eccentric-anomaly.d.ts} +6 -6
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.d.ts.map +1 -0
- package/dist/{compute-mean-anomaly.js → categories/anomalies/mean-to-eccentric-anomaly.js} +12 -21
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.js.map +1 -0
- package/dist/{true-anomaly-to-mean-anomaly.d.ts → categories/anomalies/true-to-mean-anomaly.d.ts} +6 -6
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts.map +1 -0
- package/dist/{true-anomaly-to-mean-anomaly.js → categories/anomalies/true-to-mean-anomaly.js} +7 -7
- package/dist/categories/anomalies/true-to-mean-anomaly.js.map +1 -0
- package/dist/categories/anomalies/utils/are-equal.d.ts +10 -0
- package/dist/categories/anomalies/utils/are-equal.d.ts.map +1 -0
- package/dist/categories/anomalies/utils/are-equal.js +13 -0
- package/dist/categories/anomalies/utils/are-equal.js.map +1 -0
- package/dist/categories/gravity/acceleration-on1-by2.d.ts +66 -0
- package/dist/categories/gravity/acceleration-on1-by2.d.ts.map +1 -0
- package/dist/categories/gravity/acceleration-on1-by2.js +75 -0
- package/dist/categories/gravity/acceleration-on1-by2.js.map +1 -0
- package/dist/categories/gravity/force-on1-by2.d.ts +87 -0
- package/dist/categories/gravity/force-on1-by2.d.ts.map +1 -0
- package/dist/categories/gravity/force-on1-by2.js +96 -0
- package/dist/categories/gravity/force-on1-by2.js.map +1 -0
- package/dist/categories/gravity/gravitational-force.d.ts +94 -0
- package/dist/categories/gravity/gravitational-force.d.ts.map +1 -0
- package/dist/categories/gravity/gravitational-force.js +119 -0
- package/dist/categories/gravity/gravitational-force.js.map +1 -0
- package/dist/categories/gravity/gravitational-parameter.d.ts +49 -0
- package/dist/categories/gravity/gravitational-parameter.d.ts.map +1 -0
- package/dist/categories/gravity/gravitational-parameter.js +61 -0
- package/dist/categories/gravity/gravitational-parameter.js.map +1 -0
- package/dist/{solve-kepler-bisection.d.ts → categories/kepler/solve-kepler-bisection.d.ts} +1 -1
- package/dist/categories/kepler/solve-kepler-bisection.d.ts.map +1 -0
- package/dist/{solve-kepler-bisection.js → categories/kepler/solve-kepler-bisection.js} +1 -1
- package/dist/categories/kepler/solve-kepler-bisection.js.map +1 -0
- package/dist/{solve-kepler-high-eccentricity.d.ts → categories/kepler/solve-kepler-high-eccentricity.d.ts} +2 -8
- package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts.map +1 -0
- package/dist/{solve-kepler-high-eccentricity.js → categories/kepler/solve-kepler-high-eccentricity.js} +5 -9
- package/dist/categories/kepler/solve-kepler-high-eccentricity.js.map +1 -0
- package/dist/{solve-kepler-newton-raphson.d.ts → categories/kepler/solve-kepler-newton-raphson.d.ts} +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts.map +1 -0
- package/dist/{solve-kepler-newton-raphson.js → categories/kepler/solve-kepler-newton-raphson.js} +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.js.map +1 -0
- package/dist/{solve-kepler.d.ts → categories/kepler/solve-kepler.d.ts} +1 -1
- package/dist/categories/kepler/solve-kepler.d.ts.map +1 -0
- package/dist/{solve-kepler.js → categories/kepler/solve-kepler.js} +2 -2
- package/dist/categories/kepler/solve-kepler.js.map +1 -0
- package/dist/categories/orbits/circular-speed.d.ts +42 -0
- package/dist/categories/orbits/circular-speed.d.ts.map +1 -0
- package/dist/categories/orbits/circular-speed.js +50 -0
- package/dist/categories/orbits/circular-speed.js.map +1 -0
- package/dist/categories/orbits/escape-speed.d.ts +50 -0
- package/dist/categories/orbits/escape-speed.d.ts.map +1 -0
- package/dist/categories/orbits/escape-speed.js +58 -0
- package/dist/categories/orbits/escape-speed.js.map +1 -0
- package/dist/categories/orbits/kepler-period.d.ts +45 -0
- package/dist/categories/orbits/kepler-period.d.ts.map +1 -0
- package/dist/categories/orbits/kepler-period.js +54 -0
- package/dist/categories/orbits/kepler-period.js.map +1 -0
- package/dist/categories/orbits/peri-apoapsis-radii.d.ts +46 -0
- package/dist/categories/orbits/peri-apoapsis-radii.d.ts.map +1 -0
- package/dist/categories/orbits/peri-apoapsis-radii.js +85 -0
- package/dist/categories/orbits/peri-apoapsis-radii.js.map +1 -0
- package/dist/categories/orbits/specific-angular-momentum-from-elements.d.ts +60 -0
- package/dist/categories/orbits/specific-angular-momentum-from-elements.d.ts.map +1 -0
- package/dist/categories/orbits/specific-angular-momentum-from-elements.js +76 -0
- package/dist/categories/orbits/specific-angular-momentum-from-elements.js.map +1 -0
- package/dist/categories/orbits/specific-angular-momentum.d.ts +55 -0
- package/dist/categories/orbits/specific-angular-momentum.d.ts.map +1 -0
- package/dist/categories/orbits/specific-angular-momentum.js +76 -0
- package/dist/categories/orbits/specific-angular-momentum.js.map +1 -0
- package/dist/categories/orbits/specific-mechanical-energy.d.ts +49 -0
- package/dist/categories/orbits/specific-mechanical-energy.d.ts.map +1 -0
- package/dist/categories/orbits/specific-mechanical-energy.js +57 -0
- package/dist/categories/orbits/specific-mechanical-energy.js.map +1 -0
- package/dist/categories/orbits/vis-viva-speed.d.ts +42 -0
- package/dist/categories/orbits/vis-viva-speed.d.ts.map +1 -0
- package/dist/categories/orbits/vis-viva-speed.js +70 -0
- package/dist/categories/orbits/vis-viva-speed.js.map +1 -0
- package/dist/index.d.ts +20 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -10
- package/dist/index.js.map +1 -1
- package/package.json +77 -5
- package/dist/__tests__/compute-mean-anomaly.int.spec.d.ts +0 -2
- package/dist/__tests__/compute-mean-anomaly.int.spec.d.ts.map +0 -1
- package/dist/__tests__/compute-mean-anomaly.int.spec.js.map +0 -1
- package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.d.ts +0 -2
- package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.d.ts.map +0 -1
- package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.js.map +0 -1
- package/dist/compute-angle.d.ts.map +0 -1
- package/dist/compute-angle.js.map +0 -1
- package/dist/compute-mean-anomaly.d.ts.map +0 -1
- package/dist/compute-mean-anomaly.js.map +0 -1
- package/dist/eccentric-to-true-anomaly.d.ts.map +0 -1
- package/dist/eccentric-to-true-anomaly.js.map +0 -1
- package/dist/solve-kepler-bisection.d.ts.map +0 -1
- package/dist/solve-kepler-bisection.js.map +0 -1
- package/dist/solve-kepler-high-eccentricity.d.ts.map +0 -1
- package/dist/solve-kepler-high-eccentricity.js.map +0 -1
- package/dist/solve-kepler-newton-raphson.d.ts.map +0 -1
- package/dist/solve-kepler-newton-raphson.js.map +0 -1
- package/dist/solve-kepler.d.ts.map +0 -1
- package/dist/solve-kepler.js.map +0 -1
- package/dist/true-anomaly-to-mean-anomaly.d.ts.map +0 -1
- package/dist/true-anomaly-to-mean-anomaly.js.map +0 -1
- package/dist/wrap-angle.d.ts.map +0 -1
- package/dist/wrap-angle.js.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Escape speed** ($ v_{\text{esc}} $) - minimum speed to escape a central body's gravity from radius ($ r $) (ignoring drag/perturbations).
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* v_{\text{esc}}=\sqrt{\frac{2\mu}{r}}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* where ($ \mu $) is the standard gravitational parameter and ($ r $) is the distance
|
|
11
|
+
* from the central body's center.
|
|
12
|
+
*
|
|
13
|
+
* **Units**
|
|
14
|
+
* - Inputs: ($ r $) in **meters (m)**, ($ \mu $) in **m³/s²**.
|
|
15
|
+
* - Output: ($ v_{\text{esc}} $) in **m/s**.
|
|
16
|
+
*
|
|
17
|
+
* ::: info
|
|
18
|
+
*
|
|
19
|
+
* - Relationship to circular speed ($ v_c $): ($ v_{\text{esc}}=\sqrt{2}\,v_c $).
|
|
20
|
+
* - This corresponds to **parabolic** specific energy (($ \varepsilon = 0 $)).
|
|
21
|
+
* - For general (non-escape) orbital speed use `visVivaSpeed(r, a, mu)`.
|
|
22
|
+
*
|
|
23
|
+
* :::
|
|
24
|
+
*
|
|
25
|
+
* @param {number} r Radius ($ r $) (m), distance from the central body’s center (must be finite and **> 0**).
|
|
26
|
+
* @param {number} mu Gravitational parameter ($ \mu $) (m³/s²), must be finite and **≥ 0**.
|
|
27
|
+
* @returns {number} Escape speed ($ v_{\text{esc}} $) (m/s).
|
|
28
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
|
|
29
|
+
* If inputs are non-finite or out of domain.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* // Near Earth's surface (approx.)
|
|
34
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
35
|
+
* const rSurface = 6378e3; // m
|
|
36
|
+
* const vEsc = escapeSpeed(rSurface, muEarth); // ≈ 11186 m/s
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* // LEO ~400 km altitude: r = R_E + 400 km
|
|
42
|
+
* const muEarth = 3.986004418e14;
|
|
43
|
+
* const rLEO = 6378e3 + 400e3;
|
|
44
|
+
* const vEsc = escapeSpeed(rLEO, muEarth); // ≈ 10860 m/s
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @group Orbits
|
|
48
|
+
*/
|
|
49
|
+
export declare const escapeSpeed: (r: number, mu: number) => number;
|
|
50
|
+
//# sourceMappingURL=escape-speed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-speed.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/escape-speed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,KAAG,MAUnD,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Escape speed** ($ v_{\text{esc}} $) - minimum speed to escape a central body's gravity from radius ($ r $) (ignoring drag/perturbations).
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* v_{\text{esc}}=\sqrt{\frac{2\mu}{r}}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* where ($ \mu $) is the standard gravitational parameter and ($ r $) is the distance
|
|
11
|
+
* from the central body's center.
|
|
12
|
+
*
|
|
13
|
+
* **Units**
|
|
14
|
+
* - Inputs: ($ r $) in **meters (m)**, ($ \mu $) in **m³/s²**.
|
|
15
|
+
* - Output: ($ v_{\text{esc}} $) in **m/s**.
|
|
16
|
+
*
|
|
17
|
+
* ::: info
|
|
18
|
+
*
|
|
19
|
+
* - Relationship to circular speed ($ v_c $): ($ v_{\text{esc}}=\sqrt{2}\,v_c $).
|
|
20
|
+
* - This corresponds to **parabolic** specific energy (($ \varepsilon = 0 $)).
|
|
21
|
+
* - For general (non-escape) orbital speed use `visVivaSpeed(r, a, mu)`.
|
|
22
|
+
*
|
|
23
|
+
* :::
|
|
24
|
+
*
|
|
25
|
+
* @param {number} r Radius ($ r $) (m), distance from the central body’s center (must be finite and **> 0**).
|
|
26
|
+
* @param {number} mu Gravitational parameter ($ \mu $) (m³/s²), must be finite and **≥ 0**.
|
|
27
|
+
* @returns {number} Escape speed ($ v_{\text{esc}} $) (m/s).
|
|
28
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
|
|
29
|
+
* If inputs are non-finite or out of domain.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* // Near Earth's surface (approx.)
|
|
34
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
35
|
+
* const rSurface = 6378e3; // m
|
|
36
|
+
* const vEsc = escapeSpeed(rSurface, muEarth); // ≈ 11186 m/s
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* // LEO ~400 km altitude: r = R_E + 400 km
|
|
42
|
+
* const muEarth = 3.986004418e14;
|
|
43
|
+
* const rLEO = 6378e3 + 400e3;
|
|
44
|
+
* const vEsc = escapeSpeed(rLEO, muEarth); // ≈ 10860 m/s
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @group Orbits
|
|
48
|
+
*/
|
|
49
|
+
export const escapeSpeed = (r, mu) => {
|
|
50
|
+
if (!Number.isFinite(r) || r <= 0) {
|
|
51
|
+
throw new Error('r must be a finite, positive number (m).');
|
|
52
|
+
}
|
|
53
|
+
if (!Number.isFinite(mu) || mu < 0) {
|
|
54
|
+
throw new Error('mu must be a finite, non-negative number (m^3/s^2).');
|
|
55
|
+
}
|
|
56
|
+
return Math.sqrt((2 * mu) / r);
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=escape-speed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-speed.js","sourceRoot":"","sources":["../../../src/categories/orbits/escape-speed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAU,EAAU,EAAE;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Kepler's 3rd law** - orbital period ($ T $) from semi-major axis ($ a $) and gravitational parameter ($ \mu $).
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* T = 2\pi \sqrt{\frac{a^3}{\mu}}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* **Units**
|
|
11
|
+
* - Inputs: ($ a $) in **meters (m)**, ($ \mu $) in **m³/s²**.
|
|
12
|
+
* - Output: ($ T $) in **seconds (s)**.
|
|
13
|
+
*
|
|
14
|
+
* ::: info
|
|
15
|
+
*
|
|
16
|
+
* - Valid for **Keplerian (two-body) bound orbits** with ($ a>0 $) (ellipses). Not defined for parabolic/hyperbolic trajectories.
|
|
17
|
+
* - ($ \mu $) is the **standard gravitational parameter** of the central body (e.g., Earth ($ \approx 3.986004418\times10^{14}\ \text{m}^3/\text{s}^2 $)).
|
|
18
|
+
*
|
|
19
|
+
* :::
|
|
20
|
+
*
|
|
21
|
+
* @param {number} a Semi-major axis (m), must be finite and **> 0**.
|
|
22
|
+
* @param {number} mu Gravitational parameter (m³/s²), must be finite and **> 0**.
|
|
23
|
+
* @returns {number} Orbital period ($ T $) (s).
|
|
24
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If inputs are non-finite or out of domain.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // GEO: a ≈ 42,164 km → T ≈ 86,164 s (one sidereal day)
|
|
29
|
+
* const a = 42164e3; // m
|
|
30
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
31
|
+
* const T = keplerPeriod(a, muEarth); // ≈ 86164 s
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* // LEO-ish circular: a ≈ Earth radius + 400 km
|
|
37
|
+
* const a = 6378e3 + 400e3; // m
|
|
38
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
39
|
+
* const T = keplerPeriod(a, muEarth); // ≈ 5550 s (~92.5 min)
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @group Orbits
|
|
43
|
+
*/
|
|
44
|
+
export declare const keplerPeriod: (a: number, mu: number) => number;
|
|
45
|
+
//# sourceMappingURL=kepler-period.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kepler-period.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/kepler-period.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,KAAG,MAYpD,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Kepler's 3rd law** - orbital period ($ T $) from semi-major axis ($ a $) and gravitational parameter ($ \mu $).
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* T = 2\pi \sqrt{\frac{a^3}{\mu}}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* **Units**
|
|
11
|
+
* - Inputs: ($ a $) in **meters (m)**, ($ \mu $) in **m³/s²**.
|
|
12
|
+
* - Output: ($ T $) in **seconds (s)**.
|
|
13
|
+
*
|
|
14
|
+
* ::: info
|
|
15
|
+
*
|
|
16
|
+
* - Valid for **Keplerian (two-body) bound orbits** with ($ a>0 $) (ellipses). Not defined for parabolic/hyperbolic trajectories.
|
|
17
|
+
* - ($ \mu $) is the **standard gravitational parameter** of the central body (e.g., Earth ($ \approx 3.986004418\times10^{14}\ \text{m}^3/\text{s}^2 $)).
|
|
18
|
+
*
|
|
19
|
+
* :::
|
|
20
|
+
*
|
|
21
|
+
* @param {number} a Semi-major axis (m), must be finite and **> 0**.
|
|
22
|
+
* @param {number} mu Gravitational parameter (m³/s²), must be finite and **> 0**.
|
|
23
|
+
* @returns {number} Orbital period ($ T $) (s).
|
|
24
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If inputs are non-finite or out of domain.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // GEO: a ≈ 42,164 km → T ≈ 86,164 s (one sidereal day)
|
|
29
|
+
* const a = 42164e3; // m
|
|
30
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
31
|
+
* const T = keplerPeriod(a, muEarth); // ≈ 86164 s
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* // LEO-ish circular: a ≈ Earth radius + 400 km
|
|
37
|
+
* const a = 6378e3 + 400e3; // m
|
|
38
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
39
|
+
* const T = keplerPeriod(a, muEarth); // ≈ 5550 s (~92.5 min)
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @group Orbits
|
|
43
|
+
*/
|
|
44
|
+
export const keplerPeriod = (a, mu) => {
|
|
45
|
+
if (!Number.isFinite(a) || a <= 0) {
|
|
46
|
+
throw new Error('a must be a finite, positive number (meters).');
|
|
47
|
+
}
|
|
48
|
+
if (!Number.isFinite(mu) || mu <= 0) {
|
|
49
|
+
throw new Error('mu must be a finite, positive number (m^3/s^2).');
|
|
50
|
+
}
|
|
51
|
+
const a3 = a * a * a; // a^3
|
|
52
|
+
return 2 * Math.PI * Math.sqrt(a3 / mu);
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=kepler-period.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kepler-period.js","sourceRoot":"","sources":["../../../src/categories/orbits/kepler-period.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAU,EAAU,EAAE;IAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;IAE5B,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { PeriApoRadiiType } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* **Peri/apoapsis radii** from semi-major axis ($ a $) and eccentricity ($ e $).
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* r_p = a(1-e),\qquad r_a = a(1+e)
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* **Conic validity**
|
|
12
|
+
* - **Elliptic / circular**: ($ a>0,\; 0\le e<1 $) → ($ r_p>0 $) and ($ r_a>0 $).
|
|
13
|
+
* - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ r_p = a(1-e) = |a|(e-1) > 0 $), **no apoapsis** (unbounded), so ($ r_a = null $).
|
|
14
|
+
* - **Parabolic**: ($ e=1 $) is **not** defined with finite ($ a $). Use the parabolic form (e.g. ($ r_p = \tfrac{p}{2} $)) or state vectors.
|
|
15
|
+
*
|
|
16
|
+
* **Units**
|
|
17
|
+
* - Inputs: ($ a $) in **meters (m)**, ($ e $) dimensionless.
|
|
18
|
+
* - Output: ($ r_p, r_a $) in **meters (m)**.
|
|
19
|
+
*
|
|
20
|
+
* @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0**.
|
|
21
|
+
* @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
|
|
22
|
+
* @returns {{ rp: number; ra: number | null }} Object with periapsis `rp` and apoapsis `ra` (or `null` if undefined for hyperbolic).
|
|
23
|
+
*
|
|
24
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
|
|
25
|
+
* If inputs are invalid or the ($ (a,e) $) pair does not correspond to an ellipse/circle or hyperbola with finite ($ a $).
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* // Elliptic example (LEO-like)
|
|
30
|
+
* const a = 7000e3; // m
|
|
31
|
+
* const e = 0.01;
|
|
32
|
+
* const { rp, ra } = periApoapsisRadii(a, e); // rp ≈ 6930 km, ra ≈ 7070 km
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* // Hyperbolic flyby (no apoapsis)
|
|
38
|
+
* const a = -50_000e3; // m
|
|
39
|
+
* const e = 1.2;
|
|
40
|
+
* const { rp, ra } = periApoapsisRadii(a, e); // rp = |a|(e-1) = 10,000 km, ra = null
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @group Orbits
|
|
44
|
+
*/
|
|
45
|
+
export declare const periApoapsisRadii: (a: number, e: number) => PeriApoRadiiType;
|
|
46
|
+
//# sourceMappingURL=peri-apoapsis-radii.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peri-apoapsis-radii.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/peri-apoapsis-radii.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,gBAsDxD,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* node:coverage disable */
|
|
2
|
+
/**
|
|
3
|
+
* **Peri/apoapsis radii** from semi-major axis ($ a $) and eccentricity ($ e $).
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* r_p = a(1-e),\qquad r_a = a(1+e)
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* **Conic validity**
|
|
12
|
+
* - **Elliptic / circular**: ($ a>0,\; 0\le e<1 $) → ($ r_p>0 $) and ($ r_a>0 $).
|
|
13
|
+
* - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ r_p = a(1-e) = |a|(e-1) > 0 $), **no apoapsis** (unbounded), so ($ r_a = null $).
|
|
14
|
+
* - **Parabolic**: ($ e=1 $) is **not** defined with finite ($ a $). Use the parabolic form (e.g. ($ r_p = \tfrac{p}{2} $)) or state vectors.
|
|
15
|
+
*
|
|
16
|
+
* **Units**
|
|
17
|
+
* - Inputs: ($ a $) in **meters (m)**, ($ e $) dimensionless.
|
|
18
|
+
* - Output: ($ r_p, r_a $) in **meters (m)**.
|
|
19
|
+
*
|
|
20
|
+
* @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0**.
|
|
21
|
+
* @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
|
|
22
|
+
* @returns {{ rp: number; ra: number | null }} Object with periapsis `rp` and apoapsis `ra` (or `null` if undefined for hyperbolic).
|
|
23
|
+
*
|
|
24
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
|
|
25
|
+
* If inputs are invalid or the ($ (a,e) $) pair does not correspond to an ellipse/circle or hyperbola with finite ($ a $).
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* // Elliptic example (LEO-like)
|
|
30
|
+
* const a = 7000e3; // m
|
|
31
|
+
* const e = 0.01;
|
|
32
|
+
* const { rp, ra } = periApoapsisRadii(a, e); // rp ≈ 6930 km, ra ≈ 7070 km
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* // Hyperbolic flyby (no apoapsis)
|
|
38
|
+
* const a = -50_000e3; // m
|
|
39
|
+
* const e = 1.2;
|
|
40
|
+
* const { rp, ra } = periApoapsisRadii(a, e); // rp = |a|(e-1) = 10,000 km, ra = null
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @group Orbits
|
|
44
|
+
*/
|
|
45
|
+
/* node:coverage enable */
|
|
46
|
+
export const periApoapsisRadii = (a, e) => {
|
|
47
|
+
if (!Number.isFinite(a) || a === 0) {
|
|
48
|
+
throw new Error('a must be finite and non-zero (meters).');
|
|
49
|
+
}
|
|
50
|
+
if (!Number.isFinite(e) || e < 0) {
|
|
51
|
+
throw new Error('e must be finite and ≥ 0.');
|
|
52
|
+
}
|
|
53
|
+
// Elliptic / circular
|
|
54
|
+
if (a > 0) {
|
|
55
|
+
if (e >= 1) {
|
|
56
|
+
if (e === 1) {
|
|
57
|
+
throw new Error('Parabolic (e=1) is not defined with finite a. Use parabolic relations (e.g., rp = p/2) or state vectors.');
|
|
58
|
+
}
|
|
59
|
+
throw new Error('For a>0 (elliptic/circular), eccentricity must satisfy 0 ≤ e < 1.');
|
|
60
|
+
}
|
|
61
|
+
const rp = a * (1 - e);
|
|
62
|
+
const ra = a * (1 + e);
|
|
63
|
+
// Both must be positive for a valid ellipse
|
|
64
|
+
if (!(rp > 0 && ra > 0)) {
|
|
65
|
+
throw new Error('Computed radii are non-physical for the given (a,e).');
|
|
66
|
+
}
|
|
67
|
+
return { rp, ra };
|
|
68
|
+
}
|
|
69
|
+
// Hyperbolic
|
|
70
|
+
// a < 0 requires e > 1 for a valid hyperbola
|
|
71
|
+
if (e <= 1) {
|
|
72
|
+
throw new Error('For a<0 (hyperbolic), eccentricity must satisfy e > 1.');
|
|
73
|
+
}
|
|
74
|
+
const rp = a * (1 - e); // = |a|(e-1) > 0
|
|
75
|
+
if (!(rp > 0)) {
|
|
76
|
+
// tiny negatives due to FP?
|
|
77
|
+
const tol = Math.abs(1e-14 * Math.abs(a));
|
|
78
|
+
if (rp > -tol) {
|
|
79
|
+
return { rp: 0, ra: null };
|
|
80
|
+
}
|
|
81
|
+
throw new Error('Computed periapsis radius is non-physical (≤ 0).');
|
|
82
|
+
}
|
|
83
|
+
return { rp, ra: null };
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=peri-apoapsis-radii.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peri-apoapsis-radii.js","sourceRoot":"","sources":["../../../src/categories/orbits/peri-apoapsis-radii.ts"],"names":[],"mappings":"AAEA,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAoB,EAAE;IAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,0GAA0G,CAC3G,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvB,4CAA4C;QAC5C,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACpB,CAAC;IAED,aAAa;IACb,6CAA6C;IAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;IAEzC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QACd,4BAA4B;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Specific angular momentum** ($ h $) from **orbital elements**.
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* h=\sqrt{\mu\,a\,(1-e^2)}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* where ($ a $) is the semi-major axis, ($ e $) the eccentricity, and ($ \mu $) the gravitational parameter.
|
|
11
|
+
*
|
|
12
|
+
* **Validity by conic**
|
|
13
|
+
* - **Elliptic**: ($ a>0,\; 0\le e<1 $) → ($ 1-e^2>0 $) ⇒ radicand ($ >0 $).
|
|
14
|
+
* - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ 1-e^2<0 $) and ($ a<0 $) ⇒ product still ($ >0 $).
|
|
15
|
+
* - **Parabolic**: ($ e=1 $) is not represented by finite ($ a $). Use state vectors or
|
|
16
|
+
* ($ h=\sqrt{2\mu r_p} $) (with periapsis radius ($ r_p $)).
|
|
17
|
+
*
|
|
18
|
+
* **Units**
|
|
19
|
+
* - Inputs: ($ a $) in **m**, ($ e $) dimensionless, ($ \mu $) in **m³/s²**.
|
|
20
|
+
* - Output: ($ h $) in **m²/s**.
|
|
21
|
+
*
|
|
22
|
+
* ::: info
|
|
23
|
+
*
|
|
24
|
+
* - This returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $).
|
|
25
|
+
* - For numerical robustness, tiny negative radicands from FP cancellation are clamped to zero.
|
|
26
|
+
*
|
|
27
|
+
* :::
|
|
28
|
+
*
|
|
29
|
+
* @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0** (elliptic ($ a>0 $), hyperbolic ($ a<0 $)).
|
|
30
|
+
* @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
|
|
31
|
+
* @param {number} mu Gravitational parameter ($ \mu $) (m³/s²). Must be finite and **≥ 0**.
|
|
32
|
+
* @returns {number} Specific angular momentum ($ h $) (m²/s).
|
|
33
|
+
*
|
|
34
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
|
|
35
|
+
* If ($ a $) is non-finite or zero; if ($ e $) is non-finite or negative; if ($ \mu $) is non-finite or negative; or if
|
|
36
|
+
* ($ \mu\,a\,(1-e^2) < 0 $) beyond a tiny FP tolerance (invalid element set for this formula).
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* // Near-circular LEO-like elements
|
|
41
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
42
|
+
* const a = 6778e3; // m
|
|
43
|
+
* const e = 0.001;
|
|
44
|
+
* const h = specificAngularMomentumFromElements(a, e, muEarth); // ≈ sqrt(μ a)
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* // Hyperbolic flyby example
|
|
50
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
51
|
+
* const a = -50000e3; // m (negative for hyperbola)
|
|
52
|
+
* const e = 1.2;
|
|
53
|
+
* const h = specificAngularMomentumFromElements(a, e, muEarth);
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @see {@link specificAngularMomentum} - compute ($ h $) from state vectors ($ (\mathbf r,\mathbf v) $).
|
|
57
|
+
* @group Orbits
|
|
58
|
+
*/
|
|
59
|
+
export declare const specificAngularMomentumFromElements: (a: number, e: number, mu: number) => number;
|
|
60
|
+
//# sourceMappingURL=specific-angular-momentum-from-elements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specific-angular-momentum-from-elements.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum-from-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,eAAO,MAAM,mCAAmC,GAC9C,GAAG,MAAM,EACT,GAAG,MAAM,EACT,IAAI,MAAM,KACT,MAwBF,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Specific angular momentum** ($ h $) from **orbital elements**.
|
|
3
|
+
*
|
|
4
|
+
* **Definition**
|
|
5
|
+
*
|
|
6
|
+
* $$
|
|
7
|
+
* h=\sqrt{\mu\,a\,(1-e^2)}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* where ($ a $) is the semi-major axis, ($ e $) the eccentricity, and ($ \mu $) the gravitational parameter.
|
|
11
|
+
*
|
|
12
|
+
* **Validity by conic**
|
|
13
|
+
* - **Elliptic**: ($ a>0,\; 0\le e<1 $) → ($ 1-e^2>0 $) ⇒ radicand ($ >0 $).
|
|
14
|
+
* - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ 1-e^2<0 $) and ($ a<0 $) ⇒ product still ($ >0 $).
|
|
15
|
+
* - **Parabolic**: ($ e=1 $) is not represented by finite ($ a $). Use state vectors or
|
|
16
|
+
* ($ h=\sqrt{2\mu r_p} $) (with periapsis radius ($ r_p $)).
|
|
17
|
+
*
|
|
18
|
+
* **Units**
|
|
19
|
+
* - Inputs: ($ a $) in **m**, ($ e $) dimensionless, ($ \mu $) in **m³/s²**.
|
|
20
|
+
* - Output: ($ h $) in **m²/s**.
|
|
21
|
+
*
|
|
22
|
+
* ::: info
|
|
23
|
+
*
|
|
24
|
+
* - This returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $).
|
|
25
|
+
* - For numerical robustness, tiny negative radicands from FP cancellation are clamped to zero.
|
|
26
|
+
*
|
|
27
|
+
* :::
|
|
28
|
+
*
|
|
29
|
+
* @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0** (elliptic ($ a>0 $), hyperbolic ($ a<0 $)).
|
|
30
|
+
* @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
|
|
31
|
+
* @param {number} mu Gravitational parameter ($ \mu $) (m³/s²). Must be finite and **≥ 0**.
|
|
32
|
+
* @returns {number} Specific angular momentum ($ h $) (m²/s).
|
|
33
|
+
*
|
|
34
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
|
|
35
|
+
* If ($ a $) is non-finite or zero; if ($ e $) is non-finite or negative; if ($ \mu $) is non-finite or negative; or if
|
|
36
|
+
* ($ \mu\,a\,(1-e^2) < 0 $) beyond a tiny FP tolerance (invalid element set for this formula).
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* // Near-circular LEO-like elements
|
|
41
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
42
|
+
* const a = 6778e3; // m
|
|
43
|
+
* const e = 0.001;
|
|
44
|
+
* const h = specificAngularMomentumFromElements(a, e, muEarth); // ≈ sqrt(μ a)
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* // Hyperbolic flyby example
|
|
50
|
+
* const muEarth = 3.986004418e14; // m^3/s^2
|
|
51
|
+
* const a = -50000e3; // m (negative for hyperbola)
|
|
52
|
+
* const e = 1.2;
|
|
53
|
+
* const h = specificAngularMomentumFromElements(a, e, muEarth);
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @see {@link specificAngularMomentum} - compute ($ h $) from state vectors ($ (\mathbf r,\mathbf v) $).
|
|
57
|
+
* @group Orbits
|
|
58
|
+
*/
|
|
59
|
+
export const specificAngularMomentumFromElements = (a, e, mu) => {
|
|
60
|
+
if (!Number.isFinite(a) || a === 0)
|
|
61
|
+
throw new Error('a must be finite and non-zero (meters).');
|
|
62
|
+
if (!Number.isFinite(e) || e < 0)
|
|
63
|
+
throw new Error('e must be finite and ≥ 0.');
|
|
64
|
+
if (!Number.isFinite(mu) || mu < 0)
|
|
65
|
+
throw new Error('mu must be finite and ≥ 0 (m^3/s^2).');
|
|
66
|
+
const radicand = mu * a * (1 - e * e);
|
|
67
|
+
if (radicand < 0) {
|
|
68
|
+
// Allow tiny negatives due to FP cancellation
|
|
69
|
+
const tol = Math.abs(1e-14 * mu * Math.abs(a));
|
|
70
|
+
if (radicand > -tol)
|
|
71
|
+
return 0;
|
|
72
|
+
throw new Error(`Invalid (a,e) for this formula: μ·a·(1-e²) < 0 (μ=${mu}, a=${a}, e=${e}).`);
|
|
73
|
+
}
|
|
74
|
+
return Math.sqrt(radicand);
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=specific-angular-momentum-from-elements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specific-angular-momentum-from-elements.js","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum-from-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CACjD,CAAS,EACT,CAAS,EACT,EAAU,EACF,EAAE;IACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAE7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,8CAA8C;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,IAAI,QAAQ,GAAG,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QAE9B,MAAM,IAAI,KAAK,CACb,qDAAqD,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAC5E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Vector3DTupleType } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* **Specific angular momentum** ($ h $) (scalar magnitude).
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* h = \lVert \mathbf r \times \mathbf v \rVert
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* Useful identities:
|
|
12
|
+
*
|
|
13
|
+
* $$
|
|
14
|
+
* h = r\,v_{\perp},\qquad
|
|
15
|
+
* \text{(circular)}\ \ v_\perp=\sqrt{\mu/r}\Rightarrow h=\sqrt{\mu r}
|
|
16
|
+
* $$
|
|
17
|
+
*
|
|
18
|
+
* (For orbital elements, one also has ($ h=\sqrt{\mu\,a\,(1-e^2)} $), not used here.)
|
|
19
|
+
*
|
|
20
|
+
* **Units**
|
|
21
|
+
* - Inputs: ($ \mathbf r $) in **meters (m)**, ($ \mathbf v $) in **m/s**.
|
|
22
|
+
* - Output: ($ h $) in **m²/s**.
|
|
23
|
+
*
|
|
24
|
+
* ::: info
|
|
25
|
+
*
|
|
26
|
+
* - Returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $) (not the vector).
|
|
27
|
+
* - ($ h = 0 $) iff ($ \mathbf r \parallel \mathbf v $) (purely radial motion) or ($ \mathbf v=\mathbf 0 $).
|
|
28
|
+
* - In a two-body Keplerian model, ($ h $) is constant along the orbit.
|
|
29
|
+
*
|
|
30
|
+
* :::
|
|
31
|
+
*
|
|
32
|
+
* **Invariants (floating-point tolerance aside)**
|
|
33
|
+
* - ($ h \ge 0 $)
|
|
34
|
+
* - ($ \mathbf h \perp \mathbf r $) and ($ \mathbf h \perp \mathbf v $) (directional property; this function returns only ($ \lVert\mathbf h\rVert $)).
|
|
35
|
+
*
|
|
36
|
+
* @param {Vector3DTupleType} r Inertial position vector ($ \mathbf r=[x,y,z] $) (m).
|
|
37
|
+
* @param {Vector3DTupleType} v Inertial velocity vector ($ \mathbf v=[v_x,v_y,v_z] $) (m/s).
|
|
38
|
+
* @returns {number} Specific angular momentum ($ h $) (m²/s).
|
|
39
|
+
*
|
|
40
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If any component of `r`/`v` is non-finite; if `r` has zero length; or if `v` is invalid (NaN).
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* // LEO-like state: r ⟂ v
|
|
45
|
+
* const r: [number, number, number] = [6778e3, 0, 0]; // m
|
|
46
|
+
* const v: [number, number, number] = [0, 7.67e3, 0]; // m/s
|
|
47
|
+
* const h = specificAngularMomentum(r, v); // ≈ 5.20e10 m^2/s
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @see {@link https://en.wikipedia.org/wiki/Specific_angular_momentum}
|
|
51
|
+
* @see {@link specificAngularMomentumFromElements} (if you compute from ($ a,e,\mu $))
|
|
52
|
+
* @group Orbits
|
|
53
|
+
*/
|
|
54
|
+
export declare const specificAngularMomentum: (r: Vector3DTupleType, v: Vector3DTupleType) => number;
|
|
55
|
+
//# sourceMappingURL=specific-angular-momentum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specific-angular-momentum.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,eAAO,MAAM,uBAAuB,GAClC,GAAG,iBAAiB,EACpB,GAAG,iBAAiB,KACnB,MAqBF,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* node:coverage disable */
|
|
2
|
+
/**
|
|
3
|
+
* **Specific angular momentum** ($ h $) (scalar magnitude).
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* h = \lVert \mathbf r \times \mathbf v \rVert
|
|
9
|
+
* $$
|
|
10
|
+
*
|
|
11
|
+
* Useful identities:
|
|
12
|
+
*
|
|
13
|
+
* $$
|
|
14
|
+
* h = r\,v_{\perp},\qquad
|
|
15
|
+
* \text{(circular)}\ \ v_\perp=\sqrt{\mu/r}\Rightarrow h=\sqrt{\mu r}
|
|
16
|
+
* $$
|
|
17
|
+
*
|
|
18
|
+
* (For orbital elements, one also has ($ h=\sqrt{\mu\,a\,(1-e^2)} $), not used here.)
|
|
19
|
+
*
|
|
20
|
+
* **Units**
|
|
21
|
+
* - Inputs: ($ \mathbf r $) in **meters (m)**, ($ \mathbf v $) in **m/s**.
|
|
22
|
+
* - Output: ($ h $) in **m²/s**.
|
|
23
|
+
*
|
|
24
|
+
* ::: info
|
|
25
|
+
*
|
|
26
|
+
* - Returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $) (not the vector).
|
|
27
|
+
* - ($ h = 0 $) iff ($ \mathbf r \parallel \mathbf v $) (purely radial motion) or ($ \mathbf v=\mathbf 0 $).
|
|
28
|
+
* - In a two-body Keplerian model, ($ h $) is constant along the orbit.
|
|
29
|
+
*
|
|
30
|
+
* :::
|
|
31
|
+
*
|
|
32
|
+
* **Invariants (floating-point tolerance aside)**
|
|
33
|
+
* - ($ h \ge 0 $)
|
|
34
|
+
* - ($ \mathbf h \perp \mathbf r $) and ($ \mathbf h \perp \mathbf v $) (directional property; this function returns only ($ \lVert\mathbf h\rVert $)).
|
|
35
|
+
*
|
|
36
|
+
* @param {Vector3DTupleType} r Inertial position vector ($ \mathbf r=[x,y,z] $) (m).
|
|
37
|
+
* @param {Vector3DTupleType} v Inertial velocity vector ($ \mathbf v=[v_x,v_y,v_z] $) (m/s).
|
|
38
|
+
* @returns {number} Specific angular momentum ($ h $) (m²/s).
|
|
39
|
+
*
|
|
40
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If any component of `r`/`v` is non-finite; if `r` has zero length; or if `v` is invalid (NaN).
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* // LEO-like state: r ⟂ v
|
|
45
|
+
* const r: [number, number, number] = [6778e3, 0, 0]; // m
|
|
46
|
+
* const v: [number, number, number] = [0, 7.67e3, 0]; // m/s
|
|
47
|
+
* const h = specificAngularMomentum(r, v); // ≈ 5.20e10 m^2/s
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @see {@link https://en.wikipedia.org/wiki/Specific_angular_momentum}
|
|
51
|
+
* @see {@link specificAngularMomentumFromElements} (if you compute from ($ a,e,\mu $))
|
|
52
|
+
* @group Orbits
|
|
53
|
+
*/
|
|
54
|
+
/* node:coverage enable */
|
|
55
|
+
export const specificAngularMomentum = (r, v) => {
|
|
56
|
+
// Validate inputs
|
|
57
|
+
for (const x of r)
|
|
58
|
+
if (!Number.isFinite(x))
|
|
59
|
+
throw new Error('r must be finite (meters).');
|
|
60
|
+
for (const x of v)
|
|
61
|
+
if (!Number.isFinite(x))
|
|
62
|
+
throw new Error('v must be finite (m/s).');
|
|
63
|
+
const r2 = r[0] * r[0] + r[1] * r[1] + r[2] * r[2];
|
|
64
|
+
const v2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
|
|
65
|
+
if (!(r2 > 0))
|
|
66
|
+
throw new Error('r must be non-zero (meters).');
|
|
67
|
+
if (!(v2 >= 0))
|
|
68
|
+
throw new Error('v must be valid (m/s).');
|
|
69
|
+
// h⃗ = r × v
|
|
70
|
+
const hx = r[1] * v[2] - r[2] * v[1];
|
|
71
|
+
const hy = r[2] * v[0] - r[0] * v[2];
|
|
72
|
+
const hz = r[0] * v[1] - r[1] * v[0];
|
|
73
|
+
const h = Math.hypot(hx, hy, hz); // m^2/s
|
|
74
|
+
return h;
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=specific-angular-momentum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specific-angular-momentum.js","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum.ts"],"names":[],"mappings":"AAEA,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,CAAoB,EACpB,CAAoB,EACZ,EAAE;IACV,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEtE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE/D,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE1D,aAAa;IACb,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;IAE1C,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
|