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

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

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

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

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

Ver. 11.1以降では次のようにも書けます。

ListAnimate[ArrayPlot/@ CellularAutomaton["GameOfLife",{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がインストールされていれば実際に動かすことができます。

<< 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がインストールされていれば実際に動かすことができます。


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

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

ケプラー問題の数値解

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

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

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

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』では、ハミルトン=ヤコビ方程式を使う方法が紹介されている。

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