ピタゴラス3体問題 (Burrau’s problem of three bodies)


機械で「心」を作る~「AIの父」ミンスキー氏が早稲田大学で講演

コンピュータサイエンスは重要だがコンピュータそのものが重要なわけではない、とミンスキー氏は強調した。それは解けない方程式があっても、コンピュータを使うことで何が起こるかを見る事ができるからだ。それがコンピュータがなく数学しかなかった時代との違いだとミンスキー氏はいわゆる「3体問題」など力学の問題を例に出して説明した。

「3体問題」の有名なものに、ピタゴラス3体問題があります。図のような3:4:5の直角三角形の頂点上に静止させた、質量3, 4, 5の質点の運動を調べるというものです。

天体力学のパイオニアたち―カオスと安定性をめぐる人物史〈上〉 (シュプリンガー数学クラブ) (単行本)この問題は1893年には知られていましたが、数値的にでさえ、解決は1966年になってからです。ディアク,ホームズ『天体力学のパイオニアたち』によれば、粒子の2つが連星を形成し、第3体が高速度ではじき飛ばされるという結論は、驚くべきものだったそうです。

これを数値的に解くのは、コンピュータ無しではまあ無理ですよね。「この問題をちゃんと解くのは大変ですよ。(よく知られた微分方程式の数値解法である)ルンゲ・クッタじゃぜんぜんだめですよ」と言っていた天体力学の教授の言葉が思い出されますが、ちょうど、Mathematicaならケプラー問題の数値解を簡単に求められるという記事に対して、「でも、計算精度は大丈夫でしょうか」と訊かれたところだったので、コンピュータがあれば簡単だということを確認してみましょう。

必要な精度は状況によるので、絶対大丈夫とは言えませんが、たいていの場合には、十分よい精度で計算すると思います。有名なピタゴラス3体問題で調べてみましょう。

運動エネルギーとポテンシャルエネルギーからラグランジアンを、ラグランジアンから運動方程式を導き、解きます。解く時は、保存量(全エネルギーと運動量、角運動量)が保存されるようにするといいでしょう。

(* Mass *)
m = {3, 4, 5};
(* Coordination *)
q = {{x1[t], y1[t]}, {x2[t], y2[t]}, {x3[t], y3[t]}};
(* Kinetic energy *)
V = Sum[m[[i]] Sum[D[q[[i, j]], t]^2,
      {j, 1, Length@q[[i]]}], {i, 1, Length@q}]/2;
(* Potential energy *)
U = -Total[
    Sum[Sum[m[[i]] m[[j]]/Sqrt[Total[(q[[i]] - q[[j]])^2]],
      {j, i + 1, Length@q}], {i, 1, Length@q - 1}]];
(* Lagrangian *)
L = V - U;
(* Momentum *)
p = Table[D[V, D[q[[i, j]], t]], {i, 1, 3}, {j, 1, 2}];
(* Angular momentum *)
Mz = Table[
   Cross[Append[q[[i]], 0], Append[p[[i]], 0]][[3]], {i, 1, 3}];
(* Equations of motion *)
eqns = Table[D[D[L, D[q[[i, j]], t]], t] == D[L, q[[i, j]]],
   {i, 1, 3}, {j, 1, 2}];
initialCondition = {{
     x1[0] == 1, y1[0] == 3,
     x2[0] == -2, y2[0] == -1,
     x3[0] == 1, y3[0] == -1},
    Table[D[q[[i, j]], t] == 0 /. t -> 0,
     {i, 1, 3}, {j, 1, 2}]} // Flatten;

tmax = 70;
s = NDSolve[
   {eqns, initialCondition} // Flatten,
   {q, D[q, t]} // Flatten,
   {t, 0, tmax},
   Method -> {"Projection",
     Method -> "ExplicitRungeKutta",
     "Invariants" -> {V + U, Total[p][[1]], Total[p][[2]], Total[Mz]}},
   StartingStepSize -> 0.01];

plots = Table[
   Show[
    ParametricPlot[Evaluate[q[[1]] /. s], {t, 0, time},
     PlotStyle -> Red, PlotRange -> {{-5, 5}, {-5, 5}}],
    ParametricPlot[Evaluate[q[[2]] /. s], {t, 0, time},
     PlotStyle -> Blue, PlotRange -> {{-5, 5}, {-5, 5}}],
    ParametricPlot[Evaluate[q[[3]] /. s], {t, 0, time},
     PlotStyle -> Green, PlotRange -> {{-5, 5}, {-5, 5}}]
    ], {time, 0.01, tmax}];
ListAnimate[plots]

Wolfram CDF Playerがインストールされていれば動きます(UMMでも動きます)。

この結果は、Burrau’s problem of three bodiesで紹介されているものとだいたいあっています。(リンク先にはこの問題を数値的に解いたSzebehelyの論文があります。)

最後に、保存量が実際に保存されているかどうかを見ておきましょう。

保存量の変化

Related posts:

  1. 微分方程式、それが目的ではないとき
  2. ケプラー問題の数値解
  3. プレゼント交換の手伝い
  4. 行列の計算、それが目的ではないとき(Mathematica版)
  5. 数値積分、それが目的ではないとき

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>