@interstellar-tools/equations 0.49.0 → 0.50.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.
Files changed (230) hide show
  1. package/dist/categories/angle/compute-angle.d.ts +1 -1
  2. package/dist/categories/angle/compute-angle.js +4 -4
  3. package/dist/categories/angle/compute-angle.js.map +1 -1
  4. package/dist/categories/anomalies/mean-to-eccentric-anomaly.d.ts +1 -1
  5. package/dist/categories/anomalies/mean-to-eccentric-anomaly.js +4 -4
  6. package/dist/categories/anomalies/mean-to-eccentric-anomaly.js.map +1 -1
  7. package/dist/categories/anomalies/true-to-mean-anomaly.d.ts +1 -1
  8. package/dist/categories/anomalies/true-to-mean-anomaly.js +2 -2
  9. package/dist/categories/anomalies/true-to-mean-anomaly.js.map +1 -1
  10. package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js +3 -3
  11. package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js.map +1 -1
  12. package/dist/categories/gravity/acceleration-on1-by2.js +1 -1
  13. package/dist/categories/gravity/acceleration-on1-by2.js.map +1 -1
  14. package/dist/categories/gravity/force-on1-by2.js +1 -1
  15. package/dist/categories/gravity/force-on1-by2.js.map +1 -1
  16. package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts +1 -1
  17. package/dist/categories/kepler/solve-kepler-high-eccentricity.js +2 -2
  18. package/dist/categories/kepler/solve-kepler-high-eccentricity.js.map +1 -1
  19. package/dist/categories/kepler/solve-kepler.d.ts +1 -1
  20. package/dist/categories/kepler/solve-kepler.js +5 -5
  21. package/dist/categories/kepler/solve-kepler.js.map +1 -1
  22. package/dist/index.d.ts +49 -49
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +49 -49
  25. package/dist/index.js.map +1 -1
  26. package/package.json +4 -4
  27. package/dist/__tests__/helpers/index.d.ts +0 -9
  28. package/dist/__tests__/helpers/index.d.ts.map +0 -1
  29. package/dist/__tests__/helpers/index.js +0 -45
  30. package/dist/__tests__/helpers/index.js.map +0 -1
  31. package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts +0 -2
  32. package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts.map +0 -1
  33. package/dist/categories/angle/__tests__/compute-angle.int.spec.js +0 -62
  34. package/dist/categories/angle/__tests__/compute-angle.int.spec.js.map +0 -1
  35. package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts +0 -2
  36. package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts.map +0 -1
  37. package/dist/categories/angle/__tests__/wrap-angle.spec.js +0 -60
  38. package/dist/categories/angle/__tests__/wrap-angle.spec.js.map +0 -1
  39. package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts +0 -2
  40. package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +0 -1
  41. package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js +0 -33
  42. package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js.map +0 -1
  43. package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts +0 -2
  44. package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +0 -1
  45. package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js +0 -197
  46. package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js.map +0 -1
  47. package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts +0 -2
  48. package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts.map +0 -1
  49. package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js +0 -46
  50. package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js.map +0 -1
  51. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts +0 -2
  52. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts.map +0 -1
  53. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js +0 -56
  54. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js.map +0 -1
  55. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts +0 -2
  56. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts.map +0 -1
  57. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js +0 -60
  58. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js.map +0 -1
  59. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts +0 -2
  60. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts.map +0 -1
  61. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js +0 -60
  62. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js.map +0 -1
  63. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts +0 -2
  64. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts.map +0 -1
  65. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js +0 -73
  66. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js.map +0 -1
  67. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts +0 -2
  68. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts.map +0 -1
  69. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js +0 -69
  70. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js.map +0 -1
  71. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts +0 -2
  72. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts.map +0 -1
  73. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js +0 -103
  74. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js.map +0 -1
  75. package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts +0 -2
  76. package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +0 -1
  77. package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js +0 -87
  78. package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +0 -1
  79. package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts +0 -2
  80. package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +0 -1
  81. package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js +0 -107
  82. package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js.map +0 -1
  83. package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts +0 -2
  84. package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts.map +0 -1
  85. package/dist/categories/gravity/__tests__/gravitational-force.spec.js +0 -106
  86. package/dist/categories/gravity/__tests__/gravitational-force.spec.js.map +0 -1
  87. package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts +0 -2
  88. package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts.map +0 -1
  89. package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js +0 -75
  90. package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js.map +0 -1
  91. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts +0 -2
  92. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts.map +0 -1
  93. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js +0 -79
  94. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js.map +0 -1
  95. package/dist/categories/helpers/__tests__/det-3.spec.d.ts +0 -2
  96. package/dist/categories/helpers/__tests__/det-3.spec.d.ts.map +0 -1
  97. package/dist/categories/helpers/__tests__/det-3.spec.js +0 -73
  98. package/dist/categories/helpers/__tests__/det-3.spec.js.map +0 -1
  99. package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts +0 -2
  100. package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts.map +0 -1
  101. package/dist/categories/helpers/__tests__/mat-mul3.spec.js +0 -86
  102. package/dist/categories/helpers/__tests__/mat-mul3.spec.js.map +0 -1
  103. package/dist/categories/helpers/__tests__/misc.spec.d.ts +0 -2
  104. package/dist/categories/helpers/__tests__/misc.spec.d.ts.map +0 -1
  105. package/dist/categories/helpers/__tests__/misc.spec.js +0 -101
  106. package/dist/categories/helpers/__tests__/misc.spec.js.map +0 -1
  107. package/dist/categories/helpers/__tests__/radians.spec.d.ts +0 -2
  108. package/dist/categories/helpers/__tests__/radians.spec.d.ts.map +0 -1
  109. package/dist/categories/helpers/__tests__/radians.spec.js +0 -37
  110. package/dist/categories/helpers/__tests__/radians.spec.js.map +0 -1
  111. package/dist/categories/helpers/__tests__/rot-1.spec.d.ts +0 -2
  112. package/dist/categories/helpers/__tests__/rot-1.spec.d.ts.map +0 -1
  113. package/dist/categories/helpers/__tests__/rot-1.spec.js +0 -59
  114. package/dist/categories/helpers/__tests__/rot-1.spec.js.map +0 -1
  115. package/dist/categories/helpers/__tests__/rot-3.spec.d.ts +0 -2
  116. package/dist/categories/helpers/__tests__/rot-3.spec.d.ts.map +0 -1
  117. package/dist/categories/helpers/__tests__/rot-3.spec.js +0 -65
  118. package/dist/categories/helpers/__tests__/rot-3.spec.js.map +0 -1
  119. package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts +0 -2
  120. package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts.map +0 -1
  121. package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js +0 -86
  122. package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js.map +0 -1
  123. package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts +0 -2
  124. package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +0 -1
  125. package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js +0 -81
  126. package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js.map +0 -1
  127. package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts +0 -2
  128. package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +0 -1
  129. package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js +0 -50
  130. package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js.map +0 -1
  131. package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts +0 -2
  132. package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts.map +0 -1
  133. package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js +0 -76
  134. package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js.map +0 -1
  135. package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts +0 -2
  136. package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts.map +0 -1
  137. package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js +0 -103
  138. package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js.map +0 -1
  139. package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts +0 -2
  140. package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts.map +0 -1
  141. package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js +0 -89
  142. package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js.map +0 -1
  143. package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts +0 -2
  144. package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts.map +0 -1
  145. package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js +0 -101
  146. package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js.map +0 -1
  147. package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts +0 -2
  148. package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts.map +0 -1
  149. package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js +0 -71
  150. package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js.map +0 -1
  151. package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts +0 -2
  152. package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts.map +0 -1
  153. package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js +0 -90
  154. package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js.map +0 -1
  155. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts +0 -2
  156. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts.map +0 -1
  157. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js +0 -84
  158. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js.map +0 -1
  159. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts +0 -2
  160. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts.map +0 -1
  161. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js +0 -65
  162. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js.map +0 -1
  163. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts +0 -2
  164. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts.map +0 -1
  165. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js +0 -71
  166. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js.map +0 -1
  167. package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts +0 -2
  168. package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts.map +0 -1
  169. package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js +0 -36
  170. package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js.map +0 -1
  171. package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts +0 -2
  172. package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts.map +0 -1
  173. package/dist/categories/orbits/__tests__/circular-speed.spec.js +0 -69
  174. package/dist/categories/orbits/__tests__/circular-speed.spec.js.map +0 -1
  175. package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts +0 -2
  176. package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts.map +0 -1
  177. package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js +0 -64
  178. package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js.map +0 -1
  179. package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts +0 -2
  180. package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts.map +0 -1
  181. package/dist/categories/orbits/__tests__/escape-speed.spec.js +0 -79
  182. package/dist/categories/orbits/__tests__/escape-speed.spec.js.map +0 -1
  183. package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts +0 -2
  184. package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +0 -1
  185. package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js +0 -92
  186. package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +0 -1
  187. package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts +0 -2
  188. package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +0 -1
  189. package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js +0 -64
  190. package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js.map +0 -1
  191. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts +0 -2
  192. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts.map +0 -1
  193. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js +0 -104
  194. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js.map +0 -1
  195. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts +0 -2
  196. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts.map +0 -1
  197. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js +0 -99
  198. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js.map +0 -1
  199. package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts +0 -2
  200. package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts.map +0 -1
  201. package/dist/categories/orbits/__tests__/kepler-period.spec.js +0 -72
  202. package/dist/categories/orbits/__tests__/kepler-period.spec.js.map +0 -1
  203. package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts +0 -2
  204. package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts.map +0 -1
  205. package/dist/categories/orbits/__tests__/mean-motion.spec.js +0 -48
  206. package/dist/categories/orbits/__tests__/mean-motion.spec.js.map +0 -1
  207. package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts +0 -2
  208. package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts.map +0 -1
  209. package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js +0 -74
  210. package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js.map +0 -1
  211. package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts +0 -2
  212. package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +0 -1
  213. package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js +0 -86
  214. package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js.map +0 -1
  215. package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts +0 -2
  216. package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts.map +0 -1
  217. package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js +0 -85
  218. package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js.map +0 -1
  219. package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts +0 -2
  220. package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts.map +0 -1
  221. package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js +0 -81
  222. package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js.map +0 -1
  223. package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts +0 -2
  224. package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts.map +0 -1
  225. package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js +0 -62
  226. package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js.map +0 -1
  227. package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts +0 -2
  228. package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts.map +0 -1
  229. package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js +0 -80
  230. package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js.map +0 -1
