SlideShare ist ein Scribd-Unternehmen logo
1 von 83
Downloaden Sie, um offline zu lesen
反応拡散モデルを
動かしてみよう
米倉崇晃
奈良先端大・先端科学・植物発生シグナル研究室
反応拡散モデルとは何か
本日の講義資料
▪ http://www.nibb.ac.jp/miyakohp/asari/htdocs/?page_id=57
本日の講習会で用いるスライドの一部とコードは、以下のURL
からダウンロードできます。
本日は、こちらのオンラインプラットフォームを使ってシミュ
レーションを体感します。
反応拡散モデルとは何か
反応拡散方程式
▪ 反応拡散方程式とは、反応(reaction)と拡散(diffusion)から
なる方程式。
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷∇2 𝑢
一成分
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢∇2 𝑢
二成分
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣∇2 𝑣
生物のパターン形成に大事なのはこちら
∇=
𝜕
𝜕𝑥
,
𝜕
𝜕𝑥
𝜕
𝜕𝑦
,
𝜕
𝜕𝑥
𝜕
𝜕𝑦
𝜕
𝜕𝑧
多成分 複雑だが、プログラミングは二成分の延長に過ぎない
反応拡散モデルとは何か
反応拡散方程式の意味(反応項)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷
𝜕2
𝜕𝑥2
𝑢
一成分一次元で考える
𝑡
ある時刻𝑡の位置𝑥での濃度を𝑢 𝑥, 𝑡 とおく。
𝜕
𝜕𝑡
𝑢 𝑥, 𝑡 ≔ lim
∆𝑡=0
𝑢 𝑥, 𝑡 + ∆𝑡 − 𝑢(𝑥, 𝑡)
∆𝑡
𝑓 𝑢 = 𝑉𝑢 − 𝑑 𝑢 𝑢たとえば
これだけなら、単なる反応速度の式になる。
あるいは 𝑓 𝑢 =
𝑉𝑢 𝑢2
1 + 𝑢2 − 𝑑 𝑢 𝑢
𝑢 均一な濃度変化
反応式いろいろ
𝑡
𝑢 均一な濃度変化
反応拡散モデルとは何か
反応拡散方程式の意味(拡散項)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷
𝜕2
𝜕𝑥2
𝑢
一成分一次元の拡散
単位時間単位面積あたりの物質の移動(拡散流束)は濃度勾配に比
例する。
𝑥𝑥 − ∆𝑥 𝑥 + ∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
lim
∆𝑥→0
1
∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
− 𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
= lim
∆𝑥→0
𝐷
1
∆𝑥
𝜕
𝜕𝑥
𝑢 𝑥 +
∆𝑥
2
−
𝜕
𝜕𝑥
𝑢 𝑥 −
∆𝑥
2
= 𝐷
𝜕2
𝜕𝑥2
𝑢
𝑥
フィックの法則
反応拡散モデルとは何か
反応拡散方程式
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷
𝜕2
𝜕𝑥2
𝑢
一成分一次元
𝑥
時間あたりの物質の濃度変化は、反応(合成、分解)と拡散の効果
の和で表される。
二成分(一番メジャー)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
𝑥
反応拡散モデルとは何か
自律的パターン形成の起こるネットワーク
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
𝑥
Activator-Inhibitor 系
Activator-Substrate 系
activator
inhibitor
activator
substrate
自律的パターン形成の見られ
る𝑓 𝑢, 𝑣 , 𝑔 𝑢, 𝑣 にはいくつか
のタイプが知られている。 +
+
−
−
−
−
+
+
1次元のシミュレーション
反応拡散モデルをシミュレートしよう(1次元)
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
𝑥
Gierer-Meinhardt activator-inhibitor system
(Koch and Meinhardt, 1994)
𝑓 𝑎, ℎ = 𝜌 𝑎
𝑎2
1 + 𝜅 𝑎 𝑎2 ℎ
− 𝜇 𝑎 𝑎 + 𝜎 𝑎
𝑔 𝑎, ℎ = 𝜌ℎ 𝑎2 − 𝜇ℎℎ + 𝜎ℎ
𝑎 𝑥
ℎ 𝑥
activator
inhibitor
+
−
−
+
反応拡散モデルをシミュレートしよう(1次元)
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
𝑥
この時間発展方程式を厳密に解くことはできないが、
コンピュータ上でその挙動を近似的に計算することは
できる。
離散化
元の厳密な方程式を、簡単な繰り返し計算で近似的に
時間発展させることで、その性質を掴む。
𝑎 𝑥
ℎ 𝑥
1次元のシミュレーション
1次元の時間発展方程式の離散化(時間)
時間方向の離散化
1次元のシミュレーション
𝑡
𝑢
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢
厳密解
𝑢 = 𝑢0 + න
𝑡0
𝑡
𝑓 𝑢 𝑑𝑡
1次元の時間発展方程式の離散化(時間)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢
時間方向の離散化
1次元のシミュレーション
𝑡
𝑢
数値解
𝑢 𝑘+1
= 𝑢 𝑘 + 𝑓 𝑢 𝑘 ∆𝑡
ある時間の𝑢の変化量は一定と近似する。
∆𝑡 ∆𝑡∆𝑡∆𝑡
区間内の変化速度は、
区間の開始時点のもの
を使うと楽々計算でき
る(オイラー法)
1次元の時間発展方程式の離散化(時間)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢
時間方向の離散化
1次元のシミュレーション
𝑢
数値解
𝑢 𝑘+1
= 𝑢 𝑘 + 𝑓 𝑢 𝑘 ∆𝑡
∆𝑡を小さくすればどんどん厳密解に近づく。
𝑡
1次元の時間発展方程式の離散化(時間)
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
オイラー法による時間方向の離散化
𝑎 𝑡+∆𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎 𝑡 ∆𝑡
1次元のシミュレーション
ℎ 𝑡+∆𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ 𝑡 ∆𝑡
𝑡
𝑢
∆𝑡 ∆𝑡∆𝑡∆𝑡
1次元の時間発展方程式の離散化(空間)
𝑥
空間方向の離散化
𝑎 𝑡+∆𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎 𝑡 ∆𝑡
ℎ 𝑡+∆𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ 𝑡 ∆𝑡
離散化された拡散
𝑥𝑥 − ∆𝑥 𝑥 + ∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
lim
∆𝑥→0
1
∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
− 𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
= 𝐷
𝜕2
𝜕𝑥2
𝑢
𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎 𝑡 →
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
1次元のシミュレーション
1
∆𝑥
𝐷
𝑎𝑖+1
𝑡
− 𝑎𝑖
𝑡
∆𝑥
− 𝐷
𝑎𝑖
𝑡
− 𝑎𝑖−1
𝑡
∆𝑥
1次元の時間発展方程式の離散化
空間方向の離散化
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑥
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
𝑎𝑖
0
, ℎ𝑖
0
を全細胞で決めたら、あとは時
間ステップごとに順番に計算してい
くことで、時間とともにパターンが
どう変わっていくのかシミュレー
ションできる。
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
1D_RD(C言語風)をシミュレーションしてみよう!
▪ http://www.nibb.ac.jp/miyakohp/asari/htdocs/?page_id=57
反応拡散モデルのシミュレーション
どうしてこんな計算できているのだろうか?
コードの構成がどうなっているのか知ろう
宣言(言語によっては、他のライブラリやパッケージを予め
読み込むことがある)
関数・変数の宣言(個々の計算式や文字をこう表すと定める)・
関数の定義(中身の実際の計算式を規定)
プログラムの本体(実際の計算)
この順番で最初は解説します。
概ねどんな言語でも、何をやるにしても、次のような順番で
書くことになる。
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
離散化されたアクチベーターとインヒビターの濃度は、
配列で表現するのが最も分かりやすい。
⋯ ⋯ ⋯
a
𝑖 = 1 2 3 𝑛 − 2 𝑛 − 1 𝑛
𝑎1 𝑎2 𝑎3 𝑎 𝑛−2 𝑎 𝑛−1 𝑎 𝑛
a i は、𝑎𝑖を指し示す。 ※ 𝑖 = 0, 𝑛 − 1 とする言語の方が多い。
1次元のシミュレーション
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
入力した範囲内のランダムな
実数を初期値として代入。
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2 ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
× ステップ計算
計算前の𝑎, ℎをプロット
計算後の𝑎, ℎをプロット
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
変数や、何度も変更したいパラメータは、
文字で置く。代入する値が変わると、その
文字を使った計算式の全てに変更が適用で
きる。
𝑓 𝑎, ℎ = 𝜌 𝑎
𝑎2
1 + 𝜅 𝑎 𝑎2 ℎ
− 𝜇 𝑎 𝑎 + 𝜎 𝑎
𝑔 𝑎, ℎ = 𝜌ℎ 𝑎2 − 𝜇ℎℎ + 𝜎ℎ
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
1次元のシミュレーション
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
Do[~~~,loop]は、~~~をloop回
繰り返すことを意味する。
~~~の中身が、1時間ステップ
の計算。
1次元のシミュレーション
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡
ℎ𝑖+1
𝑡
時刻 𝑡
時刻𝑡と
時刻𝑡 + Δ𝑡
の差分
∆𝑎𝑖 ∆𝑎𝑖+1
∆ℎ𝑖 ∆ℎ𝑖+1
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
da
dh
⋯⋯
中略
For[ i=1, i<=n, i++, ~~~]は、i=1, 2, 3の順に~~~を実行する。
今回はa[[i]]にda[[i]]を加算する作業をa[[1]]からa[[n]]まで行う。
ℎ𝑖−1
𝑡
∆𝑎𝑖−1
∆ℎ𝑖−1
1次元のシミュレーション
反応拡散モデルのシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ ∆𝑎𝑖∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ ∆ℎ𝑖∆𝑡
∆𝑎𝑖 = 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
∆ℎ𝑖 = 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
∆𝑎𝑖 = ∆𝑎𝑖 +
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1
𝑡
− 𝑎𝑖
𝑡
∆ℎ𝑖 = ∆ℎ𝑖 +
𝐷ℎ
∆𝑥 2 ℎ𝑖−1
𝑡
− ℎ𝑖
𝑡
⋯ ⋯ ⋯
a
𝑎1 𝑎2 𝑎 𝑛−1 𝑎 𝑛
1次元のシミュレーション
∆𝑎𝑖 = ∆𝑎𝑖 +
𝐷 𝑎
∆𝑥 2 𝑎𝑖+1
𝑡
− 𝑎𝑖
𝑡
∆ℎ𝑖 = ∆ℎ𝑖 +
𝐷ℎ
∆𝑥 2 ℎ𝑖+1
𝑡
− ℎ𝑖
𝑡
反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2 ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
× ステップ計算
計算前の𝑎, ℎをプロット
計算後の𝑎, ℎをプロット
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
シミュレーションで遊んでみよう
拡散係数を色々変えてみよう。
𝐷 𝑎 = 0.10, 𝐷ℎ = 1.0 ならどうだろうか?
𝐷 𝑎 = 0.15, 𝐷ℎ = 1.0 ならどうだろうか?
𝐷 𝑎 = 0.05, 𝐷ℎ = 1.0 ならどうだろうか?
たとえば……
1次元のシミュレーション
初期条件を色々変えてみよう。
ℎの初期条件にも乱数を入れたらどうだろうか?
たとえば……
初期の濃度をもっと低いところから始めたらどうだろうか?
反応拡散モデルで波が立つ
𝐷 𝑎 = 0.10, 𝐷ℎ = 1.0
𝐷 𝑎 = 0.15, 𝐷ℎ = 1.0𝐷 𝑎 = 0.05, 𝐷ℎ = 1.0
𝐷 𝑎 ≪ 𝐷ℎ のと き 、波 状
のパターンが立ち上が
る。
1次元のシミュレーション
𝐷 𝑎が大きかったり𝐷ℎが
小さかったりすると、
波ができない。
なぜ自己組織化がおこるのか(直観的な話)
1次元のシミュレーション
𝐷ℎ
𝐷 𝑎
拡散性が高いインヒビターによって、側方でのアクチベータの
濃度上昇が阻害されている。
さらに遠い側方側でインヒビター濃度が下がると、今度はアク
チベータの抑制が外れて、ある程度離れたところに山ができる。
𝐷ℎ ≫ 𝐷 𝑎
なぜ自己組織化がおこるのか(厳密な話)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
𝑓 𝑢, 𝑣 = 𝑔 𝑢, 𝑣 = 0となる 𝑢, 𝑣 = 𝑢′, 𝑣′ とおく。
𝑥
𝑢′
𝑣′
𝑢の濃度も𝑣の濃度も変わらない。
(平衡)
1次元のシミュレーション
𝑓 𝑢, 𝑣 を 𝑢, 𝑣 = 𝑢′, 𝑣′ の周りでテイラー展開すると、
𝑓 𝑢′ + 𝑤 𝑢, 𝑣′ + 𝑤𝑣 = ෍
𝑘=0
∞
෍
𝑙=0
∞
𝜕 𝑘
𝜕𝑢 𝑘
𝜕 𝑙
𝜕𝑣 𝑙 𝑓 𝑢′, 𝑣′
𝑤 𝑢
𝑘 𝑤𝑣
𝑙
𝑘! 𝑙!
∇𝑢 、∇𝑣が十分小さい時、二乗以上の項は無視できるほど小さいので、
𝑓 𝑢′ + 𝑤 𝑢, 𝑣 + 𝑤𝑣 ≒ 𝑓 𝑢′, 𝑣′ + 𝑤 𝑢
𝜕
𝜕𝑢
𝑓 𝑢′, 𝑣′ + 𝑤𝑣
𝜕
𝜕𝑣
𝑓 𝑢′, 𝑣′
おまけ
なぜ自己組織化がおこるのか(厳密な話)
𝑓 𝑢, 𝑣 = 𝑔 𝑢, 𝑣 = 0となる 𝑢, 𝑣 = 𝑢′, 𝑣′ とおく。
𝑥
𝑢′
𝑣′
𝑢の濃度も𝑣の濃度も変わらない。
(平衡)
1次元のシミュレーション
𝑓 𝑢, 𝑣 を 𝑢, 𝑣 = 𝑢′, 𝑣′ の周りでテイラー展開すると、
𝑓 𝑢′ + 𝑤 𝑢, 𝑣′ + 𝑤𝑣 = ෍
𝑘=0
∞
෍
𝑙=0
∞
𝜕 𝑘
𝜕𝑢 𝑘
𝜕 𝑙
𝜕𝑣 𝑙 𝑓 𝑢′, 𝑣′
𝑤 𝑢
𝑘 𝑤𝑣
𝑙
𝑘! 𝑙!
𝑤 𝑢 、𝑤𝑣が十分小さい時、二乗以上の項は無視できるほど小さいので、
𝑓 𝑢′ + ∇𝑢, 𝑣 + ∇𝑣 ≒ 𝑓𝑢 𝑤 𝑢 + 𝑓𝑣 𝑤𝑣
𝑔 𝑢′ + ∇𝑢, 𝑣 + ∇𝑣 ≒ 𝑔 𝑢 𝑤 𝑢 + 𝑔 𝑣 𝑤𝑣
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
おまけ
なぜ自己組織化がおこるのか(厳密な話)
𝑢′, 𝑣′ からのずれの程度で標準化する。
𝜕𝒘
𝜕𝑡
= 𝐴𝒘 + 𝐷
𝜕2
𝜕𝑥2
𝒘
𝒘 =
𝑤 𝑢
𝑤𝑣
𝐴 =
𝑓𝑢 𝑓𝑣
𝑔 𝑢 𝑔 𝑣
𝐷 =
𝐷 𝑢 0
0 𝐷 𝑣
1次元のシミュレーション
𝑥
0
𝑥
0
𝑤 𝑢 = 𝑢 − 𝑢′
𝑤𝑣 = 𝑣 − 𝑣′
こういう正弦波が立ち上がるのは、
どんなパラメータ設定だろうか?
𝜕
𝜕𝑡
𝑤 𝑢 ≒ 𝑓𝑢 𝑤 𝑢 + 𝑓𝑣 𝑤𝑣 + 𝐷
𝜕2
𝜕𝑥2 𝑤 𝑢
𝜕
𝜕𝑡
𝑤𝑣 ≒ 𝑔 𝑢 𝑤 𝑢 + 𝑔 𝑣 𝑤𝑣 + 𝐷
𝜕2
𝜕𝑥2 𝑤𝑣
おまけ
なぜ自己組織化がおこるのか(厳密な話)
𝜕𝒘
𝜕𝑡
= 𝐴𝒘 + 𝐷
𝜕2
𝜕𝑥2
𝒘
𝒘 = ෍
𝑘
𝒄 𝑘 𝑒 𝜆 𝑘 𝑡 𝑒 𝑖𝑘𝑥
𝜆 𝑘 𝒘 = 𝐴𝒘 − 𝑘2 𝐷𝒘
周期的なパターンの重ね合わせで表現でき
る 𝒘を考える。ある𝑘について、𝜆 𝑘 > 0と
なる𝜆 𝑘が存在すれば、ちょっとした揺らぎ
から2π/𝑘の波長のパターンが成長する。
𝑓𝑢 − 𝑘2 𝐷 𝑢 𝑓𝑣
𝑔 𝑢 𝑔 𝑣 − 𝑘2 𝐷 𝑣
𝒘 = 𝜆 𝒌 𝒘
𝜆 𝑘 =
𝑓𝑢 + 𝑔 𝑣 − 𝑘2 𝐷 𝑢 + 𝐷 𝑣 ± 𝑓𝑢 + 𝑔 𝑣 − 𝑘2 𝐷 𝑢 + 𝐷 𝑣
2
− 4 𝑓𝑢 − 𝑘2 𝐷 𝑢 𝑔 𝑣 − 𝑘2 𝐷 𝑣 − 𝑓𝑣 𝑔 𝑢
2
𝜆は行列の固有値。
1次元のシミュレーション
𝑥
0
2π
𝑘
π
𝑘
おまけ
なぜ自己組織化がおこるのか(厳密な話)
𝜆 𝑘 =
𝑓𝑢 + 𝑔 𝑣 − 𝑘2
𝐷 𝑢 + 𝐷 𝑣 ± 𝑓𝑢 + 𝑔 𝑣 − 𝑘2 𝐷 𝑢 + 𝐷 𝑣
2
− 4 𝑓𝑢 − 𝑘2 𝐷 𝑢 𝑔 𝑣 − 𝑘2 𝐷 𝑣 − 𝑓𝑣 𝑔 𝑢
2
> 0
−4 𝑓𝑢 − 𝑘2 𝐷 𝑢 𝑔 𝑣 − 𝑘2 𝐷 𝑣 − 𝑓𝑣 𝑔 𝑢 > 0
𝐷 𝑢 𝐷𝑣 𝑘4 − 𝐷 𝑢 𝑔 𝑣 + 𝐷 𝑣 𝑓𝑢 𝑘2 + 𝑓𝑢 𝑔 𝑣 − 𝑓𝑣 𝑔 𝑢 < 0
𝑓𝑢 + 𝑔 𝑣 > 0 拡散がなくても不安定になる条件
(今回は考慮しない)。
𝑓𝑢 + 𝑔 𝑣 < 0 拡散がないと安定化する条件。
固有値の一方が正になる条件。
𝑓𝑢 𝑔 𝑣 − 𝑓𝑣 𝑔 𝑢 > 0
𝐷 𝑢 𝑔 𝑣 + 𝐷 𝑣 𝑓𝑢 > 0
𝑓𝑢 + 𝑔 𝑣 < 0
𝐷 𝑢 𝑔 𝑣 − 𝐷 𝑣 𝑓𝑢
2 + 4𝐷 𝑢 𝐷 𝑣 𝑓𝑣 𝑔 𝑢 > 0
ある範囲の 𝑘 ≠ 0 で成り立つ。
1次元のシミュレーションおまけ
なぜ自己組織化がおこるのか(厳密な話)
𝑓𝑎 𝑔ℎ − 𝑓ℎ 𝑔 𝑎 > 0
𝐷 𝑎 𝑔ℎ + 𝐷ℎ 𝑓𝑎 > 0
𝑓𝑎 + 𝑔ℎ < 0
𝐷 𝑎 𝑔ℎ − 𝐷ℎ 𝑓𝑎
2 + 4𝐷 𝑎 𝐷ℎ 𝑓ℎ 𝑔 𝑎 > 0 𝑓𝑎 > 0
activator
inhibitor
+
−
−
+
𝑔ℎ < 0𝑔 𝑎 > 0
𝑓ℎ < 0
𝐷ℎ ≫ 𝐷 𝑎のとき、波状のパターンが立ち上がる
(拡散不安定性)。
1次元のシミュレーション
👉
👉
👉
𝐷ℎ ≫ 𝐷 𝑎でないとこれらの条件を満たさない。
おまけ
なぜ自己組織化がおこるのか(厳密な話)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
Activator-Inhibitor 系
Activator-Substrate 系
自律的パターン形成の見られ
る2成分の関係性には、いくつ
かのタイプが知られている。 activator
inhibitor
activator
substrate
+
+
−
−
−
−
+
+
1次元のシミュレーションおまけ
1次元から2次元へ
𝐷 𝑎 = 0.10, 𝐷ℎ = 1.0
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎∇2 𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ∇2ℎ
∇2=
𝜕
𝜕𝑥
𝜕
𝜕𝑦
∙
𝜕
𝜕𝑥
𝜕
𝜕𝑦
=
𝜕2
𝜕𝑥2 +
𝜕2
𝜕𝑦2
2次元のシミュレーション
1次元のシミュレーション
2次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
2次元のシミュレーション
2次元のシミュレーション
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
, 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
の設定
描画関数の設定 区画数の設定
拡散定数や区画の大きさの設定 ループ数の設定
初期設定
本体
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
2次元の反応拡散モデルのシミュレーション
2次元のシミュレーション
離散化されたアクチベーターとインヒビターの濃度は、
2次元配列(行列)で表現する。
𝑎𝑖,𝑗
𝑡
𝑖
𝑖 + 1
𝑖 + 2
𝑖 − 2
𝑖 − 1
𝑗 𝑗 + 1 𝑗 + 2𝑗 − 2 𝑗 − 1
𝑎1,1 𝑎1,2 ⋯ 𝑎1,𝑛−1 𝑎1,𝑛
𝑎2,1 𝑎2,2 ⋯ 𝑎2,𝑛−1 𝑎2,𝑛
⋮ ⋮ ⋱ ⋮ ⋮
𝑎 𝑛−1,1 𝑎 𝑛−1,2 ⋯ 𝑎 𝑛−1,𝑛−1 𝑎 𝑛−1,𝑛
𝑎 𝑛,1 𝑎 𝑛,2 ⋯ 𝑎 𝑛,𝑛−1 𝑎 𝑛,𝑛
a[[i, j]]は𝑎𝑖,𝑗を指し示す。
2次元のシミュレーション
2次元のシミュレーション
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
, 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
の設定
描画関数の設定 区画数の設定
拡散定数や区画の大きさの設定 ループ数の設定
初期設定
本体
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
二次元の反応拡散モデル
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
+
𝜕2
𝜕𝑦2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
+
𝜕2
𝜕𝑦2
ℎ
時刻 𝒕
𝑎𝑖,𝑗
𝑡
𝑖
𝑖 + 1
𝑖 + 2
𝑖 − 2
𝑖 − 1
𝑗 𝑗 + 1 𝑗 + 2𝑗 − 2 𝑗 − 1
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
2次元のシミュレーション
二次元の反応拡散モデル
時刻 𝒕
𝑎𝑖,𝑗
𝑡
𝑖
𝑖 + 1
𝑖 + 2
𝑖 − 2
𝑖 − 1
𝑗 𝑗 + 1 𝑗 + 2𝑗 − 2 𝑗 − 1
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
∆𝑥 = ∆𝑦ならば
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
2次元のシミュレーション
𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
→
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
− 2𝑎𝑖,𝑗
𝑡
𝐷 𝑎
𝜕2
𝜕𝑦2
𝑎
→
𝐷 𝑎
∆𝑦 2
𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 2𝑎𝑖,𝑗
𝑡
2次元の反応拡散モデルのシミュレーション
2次元のシミュレーション
計算前の𝑎, ℎをプロット
計算後の状態をプロット
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
2次元の反応拡散モデルのシミュレーション
2次元のシミュレーション
0からamaxの範囲で
色を塗り分けます
虹色で表します
黒-黄色で表します
多様なカラースキームが用意され
ている。ヘルプから検索できる。
2次元の反応拡散モデルのシミュレーション
2次元のシミュレーション
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2 ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
− ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖+1,𝑗
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖+1,𝑗
𝑡
− ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖,𝑗−1
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖,𝑗−1
𝑡
− ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖,𝑗+1
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖,𝑗+1
𝑡
− ℎ𝑖,𝑗
𝑡
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+∆𝑎 × ∆𝑡
+∆ℎ × ∆𝑡
反応拡散モデルのシミュレーション
1次元のシミュレーション
2D_RD(C言語風)をシミュレーションしてみよう!
▪ http://www.nibb.ac.jp/miyakohp/asari/htdocs/?page_id=57
Wolfram Programming Lab(フリー)の限界
▪ 遅い。
▪ 重い。
▪ 最後まで耐えられない。
2次元のシミュレーション
シミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ 普通にシミュレーションする分には、愚直なコードで困ること
はまずない。
▪ しかし、本格的に研究する場合には、速度が物足りなく感じる
ことがあるかもしれない。
対処法
“速い”プログラミング言語を使う。
“速い” 関数を使う。
高級なプログラミング言語でも、良い関数があることが多い。
“速くなる” テクニック。
Wolfram Programming Lab << Mathematica < Python < Julia < C++
(なんの工夫もしなければ)
シミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ 普通にシミュレーションする分には、愚直なコードで困ること
はまずない。
▪ しかし、本格的に研究する場合には、速度が物足りなく感じる
ことがあるかもしれない。
対処法
“速い”プログラミング言語を使う。
“速い” 関数を使う。
“速くなる” テクニック。
高級なプログラミング言語でも、良い関数があることが多い。
Wolfram Programming Lab << Mathematica < Python < Julia < C++
(なんの工夫もしなければ)
ループと分岐が重すぎる
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2 ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
− ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖+1,𝑗
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖+1,𝑗
𝑡
− ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖,𝑗−1
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖,𝑗−1
𝑡
− ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖,𝑗+1
𝑡
− 𝑎𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
ℎ𝑖,𝑗+1
𝑡
− ℎ𝑖,𝑗
𝑡
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+∆𝑎 × ∆𝑡
+∆ℎ × ∆𝑡
シミュレーションの高速化
シミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ Rotate関数で条件分岐の煩雑さを消す。
▪ Forループは使わない
Rotate関数を使うと配列の端っこでは、自動
的に反対側の端点を参照してくれる。
コード上でループや条件分岐を書くよりも、
圧倒的に速い。
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
シミュレーションの高速化
計算速度に物足りなさを感じたときには
コード上でループや条件分岐を書くよりも、圧倒的に速い。
𝑢 =
𝑢1,1 𝑢1,2 ⋯ 𝑢1,𝑛−1 𝑢1,𝑛
𝑢2,1 𝑢2,2 ⋯ 𝑢2,𝑛−1 𝑢2,𝑛
⋮ ⋮ ⋱ ⋮ ⋮
𝑢 𝑛−1,1 𝑢 𝑛−1,2 ⋯ 𝑢 𝑛−1,𝑛−1 𝑢 𝑛−1,𝑛
𝑢 𝑛,1 𝑢 𝑛,2 ⋯ 𝑢 𝑛,𝑛−1 𝑢 𝑛,𝑛
RotateLeft 𝑢, 1, 0 =
𝑢2,1 𝑢2,2 ⋯ 𝑢2,𝑛−1 𝑢2,𝑛
𝑢3,1 𝑢3,2 ⋯ 𝑢3,𝑛−1 𝑢3,𝑛
⋮ ⋮ ⋱ ⋮ ⋮
𝑢 𝑛,1 𝑢 𝑛,2 ⋯ 𝑢 𝑛,𝑛−1 𝑢 𝑛,𝑛
𝑢1,1 𝑢1,2 ⋯ 𝑢1,𝑛−1 𝑢1,𝑛
RotateLeft 𝑢, 0, 1 =
𝑢1,2 𝑢1,3 ⋯ 𝑢1,𝑛 𝑢1,1
𝑢2,2 𝑢2,3 ⋯ 𝑢2,𝑛 𝑢2,1
⋮ ⋮ ⋱ ⋮ ⋮
𝑢 𝑛−1,2 𝑢 𝑛−1,3 ⋯ 𝑢 𝑛−1,𝑛 𝑢 𝑛−1,1
𝑢 𝑛,2 𝑢 𝑛,3 ⋯ 𝑢 𝑛,𝑛 𝑢 𝑛,1
シミュレーションの高速化
計算速度に物足りなさを感じたときには
Wofram言語は、特段の設定をせずに、関数の引数に行列を指
定して処理できる。
𝑢 =
𝑢1,1 𝑢1,2 ⋯ 𝑢1,𝑛−1 𝑢1,𝑛
𝑢2,1 𝑢2,2 ⋯ 𝑢2,𝑛−1 𝑢2,𝑛
⋮ ⋮ ⋱ ⋮ ⋮
𝑢 𝑛−1,1 𝑢 𝑛−1,2 ⋯ 𝑢 𝑛−1,𝑛−1 𝑢 𝑛−1,𝑛
𝑢 𝑛,1 𝑢 𝑛,2 ⋯ 𝑢 𝑛,𝑛−1 𝑢 𝑛,𝑛
𝑓 𝑢 =
𝑓 𝑢1,1 𝑓 𝑢1,2 ⋯ 𝑓 𝑢1,𝑛−1 𝑓 𝑢1,𝑛
𝑓 𝑢2,1 𝑓 𝑢2,2 ⋯ 𝑓 𝑢2,𝑛−1 𝑓 𝑢2,𝑛
⋮ ⋮ ⋱ ⋮ ⋮
𝑓 𝑢 𝑛−1,1 𝑓 𝑢 𝑛−1,2 ⋯ 𝑓 𝑢 𝑛−1,𝑛−1 𝑓 𝑢 𝑛−1,𝑛
𝑓 𝑢 𝑛,1 𝑓 𝑢 𝑛,2 ⋯ 𝑓 𝑢 𝑛,𝑛−1 𝑓 𝑢 𝑛,𝑛
シミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ Rotate関数で条件分岐の煩雑さを消す。
▪ Forループは使わない
Rotate関数を使うと配列の端っこでは、自動
的に反対側の端点を参照してくれる。
コード上でループや条件分岐を書くよりも、
圧倒的に速い。
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
2次元の反応拡散モデルのシミュレーション
アクチベーター インヒビター
シミュレーションの高速化
2D_RD_mathematicaをシミュレーションしてみよう!
陰解法を用いたシミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ 普通にシミュレーションする分には、愚直なコードで困ること
はまずない。
▪ しかし、本格的に研究する場合には、速度が物足りなく感じる
ことがあるかもしれない。
対処法
“速い”プログラミング言語を使う。
“速い” 関数を使う。
“速くなる” テクニック。
高級なプログラミング言語でも、良い関数があることが多い。
Wolfram Programming Lab << Mathematica < Python < Julia < C++
(なんの工夫もしなければ)
陰解法を用いたシミュレーションの高速化
時間刻みを粗くすればシミュレーションは短くなる
▪ 粗くすればするほど、挙動は不安定になる。
▪ どこまで時間刻みを粗くできるだろうか?
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
+ 𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
− 4𝑎𝑖,𝑗
𝑡
Δ𝑥 2
Δ𝑡
ℎ𝑖,𝑗
𝑡+Δ𝑡
− ℎ𝑖,𝑗
𝑡
= 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷ℎ
ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗+1
𝑡
+ ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
− 4ℎ𝑖,𝑗
𝑡
Δ𝑥 2
Δ𝑡
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎∇2 𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ∇2ℎ
𝑎𝑖,𝑗
𝑡+Δ𝑡
1≤𝑖,𝑗≤𝑛
= 𝒬 𝑎 𝑎𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
, ℎ𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
ℎ𝑖,𝑗
𝑡+Δ𝑡
1≤𝑖,𝑗≤𝑛
= 𝒬ℎ 𝑎𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
, ℎ𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
陽解法
次の時間ステップを、前のステッ
プから直接(陽的)に計算可能
陰解法を用いたシミュレーションの高速化
Von Neumannの安定性解析
▪ 誤差の成長について先ほどの波の立ち上がりと同様の議論をす
ると、一成分の拡散だけで誤差が蓄積する条件を導出すること
ができる。
𝐷Δ𝑡
Δ𝑥 2
<
1
2
一成分の一次元拡散方程式における数値安定性
(Von Neumannの安定性解析)
陰解法を用いたシミュレーションの高速化
Von Neumannの数値不安定性の直観的解釈
𝛼 =
𝐷Δ𝑡
Δ𝑥 2とおいた。
𝑥
𝑢𝑖 𝑢𝑖+1 𝑢𝑖+2𝑢𝑖−1𝑢𝑖−2
𝑥
𝑢𝑖 𝑢𝑖+1 𝑢𝑖+2𝑢𝑖−1𝑢𝑖−2
𝛼 <
1
2
𝛼 ≥
1
2
のとき、誤差が収束しない。
一成分の一次元での拡散を考える
𝑥
𝑢𝑖 𝑢𝑖+1 𝑢𝑖+2𝑢𝑖−1𝑢𝑖−2
𝛼 >
1
2
陰解法を用いたシミュレーションの高速化
陽解法と陰解法
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
+ 𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
− 4𝑎𝑖,𝑗
𝑡
Δ𝑥 2 Δ𝑡
ℎ𝑖,𝑗
𝑡+Δ𝑡
− ℎ𝑖,𝑗
𝑡
= 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷ℎ
ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗+1
𝑡
+ ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
− 4ℎ𝑖,𝑗
𝑡
Δ𝑥 2 Δ𝑡
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎∇2 𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ∇2ℎ
陽解法 次の時間ステップを、前のステップから直接(陽的)に計算
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗+1
𝑡+Δ𝑡
+ 𝑎𝑖−1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗−1
𝑡+Δ𝑡
− 4𝑎𝑖,𝑗
𝑡+Δ𝑡
Δ𝑥 2 Δ𝑡
ℎ𝑖,𝑗
𝑡+Δ𝑡
− ℎ𝑖,𝑗
𝑡
= 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷ℎ
ℎ𝑖+1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗+1
𝑡+Δ𝑡
+ ℎ𝑖−1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗−1
𝑡+Δ𝑡
− 4ℎ𝑖,𝑗
𝑡+Δ𝑡
Δ𝑥 2 Δ𝑡
拡散項は、次のステップを用いて計算陰解法
陰解法を用いたシミュレーションの高速化
陽解法と陰解法
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗+1
𝑡+Δ𝑡
+ 𝑎𝑖−1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗−1
𝑡+Δ𝑡
− 4𝑎𝑖,𝑗
𝑡+Δ𝑡
Δ𝑥 2 Δ𝑡
ℎ𝑖,𝑗
𝑡+Δ𝑡
− ℎ𝑖,𝑗
𝑡
= 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷ℎ
ℎ𝑖+1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗+1
𝑡+Δ𝑡
+ ℎ𝑖−1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗−1
𝑡+Δ𝑡
− 4ℎ𝑖,𝑗
𝑡+Δ𝑡
Δ𝑥 2 Δ𝑡
拡散項は、次のステップを用いて計算陰解法
𝑎𝑖,𝑗
𝑡+Δ𝑡
とℎ𝑖,𝑗
𝑡+Δ𝑡
を計算するのに、 𝑎𝑖,𝑗
𝑡+Δ𝑡
とℎ𝑖,𝑗
𝑡+Δ𝑡
が必要(陰的)。
𝑛2 個の成分からなる巨大な連立一次方程式を2本解かなければならない。
幸いにして、Wolframには、この形の連立一次方程式を高速に解くの
に有用なFFT(高速フーリエ変換)が関数として使える。
1ステップ当たりの時間はオイラー法より遅いが、時間刻みを粗くして
も不安定にならないので、結果トータルでは速くできる。
陰解法を用いたシミュレーションの高速化
陰解法の解き方
𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
Δ𝑡
= 1 + 4
𝐷 𝑎Δ𝑡
Δ𝑥 2 𝑎𝑖,𝑗
𝑡+Δ𝑡
−
𝐷 𝑎Δ𝑡
Δ𝑥 2 𝑎𝑖+1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗+1
𝑡+Δ𝑡
+ 𝑎𝑖−1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗−1
𝑡+Δ𝑡
ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
Δ𝑡
= 1 + 4
𝐷ℎΔ𝑡
Δ𝑥 2 ℎ𝑖,𝑗
𝑡+Δ𝑡
−
𝐷ℎΔ𝑡
Δ𝑥 2 ℎ𝑖+1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗+1
𝑡+Δ𝑡
+ ℎ𝑖−1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗−1
𝑡+Δ𝑡
この式は、畳み込みを用いて次のように書き直せる。
𝑘 𝑎 ∗ 𝑎 𝑡+Δ𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡 𝑘ℎ ∗ ℎ 𝑡+Δ𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
𝑘 =
1 + 4
𝐷Δ𝑡
Δ𝑥 2 −
𝐷Δ𝑡
Δ𝑥 2
−
𝐷Δ𝑡
Δ𝑥 2 0
⋯ 0 −
𝐷Δ𝑡
Δ𝑥 2
0 0
⋮ ⋱ ⋮
0 0
−
𝐷Δ𝑡
Δ𝑥 2 0
⋯
0 0
0 0
𝑘 𝑎 ∗ 𝑎 𝑡+Δ𝑡
𝑖,𝑗
= ෍
𝑝=1
𝑁
෍
𝑞=1
𝑁
𝑘 𝑎 𝑝,𝑞 𝑎𝑖−𝑝,𝑗−𝑞
𝑡+Δ𝑡
畳み込み(Convolution)
𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡𝑎 𝑡+Δ𝑡
𝑘 𝑎
Deconvolution
おまけ
陰解法を用いたシミュレーションの高速化
陰解法の解き方
畳み込み定理が使える
൝
𝑘 𝑎 ∗ 𝑎 𝑡+Δ𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
𝑘ℎ ∗ ℎ 𝑡+Δ𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ቐ
ℱ 𝑘 𝑎 ∗ 𝑎 𝑡+Δ𝑡 = ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘ℎ ∗ ℎ 𝑡+Δ𝑡 = ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ቐ
ℱ 𝑘 𝑎 ⊙ ℱ 𝑎 𝑡+Δ𝑡 = ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘ℎ ⊙ ℱ ℎ 𝑡+Δ𝑡 = ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ቐ
𝑎 𝑡+Δ𝑡 = ℱ−1 ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡 ⊘ ℱ 𝑘 𝑎
ℎ 𝑡+Δ𝑡 = ℱ−1 ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡 ⊘ ℱ 𝑘ℎ
ℱ 𝐴 𝑢,𝑣
= ෍
𝑝=1
𝑁
෍
𝑞=1
𝑁
𝐴 𝑝,𝑞 𝑒−2π𝑖(
𝑢𝑝
𝑁
+
𝑣𝑞
𝑁
)
(離散)フーリエ変換
ℱ−1 𝐵 𝑝,𝑞
=
1
𝑁2 ෍
𝑢=1
𝑁
෍
𝑣=1
𝑁
𝐵𝑢,𝑣 𝑒2π𝑖(
𝑢𝑝
𝑁
+
𝑣𝑞
𝑁
)
フーリエ変換が高速で計算できるなら、
簡単に陰解法が使える!
⊙
⊘
成分ごとの積
成分ごとの商
ቐ
ℱ 𝑎 𝑡+Δ𝑡
= ℱ 𝑎 𝑡
+ 𝑓 𝑎 𝑡
, ℎ 𝑡
Δ𝑡 ⊘ ℱ 𝑘 𝑎
ℱ ℎ 𝑡+Δ𝑡 = ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡 ⊘ ℱ 𝑘ℎ
ℱ 𝑎 ∗ 𝑏 = ℱ 𝑎 ⊙ ℱ 𝑏
おまけ
陰解法を用いたシミュレーションの高速化
陰解法を用いた反応拡散モデルのシミュレーション
𝑎 𝑡+Δ𝑡 = ℱ−1
ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘 𝑎
ℎ 𝑡+Δ𝑡 = ℱ−1
ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘ℎ
× ステップ数
各反応式と、各種パラメータの設定
初期値𝒂 𝟎と𝒉 𝟎の設定、離散化の定義
描画
繰り返し
おまけ
陰解法を用いたシミュレーションの高速化
コードの解説
各反応式と、各種パラメータの設定(基本的に陽解法のコードと同じ)
おまけ
陰解法を用いたシミュレーションの高速化
コードの解説
各反応式と、各種パラメータの設定(基本的に陽解法のコードと同じ)
おまけ
陰解法を用いたシミュレーションの高速化
コードの解説
畳み込みカーネルの設定
𝑘 𝑎 =
1 + 4
𝐷 𝑎Δ𝑡
Δ𝑥 2 −
𝐷 𝑎Δ𝑡
Δ𝑥 2
−
𝐷 𝑎Δ𝑡
Δ𝑥 2 0
⋯ 0 −
𝐷 𝑎Δ𝑡
Δ𝑥 2
0 0
⋮ ⋱ ⋮
0 0
−
𝐷 𝑎Δ𝑡
Δ𝑥 2 0
⋯
0 0
0 0
1
ℱ 𝑘 𝑎
1
ℱ 𝑘ℎ
を先に計算しておく
𝑘ℎ =
1 + 4
𝐷ℎΔ𝑡
Δ𝑥 2 −
𝐷ℎΔ𝑡
Δ𝑥 2
−
𝐷ℎΔ𝑡
Δ𝑥 2 0
⋯ 0 −
𝐷ℎΔ𝑡
Δ𝑥 2
0 0
⋮ ⋱ ⋮
0 0
−
𝐷ℎΔ𝑡
Δ𝑥 2 0
⋯
0 0
0 0
おまけ
陰解法を用いたシミュレーションの高速化
コードの解説
初期値𝒂 𝟎と𝒉 𝟎の設定と、離散化の定義
𝑎 𝑡+Δ𝑡 = ℱ−1
ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘 𝑎
ℎ 𝑡+Δ𝑡 = ℱ−1
ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘ℎ
おまけ
陰解法を用いたシミュレーションの高速化
コードの解説
描画方法の設定(陽解法と同じ)
おまけ
陰解法を用いたシミュレーションの高速化
コードの解説
描画と実際の計算
関数型プログラミングっぽい記法。
(別にDoで書いても問題ない)
おまけ
陰解法を用いたシミュレーションの高速化
陰解法を用いると反応拡散モデルを高速に計算できる
活性化因子 抑制因子
2D_RD_IM をシミュレーションしてみよう!
シミュレーションで遊んでみよう
拡散係数を色々変えてみよう。
𝐷 𝑎 = 0.095, 𝐷ℎ = 1.0 ならどうだろうか?
𝐷 𝑎 = 0.103, 𝐷ℎ = 1.0 ならどうだろうか?(amaxを2くらいま
で下げたほうがパターンは見やすいだろう)
𝐷 𝑎 = 0.08, 𝐷ℎ = 1.0 ならどうだろうか?
たとえば𝑛 = 50でやってみよう。
陰解法を用いたシミュレーションの高速化
拡散の比によって多様なパターンが出現する
陰解法を用いたシミュレーションの高速化
𝐷 𝑎 = 0.095, 𝐷ℎ = 1.0
𝐷 𝑎 = 0.103, 𝐷ℎ = 1.0
𝐷 𝑎 = 0.08, 𝐷ℎ = 1.0
参考文献
参考文献
三浦岳先生著
(九州大・医学研究院)
Mathematicaのサンプルコードが付
いた(主として動物)発生学の数理
モデルの教科書
発生の数理
2015年、京都大学学術出版会
“現状でもまだきちんと現象からモデ
ルを立てて,数値計算,数理解析ま
でやって実験まで戻せる研究者は非
常に少ない.本書がこの分野の参入
障壁を減らして,研究者人口の増加
に貢献できれば幸いである.”
まえがきより

