ワンライナー・ライフゲーム


別の方法:https://www.google.com/search?q=conway%27s+game+of+life

Twitterで知った、Mathematicaによるワンライナー・ライフゲーム

「ライフゲームとは何か?」とか「224って何?」という疑問には後で答えるとして、とりあえず動かしてみる(RSS Readerでは何も見えないかもしれないが、Wolfram CDF Playerがインストールされていれば実際に動かすことができる。UMMでも動く)。

ListAnimate[ArrayPlot/@ CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},{RandomInteger[1,{9,9}],0},90]]


ライフゲームをこんなに短く書けることに驚く。どのくらい短いかというと、Mathematicaの開発元であるWolfram社のトップ、Wolfram氏の著書A New Kind of ScienceiPad版)に載っているコードよりも短い、しかも汎用的(「ウラムの珊瑚礁」なんかは自信ないが)。おそらく、この本に載っているような研究をしやすくするためにMathematicaに導入されたのだろう、関数CellularAutomatonは、ライフゲームに限らず一般的なセル・オートマトンに対応している。


ちなみに、上の例で使っている「グライダー」を、ハッカー・エンブレムにしよう、という話がかつてあった。

これは、ライフゲームの広い世界の入り口でしかない。さらに探索したいという人には、パウンドストーン「ライフゲイムの宇宙」(日本評論社, 2003)クヌース「コンピュータ科学者がめったに語らないこと」(エスアイビー・アクセス, 2003)がおすすめ。

45357838374434036173

地球の反対側はどこか—ブラジル・シンドローム


梅津信幸『なぜコンピュータの画像はリアルに見えるのか 』(NTT出版, 2009)を読むまで気付いていなかったのですが、ドラゴンクエストのような標準的なRPGの世界って、球ではなくトーラスなんですね。

幸いなことに、私たちの住む地球はほぼ球なので、引力がどうなっているのかなどを気にする必要はありません。でも、フクシマの反対側は気になるのです。

みんな大好きWolframAlphaは、その問いにすぐに答えてくれました。

みんな大好きGoogle Mapsは、地球の反対側をインタラクティブに調べるのに便利かもしれません。

Google Earthならインタラクションを少し派手にできますが、動作する環境が限られるという欠点があります。

Mathematicaも、インタラクティブなツールをかなり簡単につくれます。たいていの人は動作する環境を持っていないので、下の出力がインタラクティブなものであることをわかってもらうのは面倒なのですが、Wolfram CDF Playerがインストールされていれば実際に動かすことができます。(UMMでも動きます。)

<< WorldPlot`

antipode[{lngMin_, latMin_}] :=
 {-latMin, If[lngMin > 0, lngMin - 180 60, lngMin + 180 60]}

With[{map = WorldPlot[World]},
 Manipulate[Show[{
    map,
    WorldGraphics[{PointSize[0.05], Red, Point[antipode[place]]}]}],
  {{place, {0, 0}}, Locator}]]


地球が完全な球では無いことは考慮していませんが、WolframAlphaの結果とだいたい同じなので、とりあえずよしとしましょう。

Excelのようなプログラミング


Mathematicaはバージョン6でDynamicというおもしろい機能が追加されました(動的言語とは関係ありません。もとから動的ですし)。いろんな解釈があると思いますが、Dynamicで何ができるかというと、Excelのようなプログラミングです。ここで考えているExcelの機能とは、複数のセルが関連しているところで、あるセルの値が変更されると、関連するセルの値が自動的に再計算される、というものです。

Dynamicによって、Mathematicaのプログラミングスタイルは大きく変わると思うのですが、残念ながら、今のところは「GUIを簡単に作れる」という応用が主になっています。

たとえばこんな感じです。

center[p_, q_, r_] :=
 With[{np = Normalize@p, nq = Normalize@q},
  r Normalize[np + nq]/Sin[ArcCos[np.nq]/2]]

Manipulate[
 Graphics[{
   Line@{o, p},
   Line@{o, q},
   Circle[o + center[p - o, q - o, r], r]
   }, PlotRange -> 2],
 {{o, {-1, 0}}, Locator},
 {{p, {0, 1}}, Locator},
 {{q, {0, -1}}, Locator},
 {{r, 1}, 0, 2},
 SaveDefinitions -> True]

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


「こういうことがCAD上でできたらおもしろい」と思ったのですが、AutoCADなんかですでに実現されていますね。

だから、Mathematicaを使う人たちは、もっと別の応用を考えなければいけないのです。

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


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

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

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

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

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

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

運動エネルギーとポテンシャルエネルギーから運動方程式を導き、数値的解きます。解く時は、保存量(全エネルギーと運動量、角運動量)が保存されるようにします(UMMでも計算できます)。

Wolfram CDF Playerがインストールされていれば操作できます。


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

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

保存量の変化

ケプラー問題の数値解


逆二乗の中心力のもとで物体がどのように運動するかを調べるケプラー問題。微分方程式を解く能力がなければ楽しめないかと言えば、そういうわけでもない(物理を勉強する人にはもちろん必須)。

最近の強力なプログラミング環境を使えば、物体の軌道を簡単に視覚化できる。インタラクティブなものにするのも簡単(さすがに、微分方程式は立てられないといけない)。

Mathematicaならこんな感じ(インタラクティブに操作できるのは、重力の強さを決めるkと時間の上限tmax、初速度v0、初期座標pos)。Wolfram CDF Playerがインストールされていれば実際に動かすことができる(UMMでも動く)。

Manipulate[
 s = NDSolve[{
    x''[t] == -k x[t]/(x[t]^2 + y[t]^2)^(3/2),
    y''[t] == -k y[t]/(x[t]^2 + y[t]^2)^(3/2),
    x[0] == pos[[1]], y[0] == pos[[2]],
    x'[0] == v0[[1]], y'[0] == v0[[2]]},
   {x[t], y[t]},
   {t, 0, tmax}];
 ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, tmax}],
 
 {{k, 5}, 1, 10},
 {{tmax, 10}, 1, 100},
 {{pos, {2, 1}}, Locator},
 {{v0, {-1, -1}}, {-5, -5}, {5, 5}}]


Mathematicaの微分方程式ソルバーNDSolveはかなり強力で、このエントリのような単純なものだけではなく、摂動があるような問題も扱える。

解析的に解きたい人は、ランダウ=リフシッツ『力学・場の理論』のような教科書を参照して欲しい(福島登志夫『天体の位置と運動』の方がやさしいかな )。

参考:Mathematicaで解くケプラー問題

ジンマーマン, オルネス『物理学のためのMathematica』では、ハミルトン=ヤコビ方程式を使う方法が紹介されている。

関連:プリンキピアを読む