ベッセル関数によるケプラー方程式のフーリエ級数解
ケプラー方程式
$$u – e \sin u = \omega t$$
のフーリエ級数解は,ベッセル関数 $J_n(x)$ を使って以下のように書ける。
$$u = \omega t+ \sum_{n=1}^{\infty} \frac{2}{n} J_n(n e) \sin(n\, \omega t)$$
現実世界では無限大まで足し算はできないので,以下のように $N$ までの和をとることにする。
$$u(N, e, \omega t) = \omega t+ \sum_{n=1}^{N} \frac{2}{n} J_n(n e) \sin(n\, \omega t)$$
これを Maxima の関数として定義する。
Ubes(N, e, omegat):=
omegat + sum(2/n * bessel_j(n, n*e) * sin(n * omegat), n, 1, N);
/* たとえば N=10, e=0.5, omegat = 1.0 の値 */
Ubes(10, 0.5, 1.0);
逐次近似法によるケプラー方程式の近似解
離心率 $e$ は $0 \leq e < 1$ であることから,ケプラー方程式
$$u – e \sin u = \omega t$$
を以下のように逐次近似的に解いてみます。
\begin{eqnarray}
u &=& \omega t + e \sin u \\
u_0 &=& \omega t\\
u_1 &=& \omega t + e \sin u_0 = \omega t + e \sin \omega t\\
u_2 &=& \omega t + e \sin u_1 =\omega t + e \sin\left(\omega t + e \sin \omega t\right) \\
u_3 &=& \omega t + e \sin u_2 =\omega t + e \sin\left\{\omega t + e \sin\left(\omega t + e \sin \omega t\right)\right\} \\
&\vdots&\\
u_{n} &=& \omega t + e \sin u_{n-1} = \dots\\
\end{eqnarray}
$n$ が大きくなると,入れ子になっている項がどんどん増殖していきますが,$u_3$ のあたりまでは,近似的に $u$ は $t$ の陽関数としてあらわされているなぁ… という見た目がします。
上の式にそって,以下のように関数 $u(n, e, \omega t)$ を再帰的に定義します。
Uite(N, e, omegat):=
block(
if N = 0 then
omegat
else
omegat + e*sin(Uite(N-1, e, omegat))
)$
/* たとえば N=10, e=0.5, omegat = 1.0 の値 */
Uite(10, 0.5, 1.0);
方程式の数値解法によるケプラー方程式の数値解
$\omega t$ を与えたときに,ケプラー方程式を数値的に解いて $u(\omega t)$ を求める。ケプラー方程式は超越方程式であるので,find_root()
関数を使って数値に解く。
Unum(e, omegat):=
block(find_root(u - e*sin(u) = omegat, u, 0, 2*%pi));
/* たとえば e=0.5, omegat = 1.0 の値 */
Unum(0.5, 1.0);
数値解と近似解との比較
omt: makelist(float(%pi/10*i), i, 1, 9)$
/* 数値解 Unum と逐次近似解 Uite, フーリエ級数解 Ubes の差 */
e: 0.5$
N: 10$
printf(true," omega t Unum Uite-Unum Ubes-Unum ~%")$
for i thru length(omt) do(
printf(true, "~8,5f ~18,15f ~18,15f ~18,15f~%",
omt[i],
Unum(e, omt[i]),
Uite(N, e, omt[i])-Unum(e, omt[i]),
Ubes(N, e, omt[i])-Unum(e, omt[i]))
)$
数値解との差の二乗平均平方根
- 参考:二乗平均平方根
いわゆる RMS (root mean square)
$$RMS \equiv \sqrt{\frac{1}{n} \sum_{i=1}^n \left( U(\omega t_i)- U_{\rm num}(\omega t_i)\right)^2}$$
RMSite(N, e):=
sqrt(1/length(omt) *
sum((Uite(N, e, omt[i])-Unum(e, omt[i]))**2, i, 1, length(omt)))$
RMSbes(N, e):=
sqrt(1/length(omt) *
sum((Ubes(N, e, omt[i])-Unum(e, omt[i]))**2, i, 1, length(omt)))$
/* 浮動小数点表示の書式指定 */
printf(true, "~,15e~%", RMSite(10, 0.5))$
printf(true, "~,15e~%", RMSbes(10, 0.5))$
グラフ
$a = 5, \ e = 0.6$ の場合の楕円のグラフを描く。
\begin{eqnarray}
x(a, e, \omega t) &=& a (\cos u(\omega t) -e ) \\
y(a, e, \omega t) &=& a \sqrt{1 – e^2} \sin u(\omega t) \\
\end{eqnarray}
x(a, e, omegat):=
a*(cos(Uite(10, e, omegat)) - e);
y(a, e, omegat):=
a*sqrt(1-e**2)*sin(Uite(10, e, omegat));
/* plot2d 版 */
plot2d([parametric, x(5, 0.6, t), y(5, 0.6, t), [t, 0, 2*%pi]],
[x,-9, 3], [y, -6, 6], [same_xy])$
/* draw2d 版 */
draw2d(
/* 滑らかに曲線を描くように */
nticks = 300,
/* 表示範囲 */
xrange = [-9, 3], yrange = [-6, 6],
/* 縦横比。*/
proportional_axes = xy,
/* x 軸 y 軸の表示 */
xaxis = true, yaxis = true,
parametric(x(5, 0.6, omegat), y(5, 0.6, omegat), omegat, 0, 2*%pi)
)$
pxy: makelist([x(5, 0.6, float(%pi/18*i)),
y(5, 0.6, float(%pi/18*i))], i, 1, 36)$
/* plot2d 版 */
plot2d([discrete, pxy],
[style, [points, 1.5]],
[x,-9, 3], [y, -6, 6], [same_xy])$
/* draw2d 版 */
draw2d(
/* 表示範囲 */
xrange = [-9, 3], yrange = [-6, 6],
/* 縦横比。*/
proportional_axes = xy,
/* x 軸 y 軸の表示 */
xaxis = true, yaxis = true,
point_type = 7,
point_size = 1,
points(pxy)
)$