Weitere ähnliche Inhalte

Was ist angesagt?

組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
 

Was ist angesagt? (20)

A summary on “On choosing and bounding probability metrics”
A summary on “On choosing and bounding probability metrics”A summary on “On choosing and bounding probability metrics”
A summary on “On choosing and bounding probability metrics”
 
東京都市大学 データ解析入門 5 スパース性と圧縮センシング 2
東京都市大学 データ解析入門 5 スパース性と圧縮センシング 2東京都市大学 データ解析入門 5 スパース性と圧縮センシング 2
東京都市大学 データ解析入門 5 スパース性と圧縮センシング 2
 
Prml 10 1
Prml 10 1Prml 10 1
Prml 10 1
 
遺伝研スパコンを使った解析の並列化.pptx
遺伝研スパコンを使った解析の並列化.pptx遺伝研スパコンを使った解析の並列化.pptx
遺伝研スパコンを使った解析の並列化.pptx
 
PRML 6.1章 カーネル法と双対表現
PRML 6.1章 カーネル法と双対表現PRML 6.1章 カーネル法と双対表現
PRML 6.1章 カーネル法と双対表現
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
 
PRML11章
PRML11章PRML11章
PRML11章
 
8.4 グラフィカルモデルによる推論
8.4 グラフィカルモデルによる推論8.4 グラフィカルモデルによる推論
8.4 グラフィカルモデルによる推論
 
