Weitere ähnliche Inhalte
Ähnlich wie 第4回数理モデル勉強会(日本植物学会第84回大会関連集会) (20)
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
- 4. 反応拡散モデルとは何か
反応拡散方程式の意味(反応項)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷
𝜕2
𝜕𝑥2
𝑢
一成分一次元で考える
𝑡
ある時刻𝑡の位置𝑥での濃度を𝑢 𝑥, 𝑡 とおく。
𝜕
𝜕𝑡
𝑢 𝑥, 𝑡 ≔ lim
∆𝑡=0
𝑢 𝑥, 𝑡 + ∆𝑡 − 𝑢(𝑥, 𝑡)
∆𝑡
𝑓 𝑢 = 𝑉𝑢 − 𝑑 𝑢 𝑢たとえば
これだけなら、単なる反応速度の式になる。
あるいは 𝑓 𝑢 =
𝑉𝑢 𝑢2
1 + 𝑢2 − 𝑑 𝑢 𝑢
𝑢 均一な濃度変化
反応式いろいろ
𝑡
𝑢 均一な濃度変化
- 5. 反応拡散モデルとは何か
反応拡散方程式の意味(拡散項)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷
𝜕2
𝜕𝑥2
𝑢
一成分一次元の拡散
単位時間単位面積あたりの物質の移動(拡散流束)は濃度勾配に比
例する。
𝑥𝑥 − ∆𝑥 𝑥 + ∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
lim
∆𝑥→0
1
∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
− 𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
= lim
∆𝑥→0
𝐷
1
∆𝑥
𝜕
𝜕𝑥
𝑢 𝑥 +
∆𝑥
2
−
𝜕
𝜕𝑥
𝑢 𝑥 −
∆𝑥
2
= 𝐷
𝜕2
𝜕𝑥2
𝑢
𝑥
フィックの法則
- 6. 反応拡散モデルとは何か
反応拡散方程式
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢 + 𝐷
𝜕2
𝜕𝑥2
𝑢
一成分一次元
𝑥
時間あたりの物質の濃度変化は、反応(合成、分解)と拡散の効果
の和で表される。
二成分(一番メジャー)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
𝑥
- 7. 反応拡散モデルとは何か
自律的パターン形成の起こるネットワーク
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
𝑥
Activator-Inhibitor 系
Activator-Substrate 系
activator
inhibitor
activator
substrate
自律的パターン形成の見られ
る𝑓 𝑢, 𝑣 , 𝑔 𝑢, 𝑣 にはいくつか
のタイプが知られている。 +
+
−
−
−
−
+
+
- 8. 1次元のシミュレーション
反応拡散モデルをシミュレートしよう(1次元)
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
𝑥
Gierer-Meinhardt activator-inhibitor system
(Koch and Meinhardt, 1994)
𝑓 𝑎, ℎ = 𝜌 𝑎
𝑎2
1 + 𝜅 𝑎 𝑎2 ℎ
− 𝜇 𝑎 𝑎 + 𝜎 𝑎
𝑔 𝑎, ℎ = 𝜌ℎ 𝑎2 − 𝜇ℎℎ + 𝜎ℎ
𝑎 𝑥
ℎ 𝑥
activator
inhibitor
+
−
−
+
- 9. 反応拡散モデルをシミュレートしよう(1次元)
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
𝑥
この時間発展方程式を厳密に解くことはできないが、
コンピュータ上でその挙動を近似的に計算することは
できる。
離散化
元の厳密な方程式を、簡単な繰り返し計算で近似的に
時間発展させることで、その性質を掴む。
𝑎 𝑥
ℎ 𝑥
1次元のシミュレーション
- 13. 1次元の時間発展方程式の離散化(時間)
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
オイラー法による時間方向の離散化
𝑎 𝑡+∆𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎 𝑡 ∆𝑡
1次元のシミュレーション
ℎ 𝑡+∆𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ 𝑡 ∆𝑡
𝑡
𝑢
∆𝑡 ∆𝑡∆𝑡∆𝑡
- 14. 1次元の時間発展方程式の離散化(空間)
𝑥
空間方向の離散化
𝑎 𝑡+∆𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎 𝑡 ∆𝑡
ℎ 𝑡+∆𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ 𝑡 ∆𝑡
離散化された拡散
𝑥𝑥 − ∆𝑥 𝑥 + ∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
lim
∆𝑥→0
1
∆𝑥
𝐷
𝑢 𝑥 + ∆𝑥 − 𝑢 𝑥
∆𝑥
− 𝐷
𝑢 𝑥 − 𝑢 𝑥 − ∆𝑥
∆𝑥
= 𝐷
𝜕2
𝜕𝑥2
𝑢
𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎 𝑡 →
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
1次元のシミュレーション
1
∆𝑥
𝐷
𝑎𝑖+1
𝑡
− 𝑎𝑖
𝑡
∆𝑥
− 𝐷
𝑎𝑖
𝑡
− 𝑎𝑖−1
𝑡
∆𝑥
- 15. 1次元の時間発展方程式の離散化
空間方向の離散化
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑥
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
𝑎𝑖
0
, ℎ𝑖
0
を全細胞で決めたら、あとは時
間ステップごとに順番に計算してい
くことで、時間とともにパターンが
どう変わっていくのかシミュレー
ションできる。
1次元のシミュレーション
- 18. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 19. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 22. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 23. 反応拡散モデルのシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2 ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
× ステップ計算
計算前の𝑎, ℎをプロット
計算後の𝑎, ℎをプロット
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
1次元のシミュレーション
- 24. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 26. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 28. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 30. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 32. 反応拡散モデルのシミュレーション
𝑎𝑖
𝑡 𝑎𝑖+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次元のシミュレーション
- 33. 反応拡散モデルのシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ ∆𝑎𝑖∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ ∆ℎ𝑖∆𝑡
∆𝑎𝑖 = 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
∆ℎ𝑖 = 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
∆𝑎𝑖 = ∆𝑎𝑖 +
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1
𝑡
− 𝑎𝑖
𝑡
∆ℎ𝑖 = ∆ℎ𝑖 +
𝐷ℎ
∆𝑥 2 ℎ𝑖−1
𝑡
− ℎ𝑖
𝑡
⋯ ⋯ ⋯
a
𝑎1 𝑎2 𝑎 𝑛−1 𝑎 𝑛
1次元のシミュレーション
∆𝑎𝑖 = ∆𝑎𝑖 +
𝐷 𝑎
∆𝑥 2 𝑎𝑖+1
𝑡
− 𝑎𝑖
𝑡
∆ℎ𝑖 = ∆ℎ𝑖 +
𝐷ℎ
∆𝑥 2 ℎ𝑖+1
𝑡
− ℎ𝑖
𝑡
- 34. 反応拡散モデルのシミュレーション
1次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2 𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2 ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
× ステップ計算
計算前の𝑎, ℎをプロット
計算後の𝑎, ℎをプロット
𝑎𝑖
𝑡 𝑎𝑖+1
𝑡
𝑎𝑖−1
𝑡
ℎ𝑖
𝑡 ℎ𝑖+1
𝑡
ℎ𝑖−1
𝑡
時刻 𝑡
- 35. シミュレーションで遊んでみよう
拡散係数を色々変えてみよう。
𝐷 𝑎 = 0.10, 𝐷ℎ = 1.0 ならどうだろうか?
𝐷 𝑎 = 0.15, 𝐷ℎ = 1.0 ならどうだろうか?
𝐷 𝑎 = 0.05, 𝐷ℎ = 1.0 ならどうだろうか?
たとえば……
1次元のシミュレーション
初期条件を色々変えてみよう。
ℎの初期条件にも乱数を入れたらどうだろうか?
たとえば……
初期の濃度をもっと低いところから始めたらどうだろうか?
- 36. 反応拡散モデルで波が立つ
𝐷 𝑎 = 0.10, 𝐷ℎ = 1.0
𝐷 𝑎 = 0.15, 𝐷ℎ = 1.0𝐷 𝑎 = 0.05, 𝐷ℎ = 1.0
𝐷 𝑎 ≪ 𝐷ℎ のと き 、波 状
のパターンが立ち上が
る。
1次元のシミュレーション
𝐷 𝑎が大きかったり𝐷ℎが
小さかったりすると、
波ができない。
- 38. なぜ自己組織化がおこるのか(厳密な話)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
𝑓 𝑢, 𝑣 = 𝑔 𝑢, 𝑣 = 0となる 𝑢, 𝑣 = 𝑢′, 𝑣′ とおく。
𝑥
𝑢′
𝑣′
𝑢の濃度も𝑣の濃度も変わらない。
(平衡)
1次元のシミュレーション
𝑓 𝑢, 𝑣 を 𝑢, 𝑣 = 𝑢′, 𝑣′ の周りでテイラー展開すると、
𝑓 𝑢′ + 𝑤 𝑢, 𝑣′ + 𝑤𝑣 =
𝑘=0
∞
𝑙=0
∞
𝜕 𝑘
𝜕𝑢 𝑘
𝜕 𝑙
𝜕𝑣 𝑙 𝑓 𝑢′, 𝑣′
𝑤 𝑢
𝑘 𝑤𝑣
𝑙
𝑘! 𝑙!
∇𝑢 、∇𝑣が十分小さい時、二乗以上の項は無視できるほど小さいので、
𝑓 𝑢′ + 𝑤 𝑢, 𝑣 + 𝑤𝑣 ≒ 𝑓 𝑢′, 𝑣′ + 𝑤 𝑢
𝜕
𝜕𝑢
𝑓 𝑢′, 𝑣′ + 𝑤𝑣
𝜕
𝜕𝑣
𝑓 𝑢′, 𝑣′
おまけ
- 39. なぜ自己組織化がおこるのか(厳密な話)
𝑓 𝑢, 𝑣 = 𝑔 𝑢, 𝑣 = 0となる 𝑢, 𝑣 = 𝑢′, 𝑣′ とおく。
𝑥
𝑢′
𝑣′
𝑢の濃度も𝑣の濃度も変わらない。
(平衡)
1次元のシミュレーション
𝑓 𝑢, 𝑣 を 𝑢, 𝑣 = 𝑢′, 𝑣′ の周りでテイラー展開すると、
𝑓 𝑢′ + 𝑤 𝑢, 𝑣′ + 𝑤𝑣 =
𝑘=0
∞
𝑙=0
∞
𝜕 𝑘
𝜕𝑢 𝑘
𝜕 𝑙
𝜕𝑣 𝑙 𝑓 𝑢′, 𝑣′
𝑤 𝑢
𝑘 𝑤𝑣
𝑙
𝑘! 𝑙!
𝑤 𝑢 、𝑤𝑣が十分小さい時、二乗以上の項は無視できるほど小さいので、
𝑓 𝑢′ + ∇𝑢, 𝑣 + ∇𝑣 ≒ 𝑓𝑢 𝑤 𝑢 + 𝑓𝑣 𝑤𝑣
𝑔 𝑢′ + ∇𝑢, 𝑣 + ∇𝑣 ≒ 𝑔 𝑢 𝑤 𝑢 + 𝑔 𝑣 𝑤𝑣
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
おまけ
- 40. なぜ自己組織化がおこるのか(厳密な話)
𝑢′, 𝑣′ からのずれの程度で標準化する。
𝜕𝒘
𝜕𝑡
= 𝐴𝒘 + 𝐷
𝜕2
𝜕𝑥2
𝒘
𝒘 =
𝑤 𝑢
𝑤𝑣
𝐴 =
𝑓𝑢 𝑓𝑣
𝑔 𝑢 𝑔 𝑣
𝐷 =
𝐷 𝑢 0
0 𝐷 𝑣
1次元のシミュレーション
𝑥
0
𝑥
0
𝑤 𝑢 = 𝑢 − 𝑢′
𝑤𝑣 = 𝑣 − 𝑣′
こういう正弦波が立ち上がるのは、
どんなパラメータ設定だろうか?
𝜕
𝜕𝑡
𝑤 𝑢 ≒ 𝑓𝑢 𝑤 𝑢 + 𝑓𝑣 𝑤𝑣 + 𝐷
𝜕2
𝜕𝑥2 𝑤 𝑢
𝜕
𝜕𝑡
𝑤𝑣 ≒ 𝑔 𝑢 𝑤 𝑢 + 𝑔 𝑣 𝑤𝑣 + 𝐷
𝜕2
𝜕𝑥2 𝑤𝑣
おまけ
- 41. なぜ自己組織化がおこるのか(厳密な話)
𝜕𝒘
𝜕𝑡
= 𝐴𝒘 + 𝐷
𝜕2
𝜕𝑥2
𝒘
𝒘 =
𝑘
𝒄 𝑘 𝑒 𝜆 𝑘 𝑡 𝑒 𝑖𝑘𝑥
𝜆 𝑘 𝒘 = 𝐴𝒘 − 𝑘2 𝐷𝒘
周期的なパターンの重ね合わせで表現でき
る 𝒘を考える。ある𝑘について、𝜆 𝑘 > 0と
なる𝜆 𝑘が存在すれば、ちょっとした揺らぎ
から2π/𝑘の波長のパターンが成長する。
𝑓𝑢 − 𝑘2 𝐷 𝑢 𝑓𝑣
𝑔 𝑢 𝑔 𝑣 − 𝑘2 𝐷 𝑣
𝒘 = 𝜆 𝒌 𝒘
𝜆 𝑘 =
𝑓𝑢 + 𝑔 𝑣 − 𝑘2 𝐷 𝑢 + 𝐷 𝑣 ± 𝑓𝑢 + 𝑔 𝑣 − 𝑘2 𝐷 𝑢 + 𝐷 𝑣
2
− 4 𝑓𝑢 − 𝑘2 𝐷 𝑢 𝑔 𝑣 − 𝑘2 𝐷 𝑣 − 𝑓𝑣 𝑔 𝑢
2
𝜆は行列の固有値。
1次元のシミュレーション
𝑥
0
2π
𝑘
π
𝑘
おまけ
- 42. なぜ自己組織化がおこるのか(厳密な話)
𝜆 𝑘 =
𝑓𝑢 + 𝑔 𝑣 − 𝑘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次元のシミュレーションおまけ
- 43. なぜ自己組織化がおこるのか(厳密な話)
𝑓𝑎 𝑔ℎ − 𝑓ℎ 𝑔 𝑎 > 0
𝐷 𝑎 𝑔ℎ + 𝐷ℎ 𝑓𝑎 > 0
𝑓𝑎 + 𝑔ℎ < 0
𝐷 𝑎 𝑔ℎ − 𝐷ℎ 𝑓𝑎
2 + 4𝐷 𝑎 𝐷ℎ 𝑓ℎ 𝑔 𝑎 > 0 𝑓𝑎 > 0
activator
inhibitor
+
−
−
+
𝑔ℎ < 0𝑔 𝑎 > 0
𝑓ℎ < 0
𝐷ℎ ≫ 𝐷 𝑎のとき、波状のパターンが立ち上がる
(拡散不安定性)。
1次元のシミュレーション
👉
👉
👉
𝐷ℎ ≫ 𝐷 𝑎でないとこれらの条件を満たさない。
おまけ
- 44. なぜ自己組織化がおこるのか(厳密な話)
𝜕𝑢
𝜕𝑡
= 𝑓 𝑢, 𝑣 + 𝐷 𝑢
𝜕2
𝜕𝑥2
𝑢
𝜕𝑣
𝜕𝑡
= 𝑔 𝑢, 𝑣 + 𝐷𝑣
𝜕2
𝜕𝑥2
𝑣
Activator-Inhibitor 系
Activator-Substrate 系
自律的パターン形成の見られ
る2成分の関係性には、いくつ
かのタイプが知られている。 activator
inhibitor
activator
substrate
+
+
−
−
−
−
+
+
1次元のシミュレーションおまけ
- 45. 1次元から2次元へ
𝐷 𝑎 = 0.10, 𝐷ℎ = 1.0
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕2
𝜕𝑥2
𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ
𝜕2
𝜕𝑥2
ℎ
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎∇2 𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ∇2ℎ
∇2=
𝜕
𝜕𝑥
𝜕
𝜕𝑦
∙
𝜕
𝜕𝑥
𝜕
𝜕𝑦
=
𝜕2
𝜕𝑥2 +
𝜕2
𝜕𝑦2
2次元のシミュレーション
- 46. 1次元のシミュレーション
2次元のシミュレーション
𝑎𝑖
𝑡+∆𝑡
= 𝑎𝑖
𝑡
+ 𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1
𝑡
+ 𝑎𝑖+1
𝑡
− 2𝑎𝑖
𝑡
∆𝑡
ℎ𝑖
𝑡+∆𝑡
= ℎ𝑖
𝑡
+ 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1
𝑡
+ ℎ𝑖+1
𝑡
− 2ℎ𝑖
𝑡
∆𝑡
𝑓 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
, 𝑔 𝑎𝑖
𝑡
, ℎ𝑖
𝑡
の設定
描画関数の設定
区画数の設定
拡散定数や区画の大きさの設定
ループ数の設定
初期設定
本体
- 47. 2次元のシミュレーション
2次元のシミュレーション
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
, 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
の設定
描画関数の設定 区画数の設定
拡散定数や区画の大きさの設定 ループ数の設定
初期設定
本体
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
- 48. 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]]は𝑎𝑖,𝑗を指し示す。
- 49. 2次元のシミュレーション
2次元のシミュレーション
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
, 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
の設定
描画関数の設定 区画数の設定
拡散定数や区画の大きさの設定 ループ数の設定
初期設定
本体
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
- 50. 二次元の反応拡散モデル
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎
𝜕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次元のシミュレーション
- 51. 二次元の反応拡散モデル
時刻 𝒕
𝑎𝑖,𝑗
𝑡
𝑖
𝑖 + 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𝑎𝑖,𝑗
𝑡
- 52. 2次元の反応拡散モデルのシミュレーション
2次元のシミュレーション
計算前の𝑎, ℎをプロット
計算後の状態をプロット
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 2
ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
+ ℎ𝑖,𝑗+1
𝑡
− 4ℎ𝑖,𝑗
𝑡
∆𝑡
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
- 54. 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
𝑡
− ℎ𝑖,𝑗
𝑡
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+∆𝑎 × ∆𝑡
+∆ℎ × ∆𝑡
- 59. ループと分岐が重すぎる
ℎ𝑖,𝑗
𝑡+∆𝑡
= ℎ𝑖,𝑗
𝑡
+ 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷ℎ
∆𝑥 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
𝑡
− ℎ𝑖,𝑗
𝑡
𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+∆𝑎 × ∆𝑡
+∆ℎ × ∆𝑡
シミュレーションの高速化
- 60. シミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ Rotate関数で条件分岐の煩雑さを消す。
▪ Forループは使わない
Rotate関数を使うと配列の端っこでは、自動
的に反対側の端点を参照してくれる。
コード上でループや条件分岐を書くよりも、
圧倒的に速い。
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
- 61. シミュレーションの高速化
計算速度に物足りなさを感じたときには
コード上でループや条件分岐を書くよりも、圧倒的に速い。
𝑢 =
𝑢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
- 62. シミュレーションの高速化
計算速度に物足りなさを感じたときには
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 𝑓 𝑢 𝑛,𝑛
- 63. シミュレーションの高速化
計算速度に物足りなさを感じたときには
▪ Rotate関数で条件分岐の煩雑さを消す。
▪ Forループは使わない
Rotate関数を使うと配列の端っこでは、自動
的に反対側の端点を参照してくれる。
コード上でループや条件分岐を書くよりも、
圧倒的に速い。
𝑎𝑖,𝑗
𝑡+∆𝑡
= 𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+
𝐷 𝑎
∆𝑥 2
𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
− 4𝑎𝑖,𝑗
𝑡
∆𝑡
- 66. 陰解法を用いたシミュレーションの高速化
時間刻みを粗くすればシミュレーションは短くなる
▪ 粗くすればするほど、挙動は不安定になる。
▪ どこまで時間刻みを粗くできるだろうか?
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+1,𝑗
𝑡
+ 𝑎𝑖,𝑗+1
𝑡
+ 𝑎𝑖−1,𝑗
𝑡
+ 𝑎𝑖,𝑗−1
𝑡
− 4𝑎𝑖,𝑗
𝑡
Δ𝑥 2
Δ𝑡
ℎ𝑖,𝑗
𝑡+Δ𝑡
− ℎ𝑖,𝑗
𝑡
= 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷ℎ
ℎ𝑖+1,𝑗
𝑡
+ ℎ𝑖,𝑗+1
𝑡
+ ℎ𝑖−1,𝑗
𝑡
+ ℎ𝑖,𝑗−1
𝑡
− 4ℎ𝑖,𝑗
𝑡
Δ𝑥 2
Δ𝑡
𝜕𝑎
𝜕𝑡
= 𝑓 𝑎, ℎ + 𝐷 𝑎∇2 𝑎
𝜕ℎ
𝜕𝑡
= 𝑔 𝑎, ℎ + 𝐷ℎ∇2ℎ
𝑎𝑖,𝑗
𝑡+Δ𝑡
1≤𝑖,𝑗≤𝑛
= 𝒬 𝑎 𝑎𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
, ℎ𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
ℎ𝑖,𝑗
𝑡+Δ𝑡
1≤𝑖,𝑗≤𝑛
= 𝒬ℎ 𝑎𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
, ℎ𝑖,𝑗
𝑡
1≤𝑖,𝑗≤𝑛
陽解法
次の時間ステップを、前のステッ
プから直接(陽的)に計算可能
- 69. 陰解法を用いたシミュレーションの高速化
陽解法と陰解法
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+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 Δ𝑡
拡散項は、次のステップを用いて計算陰解法
- 70. 陰解法を用いたシミュレーションの高速化
陽解法と陰解法
𝑎𝑖,𝑗
𝑡+Δ𝑡
− 𝑎𝑖,𝑗
𝑡
= 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷 𝑎
𝑎𝑖+1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗+1
𝑡+Δ𝑡
+ 𝑎𝑖−1,𝑗
𝑡+Δ𝑡
+ 𝑎𝑖,𝑗−1
𝑡+Δ𝑡
− 4𝑎𝑖,𝑗
𝑡+Δ𝑡
Δ𝑥 2 Δ𝑡
ℎ𝑖,𝑗
𝑡+Δ𝑡
− ℎ𝑖,𝑗
𝑡
= 𝑔 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
+ 𝐷ℎ
ℎ𝑖+1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗+1
𝑡+Δ𝑡
+ ℎ𝑖−1,𝑗
𝑡+Δ𝑡
+ ℎ𝑖,𝑗−1
𝑡+Δ𝑡
− 4ℎ𝑖,𝑗
𝑡+Δ𝑡
Δ𝑥 2 Δ𝑡
拡散項は、次のステップを用いて計算陰解法
𝑎𝑖,𝑗
𝑡+Δ𝑡
とℎ𝑖,𝑗
𝑡+Δ𝑡
を計算するのに、 𝑎𝑖,𝑗
𝑡+Δ𝑡
とℎ𝑖,𝑗
𝑡+Δ𝑡
が必要(陰的)。
𝑛2 個の成分からなる巨大な連立一次方程式を2本解かなければならない。
幸いにして、Wolframには、この形の連立一次方程式を高速に解くの
に有用なFFT(高速フーリエ変換)が関数として使える。
1ステップ当たりの時間はオイラー法より遅いが、時間刻みを粗くして
も不安定にならないので、結果トータルでは速くできる。
- 71. 陰解法を用いたシミュレーションの高速化
陰解法の解き方
𝑎𝑖,𝑗
𝑡
+ 𝑓 𝑎𝑖,𝑗
𝑡
, ℎ𝑖,𝑗
𝑡
Δ𝑡
= 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
おまけ
- 72. 陰解法を用いたシミュレーションの高速化
陰解法の解き方
畳み込み定理が使える
൝
𝑘 𝑎 ∗ 𝑎 𝑡+Δ𝑡 = 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
𝑘ℎ ∗ ℎ 𝑡+Δ𝑡 = ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ቐ
ℱ 𝑘 𝑎 ∗ 𝑎 𝑡+Δ𝑡 = ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘ℎ ∗ ℎ 𝑡+Δ𝑡 = ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ቐ
ℱ 𝑘 𝑎 ⊙ ℱ 𝑎 𝑡+Δ𝑡 = ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ℱ 𝑘ℎ ⊙ ℱ ℎ 𝑡+Δ𝑡 = ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡
ቐ
𝑎 𝑡+Δ𝑡 = ℱ−1 ℱ 𝑎 𝑡 + 𝑓 𝑎 𝑡, ℎ 𝑡 Δ𝑡 ⊘ ℱ 𝑘 𝑎
ℎ 𝑡+Δ𝑡 = ℱ−1 ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡 ⊘ ℱ 𝑘ℎ
ℱ 𝐴 𝑢,𝑣
=
𝑝=1
𝑁
𝑞=1
𝑁
𝐴 𝑝,𝑞 𝑒−2π𝑖(
𝑢𝑝
𝑁
+
𝑣𝑞
𝑁
)
(離散)フーリエ変換
ℱ−1 𝐵 𝑝,𝑞
=
1
𝑁2
𝑢=1
𝑁
𝑣=1
𝑁
𝐵𝑢,𝑣 𝑒2π𝑖(
𝑢𝑝
𝑁
+
𝑣𝑞
𝑁
)
フーリエ変換が高速で計算できるなら、
簡単に陰解法が使える!
⊙
⊘
成分ごとの積
成分ごとの商
ቐ
ℱ 𝑎 𝑡+Δ𝑡
= ℱ 𝑎 𝑡
+ 𝑓 𝑎 𝑡
, ℎ 𝑡
Δ𝑡 ⊘ ℱ 𝑘 𝑎
ℱ ℎ 𝑡+Δ𝑡 = ℱ ℎ 𝑡 + 𝑔 𝑎 𝑡, ℎ 𝑡 Δ𝑡 ⊘ ℱ 𝑘ℎ
ℱ 𝑎 ∗ 𝑏 = ℱ 𝑎 ⊙ ℱ 𝑏
おまけ
- 76. 陰解法を用いたシミュレーションの高速化
コードの解説
畳み込みカーネルの設定
𝑘 𝑎 =
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
おまけ
- 81. シミュレーションで遊んでみよう
拡散係数を色々変えてみよう。
𝐷 𝑎 = 0.095, 𝐷ℎ = 1.0 ならどうだろうか?
𝐷 𝑎 = 0.103, 𝐷ℎ = 1.0 ならどうだろうか?(amaxを2くらいま
で下げたほうがパターンは見やすいだろう)
𝐷 𝑎 = 0.08, 𝐷ℎ = 1.0 ならどうだろうか?
たとえば𝑛 = 50でやってみよう。
陰解法を用いたシミュレーションの高速化