数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖...

27
数値解析アルゴリズム 応用:拡散現象

Upload: others

Post on 15-Mar-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

数値解析アルゴリズム

応用:拡散現象

Page 2: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散現象

• 粒子、熱、運動量などが自発的に、空間的に散らばり広がる現象

• 流体を構成する粒子の乱雑な運動に起因

2

インクの拡散[https://www.youtube.com/watch?v=J_D3JO9AUL4]

Page 3: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散現象のモデル化

• たとえば、気体の拡散現象を例に考える。

• 分布がどのように変化するかについての経験則 – Fickの法則:拡散流束は勾配に比例する

–偏微分方程式による数理モデル

• 気体を構成する粒子の運動によって拡散が起こる。衝突が主要プロセス。 –個々の衝突プロセスはランダム

–粒子モデル

3

Page 4: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 変数𝑓(𝑥, 𝑡)に対する拡散方程式 𝜕𝑓

𝜕𝑡= 𝐷𝜕2𝑓

𝜕𝑥2

• Dは拡散係数。簡単のため空間的に変化しないものとする。

• 考える領域を0 < 𝑥 < 𝐿 = 1とする。

• 境界条件は以下のようなものが考えられる。 – 周期境界:𝑓 0 = 𝑓 𝐿 , 𝑓′ 0 = 𝑓′(𝐿)

– Dirichlet条件:𝑓 0 = 0, 𝑓 𝐿 = 0

– Neumann条件:𝑓′ 0 = 0, 𝑓′ 𝐿 = 0

4

Page 5: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 初期値問題

–初期条件は任意に与える。

• 初期条件

–たとえば、𝑓 𝑥, 𝑡 = 0 = 1 − cos2𝜋

𝐿𝑥

• 解析解

𝑓 𝑥, 𝑡 = 1 − cos2𝜋

𝐿𝑥 exp −𝐷

2𝜋

𝐿

2

𝑡

5

Page 6: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 数値解法(有限差分法) – 離散化

• 𝑡𝑛 = 𝑛∆𝑡

• 𝑥𝑖 = 𝑖∆𝑥 (𝑖 = 0,… ,𝑁𝑥;Δ𝑥 = 𝐿/𝑁𝑥) – 𝑥𝑖 = (𝑖 − 0.5)∆𝑥 (𝑖 = 1,… ,𝑁𝑥;Δ𝑥 = 𝐿/𝑁𝑥) とする方式もある。

• 𝑓 𝑥𝑖 , 𝑡𝑛 = 𝑓𝑖𝑛

– 陰的Euler法+中心差分

𝑓𝑖𝑛+1 − 𝑓𝑖

𝑛

∆𝑡= 𝐷𝑓𝑖+1𝑛+1 − 2𝑓𝑖

𝑛+1 + 𝑓𝑖−1𝑛+1

∆𝑥2

6

Page 7: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 数値解法(有限差分法) – 𝑓𝑖𝑛についての漸化式を導出する。

–現在の時刻𝑡𝑛での𝑓𝑛の値を知っているとき、次の時刻𝑡𝑛+1での𝑓𝑛+1の値をどのように計算するか?

–陰解法であることに注意せよ。

–陽解法の場合を先に考えてもよい。

7

Page 8: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 数値解法 – 𝐴 = 𝐷 ∆𝑡 ∆𝑥2 と書く。 – 𝒇𝑛+1(ベクトル)について整理すると

𝐿𝒇𝑛+1 = 𝒇𝑛

𝐿 =

1 + 2𝐴 −𝐴 −𝐴−𝐴 1 + 2𝐴 −𝐴

⋱−𝐴 1 + 2𝐴 −𝐴

−𝐴 −𝐴 1 + 2𝐴

– 周期境界条件より𝑓𝑁𝑥は解く必要がない。𝒇 = 𝑓0, … , 𝑓𝑁𝑥−1 の𝑁𝑥成分、𝐿は𝑁𝑥 × 𝑁𝑥成分の行列。

8

Page 9: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• Dirichlet条件の場合 – 𝑓 0 , 𝑓(𝐿) は解かないので、 𝒇 = 𝑓1, … , 𝑓𝑁𝑥−1 の𝑁𝑥 − 1成分、𝐿は(𝑁𝑥−1) × (𝑁𝑥 − 1)成

分の行列。

𝐿 =

1 + 2𝐴 −𝐴−𝐴 1 + 2𝐴 −𝐴

⋱−𝐴 1 + 2𝐴 −𝐴

−𝐴 1 + 2𝐴

• Neumann条件の場合

– 𝑓−1 = 𝑓1、𝑓𝑁𝑥+1 = 𝑓𝑁𝑥とすればよい。

𝐿 =

1 + 𝐴 −𝐴−𝐴 1 + 2𝐴 −𝐴

⋱−𝐴 1 + 2𝐴 −𝐴

−𝐴 1 + 𝐴

9

Page 10: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 保存性

周期境界、ノイマン型境界のとき

𝐹 = 𝑓d𝑥𝐿

0 は時間変化しない。

𝑑𝐹

𝑑𝑡=𝑑

𝑑𝑡 𝑓𝑑𝑥𝐿

0

= 𝜕𝑓

𝜕𝑡𝑑𝑥

𝐿

0

= 𝐷𝜕2𝑓

𝜕𝑥2𝑑𝑥

𝐿

0

= 𝐷𝜕𝑓

𝜕𝑥0

𝐿

• 離散化された表式で保存性を確認せよ。

𝐹 ≈ ∆𝑥 𝑓𝑖𝑛 + 𝑓𝑖+1

𝑛

2

𝑁𝑥 −1

𝑖=0

=?∆𝑥 𝑓𝑖𝑛+1 + 𝑓𝑖+1

𝑛+1

2

𝑁𝑥−1

𝑖=0

10

Page 11: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• プログラム

–ガウスの消去法、ヤコビ法等の連立方程式の解法を活用できる

11

𝑓の初期設定 行列𝑀の設定 for (i=0;i<;ntime) { t+=dt; 𝑓の更新(入力𝐿、入出力𝑓) }

Page 12: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

12

Page 13: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 精度

–解析解との差を誤差とする

• 𝑒 =1

𝑁 𝑓𝑖 − 𝑓

analytic(𝑥𝑖)2𝑁

𝑖=1

– ∆𝑥, ∆𝑡と誤差との関係

13

Page 14: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

拡散方程式

• 有限差分法による拡散方程式の数値解法

–時間積分法の拡張

–空間積分法の拡張

• 高次精度有限差分

• コンパクト差分

• 他のタイプの偏微分方程式

–双曲型(波動方程式)

–楕円型

14

Page 15: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• ブラウン運動

15

牛乳の脂肪球のブラウン運動 [https://www.youtube.com/watch?v=Osx33N6oTvg]

Page 16: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 確率で移動する粒子 – 1次元なら、𝑝, 1 − 𝑝の確率で右、左に移動する。(𝑥軸正の方向を右とする。)

• ランダムウォークする多数粒子によって拡散現象を表現する。

16

Page 17: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• アルゴリズム –時刻を𝑡𝑛 = 𝑛 ∆𝑡、位置を𝑥𝑖 = 𝑖 ∆𝑥と書く。

–毎時間ステップにおいて確率𝑝 = 1/2で粒子は左右どちらかに1マス移動する。(𝑝 ≠ 1/2でもよい。)

17

Page 18: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• アルゴリズム –時刻𝑡0に位置𝑥0にいた粒子の、時刻𝑡𝑛における位置𝑥𝑖にいる確率分布𝑃(𝑥𝑖 , 𝑡𝑛)は?

– 2項分布

𝑃 𝑥𝑖 , 𝑡𝑛 =𝑛!

𝑛+! 𝑛−!𝑝𝑛+ 1 − 𝑝 𝑛−

– 𝑝は右に移動する確率。𝑛+, 𝑛−は、それぞれ右、左に移動する回数。

𝑛+ + 𝑛− = 𝑛 𝑛+ − 𝑛− = 𝑖

18

Page 19: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 一般に,左右に移動する確率を𝑝 =1

2, 𝑞 = 1 − 𝑝 =

1

2 として

おく。 • 平均

– 𝑥 = 𝑥𝑖𝑝 𝑥𝑖 , 𝑡𝑛𝑛𝑖=−𝑛 = ∆𝑥 𝑛 2𝑝 − 1 = 0

– 2項展開 𝑝 + 𝑞 𝑛 = 𝐶𝑘𝑛 𝑝𝑛𝑞𝑛−𝑘𝑛

𝑘=0 を用いる

– 𝑥𝑖𝑝 𝑥𝑖 , 𝑡𝑛𝑛𝑖=−𝑛 = (𝑖∆𝑥) 𝐶𝑛+𝑛 𝑝𝑛+𝑞𝑛−𝑛+𝑛

𝑖=−𝑛 =

∆𝑥 (2𝑛+ − 𝑛)𝑛𝑛+=0

𝐶𝑛+𝑛 𝑝𝑛+𝑞𝑛−𝑛+ =

∆𝑥 2 𝑛+ 𝐶𝑛+𝑛 𝑝𝑛+𝑞𝑛−𝑛+𝑛𝑛+=1

− 𝑛 𝐶𝑛+𝑛 𝑝𝑛+𝑞𝑛−𝑛+𝑛𝑛+=0

=

∆𝑥 2 𝑛𝑝 𝐶𝑛+𝑛−1 𝑝𝑛+𝑞𝑛−1−𝑛+𝑛−1𝑛+=0

− 𝑛 𝑝 + 𝑞 𝑛 = ∆𝑥 2𝑛𝑝 − 𝑛

• 分散

– 𝑥2 = 𝑥𝑖 − 𝑥2𝑝 𝑥𝑖 , 𝑡𝑛

𝑛𝑖=−𝑛 = Δ𝑥 4𝑛𝑝𝑞 =2 Δ𝑥2𝑛

19

Page 20: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 拡散 – 𝑡 = 𝑛∆𝑡を用いると

– 𝑥2 = ∆𝑥2𝑡

∆𝑡= 2𝐷𝑡

–ただし𝐷 = ∆𝑥2

2∆𝑡

20

Page 21: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 確率分布がしたがう差分方程式

𝑝 𝑥𝑖 , 𝑡𝑛+1 =1

2𝑝 𝑥𝑖+1, 𝑡𝑛 + 𝑝(𝑥𝑖−𝑖 , 𝑡𝑛)

• 変形すると

𝑝 𝑥𝑖 , 𝑡𝑛+1 − 𝑝(𝑥𝑖 , 𝑡𝑛) =1

2𝑝 𝑥𝑖+1, 𝑡𝑛 − 2𝑝(𝑥𝑖 , 𝑡𝑛) + 𝑝(𝑥𝑖−𝑖 , 𝑡𝑛)

• 連続極限で拡散方程式に一致 𝑝 𝑥𝑖 , 𝑡𝑛+1 − 𝑝(𝑥𝑖 , 𝑡𝑛)

∆𝑡=∆𝑥2

2∆𝑡

𝑝 𝑥𝑖+1, 𝑡𝑛 − 2𝑝 𝑥𝑖 , 𝑡𝑛 + 𝑝(𝑥𝑖−1, 𝑡𝑛)

∆𝑥2

𝐷 = ∆𝑥2

(2∆𝑡) を有限に保ったままΔ𝑥, ∆𝑡 → 0 とすると

𝜕𝑝

𝜕𝑡= 𝐷𝜕2𝑝

𝜕𝑥2

21

Page 22: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• プログラム

22

for (i=0;i<ntime;i++) { t+=dt; for (ip=0;ip<np;ip++) { 各粒子の位置の更新 } 各粒子位置から分布への焼き直し }

Page 23: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• プログラム – 位置の更新 – [0,1)の一様乱数を返す関数として、rand_uni()が定義されているとする。

23

r=rand_uni(); if (r<0.5) { x[ip]++; } else { x[ip]--; }

Page 24: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• プログラム – C言語での乱数

• 標準ライブラリで定義されているrand()関数が使える。rand()は0からRAND_MAX(実装によるが、glibcなら232)の整数

• [0,1)の範囲の実数の一様乱数を返す関数を以下のように定義する。

24

#include <stdlib.h> double rand_uni() { return rand()/((double) RAND_MAX + 1); }

Page 25: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 初期分布の設定 –確率分布𝑝 𝑥 = 1 − cos 2𝜋 𝑥に従う乱数𝑋p ∈ [0,1]を得たい。(一様乱数は容易に得ら

れるとする。)

25

Page 26: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 初期分布の設定(逆変換法による乱数生成) – 累積分布関数

𝑞 𝑥 = 𝑝 𝑥 𝑑𝑥𝑥

0

= 𝑥 −1

2𝜋sin 2𝜋𝑥

– 一様乱数𝑋U ∈ [0,1]が与えられたとき、𝑝(𝑥)にしたがう乱数𝑋P を得るには𝑞 𝑋P = 𝑋Uを満たす𝑋Pを求めればよい。

– すなわち、𝑓 𝑋P = 𝑞 𝑋P − 𝑋Uに対して、𝑓 𝑋P = 0を満たす𝑋Pを求める求根問題を解く。

26

Page 27: 数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖 𝑛についての漸化式を導出する。 –現在の時刻𝑡𝑛での 𝑛の値を知っているとき、

ランダムウォーク

• 拡散係数

–時間ステップ、空間ステップとの関係

• 粒子数𝑁pと誤差の関係

27