細胞現象の数理
細胞現象の数理細胞現象の数理
細胞現象の数理
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
 
自由エネルギー原理入門: 正規分布を仮定した場合
自由エネルギー原理入門: 正規分布を仮定した場合自由エネルギー原理入門: 正規分布を仮定した場合
自由エネルギー原理入門: 正規分布を仮定した場合
 
PRMLの線形回帰モデル(線形基底関数モデル)
PRMLの線形回帰モデル(線形基底関数モデル)PRMLの線形回帰モデル(線形基底関数モデル)
PRMLの線形回帰モデル(線形基底関数モデル)
 
【DL輪読会】Unbiased Gradient Estimation for Marginal Log-likelihood
【DL輪読会】Unbiased Gradient Estimation for Marginal Log-likelihood【DL輪読会】Unbiased Gradient Estimation for Marginal Log-likelihood
【DL輪読会】Unbiased Gradient Estimation for Marginal Log-likelihood
 
Deep walk について
Deep walk についてDeep walk について
Deep walk について
 
[DL輪読会]Recent Advances in Autoencoder-Based Representation Learning
[DL輪読会]Recent Advances in Autoencoder-Based Representation Learning[DL輪読会]Recent Advances in Autoencoder-Based Representation Learning
[DL輪読会]Recent Advances in Autoencoder-Based Representation Learning
 
