@interstellar-tools/equations 0.2.0 → 0.4.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.js +16 -16
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +1 -1
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.js +20 -20
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.js.map +1 -1
- package/dist/__tests__/gravitational-force.spec.js +1 -1
- package/dist/__tests__/gravitational-force.spec.js.map +1 -1
- package/dist/__tests__/gravitational-parameters.spec.js +1 -1
- package/dist/__tests__/gravitational-parameters.spec.js.map +1 -1
- 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 +6 -0
- package/dist/__tests__/helpers/index.js.map +1 -1
- package/dist/__tests__/kepler-period.spec.js +1 -1
- package/dist/__tests__/kepler-period.spec.js.map +1 -1
- 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.js +1 -1
- package/dist/__tests__/specific-mechanical-energy.spec.js.map +1 -1
- 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.js +1 -1
- package/dist/__tests__/vis-viva-speed.spec.js.map +1 -1
- 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} +1 -1
- 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} +1 -1
- 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} +5 -5
- 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} +11 -20
- 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/{gravitational-parameter.d.ts → categories/gravity/gravitational-parameter.d.ts} +1 -1
- package/dist/categories/gravity/gravitational-parameter.d.ts.map +1 -0
- package/dist/{gravitational-parameter.js → categories/gravity/gravitational-parameter.js} +1 -1
- 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/{kepler-period.d.ts → categories/orbits/kepler-period.d.ts} +1 -1
- package/dist/categories/orbits/kepler-period.d.ts.map +1 -0
- package/dist/{kepler-period.js → categories/orbits/kepler-period.js} +1 -1
- 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/{specific-mechanical-energy.d.ts → categories/orbits/specific-mechanical-energy.d.ts} +1 -1
- package/dist/categories/orbits/specific-mechanical-energy.d.ts.map +1 -0
- package/dist/{specific-mechanical-energy.js → categories/orbits/specific-mechanical-energy.js} +1 -1
- package/dist/categories/orbits/specific-mechanical-energy.js.map +1 -0
- package/dist/{vis-viva-speed.d.ts → categories/orbits/vis-viva-speed.d.ts} +1 -1
- package/dist/categories/orbits/vis-viva-speed.d.ts.map +1 -0
- package/dist/{vis-viva-speed.js → categories/orbits/vis-viva-speed.js} +1 -1
- package/dist/categories/orbits/vis-viva-speed.js.map +1 -0
- package/dist/index.d.ts +20 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -15
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- 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/gravitational-parameter.d.ts.map +0 -1
- package/dist/gravitational-parameter.js.map +0 -1
- package/dist/kepler-period.d.ts.map +0 -1
- package/dist/kepler-period.js.map +0 -1
- package/dist/law-of-gravitation.d.ts +0 -243
- package/dist/law-of-gravitation.d.ts.map +0 -1
- package/dist/law-of-gravitation.js +0 -284
- package/dist/law-of-gravitation.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/specific-mechanical-energy.d.ts.map +0 -1
- package/dist/specific-mechanical-energy.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/vis-viva-speed.d.ts.map +0 -1
- package/dist/vis-viva-speed.js.map +0 -1
- package/dist/wrap-angle.d.ts.map +0 -1
- package/dist/wrap-angle.js.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Vector3DTupleType } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* Gravitational **acceleration** of body 1 due to body 2 (vector, m/s²).
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \mathbf r=\mathbf r_2-\mathbf r_1,\quad
|
|
9
|
+
* r=\lVert\mathbf r\rVert,\quad
|
|
10
|
+
* \hat{\mathbf r}=\frac{\mathbf r}{r}
|
|
11
|
+
* $$
|
|
12
|
+
*
|
|
13
|
+
* **Acceleration field**
|
|
14
|
+
*
|
|
15
|
+
* $$
|
|
16
|
+
* \mathbf a_{1\leftarrow2}
|
|
17
|
+
* = \frac{\mathbf F_{1\leftarrow2}}{m_1}
|
|
18
|
+
* = G\,\frac{m_2}{r^2}\,\hat{\mathbf r}
|
|
19
|
+
* $$
|
|
20
|
+
*
|
|
21
|
+
* **Units**
|
|
22
|
+
* - Inputs: masses in **kg**, positions in **m**, ($ G $) in **m³·kg⁻¹·s⁻²**.
|
|
23
|
+
* - Output: acceleration in **m/s²**.
|
|
24
|
+
*
|
|
25
|
+
* ::: info
|
|
26
|
+
*
|
|
27
|
+
* - Implemented via `gravitationalForce(1, m2, r1, r2, G)`, so the returned vector equals the force on a **1 kg** test mass (i.e., the acceleration).
|
|
28
|
+
* - Direction points **from body 1 toward body 2**: ($ \hat{\mathbf r} $).
|
|
29
|
+
*
|
|
30
|
+
* :::
|
|
31
|
+
*
|
|
32
|
+
* **Invariants (within FP tolerance)**
|
|
33
|
+
* - `||a|| = G*m2/r^2`
|
|
34
|
+
* - `a = ||a|| * r̂`
|
|
35
|
+
*
|
|
36
|
+
* @param {number} m2 Mass of body 2 (kg).
|
|
37
|
+
* @param {Vector3DTupleType} r1 Position of body 1 `[x, y, z]` in meters.
|
|
38
|
+
* @param {Vector3DTupleType} r2 Position of body 2 `[x, y, z]` in meters.
|
|
39
|
+
* @param {number} [G=G_SI] Gravitational constant.
|
|
40
|
+
* @returns {Vector3DTupleType} Acceleration of body 1 due to body 2 (m/s²).
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* // Acceleration of a satellite due to Earth at ~7000 km from Earth's center
|
|
45
|
+
* const mSat = 500; // kg (any value; a is independent of mSat)
|
|
46
|
+
* const mEarth = 5.972e24; // kg
|
|
47
|
+
* const rSat: [number, number, number] = [7.0e6, 0, 0]; // m
|
|
48
|
+
* const rEarth: [number, number, number] = [0, 0, 0];
|
|
49
|
+
*
|
|
50
|
+
* const a = accelerationOn1By2(mSat, mEarth, rSat, rEarth);
|
|
51
|
+
* // ≈ [-8.14, 0, 0] m/s² (toward Earth)
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* // Derive force from acceleration (F = m1 * a)
|
|
57
|
+
* const m1 = 1200; // kg spacecraft
|
|
58
|
+
* const a = accelerationOn1By2(m1, mEarth, rSat, rEarth);
|
|
59
|
+
* const F: [number, number, number] = [a[0]*m1, a[1]*m1, a[2]*m1]; // newtons
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @see https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
|
|
63
|
+
* @group Gravity
|
|
64
|
+
*/
|
|
65
|
+
export declare const accelerationOn1By2: (m2: number, r1: Vector3DTupleType, r2: Vector3DTupleType, G?: number) => Vector3DTupleType;
|
|
66
|
+
//# sourceMappingURL=acceleration-on1-by2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceleration-on1-by2.d.ts","sourceRoot":"","sources":["../../../src/categories/gravity/acceleration-on1-by2.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,eAAO,MAAM,kBAAkB,GAC7B,IAAI,MAAM,EACV,IAAI,iBAAiB,EACrB,IAAI,iBAAiB,EACrB,IAAG,MAAa,KACf,iBASF,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { G_SI } from '@interstellar-tools/constants';
|
|
2
|
+
import { gravitationalForce } from './gravitational-force';
|
|
3
|
+
/**
|
|
4
|
+
* Gravitational **acceleration** of body 1 due to body 2 (vector, m/s²).
|
|
5
|
+
*
|
|
6
|
+
* **Definitions**
|
|
7
|
+
*
|
|
8
|
+
* $$
|
|
9
|
+
* \mathbf r=\mathbf r_2-\mathbf r_1,\quad
|
|
10
|
+
* r=\lVert\mathbf r\rVert,\quad
|
|
11
|
+
* \hat{\mathbf r}=\frac{\mathbf r}{r}
|
|
12
|
+
* $$
|
|
13
|
+
*
|
|
14
|
+
* **Acceleration field**
|
|
15
|
+
*
|
|
16
|
+
* $$
|
|
17
|
+
* \mathbf a_{1\leftarrow2}
|
|
18
|
+
* = \frac{\mathbf F_{1\leftarrow2}}{m_1}
|
|
19
|
+
* = G\,\frac{m_2}{r^2}\,\hat{\mathbf r}
|
|
20
|
+
* $$
|
|
21
|
+
*
|
|
22
|
+
* **Units**
|
|
23
|
+
* - Inputs: masses in **kg**, positions in **m**, ($ G $) in **m³·kg⁻¹·s⁻²**.
|
|
24
|
+
* - Output: acceleration in **m/s²**.
|
|
25
|
+
*
|
|
26
|
+
* ::: info
|
|
27
|
+
*
|
|
28
|
+
* - Implemented via `gravitationalForce(1, m2, r1, r2, G)`, so the returned vector equals the force on a **1 kg** test mass (i.e., the acceleration).
|
|
29
|
+
* - Direction points **from body 1 toward body 2**: ($ \hat{\mathbf r} $).
|
|
30
|
+
*
|
|
31
|
+
* :::
|
|
32
|
+
*
|
|
33
|
+
* **Invariants (within FP tolerance)**
|
|
34
|
+
* - `||a|| = G*m2/r^2`
|
|
35
|
+
* - `a = ||a|| * r̂`
|
|
36
|
+
*
|
|
37
|
+
* @param {number} m2 Mass of body 2 (kg).
|
|
38
|
+
* @param {Vector3DTupleType} r1 Position of body 1 `[x, y, z]` in meters.
|
|
39
|
+
* @param {Vector3DTupleType} r2 Position of body 2 `[x, y, z]` in meters.
|
|
40
|
+
* @param {number} [G=G_SI] Gravitational constant.
|
|
41
|
+
* @returns {Vector3DTupleType} Acceleration of body 1 due to body 2 (m/s²).
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* // Acceleration of a satellite due to Earth at ~7000 km from Earth's center
|
|
46
|
+
* const mSat = 500; // kg (any value; a is independent of mSat)
|
|
47
|
+
* const mEarth = 5.972e24; // kg
|
|
48
|
+
* const rSat: [number, number, number] = [7.0e6, 0, 0]; // m
|
|
49
|
+
* const rEarth: [number, number, number] = [0, 0, 0];
|
|
50
|
+
*
|
|
51
|
+
* const a = accelerationOn1By2(mSat, mEarth, rSat, rEarth);
|
|
52
|
+
* // ≈ [-8.14, 0, 0] m/s² (toward Earth)
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* // Derive force from acceleration (F = m1 * a)
|
|
58
|
+
* const m1 = 1200; // kg spacecraft
|
|
59
|
+
* const a = accelerationOn1By2(m1, mEarth, rSat, rEarth);
|
|
60
|
+
* const F: [number, number, number] = [a[0]*m1, a[1]*m1, a[2]*m1]; // newtons
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @see https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
|
|
64
|
+
* @group Gravity
|
|
65
|
+
*/
|
|
66
|
+
export const accelerationOn1By2 = (m2, r1, r2, G = G_SI) => {
|
|
67
|
+
const { direction, magnitude } = gravitationalForce(1, m2, r1, r2, G); // |F| on 1 kg == |a|
|
|
68
|
+
const a = [
|
|
69
|
+
direction[0] * magnitude,
|
|
70
|
+
direction[1] * magnitude,
|
|
71
|
+
direction[2] * magnitude
|
|
72
|
+
];
|
|
73
|
+
return a;
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=acceleration-on1-by2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceleration-on1-by2.js","sourceRoot":"","sources":["../../../src/categories/gravity/acceleration-on1-by2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,EAAU,EACV,EAAqB,EACrB,EAAqB,EACrB,IAAY,IAAI,EACG,EAAE;IACrB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB;IAC5F,MAAM,CAAC,GAAsB;QAC3B,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;QACxB,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;QACxB,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;KACzB,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Vector3DTupleType } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* Gravitational **force vector** on body 1 due to body 2 (newtons, N).
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \mathbf r=\mathbf r_2-\mathbf r_1,\quad
|
|
9
|
+
* r=\lVert\mathbf r\rVert,\quad
|
|
10
|
+
* \hat{\mathbf r}=\frac{\mathbf r}{r}
|
|
11
|
+
* $$
|
|
12
|
+
*
|
|
13
|
+
* **Newton's law (vector form)**
|
|
14
|
+
*
|
|
15
|
+
* $$
|
|
16
|
+
* \mathbf F_{1\leftarrow2}
|
|
17
|
+
* = G\,\frac{m_1 m_2}{r^2}\,\hat{\mathbf r}
|
|
18
|
+
* $$
|
|
19
|
+
*
|
|
20
|
+
* **Magnitude & Components**
|
|
21
|
+
*
|
|
22
|
+
* $$
|
|
23
|
+
* \lVert\mathbf F\rVert=G\,\frac{m_1 m_2}{r^2},\qquad
|
|
24
|
+
* \mathbf F=\langle F_x,F_y,F_z\rangle=\lVert\mathbf F\rVert\,\hat{\mathbf r}
|
|
25
|
+
* $$
|
|
26
|
+
*
|
|
27
|
+
* $$
|
|
28
|
+
* F_x=\lVert\mathbf F\rVert\,\hat r_x,\quad
|
|
29
|
+
* F_y=\lVert\mathbf F\rVert\,\hat r_y,\quad
|
|
30
|
+
* F_z=\lVert\mathbf F\rVert\,\hat r_z
|
|
31
|
+
* $$
|
|
32
|
+
*
|
|
33
|
+
* **Newton's 3rd law (context)**
|
|
34
|
+
*
|
|
35
|
+
* $$
|
|
36
|
+
* \mathbf F_{1\leftarrow2}=-\,\mathbf F_{2\leftarrow1}
|
|
37
|
+
* $$
|
|
38
|
+
*
|
|
39
|
+
* **Units**
|
|
40
|
+
* - Inputs: masses in **kg**, positions in **m**, ($ G $) in **m³·kg⁻¹·s⁻²**.
|
|
41
|
+
* - Output: force vector in **newtons (N)**.
|
|
42
|
+
*
|
|
43
|
+
* ::: info
|
|
44
|
+
*
|
|
45
|
+
* - The returned vector points **from body 1 toward body 2** (i.e., along ($ \hat{\mathbf r} $)).
|
|
46
|
+
* - Internally delegates to `gravitationalForce(m1, m2, r1, r2, G)` and returns its
|
|
47
|
+
* direction-scaled magnitude as a 3-tuple.
|
|
48
|
+
* - For acceleration instead of force, use `accelerationOn1By2` or compute ($ \mathbf a=\mathbf F/m_1 $).
|
|
49
|
+
*
|
|
50
|
+
* :::
|
|
51
|
+
*
|
|
52
|
+
* **Invariants (within FP tolerance)**
|
|
53
|
+
* - `||F|| = G*m1*m2/r^2`
|
|
54
|
+
* - `F = ||F|| * r̂`
|
|
55
|
+
*
|
|
56
|
+
* @param {number} m1 Mass of body 1 (kg).
|
|
57
|
+
* @param {number} m2 Mass of body 2 (kg).
|
|
58
|
+
* @param {Vector3DTupleType} r1 Position of body 1 `[x, y, z]` in meters.
|
|
59
|
+
* @param {Vector3DTupleType} r2 Position of body 2 `[x, y, z]` in meters.
|
|
60
|
+
* @param {number} [G=G_SI] Gravitational constant.
|
|
61
|
+
* @returns {Vector3DTupleType} Force on body 1 due to body 2, in newtons `[Fx, Fy, Fz]`.
|
|
62
|
+
*
|
|
63
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} Propagated from `gravitationalForce` if inputs are invalid (non-finite/negative masses, coincident positions ($ r=0 $), or non-positive ($ G $)).
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* // Earth–Sun at ~1 AU (force on Earth due to Sun)
|
|
68
|
+
* const mEarth = 5.972e24; // kg
|
|
69
|
+
* const mSun = 1.9885e30; // kg
|
|
70
|
+
* const rEarth: [number, number, number] = [0, 0, 0];
|
|
71
|
+
* const rSun : [number, number, number] = [1.495978707e11, 0, 0]; // m
|
|
72
|
+
*
|
|
73
|
+
* const F = forceOn1By2(mEarth, mSun, rEarth, rSun); // N
|
|
74
|
+
* const Fmag = Math.hypot(F[0], F[1], F[2]); // ≈ 3.54e22 N
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* // Derive acceleration from the returned force: a = F / m1
|
|
80
|
+
* const a: [number, number, number] = [F[0]/mEarth, F[1]/mEarth, F[2]/mEarth]; // m/s^2
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @see https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
|
|
84
|
+
* @group Gravity
|
|
85
|
+
*/
|
|
86
|
+
export declare const forceOn1By2: (m1: number, m2: number, r1: Vector3DTupleType, r2: Vector3DTupleType, G?: number) => Vector3DTupleType;
|
|
87
|
+
//# sourceMappingURL=force-on1-by2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"force-on1-by2.d.ts","sourceRoot":"","sources":["../../../src/categories/gravity/force-on1-by2.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,eAAO,MAAM,WAAW,GACtB,IAAI,MAAM,EACV,IAAI,MAAM,EACV,IAAI,iBAAiB,EACrB,IAAI,iBAAiB,EACrB,IAAG,MAAa,KACf,iBASF,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { G_SI } from '@interstellar-tools/constants';
|
|
2
|
+
import { gravitationalForce } from './gravitational-force';
|
|
3
|
+
/**
|
|
4
|
+
* Gravitational **force vector** on body 1 due to body 2 (newtons, N).
|
|
5
|
+
*
|
|
6
|
+
* **Definitions**
|
|
7
|
+
*
|
|
8
|
+
* $$
|
|
9
|
+
* \mathbf r=\mathbf r_2-\mathbf r_1,\quad
|
|
10
|
+
* r=\lVert\mathbf r\rVert,\quad
|
|
11
|
+
* \hat{\mathbf r}=\frac{\mathbf r}{r}
|
|
12
|
+
* $$
|
|
13
|
+
*
|
|
14
|
+
* **Newton's law (vector form)**
|
|
15
|
+
*
|
|
16
|
+
* $$
|
|
17
|
+
* \mathbf F_{1\leftarrow2}
|
|
18
|
+
* = G\,\frac{m_1 m_2}{r^2}\,\hat{\mathbf r}
|
|
19
|
+
* $$
|
|
20
|
+
*
|
|
21
|
+
* **Magnitude & Components**
|
|
22
|
+
*
|
|
23
|
+
* $$
|
|
24
|
+
* \lVert\mathbf F\rVert=G\,\frac{m_1 m_2}{r^2},\qquad
|
|
25
|
+
* \mathbf F=\langle F_x,F_y,F_z\rangle=\lVert\mathbf F\rVert\,\hat{\mathbf r}
|
|
26
|
+
* $$
|
|
27
|
+
*
|
|
28
|
+
* $$
|
|
29
|
+
* F_x=\lVert\mathbf F\rVert\,\hat r_x,\quad
|
|
30
|
+
* F_y=\lVert\mathbf F\rVert\,\hat r_y,\quad
|
|
31
|
+
* F_z=\lVert\mathbf F\rVert\,\hat r_z
|
|
32
|
+
* $$
|
|
33
|
+
*
|
|
34
|
+
* **Newton's 3rd law (context)**
|
|
35
|
+
*
|
|
36
|
+
* $$
|
|
37
|
+
* \mathbf F_{1\leftarrow2}=-\,\mathbf F_{2\leftarrow1}
|
|
38
|
+
* $$
|
|
39
|
+
*
|
|
40
|
+
* **Units**
|
|
41
|
+
* - Inputs: masses in **kg**, positions in **m**, ($ G $) in **m³·kg⁻¹·s⁻²**.
|
|
42
|
+
* - Output: force vector in **newtons (N)**.
|
|
43
|
+
*
|
|
44
|
+
* ::: info
|
|
45
|
+
*
|
|
46
|
+
* - The returned vector points **from body 1 toward body 2** (i.e., along ($ \hat{\mathbf r} $)).
|
|
47
|
+
* - Internally delegates to `gravitationalForce(m1, m2, r1, r2, G)` and returns its
|
|
48
|
+
* direction-scaled magnitude as a 3-tuple.
|
|
49
|
+
* - For acceleration instead of force, use `accelerationOn1By2` or compute ($ \mathbf a=\mathbf F/m_1 $).
|
|
50
|
+
*
|
|
51
|
+
* :::
|
|
52
|
+
*
|
|
53
|
+
* **Invariants (within FP tolerance)**
|
|
54
|
+
* - `||F|| = G*m1*m2/r^2`
|
|
55
|
+
* - `F = ||F|| * r̂`
|
|
56
|
+
*
|
|
57
|
+
* @param {number} m1 Mass of body 1 (kg).
|
|
58
|
+
* @param {number} m2 Mass of body 2 (kg).
|
|
59
|
+
* @param {Vector3DTupleType} r1 Position of body 1 `[x, y, z]` in meters.
|
|
60
|
+
* @param {Vector3DTupleType} r2 Position of body 2 `[x, y, z]` in meters.
|
|
61
|
+
* @param {number} [G=G_SI] Gravitational constant.
|
|
62
|
+
* @returns {Vector3DTupleType} Force on body 1 due to body 2, in newtons `[Fx, Fy, Fz]`.
|
|
63
|
+
*
|
|
64
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} Propagated from `gravitationalForce` if inputs are invalid (non-finite/negative masses, coincident positions ($ r=0 $), or non-positive ($ G $)).
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* // Earth–Sun at ~1 AU (force on Earth due to Sun)
|
|
69
|
+
* const mEarth = 5.972e24; // kg
|
|
70
|
+
* const mSun = 1.9885e30; // kg
|
|
71
|
+
* const rEarth: [number, number, number] = [0, 0, 0];
|
|
72
|
+
* const rSun : [number, number, number] = [1.495978707e11, 0, 0]; // m
|
|
73
|
+
*
|
|
74
|
+
* const F = forceOn1By2(mEarth, mSun, rEarth, rSun); // N
|
|
75
|
+
* const Fmag = Math.hypot(F[0], F[1], F[2]); // ≈ 3.54e22 N
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* // Derive acceleration from the returned force: a = F / m1
|
|
81
|
+
* const a: [number, number, number] = [F[0]/mEarth, F[1]/mEarth, F[2]/mEarth]; // m/s^2
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @see https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
|
|
85
|
+
* @group Gravity
|
|
86
|
+
*/
|
|
87
|
+
export const forceOn1By2 = (m1, m2, r1, r2, G = G_SI) => {
|
|
88
|
+
const { direction, magnitude } = gravitationalForce(m1, m2, r1, r2, G); // |F|
|
|
89
|
+
const F = [
|
|
90
|
+
direction[0] * magnitude,
|
|
91
|
+
direction[1] * magnitude,
|
|
92
|
+
direction[2] * magnitude
|
|
93
|
+
];
|
|
94
|
+
return F;
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=force-on1-by2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"force-on1-by2.js","sourceRoot":"","sources":["../../../src/categories/gravity/force-on1-by2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAU,EACV,EAAU,EACV,EAAqB,EACrB,EAAqB,EACrB,IAAY,IAAI,EACG,EAAE;IACrB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;IAC9E,MAAM,CAAC,GAAsB;QAC3B,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;QACxB,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;QACxB,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;KACzB,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { ForceResultInterface, Vector3DTupleType } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* Compute the Newtonian **gravitational force** on body 1 due to body 2.
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \mathbf r=\mathbf r_2-\mathbf r_1,\quad
|
|
9
|
+
* r=\lVert\mathbf r\rVert,\quad
|
|
10
|
+
* \hat{\mathbf r}=\frac{\mathbf r}{r}
|
|
11
|
+
* $$
|
|
12
|
+
*
|
|
13
|
+
* **Law & Decomposition**
|
|
14
|
+
*
|
|
15
|
+
* $$
|
|
16
|
+
* \mathbf F_{1\leftarrow2}
|
|
17
|
+
* = G\,\frac{m_1 m_2}{r^2}\,\hat{\mathbf r}
|
|
18
|
+
* $$
|
|
19
|
+
*
|
|
20
|
+
* $$
|
|
21
|
+
* \lVert\mathbf F\rVert
|
|
22
|
+
* = G\,\frac{m_1 m_2}{r^2},\qquad
|
|
23
|
+
* \mathbf F=\langle F_x,F_y,F_z\rangle
|
|
24
|
+
* = \lVert\mathbf F\rVert\,\hat{\mathbf r}
|
|
25
|
+
* $$
|
|
26
|
+
*
|
|
27
|
+
* $$
|
|
28
|
+
* F_x=\lVert\mathbf F\rVert\,\hat r_x,\quad
|
|
29
|
+
* F_y=\lVert\mathbf F\rVert\,\hat r_y,\quad
|
|
30
|
+
* F_z=\lVert\mathbf F\rVert\,\hat r_z
|
|
31
|
+
* $$
|
|
32
|
+
*
|
|
33
|
+
* **Newton's 3rd law, for context**
|
|
34
|
+
*
|
|
35
|
+
* $$
|
|
36
|
+
* \mathbf F_{1\leftarrow2}=-\,\mathbf F_{2\leftarrow1}
|
|
37
|
+
* $$
|
|
38
|
+
*
|
|
39
|
+
* **Conventions & units**
|
|
40
|
+
* - Input masses in **kilograms (kg)**; positions in **meters (m)**.
|
|
41
|
+
* - Output force in **newtons (N)**.
|
|
42
|
+
* - Returned `vector` and `direction` point **from body 1 toward body 2**; i.e., `direction = \hat{\mathbf r}`.
|
|
43
|
+
*
|
|
44
|
+
* **Invariants (within numerical tolerance)**
|
|
45
|
+
* - `vector = magnitude * direction`
|
|
46
|
+
* - `magnitude = sqrt(Fx² + Fy² + Fz²)`
|
|
47
|
+
* - `||direction|| = 1`
|
|
48
|
+
*
|
|
49
|
+
*
|
|
50
|
+
* @param {number} m1 Mass of body 1 (kg).
|
|
51
|
+
* @param {number} m2 Mass of body 2 (kg).
|
|
52
|
+
* @param {Vector3DTupleType} r1 Position of body 1 as a 3-tuple `[x, y, z]` in meters.
|
|
53
|
+
* @param {Vector3DTupleType} r2 Position of body 2 as a 3-tuple `[x, y, z]` in meters.
|
|
54
|
+
* @param {number} [G] Gravitational constant (defaults to `G_SI`, m³·kg⁻¹·s⁻²).
|
|
55
|
+
* @returns {ForceResultInterface} `{ vector, magnitude, direction }`.
|
|
56
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If `m1` or `m2` are non-finite or negative.
|
|
57
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If positions coincide (`r = 0`).
|
|
58
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If `G` is non-finite or not positive.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { gravitationalForce } from "@interstellar-tools/equations";
|
|
63
|
+
* import { G_SI } from "@interstellar-tools/constants";
|
|
64
|
+
*
|
|
65
|
+
* // Earth–Sun at ~1 AU
|
|
66
|
+
* const mEarth = 5.972e24; // kg
|
|
67
|
+
* const mSun = 1.9885e30; // kg
|
|
68
|
+
* const rEarth: [number, number, number] = [0, 0, 0];
|
|
69
|
+
* const rSun : [number, number, number] = [1.495978707e11, 0, 0]; // m
|
|
70
|
+
*
|
|
71
|
+
* const F = gravitationalForce(mEarth, mSun, rEarth, rSun, G_SI);
|
|
72
|
+
* console.log(F.magnitude.toExponential(3)); // ≈ "3.542e+22" N
|
|
73
|
+
* console.log(F.vector); // Points from Earth toward Sun (−x here)
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* **Get F directly (recommended)**
|
|
77
|
+
*
|
|
78
|
+
* ```ts
|
|
79
|
+
* import { gravitationalForce } from "@interstellar-tools/equations";
|
|
80
|
+
* import type { Vector3DTupleType, ForceResultInterface } from "@interstellar-tools/types";
|
|
81
|
+
*
|
|
82
|
+
* const m1 = 5.972e24; // kg
|
|
83
|
+
* const m2 = 1.9885e30; // kg
|
|
84
|
+
* const r1: Vector3DTupleType = [0, 0, 0]; // m
|
|
85
|
+
* const r2: Vector3DTupleType = [1.495978707e11, 0, 0]; // m
|
|
86
|
+
*
|
|
87
|
+
* const { vector: F, magnitude, direction }: ForceResultInterface = gravitationalForce(m1, m2, r1, r2);
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @see https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
|
|
91
|
+
* @group Gravity
|
|
92
|
+
*/
|
|
93
|
+
export declare const gravitationalForce: (m1: number, m2: number, r1: Vector3DTupleType, r2: Vector3DTupleType, G?: number) => ForceResultInterface;
|
|
94
|
+
//# sourceMappingURL=gravitational-force.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gravitational-force.d.ts","sourceRoot":"","sources":["../../../src/categories/gravity/gravitational-force.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,eAAO,MAAM,kBAAkB,GAC7B,IAAI,MAAM,EACV,IAAI,MAAM,EACV,IAAI,iBAAiB,EACrB,IAAI,iBAAiB,EACrB,IAAG,MAAa,KACf,oBAgCF,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { G_SI } from '@interstellar-tools/constants';
|
|
2
|
+
/**
|
|
3
|
+
* Compute the Newtonian **gravitational force** on body 1 due to body 2.
|
|
4
|
+
*
|
|
5
|
+
* **Definitions**
|
|
6
|
+
*
|
|
7
|
+
* $$
|
|
8
|
+
* \mathbf r=\mathbf r_2-\mathbf r_1,\quad
|
|
9
|
+
* r=\lVert\mathbf r\rVert,\quad
|
|
10
|
+
* \hat{\mathbf r}=\frac{\mathbf r}{r}
|
|
11
|
+
* $$
|
|
12
|
+
*
|
|
13
|
+
* **Law & Decomposition**
|
|
14
|
+
*
|
|
15
|
+
* $$
|
|
16
|
+
* \mathbf F_{1\leftarrow2}
|
|
17
|
+
* = G\,\frac{m_1 m_2}{r^2}\,\hat{\mathbf r}
|
|
18
|
+
* $$
|
|
19
|
+
*
|
|
20
|
+
* $$
|
|
21
|
+
* \lVert\mathbf F\rVert
|
|
22
|
+
* = G\,\frac{m_1 m_2}{r^2},\qquad
|
|
23
|
+
* \mathbf F=\langle F_x,F_y,F_z\rangle
|
|
24
|
+
* = \lVert\mathbf F\rVert\,\hat{\mathbf r}
|
|
25
|
+
* $$
|
|
26
|
+
*
|
|
27
|
+
* $$
|
|
28
|
+
* F_x=\lVert\mathbf F\rVert\,\hat r_x,\quad
|
|
29
|
+
* F_y=\lVert\mathbf F\rVert\,\hat r_y,\quad
|
|
30
|
+
* F_z=\lVert\mathbf F\rVert\,\hat r_z
|
|
31
|
+
* $$
|
|
32
|
+
*
|
|
33
|
+
* **Newton's 3rd law, for context**
|
|
34
|
+
*
|
|
35
|
+
* $$
|
|
36
|
+
* \mathbf F_{1\leftarrow2}=-\,\mathbf F_{2\leftarrow1}
|
|
37
|
+
* $$
|
|
38
|
+
*
|
|
39
|
+
* **Conventions & units**
|
|
40
|
+
* - Input masses in **kilograms (kg)**; positions in **meters (m)**.
|
|
41
|
+
* - Output force in **newtons (N)**.
|
|
42
|
+
* - Returned `vector` and `direction` point **from body 1 toward body 2**; i.e., `direction = \hat{\mathbf r}`.
|
|
43
|
+
*
|
|
44
|
+
* **Invariants (within numerical tolerance)**
|
|
45
|
+
* - `vector = magnitude * direction`
|
|
46
|
+
* - `magnitude = sqrt(Fx² + Fy² + Fz²)`
|
|
47
|
+
* - `||direction|| = 1`
|
|
48
|
+
*
|
|
49
|
+
*
|
|
50
|
+
* @param {number} m1 Mass of body 1 (kg).
|
|
51
|
+
* @param {number} m2 Mass of body 2 (kg).
|
|
52
|
+
* @param {Vector3DTupleType} r1 Position of body 1 as a 3-tuple `[x, y, z]` in meters.
|
|
53
|
+
* @param {Vector3DTupleType} r2 Position of body 2 as a 3-tuple `[x, y, z]` in meters.
|
|
54
|
+
* @param {number} [G] Gravitational constant (defaults to `G_SI`, m³·kg⁻¹·s⁻²).
|
|
55
|
+
* @returns {ForceResultInterface} `{ vector, magnitude, direction }`.
|
|
56
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If `m1` or `m2` are non-finite or negative.
|
|
57
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If positions coincide (`r = 0`).
|
|
58
|
+
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If `G` is non-finite or not positive.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { gravitationalForce } from "@interstellar-tools/equations";
|
|
63
|
+
* import { G_SI } from "@interstellar-tools/constants";
|
|
64
|
+
*
|
|
65
|
+
* // Earth–Sun at ~1 AU
|
|
66
|
+
* const mEarth = 5.972e24; // kg
|
|
67
|
+
* const mSun = 1.9885e30; // kg
|
|
68
|
+
* const rEarth: [number, number, number] = [0, 0, 0];
|
|
69
|
+
* const rSun : [number, number, number] = [1.495978707e11, 0, 0]; // m
|
|
70
|
+
*
|
|
71
|
+
* const F = gravitationalForce(mEarth, mSun, rEarth, rSun, G_SI);
|
|
72
|
+
* console.log(F.magnitude.toExponential(3)); // ≈ "3.542e+22" N
|
|
73
|
+
* console.log(F.vector); // Points from Earth toward Sun (−x here)
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* **Get F directly (recommended)**
|
|
77
|
+
*
|
|
78
|
+
* ```ts
|
|
79
|
+
* import { gravitationalForce } from "@interstellar-tools/equations";
|
|
80
|
+
* import type { Vector3DTupleType, ForceResultInterface } from "@interstellar-tools/types";
|
|
81
|
+
*
|
|
82
|
+
* const m1 = 5.972e24; // kg
|
|
83
|
+
* const m2 = 1.9885e30; // kg
|
|
84
|
+
* const r1: Vector3DTupleType = [0, 0, 0]; // m
|
|
85
|
+
* const r2: Vector3DTupleType = [1.495978707e11, 0, 0]; // m
|
|
86
|
+
*
|
|
87
|
+
* const { vector: F, magnitude, direction }: ForceResultInterface = gravitationalForce(m1, m2, r1, r2);
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @see https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
|
|
91
|
+
* @group Gravity
|
|
92
|
+
*/
|
|
93
|
+
export const gravitationalForce = (m1, m2, r1, r2, G = G_SI) => {
|
|
94
|
+
if (!Number.isFinite(m1) || !Number.isFinite(m2) || m1 < 0 || m2 < 0) {
|
|
95
|
+
throw new Error('m1 and m2 must be finite, non-negative numbers (kg).');
|
|
96
|
+
}
|
|
97
|
+
if (!Number.isFinite(G) || G <= 0) {
|
|
98
|
+
throw new Error('G must be a finite, positive number (m^3·kg^-1·s^-2).');
|
|
99
|
+
}
|
|
100
|
+
const rx = r2[0] - r1[0];
|
|
101
|
+
const ry = r2[1] - r1[1];
|
|
102
|
+
const rz = r2[2] - r1[2];
|
|
103
|
+
const r2mag = rx * rx + ry * ry + rz * rz;
|
|
104
|
+
if (r2mag === 0) {
|
|
105
|
+
throw new Error('Bodies are at the same position: gravitational force is singular (r = 0).');
|
|
106
|
+
}
|
|
107
|
+
const invR = 1 / Math.sqrt(r2mag);
|
|
108
|
+
const dir = [rx * invR, ry * invR, rz * invR];
|
|
109
|
+
// |F| = G m1 m2 / r^2
|
|
110
|
+
const magnitude = (G * m1 * m2) / r2mag;
|
|
111
|
+
// Vector points from body 1 toward body 2.
|
|
112
|
+
const Fx = dir[0] * magnitude;
|
|
113
|
+
const Fy = dir[1] * magnitude;
|
|
114
|
+
const Fz = dir[2] * magnitude;
|
|
115
|
+
// Ensure the tuple type is preserved for callers.
|
|
116
|
+
const vector = [Fx, Fy, Fz];
|
|
117
|
+
return { vector, magnitude, direction: dir };
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=gravitational-force.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gravitational-force.js","sourceRoot":"","sources":["../../../src/categories/gravity/gravitational-force.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAMrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,EAAU,EACV,EAAU,EACV,EAAqB,EACrB,EAAqB,EACrB,IAAY,IAAI,EACM,EAAE;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAE1C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,GAAG,GAAsB,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACjE,sBAAsB;IACtB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;IACxC,2CAA2C;IAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9B,kDAAkD;IAClD,MAAM,MAAM,GAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAC/C,CAAC,CAAC"}
|
package/dist/{gravitational-parameter.d.ts → categories/gravity/gravitational-parameter.d.ts}
RENAMED
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
* // Earth–Moon system (two-body μ)
|
|
44
44
|
* const muEarthMoon = gravitationalParameter(5.97219e24, 7.342e22);
|
|
45
45
|
* ```
|
|
46
|
-
* @
|
|
46
|
+
* @group Gravity
|
|
47
47
|
*/
|
|
48
48
|
export declare const gravitationalParameter: (M: number, m?: number, G?: number) => number;
|
|
49
49
|
//# sourceMappingURL=gravitational-parameter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gravitational-parameter.d.ts","sourceRoot":"","sources":["../../../src/categories/gravity/gravitational-parameter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,sBAAsB,GACjC,GAAG,MAAM,EACT,IAAG,MAAU,EACb,IAAG,MAAa,KACf,MAcF,CAAC"}
|
|
@@ -44,7 +44,7 @@ import { G_SI } from '@interstellar-tools/constants';
|
|
|
44
44
|
* // Earth–Moon system (two-body μ)
|
|
45
45
|
* const muEarthMoon = gravitationalParameter(5.97219e24, 7.342e22);
|
|
46
46
|
* ```
|
|
47
|
-
* @
|
|
47
|
+
* @group Gravity
|
|
48
48
|
*/
|
|
49
49
|
export const gravitationalParameter = (M, m = 0, G = G_SI) => {
|
|
50
50
|
if (!Number.isFinite(M) || M < 0) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gravitational-parameter.js","sourceRoot":"","sources":["../../../src/categories/gravity/gravitational-parameter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,CAAS,EACT,IAAY,CAAC,EACb,IAAY,IAAI,EACR,EAAE;IACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -69,7 +69,7 @@ import { Radians } from '@interstellar-tools/types';
|
|
|
69
69
|
*
|
|
70
70
|
* @see [Kepler's Equation (Wikipedia)](https://en.wikipedia.org/wiki/Kepler%27s_equation)
|
|
71
71
|
* @see [Bisection Method (Wikipedia)](https://en.wikipedia.org/wiki/Bisection_method)
|
|
72
|
-
* @
|
|
72
|
+
* @group Kepler Solvers
|
|
73
73
|
*/
|
|
74
74
|
export declare const solveKeplerBisection: (M: Radians, e: number, maxIter: number, tolerance: number) => Radians;
|
|
75
75
|
//# sourceMappingURL=solve-kepler-bisection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve-kepler-bisection.d.ts","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-bisection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,GAAG,OAAO,EACV,GAAG,MAAM,EACT,SAAS,MAAM,EACf,WAAW,MAAM,KAChB,OAwBF,CAAC"}
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
*
|
|
69
69
|
* @see [Kepler's Equation (Wikipedia)](https://en.wikipedia.org/wiki/Kepler%27s_equation)
|
|
70
70
|
* @see [Bisection Method (Wikipedia)](https://en.wikipedia.org/wiki/Bisection_method)
|
|
71
|
-
* @
|
|
71
|
+
* @group Kepler Solvers
|
|
72
72
|
*/
|
|
73
73
|
export const solveKeplerBisection = (M, e, maxIter, tolerance) => {
|
|
74
74
|
let E_low = 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve-kepler-bisection.js","sourceRoot":"","sources":["../../../src/categories/kepler/solve-kepler-bisection.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,CAAU,EACV,CAAS,EACT,OAAe,EACf,SAAiB,EACR,EAAE;IACX,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,GAAG,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,CAAC,YAAY;QACxB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QAED,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC;IACT,CAAC;IAED,OAAO,CAAC,CAAC,CAAC,qBAAqB;AACjC,CAAC,CAAC"}
|
|
@@ -3,8 +3,6 @@ import { Radians } from '@interstellar-tools/types';
|
|
|
3
3
|
* Solves **Kepler's Equation** for the **Eccentric Anomaly** ($E$) in highly eccentric orbits
|
|
4
4
|
* ($e > 0.9$) using an iterative numerical approach.
|
|
5
5
|
*
|
|
6
|
-
* ---
|
|
7
|
-
*
|
|
8
6
|
* **Mathematical Explanation:**
|
|
9
7
|
*
|
|
10
8
|
* Kepler's equation for eccentric anomaly ($E$) is:
|
|
@@ -55,13 +53,11 @@ import { Radians } from '@interstellar-tools/types';
|
|
|
55
53
|
* 3. **Angle Wrapping (Elliptical Only):**
|
|
56
54
|
* - The result is wrapped using `wrapAngle()` for consistency.
|
|
57
55
|
*
|
|
58
|
-
* ---
|
|
59
56
|
*
|
|
60
57
|
* **Performance Considerations:**
|
|
61
58
|
* - **Typically converges in fewer than 10 iterations for $e > 0.9$.**
|
|
62
59
|
* - **Time complexity:** $O(1)$ for standard convergence.
|
|
63
60
|
*
|
|
64
|
-
* ---
|
|
65
61
|
*
|
|
66
62
|
* @param {Radians} M - Mean anomaly ($M$) in **radians**.
|
|
67
63
|
* @param {number} e - Orbital eccentricity ($e > 0.9$ for high-eccentricity orbits).
|
|
@@ -69,7 +65,6 @@ import { Radians } from '@interstellar-tools/types';
|
|
|
69
65
|
* @param {number} [tolerance=1e-9] - Convergence criterion for stopping the iteration.
|
|
70
66
|
* @returns {Radians} The **eccentric anomaly** ($E$) in **radians** (wrapped to $[-\pi, \pi]$ for elliptical orbits).
|
|
71
67
|
*
|
|
72
|
-
* ---
|
|
73
68
|
*
|
|
74
69
|
* @example
|
|
75
70
|
* ```ts
|
|
@@ -89,11 +84,10 @@ import { Radians } from '@interstellar-tools/types';
|
|
|
89
84
|
* console.log(solveKeplerHighEccentricity(M_hyperbolic, e_hyperbolic));
|
|
90
85
|
* ```
|
|
91
86
|
*
|
|
92
|
-
* ---
|
|
93
|
-
*
|
|
94
87
|
* @see [Kepler's Equation (Wikipedia)](https://en.wikipedia.org/wiki/Kepler%27s_equation)
|
|
95
88
|
* @see [Hyperbolic Anomaly (Wikipedia)](https://en.wikipedia.org/wiki/Hyperbolic_trajectory#Hyperbolic_anomaly)
|
|
96
|
-
* @
|
|
89
|
+
* @group Kepler Solvers
|
|
90
|
+
*
|
|
97
91
|
*/
|
|
98
92
|
export declare const solveKeplerHighEccentricity: (M: Radians, e: number, maxIter?: number, tolerance?: number) => Radians;
|
|
99
93
|
//# sourceMappingURL=solve-kepler-high-eccentricity.d.ts.map
|