我々には少し先までしか見えないが、そこになすべきことをたっぷりと見付けることができる。
―アラン・チューリング
以前,セル・オートマトンに関係するプログラミングで作った反応拡散方程式シミュレーションのお話です.
眠らせておくのももったいないので,ここで紹介しておきます.
反応拡散方程式というのは,ある空間上での何かの物質の濃度の変化を表現した微分方程式です.もともとは化学の分野で反応をモデル化する際に考えられたものですが,その解が複雑な振る舞いをすることから様々な分野で興味の対象となり,実世界の模様との関連性が指摘されたりもしています.
今回はこの反応拡散方程式のシミュレータの紹介です.まずは動画をどうぞ.
この模様はチューリングパターンと呼ばれ,動物の模様や植生の分布などに類似の模様が見られることがあります.
今回扱う反応拡散方程式は1980年代に提案されたGray-Scottモデルと呼ばれるもので,以下の形に書き下されます.
uとvという2種類の物質(?)についての式で,左辺が変化の度合い,右辺第1項が拡散,第2項が反応,第3項が生成と消滅に対応しています.Fとかkとかはパラメータです.
解析的に解けなさそうな式ですが,差分方程式にしてしまえばコンピュータで解くのはそれほど困難ではありません.得られるパターンが独特かつパラメータによって多様に変化するので,数値解析の例題としてはなかなか楽しい部類に入るのではないかと思います.
私がこの反応拡散方程式にはじめて出会ったのは,まともにプログラミングを学んだ少し後の頃でしたが,当時紹介されていた動画などを見てすっかり気に入ってしまった記憶があります.
1つは「ぬるぬる」している点です.特にはじめて触った頃のプログラミングというのはテキストや数式を扱うことが多いため,どうにも真四角でお固い世界だと錯覚しがちです.こんな「ぬるぬる」は当時の私にとってあまりコンピュータっぽくなかったというのがあります.
もう1つは,式が簡単であることです.すごく複雑なものが複雑な式から出てくるならまあわかりますが,この式自体はそれほど複雑ではありません.
各部分では単に隣接した点の情報のみから変化しているだけなのですが,それでも全体としてパターンが現れるというのはなかなか面白いと思います.
プログラムを置いておきます.手元の 64bit Windows 用(7で動作確認済み)なので,実行できない方は一番下のソースコードからコンパイルしてみて下さい.
マウスでドラッグした部分が消せます.キーボードの左2列(1,2,q,w,a,s,z,x)でパラメータの変更,iキーで分布を初期化できます.
rd_system_2 [追記: 録画用でウィンドウが小さいままだったので大きくしました.]
rd_system_32bit [さらに追記: 32bit版も用意しました]
私の大学の機械工学科には「シミュレーション & ビジュアライゼーション演習」という授業があります.この授業では何らかのシミュレーションの可視化に挑戦します.
実際に扱う対象は連続体というよりはどちらかというと剛体系の人が多いかと思いますが,何にしても可視化してみるというのは楽しいもので,あれこれ計算した結果が絵になって出てくる達成感がある気がします.
私も昨年度TAで参加したときに楽しませてもらいました.
プログラミングでちょっと遊んでみたいという人は,マイコンのような動くものにつなげてみるか,あるいはこういう可視化のできるもので何か作ってみると手ごたえを感じやすいと思います.
実装はC++/OpenGL+freeglut,方程式は1次の陽解法です.私はこういうものを作るときはたいていC# & 速度の必要な部分のみC++で実装してしまうのですが(実はこれもそうでした),今回は公開する前に移植しやすいようにC++で書き直してみました.
ソースはgithubにあげておきます.
githubを使うのははじめてなので,何か不具合があったら申し訳ございません.