ローレンツ アトラクタ
この二重振り子の話をTwitterで見かけて、面白いなぁと思いました。
Haskellで二重振り子のシミュレーションを書いた。実はこの振り子50本あって初期値を1兆分の1ぐらいずらしてあるので途中からめちゃくちゃ分岐する pic.twitter.com/3dh4Metcpj
— lotz (@lotz84_) 2017年5月22日
その後、別の方のこのようなツイートも。
先日のカオス振り子動画を見て極端な場合を試してみたくなったので、3重振り子で高精度物理演算してみた。初期の振り子の角度を10の100乗(グーゴル)分の1ずつだけずらしたものを100個同時に再生。完全に一致してるように見えるけど、1分20秒くらいから「それ」がやってくる。 pic.twitter.com/a7E2OASIDe
— So Takamoto (@tkmtSo) 2017年5月25日
うわー。楽しい。
初期値がほんの少し違うだけで、その後の挙動が大きく変化するような現象は、カオスの分野でよく研究されています。
私の場合、カオスと言ってすぐに思い当たるのがロジスティック写像とローレンツ方程式で、ローレンツ方程式だったらすぐに実装できるでしょうと思ったので、さっそくJavaScriptでアニメーション表示してみました。
カオスと言えば、ローレンツ方程式だよね!
— 三谷 純 Jun MITANI (@jmitani) 2017年5月26日
と、いうことで、1000個の点をアニメーションしてみた様子。
ローレンツ方程式 - Wikipedia https://t.co/GrgEKhRDnq pic.twitter.com/3PkltOuef5
個々の点をローレンツ アトラクタと呼ぶみたいですね。しばらく一緒に動作しながらも、ある一定時間たつと、バラバラになって、それぞれが独立して渦を描くように動き出します。
Wikipediaに掲載されている微分方程式は次の通り。
それぞれの微分値を微小時間 dt の値だけ掛けて加算すればよいので、簡単に計算できます。
プログラムコードはこんな感じ。
精度よく計算するために、ルンゲクッタ法を使用する方法が紹介されていることもありますが、今回は精度は気にしていません。初期値の設定もかなり適当ですので、いろいろいじってみると、面白い結果がえられるかもしれません。