PyMCがあれば,ベイズ推定でもう泣いたりなんかしない
PyMCがあれば,ベイズ推定でもう泣いたりなんかしないPyMCがあれば,ベイズ推定でもう泣いたりなんかしない
PyMCがあれば,ベイズ推定でもう泣いたりなんかしない
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介
[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介
[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介
 
coordinate descent 法について
coordinate descent 法についてcoordinate descent 法について
coordinate descent 法について
 

Ähnlich wie 第4回数理モデル勉強会(日本植物学会第84回大会関連集会)

Ähnlich wie 第4回数理モデル勉強会(日本植物学会第84回大会関連集会) (20)

星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章
 
これならわかる最適化数学8章_動的計画法
これならわかる最適化数学8章_動的計画法これならわかる最適化数学8章_動的計画法
これならわかる最適化数学8章_動的計画法
 
数理解析道場
数理解析道場数理解析道場
数理解析道場
 
グレブナー基底輪読会 #1 ―準備体操の巻―
グレブナー基底輪読会 #1 ―準備体操の巻―グレブナー基底輪読会 #1 ―準備体操の巻―
グレブナー基底輪読会 #1 ―準備体操の巻―
 
強化学習その3
強化学習その3強化学習その3
強化学習その3
 
Prml1.2.4
Prml1.2.4Prml1.2.4
Prml1.2.4
 
Prml 最尤推定からベイズ曲線フィッティング
Prml 最尤推定からベイズ曲線フィッティングPrml 最尤推定からベイズ曲線フィッティング
Prml 最尤推定からベイズ曲線フィッティング
 
SMO徹底入門 - SVMをちゃんと実装する
SMO徹底入門 - SVMをちゃんと実装するSMO徹底入門 - SVMをちゃんと実装する
SMO徹底入門 - SVMをちゃんと実装する
 
強束縛模型における多体電子状態の第2量子化表現
強束縛模型における多体電子状態の第2量子化表現強束縛模型における多体電子状態の第2量子化表現
強束縛模型における多体電子状態の第2量子化表現
 
Fourier transform
Fourier transformFourier transform
Fourier transform
 
場の量子論
場の量子論場の量子論
場の量子論
 
20170408cvsaisentan6 2 4.3-4.5
20170408cvsaisentan6 2 4.3-4.520170408cvsaisentan6 2 4.3-4.5
20170408cvsaisentan6 2 4.3-4.5
 
外積代数で読み解く平行体 ~究極の関係式を追い求めて~
外積代数で読み解く平行体 ~究極の関係式を追い求めて~外積代数で読み解く平行体 ~究極の関係式を追い求めて~
外積代数で読み解く平行体 ~究極の関係式を追い求めて~
 
それっぽく感じる機械学習
それっぽく感じる機械学習それっぽく感じる機械学習
それっぽく感じる機械学習
 
双対性
双対性双対性
双対性
 
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
 
第2回 メドレー読書会
第2回 メドレー読書会第2回 メドレー読書会
第2回 メドレー読書会
 
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
 
Computing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner BasisComputing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner Basis
 

第4回数理モデル勉強会(日本植物学会第84回大会関連集会)