「楕円軌道上の時刻ごとの位置を求めるための下ごしらえ」で下ごしらえした式を Maxima で数値的に解く。
無次元化された式
「楕円軌道上の時刻ごとの位置を求めるための下ごしらえ」で下ごしらえした式(無次元化済み)。
\begin{eqnarray}
\frac{d\phi}{dT} &=& f(\phi, e) = 2 \pi \frac{(1+e \cos\phi)^2}{(1-e^2)^{3/2}} \tag{1}\\
R(\phi) &\equiv& \frac{r}{a} = \frac{1-e^2}{1+e\cos\phi} \tag{2}\\
X(\phi) &\equiv& \frac{x}{a} =R(\phi) \cos\phi \tag{3}\\
Y(\phi) &\equiv& \frac{y}{a} =R(\phi) \sin\phi \tag{4}
\end{eqnarray}
/* 微分方程式の右辺 */
f(phi, e):= 2*%pi*(1+e*cos(phi))**2/(1 - e**2)**(3/2);
R(phi, e):= (1 - e**2)/(1 + e*cos(phi));
X(phi, e):= R(phi, e) * cos(phi);
Y(phi, e):= R(phi, e) * sin(phi);
rk()
で常微分方程式を数値的に解く
/* T の初期値 */
T0: 0$
/* phi の初期値 */
phi0: 0$
/* T の終了値 */
Tend: 1$
/* 分割数 */
ndiv: 100$
Ndiv: 36$
N: Ndiv * ndiv$
/* 刻み幅 h は以下のようにして計算される。*/
h: float((Tend - T0)/N)$
/* 1階上微分方程式を Runge-Kutta 法で解く */
/* e = 0.6 */
e: 0.6$
rkphi: rk(f(phi, e), phi, phi0, [T, T0, Tend, h])$
ちょうど1周期 $T = T_{\rm end}$ たてば $\phi = 2 \pi$ になっているはずだから,数値誤差を確認する。
$$\phi(T_{\rm end}) – 2 \pi$$
rkphi[length(rkphi)][2]- float(2*%pi);
一定時間間隔ごとの位置をグラフに
一定時間間隔 $\displaystyle \Delta T = \frac{T_{\rm end}}{N_{\rm div}}$ ごとの位置:
phii: makelist(rkphi[i][2], i, 1, length(rkphi), ndiv)$
pos: makelist([X(phii[i], e), Y(phii[i], e)], i, length(phii))$
plot2d()
でグラフ作成
plot2d([discrete, pos], [style, [points,1]],
[same_xy], [x, -2, 1], [y, -1.5, 1.5])$
draw2d()
でグラフ作成
draw2d(
/* 点を塗りつぶした丸に */
point_type = 7,
/* 表示範囲 */
xrange = [-2, 1], yrange = [-1.5, 1.5],
/* 縦横比 */
proportional_axes=xy,
/* x 軸 y 軸 */
xaxis = true, yaxis = true,
/* 点の大きさ */
point_size = 0.5,
points(pos)
)$
参考:ケプラー方程式の数値解との比較
「ケプラー方程式を数値的に解いてケプラーの第2法則を視覚的に確認する」にまとめているように,楕円軌道の $x, y$ を軌道長半径 $a$ で規格化した $X_u, Y_u$ を,離心近点離角 $u$ を使って以下のようにあらわすことができる。
\begin{eqnarray}
X_u &\equiv& \frac{x}{a} = \cos u – e\\
Y_u &\equiv& \frac{y}{a} = \sqrt{1-e^2} \sin u
\end{eqnarray}
離心近点離角 $u$ と周期 $P$ で規格化された時間 $T$ との関係は,以下のケプラー方程式を数値的に解いて得られる。
\begin{eqnarray}
2\pi T &=& u – e \sin u, \quad T \equiv \frac{t}{P}
\end{eqnarray}
ケプラー方程式の数値解
$$g(u_i) \equiv u_i – e \sin u_i = \frac{2\pi}{T} t_i = \frac{2\pi}{N_{\rm div}} \times i$$
を $u_i$ について find_root()
関数で数値的に解きます。
g(u):= u - e*sin(u);
for i:0 thru Ndiv do
ui[i]: find_root(g(u) = 2*%pi/Ndiv * i, u, 0, 2*%pi)$
一定時間間隔ごとの位置
Xu(u, e):= (cos(u) - e);
Yu(u, e):= sqrt(1-e**2)*sin(u);
posu: makelist([Xu(ui[i], e), Yu(ui[i], e)], i, 0, Ndiv)$
2つの解の比較
$\phi$ に関する1階常微分方程式を数値的に解いた解である pos
と,ケプラー方程式を数値的に解いた解である posu
は,当然ながら数値誤差の範囲で一致してるはずである。
2つの配列の引き算をして差を調べる。37組全て表示すると冗長なので,代表して3組ほど。
/* 2つの数値解 X, Y の差 */
(pos-posu)[10];
(pos-posu)[20];
(pos-posu)[30];
念のために2つの数値解をグラフにすると,当然ながら重なっていることがわかる。
draw2d(
/* 点を塗りつぶした丸に */
point_type = 7,
/* 表示範囲 */
xrange = [-2, 1], yrange = [-1.5, 1.5],
/* 縦横比 */
proportional_axes=xy,
/* x 軸 y 軸 */
xaxis = true, yaxis = true,
point_size = 0.5, color = red, key = "常微分方程式の数値解",
points(pos),
point_size = 0.2, color = blue, key = "ケプラー方程式の数値解",
points(posu)
)$