カテゴリー別アーカイブ: 作ってみた

[作ってみた] [プログラミング] 反応拡散方程式で遊ぶ


我々には少し先までしか見えないが、そこになすべきことをたっぷりと見付けることができる。
―アラン・チューリング

タテジマキンチャクダイ

タテジマキンチャクダイ

以前,セル・オートマトンに関係するプログラミングで作った反応拡散方程式シミュレーションのお話です.
眠らせておくのももったいないので,ここで紹介しておきます.

反応拡散方程式というのは,ある空間上での何かの物質の濃度の変化を表現した微分方程式です.もともとは化学の分野で反応をモデル化する際に考えられたものですが,その解が複雑な振る舞いをすることから様々な分野で興味の対象となり,実世界の模様との関連性が指摘されたりもしています.

今回はこの反応拡散方程式のシミュレータの紹介です.まずは動画をどうぞ.

この模様はチューリングパターンと呼ばれ,動物の模様や植生の分布などに類似の模様が見られることがあります.

今回扱う反応拡散方程式は1980年代に提案されたGray-Scottモデルと呼ばれるもので,以下の形に書き下されます.

  \frac{\partial u}{\partial t} = D_{u}\nabla^2u - uv^2 + F(1 - u)\\   \frac{\partial v}{\partial t} = D_{v}\nabla^2v + uv^2 - (F + k)v

 

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を使うのははじめてなので,何か不具合があったら申し訳ございません.

ソース


[作ってみた] [プログラミング] Internet Explorer の正統進化


先日「Google ChromeのシェアがIEを抜いた」などというニュースが流れてきて,第二次ブラウザ戦争も新しい局面を迎えているなあ,などと考える今日この頃です.
ユーザーからすると各社がしのぎを削ってくれるのは大変素晴らしいことでもあります.

さて,アップデートが行われるたびに「大幅に進化したFireFox」「Google Chromeの進化」などと日常的に騒がれるわけですが,それって本当に進化なのでしょうか?

「進化」ということばはしばしば本来の意味からは大きく外れる使い方をされます.ことばなので使い方が変わるのは当然なのですが,こうなると困るのが本来の使い方をしていた人たちです.

進化は、生物の形質が世代を経る中で変化していく現象のことである (Wikipedia)”

とあるように,進化は別に改良されることを指す現象ではありません.大学の生態学の先生が「チンパンジーも時間がたったらヒトになるんですか?」といろんな場で聞かれて返事に困ってしまうと以前話していましたが,確かに某ゲームに親しんで育ってきてしまうとそんな誤謬も発生するのかもしれません.

ブラウザの話に戻りますが,ブラウザにとっては別に使いやすくなることが進化の目的ではありません.基本的には自分の複製を増やす(=大勢の人に使ってもらう)ことが目的であって,使いやすくなることはその手段に過ぎません.ブラウザにとって自己複製/拡大の目的が達せられるなら,ユーザーを裏切ることさえ進化となってよいはずです.

 


前置きが長くなりましたが,本題です.
IE拡張プログラムを作成しました.名付けて「利己的なプラグイン(The Selfish Plugin)」です.

このプラグインを導入すると,ページ内のGoogle Chromeの紹介/ダウンロードページへのリンクが全てIEの紹介ページのリンクに化けます.その他Chromeにまつわるページ(今のところURLにchromeという文字を含む)に全て同じ仕打ちを行います.こんな感じです:


キャプチャなのでマウスポインタがとれていませんが,検索結果のリンク先がIEになっているのがわかるかと思います.

私はIE(を含むブラウザ)について昔から「賢くないなあ」と思うことがあって,それは他のブラウザの安易な紹介です.もし私がIEだったとしたら,ユーザーが検索窓に”Chrome”と打ち込んだとき素直にChromeの紹介を見せるでしょうか?

Noです.絶対にNoです.あの手この手を使って見せまいとするに決まっています.そうでなければ死んでしまいます.

そこでこのプラグインです.この利己的なプラグインにより,IEはユーザーの目的を無視してChromeへのアクセスをなんとか拒否しようとします.積極的でないユーザーならあきらめてくれるかもしれません.
FireFox,Safariその他ブラウザへの対応も同様に可能です.

これで「IEはブラウザダウンロード用ブラウザ」などという不名誉な称号も,擬人化されて涙を流されることもきっとなくなるはずです.

やったねIE.

 

技術的な話をすると,IEの拡張なんて作ったのは初めてで,ただ話的にIEでないとできない内容だったので結局COMプログラミングに挑むことになりました.(コピー参考にしたページ:MSDN).
やっていることは単純なのでコード量的には多くありません.レジストリをいじったり面倒な作業が必要になるので完成品の公開はしませんが,一応クラスのソースだけ置いておきます.[ダウンロード]

 

あ,ちなみに私はFireFoxユーザーです.そんなに極端な使い方はしないのでなんでもよいのですが,ころころ変わると面倒なので合わせてあるだけです.