@@ -1,92 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test, { describe } from 'node:test';
3
- import { flightPathAngleFromTrueAnomaly } from '../flight-path-angle-from-true-anomaly';
4
- import { absClose } from 'packages/equations/src/__tests__/helpers';
5
- const EPS = 1e-12;
6
- const PI = Math.PI;
7
- describe('flightPathAngleFromTrueAnomaly', () => {
8
- test('e = 0 (circular): gamma = 0 for any ν', () => {
9
- const e = 0;
10
- const nus = [
11
- 0,
12
- (PI / 6),
13
- (PI / 2),
14
- PI,
15
- -1.1
16
- ];
17
- for (const nu of nus) {
18
- const g = flightPathAngleFromTrueAnomaly(nu, e);
19
- absClose(g, 0, EPS, `gamma(ν=${nu}, e=0) should be 0`);
20
- }
21
- });
22
- test('elliptic examples: tan(γ) ≈ (e sin ν) / (1 + e cos ν)', () => {
23
- const cases = [
24
- { nu: 0.7, e: 0.2 },
25
- { nu: 1.2, e: 0.7 },
26
- { nu: 2.0, e: 0.5 }
27
- ];
28
- for (const { nu, e } of cases) {
29
- const gamma = flightPathAngleFromTrueAnomaly(nu, e);
30
- const ratio = (e * Math.sin(nu)) / (1 + e * Math.cos(nu));
31
- // Avoiding points too close to denom=0 by choice of cases above
32
- absClose(Math.tan(gamma), ratio, 1e-11, `tan(gamma) mismatch for ν=${nu}, e=${e}`);
33
- // For 0 ≤ e < 1, |γ| < π/2
34
- assert.ok(Math.abs(gamma) < PI / 2 - 1e-15, 'elliptic γ must be in (-π/2, π/2)');
35
- }
36
- });
37
- test('sign symmetry: γ(-ν) = -γ(ν) for elliptic case', () => {
38
- const e = 0.4;
39
- const nu = 0.8;
40
- const g1 = flightPathAngleFromTrueAnomaly(nu, e);
41
- const g2 = flightPathAngleFromTrueAnomaly(-nu, e);
42
- absClose(g1, -g2, 1e-12);
43
- });
44
- test('limits: ν = 0 and ν = π both yield γ = 0 for 0 ≤ e < 1', () => {
45
- const es = [0, 0.1, 0.5, 0.9];
46
- for (const e of es) {
47
- const g0 = flightPathAngleFromTrueAnomaly(0, e);
48
- absClose(g0, 0);
49
- const gpi = flightPathAngleFromTrueAnomaly(PI, e);
50
- absClose(gpi, 0);
51
- }
52
- });
53
- test('parabolic special-case: e = 1 and ν = π returns 0 by design', () => {
54
- const e = 1;
55
- const nu = PI;
56
- const g = flightPathAngleFromTrueAnomaly(nu, e);
57
- absClose(g, 0);
58
- });
59
- test('parabolic (e=1): for general ν, γ ≈ ν/2 (principal value), away from ν=π', () => {
60
- const e = 1;
61
- const nus = [0.6, 1.0, -1.2];
62
- for (const nu of nus) {
63
- const g = flightPathAngleFromTrueAnomaly(nu, e);
64
- // Using identity tan γ = sin ν / (1 + cos ν) = tan(ν/2)
65
- // γ = atan2(sin(ν/2), cos(ν/2)) → principal value ≈ ν/2 for |ν| < π
66
- absClose(g, nu / 2, 1e-12, `parabolic γ ≈ ν/2 failed for ν=${nu}`);
67
- }
68
- });
69
- test('hyperbolic asymptote: e > 1 and ν = arccos(-1/e) ⇒ γ → +π/2', () => {
70
- const e = 1.5;
71
- const nu0 = Math.acos(-1 / e); // 1 + e cos ν0 = 0
72
- const g = flightPathAngleFromTrueAnomaly(nu0, e);
73
- absClose(g, PI / 2, 1e-12);
74
- });
75
- test('hyperbolic asymptote (negative): e > 1 and ν = -arccos(-1/e) ⇒ γ → -π/2', () => {
76
- const e = 1.5;
77
- const nu0 = -Math.acos(-1 / e);
78
- const g = flightPathAngleFromTrueAnomaly(nu0, e);
79
- absClose(g, -PI / 2, 1e-12);
80
- });
81
- test('input validation: throws on non-finite ν or negative e', () => {
82
- // non-finite nu
83
- assert.throws(() => flightPathAngleFromTrueAnomaly(NaN, 0.3), /finite/);
84
- assert.throws(() => flightPathAngleFromTrueAnomaly(Infinity, 0.3), /finite/);
85
- // negative e
86
- assert.throws(() => flightPathAngleFromTrueAnomaly(1, -0.01), /≥ 0/);
87
- // non-finite e
88
- assert.throws(() => flightPathAngleFromTrueAnomaly(1, NaN), /finite/);
89
- assert.throws(() => flightPathAngleFromTrueAnomaly(1, Infinity), /finite/);
90
- });
91
- });
92
- //# sourceMappingURL=flight-path-angle-from-true-anomaly.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flight-path-angle-from-true-anomaly.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=hyperbolic-periapsis-speed.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hyperbolic-periapsis-speed.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.ts"],"names":[],"mappings":""}
@@ -1,64 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test, { describe } from 'node:test';
3
- import { hyperbolicPeriapsisSpeed } from '../hyperbolic-periapsis-speed';
4
- import { relClose } from 'packages/equations/src/__tests__/helpers';
5
- describe('hyperbolicPeriapsisSpeed', () => {
6
- test('returns sqrt(vInf² + 2mu/rp) for typical inputs (Earth, km-based example)', () => {
7
- const vInf = 3.2; // km/s
8
- const mu = 398600.4418; // km³/s²
9
- const rp = 6678; // km
10
- const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
11
- const expected = Math.sqrt(vInf * vInf + (2 * mu) / rp);
12
- relClose(vp, expected);
13
- });
14
- test('when vInfinity is 0, reduces to escape speed at rp: sqrt(2mu/rp)', () => {
15
- const vInf = 0;
16
- const mu = 398600.4418;
17
- const rp = 6678;
18
- const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
19
- const expected = Math.sqrt((2 * mu) / rp);
20
- relClose(vp, expected);
21
- });
22
- test('is always >= vInfinity for valid inputs', () => {
23
- const vInf = 5;
24
- const mu = 1e5;
25
- const rp = 1e3;
26
- const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
27
- assert.ok(vp >= vInf, `expected vp (${vp}) >= vInfinity (${vInf})`);
28
- });
29
- test('throws TypeError when vInfinity is NaN', () => {
30
- assert.throws(() => hyperbolicPeriapsisSpeed(Number.NaN, 1, 1), (err) => err instanceof TypeError &&
31
- err.message === 'vInfinity must be a finite number. Received: NaN');
32
- });
33
- test('throws TypeError when mu is Infinity', () => {
34
- assert.throws(() => hyperbolicPeriapsisSpeed(1, Number.POSITIVE_INFINITY, 1), (err) => err instanceof TypeError &&
35
- err.message === 'mu must be a finite number. Received: Infinity');
36
- });
37
- test('throws TypeError when rp is undefined/NaN-ish (NaN)', () => {
38
- assert.throws(() => hyperbolicPeriapsisSpeed(1, 1, Number.NaN), (err) => err instanceof TypeError &&
39
- err.message === 'rp must be a finite number. Received: NaN');
40
- });
41
- test('throws RangeError when vInfinity < 0', () => {
42
- assert.throws(() => hyperbolicPeriapsisSpeed(-0.0001, 1, 1), (err) => err instanceof RangeError &&
43
- err.message === 'vInfinity must be >= 0. Received: -0.0001');
44
- });
45
- test('throws RangeError when mu <= 0 (mu === 0)', () => {
46
- assert.throws(() => hyperbolicPeriapsisSpeed(0, 0, 1), (err) => err instanceof RangeError &&
47
- err.message === 'mu must be > 0. Received: 0');
48
- });
49
- test('throws RangeError when rp <= 0 (rp === 0)', () => {
50
- assert.throws(() => hyperbolicPeriapsisSpeed(0, 1, 0), (err) => err instanceof RangeError &&
51
- err.message === 'rp must be > 0. Received: 0');
52
- });
53
- test('for large rp, vp - vInfinity ≈ mu / (rp * vInfinity)', () => {
54
- const vInf = 12.345;
55
- const mu = 3.986004418e5;
56
- const rp = 1e12;
57
- const vp = hyperbolicPeriapsisSpeed(vInf, mu, rp);
58
- const delta = vp - vInf;
59
- const approx = mu / (rp * vInf);
60
- // approximation, so use a looser tolerance than exact comparisons
61
- relClose(delta, approx, 1e-6);
62
- });
63
- });
64
- //# sourceMappingURL=hyperbolic-periapsis-speed.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hyperbolic-periapsis-speed.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=j2-argument-of-perigee-rate.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"j2-argument-of-perigee-rate.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.ts"],"names":[],"mappings":""}
@@ -1,104 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test, { describe } from 'node:test';
3
- import { relClose } from 'packages/equations/src/__tests__/helpers';
4
- import { j2ArgumentOfPerigeeRate } from '../j2-argument-of-perigee-rate';
5
- import { rad } from '../../helpers/radians';
6
- describe('j2ArgumentOfPerigeeRate', () => {
7
- test('computes ωdot from the reference formula (typical Earth-ish LEO inputs)', () => {
8
- const J2 = 1.08262668e-3;
9
- const n = 0.001078; // rad/s
10
- const Re = 6378.137; // km
11
- const a = 7000; // km
12
- const i = rad((63.4 * Math.PI) / 180);
13
- const e = 0.001;
14
- const omegaDot = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, e);
15
- const oneMinusESq = 1 - e * e;
16
- const expected = (0.75 *
17
- J2 *
18
- n *
19
- Math.pow(Re / a, 2) *
20
- (5 * Math.pow(Math.cos(i), 2) - 1)) /
21
- Math.pow(oneMinusESq, 2);
22
- relClose(omegaDot, expected);
23
- });
24
- test('critical inclination: ωdot ~ 0 when 5cos^2(i) - 1 = 0', () => {
25
- // 5 cos^2(i) - 1 = 0 => cos^2(i)=1/5 => i = arccos(sqrt(1/5)) ≈ 63.4349°
26
- const icrit = rad(Math.acos(Math.sqrt(1 / 5)));
27
- const J2 = 1e-3;
28
- const n = 0.001;
29
- const Re = 6000;
30
- const a = 7000;
31
- const e = 0;
32
- const omegaDot = j2ArgumentOfPerigeeRate(J2, n, Re, a, icrit, e);
33
- relClose(omegaDot, 0, 1e-12);
34
- });
35
- test('equatorial orbit (i = 0) yields positive ωdot for J2 > 0', () => {
36
- const omegaDot = j2ArgumentOfPerigeeRate(1e-3, 0.001, 6000, 7000, rad(0), 0);
37
- assert.ok(omegaDot > 0, `expected ωdot > 0, got ${omegaDot}`);
38
- });
39
- test('polar orbit (i = 90°) yields negative ωdot for J2 > 0', () => {
40
- // cos(i)=0 => (5cos^2 - 1) = -1 => ωdot negative
41
- const omegaDot = j2ArgumentOfPerigeeRate(1e-3, 0.001, 6000, 7000, rad(Math.PI / 2), 0);
42
- assert.ok(omegaDot < 0, `expected ωdot < 0, got ${omegaDot}`);
43
- });
44
- test('with e = 0, denominator is 1 (matches simplified circular-orbit form)', () => {
45
- const J2 = 1e-3;
46
- const n = 0.001;
47
- const Re = 6000;
48
- const a = 7000;
49
- const i = rad((40 * Math.PI) / 180);
50
- const e = 0;
51
- const omegaDot = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, e);
52
- const expected = 0.75 * J2 * n * Math.pow(Re / a, 2) * (5 * Math.pow(Math.cos(i), 2) - 1);
53
- relClose(omegaDot, expected);
54
- });
55
- test('as e increases, |ωdot| increases due to (1 - e^2)^-2', () => {
56
- const J2 = 1e-3;
57
- const n = 0.001;
58
- const Re = 6000;
59
- const a = 7000;
60
- const i = rad((30 * Math.PI) / 180);
61
- const omegaDot0 = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, 0);
62
- const omegaDot5 = j2ArgumentOfPerigeeRate(J2, n, Re, a, i, 0.5);
63
- assert.ok(Math.abs(omegaDot5) > Math.abs(omegaDot0), `expected |ωdot| to increase with e: ${omegaDot0} -> ${omegaDot5}`);
64
- });
65
- test('throws TypeError when any input is not finite', () => {
66
- const J2 = 1e-3;
67
- const n = 0.001;
68
- const Re = 6000;
69
- const a = 7000;
70
- const i = rad(0);
71
- const e = 0;
72
- assert.throws(() => j2ArgumentOfPerigeeRate(Number.NaN, n, Re, a, i, e), (err) => err instanceof TypeError &&
73
- err.message === 'J2 must be a finite number. Received: NaN');
74
- assert.throws(() => j2ArgumentOfPerigeeRate(J2, Number.POSITIVE_INFINITY, Re, a, i, e), (err) => err instanceof TypeError &&
75
- err.message === 'n must be a finite number. Received: Infinity');
76
- assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Number.NEGATIVE_INFINITY, a, i, e), (err) => err instanceof TypeError &&
77
- err.message === 'Re must be a finite number. Received: -Infinity');
78
- assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Re, Number.NaN, i, e), (err) => err instanceof TypeError &&
79
- err.message === 'a must be a finite number. Received: NaN');
80
- assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Re, a, rad(Number.NaN), e), (err) => err instanceof TypeError &&
81
- err.message === 'i must be a finite number. Received: NaN');
82
- assert.throws(() => j2ArgumentOfPerigeeRate(J2, n, Re, a, i, Number.NaN), (err) => err instanceof TypeError &&
83
- err.message === 'e must be a finite number. Received: NaN');
84
- });
85
- test('throws RangeError when n < 0', () => {
86
- assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, -1e-9, 6000, 7000, rad(0), 0), (err) => err instanceof RangeError &&
87
- err.message === 'n must be >= 0. Received: -1e-9');
88
- });
89
- test('throws RangeError when Re <= 0', () => {
90
- assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 0, 7000, rad(0), 0), (err) => err instanceof RangeError &&
91
- err.message === 'Re must be > 0. Received: 0');
92
- });
93
- test('throws RangeError when a <= 0', () => {
94
- assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 6000, 0, rad(0), 0), (err) => err instanceof RangeError &&
95
- err.message === 'a must be > 0. Received: 0');
96
- });
97
- test('throws RangeError when e is outside [0, 1)', () => {
98
- assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 6000, 7000, rad(0), -1e-9), (err) => err instanceof RangeError &&
99
- err.message === 'e must be in [0, 1]. Received: -1e-9');
100
- assert.throws(() => j2ArgumentOfPerigeeRate(1e-3, 1e-3, 6000, 7000, rad(0), 1), (err) => err instanceof RangeError &&
101
- err.message === 'e must be in [0, 1]. Received: 1');
102
- });
103
- });
104
- //# sourceMappingURL=j2-argument-of-perigee-rate.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"j2-argument-of-perigee-rate.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=j2-nodal-precession-rate.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"j2-nodal-precession-rate.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-nodal-precession-rate.spec.ts"],"names":[],"mappings":""}
@@ -1,99 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test, { describe } from 'node:test';
3
- import { relClose } from 'packages/equations/src/__tests__/helpers';
4
- import { j2NodalPrecessionRate } from '../j2-nodal-precession-rate';
5
- import { rad } from '../../helpers/radians';
6
- describe('j2NodalPrecessionRate', () => {
7
- test('computes Ωdot from the reference formula (typical Earth-ish LEO inputs)', () => {
8
- const J2 = 1.08262668e-3;
9
- const n = 0.001078; // rad/s
10
- const Re = 6378.137; // km
11
- const a = 7000; // km
12
- const i = rad((98 * Math.PI) / 180);
13
- const e = 0.001;
14
- const omegaDot = j2NodalPrecessionRate(J2, n, Re, a, i, e);
15
- const expected = (-1.5 * J2 * n * Math.pow(Re / a, 2) * Math.cos(i)) /
16
- Math.pow(1 - e * e, 2);
17
- relClose(omegaDot, expected);
18
- });
19
- test('sign check: prograde (i < 90°) gives negative Ωdot; retrograde (i > 90°) gives positive Ωdot', () => {
20
- const J2 = 1e-3;
21
- const n = 0.001;
22
- const Re = 6000;
23
- const a = 7000;
24
- const e = 0;
25
- const prograde = j2NodalPrecessionRate(J2, n, Re, a, rad((30 * Math.PI) / 180), e);
26
- const retrograde = j2NodalPrecessionRate(J2, n, Re, a, rad((120 * Math.PI) / 180), e);
27
- assert.ok(prograde < 0, `expected prograde Ωdot < 0, got ${prograde}`);
28
- assert.ok(retrograde > 0, `expected retrograde Ωdot > 0, got ${retrograde}`);
29
- });
30
- test('polar orbit (i = 90°) gives ~0 Ωdot', () => {
31
- const J2 = 1e-3;
32
- const n = 0.001;
33
- const Re = 6000;
34
- const a = 7000;
35
- const e = 0;
36
- const omegaDot = j2NodalPrecessionRate(J2, n, Re, a, rad(Math.PI / 2), e);
37
- relClose(omegaDot, 0, 1e-12);
38
- });
39
- test('with e = 0, denominator is 1 (matches simplified circular-orbit form)', () => {
40
- const J2 = 1.08262668e-3;
41
- const n = 0.001;
42
- const Re = 6378.137;
43
- const a = 7000;
44
- const i = rad((45 * Math.PI) / 180);
45
- const e = 0;
46
- const omegaDot = j2NodalPrecessionRate(J2, n, Re, a, i, e);
47
- const expected = -1.5 * J2 * n * Math.pow(Re / a, 2) * Math.cos(i);
48
- relClose(omegaDot, expected);
49
- });
50
- test('throws TypeError when any input is not finite', () => {
51
- const J2 = 1e-3;
52
- const n = 0.001;
53
- const Re = 6000;
54
- const a = 7000;
55
- const i = rad(0);
56
- const e = 0;
57
- assert.throws(() => j2NodalPrecessionRate(Number.NaN, n, Re, a, i, e), (err) => err instanceof TypeError &&
58
- err.message === 'J2 must be a finite number. Received: NaN');
59
- assert.throws(() => j2NodalPrecessionRate(J2, Number.POSITIVE_INFINITY, Re, a, i, e), (err) => err instanceof TypeError &&
60
- err.message === 'n must be a finite number. Received: Infinity');
61
- assert.throws(() => j2NodalPrecessionRate(J2, n, Number.NEGATIVE_INFINITY, a, i, e), (err) => err instanceof TypeError &&
62
- err.message === 'Re must be a finite number. Received: -Infinity');
63
- assert.throws(() => j2NodalPrecessionRate(J2, n, Re, Number.NaN, i, e), (err) => err instanceof TypeError &&
64
- err.message === 'a must be a finite number. Received: NaN');
65
- assert.throws(() => j2NodalPrecessionRate(J2, n, Re, a, rad(Number.NaN), e), (err) => err instanceof TypeError &&
66
- err.message === 'i must be a finite number. Received: NaN');
67
- assert.throws(() => j2NodalPrecessionRate(J2, n, Re, a, i, Number.NaN), (err) => err instanceof TypeError &&
68
- err.message === 'e must be a finite number. Received: NaN');
69
- });
70
- test('throws RangeError when n < 0', () => {
71
- assert.throws(() => j2NodalPrecessionRate(1e-3, -1e-9, 6000, 7000, rad(0), 0), (err) => err instanceof RangeError &&
72
- err.message === 'n must be >= 0. Received: -1e-9');
73
- });
74
- test('throws RangeError when Re <= 0', () => {
75
- assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 0, 7000, rad(0), 0), (err) => err instanceof RangeError &&
76
- err.message === 'Re must be > 0. Received: 0');
77
- });
78
- test('throws RangeError when a <= 0', () => {
79
- assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 6000, 0, rad(0), 0), (err) => err instanceof RangeError &&
80
- err.message === 'a must be > 0. Received: 0');
81
- });
82
- test('throws RangeError when e is outside [0, 1]', () => {
83
- assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 6000, 7000, rad(0), -1e-9), (err) => err instanceof RangeError &&
84
- err.message === 'e must be in [0, 1]. Received: -1e-9');
85
- assert.throws(() => j2NodalPrecessionRate(1e-3, 1e-3, 6000, 7000, rad(0), 1), (err) => err instanceof RangeError &&
86
- err.message === 'e must be in [0, 1]. Received: 1');
87
- });
88
- test('as e increases, |Ωdot| increases due to (1 - e²)⁻²', () => {
89
- const J2 = 1e-3;
90
- const n = 0.001;
91
- const Re = 6000;
92
- const a = 7000;
93
- const i = rad((60 * Math.PI) / 180);
94
- const omegaDot0 = j2NodalPrecessionRate(J2, n, Re, a, i, 0);
95
- const omegaDot5 = j2NodalPrecessionRate(J2, n, Re, a, i, 0.5);
96
- assert.ok(Math.abs(omegaDot5) > Math.abs(omegaDot0), `expected |Ωdot| to increase with e: ${omegaDot0} -> ${omegaDot5}`);
97
- });
98
- });
99
- //# sourceMappingURL=j2-nodal-precession-rate.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"j2-nodal-precession-rate.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/j2-nodal-precession-rate.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=kepler-period.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kepler-period.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/kepler-period.spec.ts"],"names":[],"mappings":""}
@@ -1,72 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test, { describe } from 'node:test';
3
- import { relClose } from 'packages/equations/src/__tests__/helpers';
4
- import { keplerPeriod } from '../kepler-period';
5
- describe('keplerPeriod', () => {
6
- test('GEO sanity: a ≈ 42,164 km around Earth → T ≈ 86,164 s', () => {
7
- const a = 42164e3; // m
8
- const muEarth = 3.986004418e14; // m³/s²
9
- const T = keplerPeriod(a, muEarth);
10
- const ref = 86164.0905; // sidereal day (s)
11
- // Keep tolerance modest: orbit isn't exactly Keplerian in reality; our formula is ideal
12
- relClose(T, ref, 1e-3); // 0.1% relative tolerance
13
- });
14
- test('LEO circular (~400 km): a = Re + 400 km → T ~ 5550 s', () => {
15
- const a = 6378e3 + 400e3; // m
16
- const muEarth = 3.986004418e14; // m³/s²
17
- const T = keplerPeriod(a, muEarth);
18
- const ref = 5550; // ~92.5 min
19
- relClose(T, ref, 5e-2); // 5% slack; depends on precise constants
20
- });
21
- test('Scaling with semi-major axis: T ∝ a^(3/2) (same μ)', () => {
22
- const mu = 3.986004418e14;
23
- const a1 = 7000e3;
24
- const a2 = 2 * a1;
25
- const T1 = keplerPeriod(a1, mu);
26
- const T2 = keplerPeriod(a2, mu);
27
- const expectedRatio = Math.pow(2, 1.5); // 2^(3/2)
28
- relClose(T2 / T1, expectedRatio, 1e-12);
29
- });
30
- test('Scaling with μ: doubling μ reduces T by 1/√2 (same a)', () => {
31
- const a = 10000e3;
32
- const mu = 3.986004418e14;
33
- const T1 = keplerPeriod(a, mu);
34
- const T2 = keplerPeriod(a, 2 * mu);
35
- const expectedRatio = 1 / Math.SQRT2;
36
- relClose(T2 / T1, expectedRatio, 1e-12);
37
- });
38
- test('Heliocentric: a = 1 AU around Sun → T ≈ 365.256 days', () => {
39
- const AU = 149597870700; // m (IAU 2012)
40
- const muSun = 1.32712440018e20; // m³/s²
41
- const T = keplerPeriod(AU, muSun);
42
- const siderealYear = 365.256363004 * 86400; // s
43
- relClose(T, siderealYear, 1e-3); // 0.1% tolerance
44
- });
45
- test('Input validation: a <= 0, μ <= 0, or non-finite throws', () => {
46
- const a = 7000e3;
47
- const mu = 3.986004418e14;
48
- // a invalid
49
- assert.throws(() => keplerPeriod(0, mu), /positive/);
50
- assert.throws(() => keplerPeriod(-1, mu), /positive/);
51
- assert.throws(() => keplerPeriod(Number.NaN, mu), /finite/);
52
- // μ invalid
53
- assert.throws(() => keplerPeriod(a, 0), /positive/);
54
- assert.throws(() => keplerPeriod(a, -1), /positive/);
55
- assert.throws(() => keplerPeriod(a, Number.NaN), /finite/);
56
- });
57
- test('Numerical stability: very large a still yields finite result', () => {
58
- const a = 1e9; // 1,000,000 km
59
- const muEarth = 3.986004418e14; // m³/s²
60
- const T = keplerPeriod(a, muEarth);
61
- assert.ok(Number.isFinite(T) && T > 0);
62
- });
63
- // Optional tight identity test against the formula directly
64
- test('Definition check: T = 2π * sqrt(a^3/μ)', () => {
65
- const a = 12345678; // m
66
- const mu = 7.654321e13; // m³/s²
67
- const T = keplerPeriod(a, mu);
68
- const expected = 2 * Math.PI * Math.sqrt((a * a * a) / mu);
69
- relClose(T, expected, 1e-15);
70
- });
71
- });
72
- //# sourceMappingURL=kepler-period.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kepler-period.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/kepler-period.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mean-motion.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mean-motion.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/mean-motion.spec.ts"],"names":[],"mappings":""}
@@ -1,48 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test, { describe } from 'node:test';
3
- import { meanMotion } from '../mean-motion';
4
- import { relClose } from 'packages/equations/src/__tests__/helpers';
5
- describe('meanMotion', () => {
6
- test('computes n = sqrt(mu / a^3) for a typical Earth orbit (km-based)', () => {
7
- const mu = 398600.4418; // km³/s²
8
- const a = 7000; // km
9
- const n = meanMotion(mu, a);
10
- const expected = Math.sqrt(mu / (a * a * a));
11
- relClose(n, expected);
12
- assert.ok(n > 0);
13
- });
14
- test('scales as a^(-3/2): doubling a reduces n by 2^(3/2)', () => {
15
- const mu = 398600.4418;
16
- const a1 = 7000;
17
- const a2 = 2 * a1;
18
- const n1 = meanMotion(mu, a1);
19
- const n2 = meanMotion(mu, a2);
20
- const expectedRatio = 1 / Math.pow(2, 3 / 2); // n2/n1
21
- relClose(n2 / n1, expectedRatio);
22
- });
23
- test('scales as sqrt(mu): quadrupling mu doubles n', () => {
24
- const mu1 = 100;
25
- const mu2 = 4 * mu1;
26
- const a = 10;
27
- const n1 = meanMotion(mu1, a);
28
- const n2 = meanMotion(mu2, a);
29
- relClose(n2 / n1, 2);
30
- });
31
- test('throws TypeError when mu is not finite (NaN)', () => {
32
- assert.throws(() => meanMotion(Number.NaN, 1), (err) => err instanceof TypeError &&
33
- err.message === 'mu must be finite. Received: NaN');
34
- });
35
- test('throws TypeError when a is not finite (Infinity)', () => {
36
- assert.throws(() => meanMotion(1, Number.POSITIVE_INFINITY), (err) => err instanceof TypeError &&
37
- err.message === 'a must be finite. Received: Infinity');
38
- });
39
- test('throws RangeError when mu <= 0 (mu === 0)', () => {
40
- assert.throws(() => meanMotion(0, 1), (err) => err instanceof RangeError &&
41
- err.message === 'mu must be > 0. Received: 0');
42
- });
43
- test('throws RangeError when a <= 0 (a === 0)', () => {
44
- assert.throws(() => meanMotion(1, 0), (err) => err instanceof RangeError &&
45
- err.message === 'a must be > 0. Received: 0');
46
- });
47
- });
48
- //# sourceMappingURL=mean-motion.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mean-motion.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/mean-motion.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=peri-apoapsis-radii.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"peri-apoapsis-radii.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/peri-apoapsis-radii.spec.ts"],"names":[],"mappings":""}