1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _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 |
|
17 | exports.trueAnomaly = trueAnomaly;
|
18 | exports.radius = radius;
|
19 | exports.kepler1 = kepler1;
|
20 | exports.kepler2 = kepler2;
|
21 | exports.kepler2a = kepler2a;
|
22 | exports.kepler2b = kepler2b;
|
23 | exports.kepler3 = kepler3;
|
24 | exports.kepler4 = kepler4;
|
25 |
|
26 | var _base = require('./base');
|
27 |
|
28 | var _base2 = _interopRequireDefault(_base);
|
29 |
|
30 | var _iterate = require('./iterate');
|
31 |
|
32 | var _iterate2 = _interopRequireDefault(_iterate);
|
33 |
|
34 | function _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 | */
|
43 | function 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 | */
|
58 | function 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 | */
|
80 | function 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 | */
|
103 | function 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 | */
|
128 | function 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 | */
|
155 | function 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 | */
|
183 | function 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 | */
|
218 | function 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 |
|
228 | exports.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 |