数値解析アルゴリズム拡散方程式 •数値解法(有限差分法) – 𝑖...
TRANSCRIPT
数値解析アルゴリズム
応用:拡散現象
拡散現象
• 粒子、熱、運動量などが自発的に、空間的に散らばり広がる現象
• 流体を構成する粒子の乱雑な運動に起因
2
インクの拡散[https://www.youtube.com/watch?v=J_D3JO9AUL4]
拡散現象のモデル化
• たとえば、気体の拡散現象を例に考える。
• 分布がどのように変化するかについての経験則 – Fickの法則:拡散流束は勾配に比例する
–偏微分方程式による数理モデル
• 気体を構成する粒子の運動によって拡散が起こる。衝突が主要プロセス。 –個々の衝突プロセスはランダム
–粒子モデル
3
拡散方程式
• 変数𝑓(𝑥, 𝑡)に対する拡散方程式 𝜕𝑓
𝜕𝑡= 𝐷𝜕2𝑓
𝜕𝑥2
• Dは拡散係数。簡単のため空間的に変化しないものとする。
• 考える領域を0 < 𝑥 < 𝐿 = 1とする。
• 境界条件は以下のようなものが考えられる。 – 周期境界:𝑓 0 = 𝑓 𝐿 , 𝑓′ 0 = 𝑓′(𝐿)
– Dirichlet条件:𝑓 0 = 0, 𝑓 𝐿 = 0
– Neumann条件:𝑓′ 0 = 0, 𝑓′ 𝐿 = 0
4
拡散方程式
• 初期値問題
–初期条件は任意に与える。
• 初期条件
–たとえば、𝑓 𝑥, 𝑡 = 0 = 1 − cos2𝜋
𝐿𝑥
• 解析解
𝑓 𝑥, 𝑡 = 1 − cos2𝜋
𝐿𝑥 exp −𝐷
2𝜋
𝐿
2
𝑡
5
拡散方程式
• 数値解法(有限差分法) – 離散化
• 𝑡𝑛 = 𝑛∆𝑡
• 𝑥𝑖 = 𝑖∆𝑥 (𝑖 = 0,… ,𝑁𝑥;Δ𝑥 = 𝐿/𝑁𝑥) – 𝑥𝑖 = (𝑖 − 0.5)∆𝑥 (𝑖 = 1,… ,𝑁𝑥;Δ𝑥 = 𝐿/𝑁𝑥) とする方式もある。
• 𝑓 𝑥𝑖 , 𝑡𝑛 = 𝑓𝑖𝑛
– 陰的Euler法+中心差分
𝑓𝑖𝑛+1 − 𝑓𝑖
𝑛
∆𝑡= 𝐷𝑓𝑖+1𝑛+1 − 2𝑓𝑖
𝑛+1 + 𝑓𝑖−1𝑛+1
∆𝑥2
6
拡散方程式
• 数値解法(有限差分法) – 𝑓𝑖𝑛についての漸化式を導出する。
–現在の時刻𝑡𝑛での𝑓𝑛の値を知っているとき、次の時刻𝑡𝑛+1での𝑓𝑛+1の値をどのように計算するか?
–陰解法であることに注意せよ。
–陽解法の場合を先に考えてもよい。
7
拡散方程式
• 数値解法 – 𝐴 = 𝐷 ∆𝑡 ∆𝑥2 と書く。 – 𝒇𝑛+1(ベクトル)について整理すると
𝐿𝒇𝑛+1 = 𝒇𝑛
𝐿 =
1 + 2𝐴 −𝐴 −𝐴−𝐴 1 + 2𝐴 −𝐴
⋱−𝐴 1 + 2𝐴 −𝐴
−𝐴 −𝐴 1 + 2𝐴
– 周期境界条件より𝑓𝑁𝑥は解く必要がない。𝒇 = 𝑓0, … , 𝑓𝑁𝑥−1 の𝑁𝑥成分、𝐿は𝑁𝑥 × 𝑁𝑥成分の行列。
8
拡散方程式
• 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
拡散方程式
• 保存性
周期境界、ノイマン型境界のとき
𝐹 = 𝑓d𝑥𝐿
0 は時間変化しない。
𝑑𝐹
𝑑𝑡=𝑑
𝑑𝑡 𝑓𝑑𝑥𝐿
0
= 𝜕𝑓
𝜕𝑡𝑑𝑥
𝐿
0
= 𝐷𝜕2𝑓
𝜕𝑥2𝑑𝑥
𝐿
0
= 𝐷𝜕𝑓
𝜕𝑥0
𝐿
• 離散化された表式で保存性を確認せよ。
𝐹 ≈ ∆𝑥 𝑓𝑖𝑛 + 𝑓𝑖+1
𝑛
2
𝑁𝑥 −1
𝑖=0
=?∆𝑥 𝑓𝑖𝑛+1 + 𝑓𝑖+1
𝑛+1
2
𝑁𝑥−1
𝑖=0
10
拡散方程式
• プログラム
–ガウスの消去法、ヤコビ法等の連立方程式の解法を活用できる
11
𝑓の初期設定 行列𝑀の設定 for (i=0;i<;ntime) { t+=dt; 𝑓の更新(入力𝐿、入出力𝑓) }
拡散方程式
12
拡散方程式
• 精度
–解析解との差を誤差とする
• 𝑒 =1
𝑁 𝑓𝑖 − 𝑓
analytic(𝑥𝑖)2𝑁
𝑖=1
– ∆𝑥, ∆𝑡と誤差との関係
13
拡散方程式
• 有限差分法による拡散方程式の数値解法
–時間積分法の拡張
–空間積分法の拡張
• 高次精度有限差分
• コンパクト差分
• 他のタイプの偏微分方程式
–双曲型(波動方程式)
–楕円型
14
ランダムウォーク
• ブラウン運動
15
牛乳の脂肪球のブラウン運動 [https://www.youtube.com/watch?v=Osx33N6oTvg]
ランダムウォーク
• 確率で移動する粒子 – 1次元なら、𝑝, 1 − 𝑝の確率で右、左に移動する。(𝑥軸正の方向を右とする。)
• ランダムウォークする多数粒子によって拡散現象を表現する。
16
ランダムウォーク
• アルゴリズム –時刻を𝑡𝑛 = 𝑛 ∆𝑡、位置を𝑥𝑖 = 𝑖 ∆𝑥と書く。
–毎時間ステップにおいて確率𝑝 = 1/2で粒子は左右どちらかに1マス移動する。(𝑝 ≠ 1/2でもよい。)
17
ランダムウォーク
• アルゴリズム –時刻𝑡0に位置𝑥0にいた粒子の、時刻𝑡𝑛における位置𝑥𝑖にいる確率分布𝑃(𝑥𝑖 , 𝑡𝑛)は?
– 2項分布
𝑃 𝑥𝑖 , 𝑡𝑛 =𝑛!
𝑛+! 𝑛−!𝑝𝑛+ 1 − 𝑝 𝑛−
– 𝑝は右に移動する確率。𝑛+, 𝑛−は、それぞれ右、左に移動する回数。
𝑛+ + 𝑛− = 𝑛 𝑛+ − 𝑛− = 𝑖
18
ランダムウォーク
• 一般に,左右に移動する確率を𝑝 =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
ランダムウォーク
• 拡散 – 𝑡 = 𝑛∆𝑡を用いると
– 𝑥2 = ∆𝑥2𝑡
∆𝑡= 2𝐷𝑡
–ただし𝐷 = ∆𝑥2
2∆𝑡
20
ランダムウォーク
• 確率分布がしたがう差分方程式
𝑝 𝑥𝑖 , 𝑡𝑛+1 =1
2𝑝 𝑥𝑖+1, 𝑡𝑛 + 𝑝(𝑥𝑖−𝑖 , 𝑡𝑛)
• 変形すると
𝑝 𝑥𝑖 , 𝑡𝑛+1 − 𝑝(𝑥𝑖 , 𝑡𝑛) =1
2𝑝 𝑥𝑖+1, 𝑡𝑛 − 2𝑝(𝑥𝑖 , 𝑡𝑛) + 𝑝(𝑥𝑖−𝑖 , 𝑡𝑛)
• 連続極限で拡散方程式に一致 𝑝 𝑥𝑖 , 𝑡𝑛+1 − 𝑝(𝑥𝑖 , 𝑡𝑛)
∆𝑡=∆𝑥2
2∆𝑡
𝑝 𝑥𝑖+1, 𝑡𝑛 − 2𝑝 𝑥𝑖 , 𝑡𝑛 + 𝑝(𝑥𝑖−1, 𝑡𝑛)
∆𝑥2
𝐷 = ∆𝑥2
(2∆𝑡) を有限に保ったままΔ𝑥, ∆𝑡 → 0 とすると
𝜕𝑝
𝜕𝑡= 𝐷𝜕2𝑝
𝜕𝑥2
21
ランダムウォーク
• プログラム
22
for (i=0;i<ntime;i++) { t+=dt; for (ip=0;ip<np;ip++) { 各粒子の位置の更新 } 各粒子位置から分布への焼き直し }
ランダムウォーク
• プログラム – 位置の更新 – [0,1)の一様乱数を返す関数として、rand_uni()が定義されているとする。
23
r=rand_uni(); if (r<0.5) { x[ip]++; } else { x[ip]--; }
ランダムウォーク
• プログラム – C言語での乱数
• 標準ライブラリで定義されているrand()関数が使える。rand()は0からRAND_MAX(実装によるが、glibcなら232)の整数
• [0,1)の範囲の実数の一様乱数を返す関数を以下のように定義する。
24
#include <stdlib.h> double rand_uni() { return rand()/((double) RAND_MAX + 1); }
ランダムウォーク
• 初期分布の設定 –確率分布𝑝 𝑥 = 1 − cos 2𝜋 𝑥に従う乱数𝑋p ∈ [0,1]を得たい。(一様乱数は容易に得ら
れるとする。)
25
ランダムウォーク
• 初期分布の設定(逆変換法による乱数生成) – 累積分布関数
𝑞 𝑥 = 𝑝 𝑥 𝑑𝑥𝑥
0
= 𝑥 −1
2𝜋sin 2𝜋𝑥
– 一様乱数𝑋U ∈ [0,1]が与えられたとき、𝑝(𝑥)にしたがう乱数𝑋P を得るには𝑞 𝑋P = 𝑋Uを満たす𝑋Pを求めればよい。
– すなわち、𝑓 𝑋P = 𝑞 𝑋P − 𝑋Uに対して、𝑓 𝑋P = 0を満たす𝑋Pを求める求根問題を解く。
26
ランダムウォーク
• 拡散係数
–時間ステップ、空間ステップとの関係
• 粒子数𝑁pと誤差の関係
27