UNPKG

10.3 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /**
8 * @copyright 2013 Sonia Keys
9 * @copyright 2016 commenthol
10 * @license MIT
11 * @module kepler
12 */
13/**
14 * Kepler: Chapter 30, Equation of Kepler.
15 */
16
17exports.trueAnomaly = trueAnomaly;
18exports.radius = radius;
19exports.kepler1 = kepler1;
20exports.kepler2 = kepler2;
21exports.kepler2a = kepler2a;
22exports.kepler2b = kepler2b;
23exports.kepler3 = kepler3;
24exports.kepler4 = kepler4;
25
26var _base = require('./base');
27
28var _base2 = _interopRequireDefault(_base);
29
30var _iterate = require('./iterate');
31
32var _iterate2 = _interopRequireDefault(_iterate);
33
34function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
36/**
37 * True returns true anomaly ν for given eccentric anomaly E.
38 *
39 * @param {number} e - eccentricity
40 * @param {number} E - eccentric anomaly in radians.
41 * @return true anomaly ν in radians.
42 */
43function trueAnomaly(E, e) {
44 // (30.1) p. 195
45 return 2 * Math.atan(Math.sqrt((1 + e) / (1 - e)) * Math.tan(E * 0.5));
46}
47
48/**
49 * Radius returns radius distance r for given eccentric anomaly E.
50 *
51 * Result unit is the unit of semimajor axis a (typically AU.)
52 *
53 * @param {number} e - eccentricity
54 * @param {number} E - eccentric anomaly in radians
55 * @param {number} a - semimajor axis
56 * @return {number} radius distance in unit of `a`
57 */
58function radius(E, e, a) {
59 // (E, e, a float64) float64
60 // (30.2) p. 195
61 return a * (1 - e * Math.cos(E));
62}
63
64/**
65 * Kepler1 solves Kepler's equation by iteration.
66 *
67 * The iterated formula is
68 *
69 * E1 = m + e * sin(E0)
70 *
71 * For some vaues of e and M it will fail to converge and the
72 * function will return an error.
73 *
74 * @throws Error
75 * @param {number} e - eccentricity
76 * @param {number} m - mean anomaly in radians
77 * @param {number} places - (int) desired number of decimal places in the result
78 * @return {number} eccentric anomaly `E` in radians.
79 */
80function kepler1(e, m, places) {
81 var f = function f(E0) {
82 return m + e * Math.sin(E0); // (30.5) p. 195
83 };
84 return _iterate2.default.decimalPlaces(f, m, places, places * 5);
85}
86
87/**
88 * Kepler2 solves Kepler's equation by iteration.
89 *
90 * The iterated formula is
91 *
92 * E1 = E0 + (m + e * sin(E0) - E0) / (1 - e * cos(E0))
93 *
94 * The function converges over a wider range of inputs than does Kepler1
95 * but it also fails to converge for some values of e and M.
96 *
97 * @throws Error
98 * @param {number} e - eccentricity
99 * @param {number} m - mean anomaly in radians
100 * @param {number} places - (int) desired number of decimal places in the result
101 * @return {number} eccentric anomaly `E` in radians.
102 */
103function kepler2(e, m, places) {
104 // (e, M float64, places int) (E float64, err error)
105 var f = function f(E0) {
106 var _base$sincos = _base2.default.sincos(E0),
107 _base$sincos2 = _slicedToArray(_base$sincos, 2),
108 se = _base$sincos2[0],
109 ce = _base$sincos2[1];
110
111 return E0 + (m + e * se - E0) / (1 - e * ce); // (30.7) p. 199
112 };
113 return _iterate2.default.decimalPlaces(f, m, places, places);
114}
115
116/**
117 * Kepler2a solves Kepler's equation by iteration.
118 *
119 * The iterated formula is the same as in Kepler2 but a limiting function
120 * avoids divergence.
121 *
122 * @throws Error
123 * @param {number} e - eccentricity
124 * @param {number} m - mean anomaly in radians
125 * @param {number} places - (int) desired number of decimal places in the result
126 * @return {number} eccentric anomaly `E` in radians.
127 */
128function kepler2a(e, m, places) {
129 // (e, M float64, places int) (E float64, err error)
130 var f = function f(E0) {
131 var _base$sincos3 = _base2.default.sincos(E0),
132 _base$sincos4 = _slicedToArray(_base$sincos3, 2),
133 se = _base$sincos4[0],
134 ce = _base$sincos4[1];
135 // method of Leingärtner, p. 205
136
137
138 return E0 + Math.asin(Math.sin((m + e * se - E0) / (1 - e * ce)));
139 };
140 return _iterate2.default.decimalPlaces(f, m, places, places * 5);
141}
142
143/**
144 * Kepler2b solves Kepler's equation by iteration.
145 *
146 * The iterated formula is the same as in Kepler2 but a (different) limiting
147 * function avoids divergence.
148 *
149 * @throws Error
150 * @param {number} e - eccentricity
151 * @param {number} m - mean anomaly in radians
152 * @param {number} places - (int) desired number of decimal places in the result
153 * @return {number} eccentric anomaly `E` in radians.
154 */
155function kepler2b(e, m, places) {
156 // (e, M float64, places int) (E float64, err error)
157 var f = function f(E0) {
158 var _base$sincos5 = _base2.default.sincos(E0),
159 _base$sincos6 = _slicedToArray(_base$sincos5, 2),
160 se = _base$sincos6[0],
161 ce = _base$sincos6[1];
162
163 var d = (m + e * se - E0) / (1 - e * ce);
164 // method of Steele, p. 205
165 if (d > 0.5) {
166 d = 0.5;
167 } else if (d < -0.5) {
168 d = -0.5;
169 }
170 return E0 + d;
171 };
172 return _iterate2.default.decimalPlaces(f, m, places, places);
173}
174
175/**
176 * Kepler3 solves Kepler's equation by binary search.
177 *
178 * @throws Error
179 * @param {number} e - eccentricity
180 * @param {number} m - mean anomaly in radians
181 * @return {number} eccentric anomaly `E` in radians.
182 */
183function kepler3(e, m) {
184 // (e, m float64) (E float64)
185 // adapted from BASIC, p. 206
186 m = _base2.default.pmod(m, 2 * Math.PI);
187 var f = 1;
188 if (m > Math.PI) {
189 f = -1;
190 m = 2 * Math.PI - m;
191 }
192 var E0 = Math.PI * 0.5;
193 var d = Math.PI * 0.25;
194 for (var i = 0; i < 53; i++) {
195 var M1 = E0 - e * Math.sin(E0);
196 if (m - M1 < 0) {
197 E0 -= d;
198 } else {
199 E0 += d;
200 }
201 d *= 0.5;
202 }
203 if (f < 0) {
204 return -E0;
205 }
206 return E0;
207}
208
209/**
210 * Kepler4 returns an approximate solution to Kepler's equation.
211 *
212 * It is valid only for small values of e.
213 *
214 * @param {number} e - eccentricity
215 * @param {number} m - mean anomaly in radians
216 * @return {number} eccentric anomaly `E` in radians.
217 */
218function kepler4(e, m) {
219 // (e, m float64) (E float64)
220 var _base$sincos7 = _base2.default.sincos(m),
221 _base$sincos8 = _slicedToArray(_base$sincos7, 2),
222 sm = _base$sincos8[0],
223 cm = _base$sincos8[1];
224
225 return Math.atan2(sm, cm - e); // (30.8) p. 206
226}
227
228exports.default = {
229 trueAnomaly: trueAnomaly,
230 true: trueAnomaly, // BACKWARDS-COMPATIBILITY
231 radius: radius,
232 kepler1: kepler1,
233 kepler2: kepler2,
234 kepler2a: kepler2a,
235 kepler2b: kepler2b,
236 kepler3: kepler3,
237 kepler4: kepler4
238};
\No newline at end of file