数値計算講義 第 10 回
偏微分方程式の初期値問題の近似解法
カ ーネン コ
金 子
ア レ ク セイ晃
[email protected] [email protected]
http://www.kanenko.com/
偏微分方程式と そ の近似解法 1
世の中の数値計算のほと んど を 占める . 主な単独方程式:
熱方程式: ∂u
∂t = ν∆u 熱伝導, 拡散 波動方程式: 1
c
2∂
2u
∂t
2= ∆u 波動の伝播
Laplace 方程式 ∆u = 0 , Poisson 方程式: ∆u = f 種々 の定常状態 こ こ に, ∆u := ∂
2u
∂x
2+ ∂
2u
∂y
2+ ∂
2u
∂z
2は Laplacian と 呼ばれる 微分演算子.
主な連立方程式:
Navier-Stokes 方程式: 流体の運動
弾性体の方程式: ダムや橋や建物など の安定性と 揺れの計算 電磁波の方程式: アン テナ等の設計
3 大数値解法:
スペク ト ル法
差分法 有限要素法
熱方程式の導出 ( 空間1 次元の場合 ) 2 熱伝導の法則:
熱は温度の高い方から 低い方へ流れる .
流れる 量は温度勾配に比例する ( 比例定数 k が熱伝導率 ) . 熱量の保存則:
針金の微小区間 [x, x + ∆x] における 時間当たり の熱量の変化は,
その時間内にこ の区間の境界から 流れ込んだ熱量の総和に等し い.
比熱 ( 正確には単位長さ 当たり の熱容量 ) を c と し て
∂u
∂x (t, x) ∂u
∂x (t, x + ∆x)
x x +∆ x x
Z
x+∆xx
{u(x, t + ∆t) − u(x, t)} c dx = k{ ∂u
∂x (x + ∆x, t) − ∂u
∂x (x, t)}∆t
· = · · = ·
c ∂u
∂t ∆t∆x k ∂
2u
∂x
2(x, t)∆x∆t
∴ ∂u
∂t = ν ∂
2u
∂x
2(ν = k
c ) 拡散方程式と し て の説明:
拡散量は , 溶質の濃度勾配に比例し て , 濃い方から 薄い方に移動する . 物質量の保存則を 書く と , 上と 同じ 式が得ら れる .
( こ の場合 c = 1 であり , k は拡散係数と 呼ばれる 物質定数にな る .)
熱方程式の初期 - 境界値問題の差分解法 (numa-1.f) 3 有限な長さ の針金の両端の温度を 一定にし て ( 境界条件 ), 針金に勝手に与え た初期温度分布 ( 初期条件 ) から , その後の針金の温度分布の時間的変化を 予測する .
∂u
∂t = ν ∂
2u
∂x
2, 0 < t < T, a < x < b,
u(a, t) = u(b, t) = 0, 0 < t < T ( 斉次 Dirichlet 条件 ), u(x, 0) = ϕ(x), a < x < b ( 初期条件 )
熱方程式の差分近似 u(x, t + k) − u(x, t)
k = ν u(x + h, t) + u(x − h, t) − 2u(x, t) h
21 階前進差分 2 階中心差分
∴ u(x, t + k) = 1 − 2νk h
2u(x, t) + νk
h
2u(x + h, t) + νk
h
2u(x − h, t) 区間 [a, b] を N 等分し , h = b − a
N , ま た νk
h
2= λ が定数と なる よ う にし て , u
ji:= u(a + hi, jk), i = 0, 1, 2, . . . , N, j = 0, 1, 2, . . . と 書けば ,
u
0i= ϕ
i:= ϕ(a + ih) ( 時刻 0 での値は初期値から 決ま る ), u
ji= (1 − 2λ)u
ji−1+ λu
ji+1−1+ λu
ji−−11ただし , u
j0, u
jN= 0, j = 1, 2, . . . ( 両端での値は境界条件から 決ま る ) こ の漸化式から , 初期 - 境界値問題は簡単に解ける .
( 行列の掛け算さ え も プロ グラ ム する 必要がな い . )
x t
BLOCK DATA 4
COMMON /PARS/IXMIN,IXMAX,IYMIN,IYMAX,XMIN,XMAX,YMIN,YMAX DATA IXMIN/0/,IXMAX/799/,IYMIN/0/,IYMAX/599/,
+ XMIN/0.0/,XMAX/1.0/,YMIN/-2.0/,YMAX/2.0/
END
PROGRAM HEAT PARAMETER(N=80) REAL*4 U(0:N,0:1)
COMMON /PARS/IXMIN,IXMAX,IYMIN,IYMAX,XMIN,XMAX,YMIN,YMAX HX=(XMAX-XMIN)/N
WRITE(*,*)’Ratio k/h^2 :’
READ(*,*)ALMBDA HT=HX*HX*ALMBDA I=0
X=XMIN
DO 100 J=0,N
U(J,I)=AINIT0(X) X=X+HX
100 CONTINUE
WRITE(*,*)’Push c on the graphic window to continue.’
WRITE(*,*)’Push q there to quit.’
CALL INIT(IXMIN,IYMIN,IXMAX,IYMAX) CALL DRAW(U(0,I),N,HX)
IF (KEY().EQ.0) STOP 150 I1=I; I=1-I
U(0,I)=0
DO 200 J=1,N-1
U(J,I)=(1-2*ALMBDA)*U(J,I1)+ALMBDA*(U(J+1,I1)+U(J-1,I1)) 200 CONTINUE
U(N,I)=0
CALL DRAW(U(0,I),N,HX)
IF (KEY().EQ.1) GO TO 150
END
プログラ ミ ン グの注意点 5
全て の時間ステッ プの計算結果を 記録する 必要はない . 現在と 直前の2 時間ステッ プ分だけでよ い .
( 結果は , リ アルタ イ ムで描画する か , フ ァ イ ルに書き 出し て ゆく .) こ う いう と き は , 2 次元配列 U(0:N,0:1) を 回し て 使う と 効率的:
U(j,0) に直前の結果 = ⇒ U(j,1) に現在の結果 = ⇒ U(j,0) に次の結果 . ま と める と , U(j,k) = ⇒ U(j,1-k) と 常に書け , k = ⇒ 1-k で交替する .
配列の参照渡し
CALL DRAW(U(0,1),...) の最初の引数は , 2 次元配列 U の中間アド レ スを 渡し て おり , サブルーチン の方では , そこ から 先
U(0,1),U(1,1),U(2,1),...,U(N,1)
を 通常の1 次元配列と し て 宣言し 取り 扱う こ と ができ る . 初期値の設定
FORTRAN では , 変数や配列の初期値を DATA 文で与え る こ と ができ る . ( コ ン パイ ル時に値がセッ ト さ れる .)
し かし , COMMON 宣言さ れた変数や配列の初期値設定は ,
BLOCK DATA 文と いう それ専用の副プロ グラ ムて 行わねばなら ない . こ の際 , 変数や配列は , 名前付き COMMON BLOCK と いう も のにま と め ,
以下の COMMON 文では必ずこ の名前を 添付する .
熱方程式の導出 ( 空間3 次元の場合 ) 6 熱伝導の法則:
熱は温度の高い方から 低い方へ流れる .
流れる 量は温度勾配に比例する ( 比例定数が熱伝導率 ) . 熱量の保存則:
物質中のある 部分領域におけ る 時間当たり の熱量の変化は,
その時間内にこ の領域の境界から 流れ込んだ熱量の総和に等し い.
以上を 微小部分領域 ∆V に適用し た等式を 書く と , 体積比熱を c と し て Z Z Z
∆V
{u(t + ∆t, x) − u(t, x)}cdV = k Z Z
∂∆V
∇u · ndS · ∆t
· = · = (Gauss の発散定理 )
c ∂u
∂t ∆t∆V k
Z Z Z
∆V
∆udV = · · k∆u∆V 故に ∆t, ∆V → 0 と し て
∂u
∂t = ν∆u (ν = k c ).
※ ∇u := ∂u
∂x , ∂u
∂y , ∂u
∂z
( 勾配演算子 )
※ Gauss の発散定理は
Z Z Z
∂D
f · ndS = Z Z Z
D
divf dV
dS n
u∆
∆V
こ こ に, f = (f
1, f
2, f
3) に対し , divf = ∂f
1∂x + ∂f
2∂y + ∂f
3∂z
熱方程式の差分解法 ( 空間2 次元の場合 ) (numa-2.f) 7
簡単のため , ν = 1 と し , 考え て いる 領域は長方形 [a
0, a
1] × [b
0, b
1] と する . 時間微分は , メ ッ シュ 幅を h
tと 書く と き ,
∂u
∂t = u(x, y, t + h
t) − u(x, y, t) h
tで近似する .
空間微分は , メ ッ シュ 幅を h
x= (a
1− a
0)/M , h
y= (b
1− b
0)/N と 置けば ,
∆u := ∂
2u
∂x
2+ ∂
2u
∂y
2= u(x + h
x, y, t) + u(x − h
x, y, t) − 2u(x, y, t) h
2x+ u(x, y + h
y, t) + u(x, y − h
y, t) − 2u(x, y, t) h
2yで差分化 .
よ っ て , 漸化式は略記号 u
ki,j:= u(a
0+ ih
x, b
0+ jh
y, kh
t) を 用いて , u
k+1i,j=
1 − 2 h
th
2x+ h
th
2y) u
ki,j+ h
th
2xu
ki+1,j+ h
th
2xu
ki−1,j+ h
th
2yu
ki,j+1+ h
th
2yu
ki,j−1空間1 次元の場合と 同様, こ の漸化式を 行列を 使わず直接プロ グラ ムする
のが最も 簡単 .
上の漸化式を 行列で表現する 場合 , ま ず問題と なる のは, 8 2 次元的な量 u
ki,jを 1 次元ベク ト ルと し て ど う 表現する か . 一つの表現法 ( かなり 標準的 ) :
下図の左下の格子点から 右上の格子点ま で矢印の順にたど り , 1 本の縦ベク ト ルの成分と する ( 便宜上横に記す ) :
u
k1,1, u
k2,1, . . . , u
kM−1,1, u
k1,2, u
k2,2, . . . , u
kM−1,1, . . . , u
k1,N−1, u
k2,N−1, . . . , u
kM−1,N−11 2 3 4
5 6 7 8
12 11 9 10
未知ベク ト ルの第 i 成分の位置
する と , 先の漸化式は , 次のよ う な帯状行列によ る 積で実現さ れる :
u
k+1i,j9
=
1 − 2 h
th
2x+ h
th
2y) u
ki,j+ h
th
2xu
ki+1,j+ h
th
2xu
ki−1,j+ h
th
2yu
ki,j+1+ h
th
2yu
ki,j−1
u
k+11u
k+12.. . u
k+1(M−1)(N−1)
< −−−−−−−−− M − 1 −−−−−−−−−− >
=
1−
h22x
−
h22y
1
h2x
0 · · · 0
h12y
0 · · · 0
1
h2x
1−
h22x
−
h22y
1
h2x
.. .
0 . .. . .. ... . .. 0
.. . . .. . .. . ..
h12y
0 0
1
h2y
. .. ... ... ... .. .
0 0
.. . . .. . ..
h12x
0 · · · 0 · · · 0
h12y
0 · · · 0
h12x
1−
h22x
−
h22y
u
k1u
k2.. . u
k(M−1)(N−1)
波動方程式の初期 - 境界値問題の差分解法 (numa-3.f) 10 空間1 次元の波動方程式は , 両端を 固定し た有限な長さ の 弦の振動の方程式と し て 既に導いた :
1 c
2∂
2u
∂t
2= ∂
2u
∂x
2, 0 < t < T, a < x < b,
u(a, t) = u(b, t) = 0, 0 < t < T ( 斉次 Dirichlet 条件 ), u(x, 0) = ϕ(x), ∂u
∂t (x, 0) = ψ(x), a < x < b ( 初期条件 ) 波動方程式の差分近似
1 c
2u(x, t + k) + u(x, t − k) − 2u(x, t)
k
2= u(x + h, t) + u(x − h, t) − 2u(x, t) h
22 階中心差分 2 階中心差分
∴ u(x, t +k) = 2 1 − c
2k
2h
2u(x, t)+ c
2k
2h
2u(x +h, t)+ c
2k
2h
2u(x −h, t)− u(x, t −k) 区間 [a, b] を N 等分し , h = b − a
N , λ = ck
h と 置いて ,
u
ji:= u(a + hi, jk), i = 0, 1, 2, . . . , N, j = 0, 1, 2, . . . と 書けば , u
0i= ϕ
i:= ϕ(a + ih) ( 既知の値 ),
u
1i= u
0i+ k ∂u
∂t (a + ih, 0) = u
0i+ kψ(a + ih) ( 既知の値 ), u
ji= 2(1 − λ
2)u
ji−1+ λ
2u
ji+1−1+ λ
2u
ji−−11− u
ji−2ただし , u
j0, u
jN= 0, j = 1, 2, . . .
こ の漸化式から , 波動方程式の初期 - 境界値問題は熱方程式と 同様に解ける . ただし 今度は3 ステッ プ分の記憶が必要:
U(i,j), j=0,1,2 を 使い回し ,
U(i,j mod 3) と U(i,j+1 mod 3) と から U(i,j+2 mod 3) を 計算し た後 ,
j = ⇒ j+1 mod 3 で更新する .
空間2 次元の場合: (numa-4.f) 11
波動方程式の導出は省略する が , 方程式の意味は膜の微小振動のモデルである . 最も 簡単な長方形の膜 D = [a
0, a
1] × [b
0, b
1] の場合, 初期 - 境界値問題は
1 c
2∂
2u
∂t
2= ∂
2u
∂x
2+ ∂
2u
∂y
2, 0 < t < T, (x, y) ∈ D
u(x, y, t) = 0, 0 < t < T, (x, y) ∈ ∂D ( 斉次 Dirichlet 条件 ), u(x, y, 0) = ϕ(x, y), ∂u
∂t (x, y, 0) = ψ(x, y), (x, y) ∈ D ( 初期条件 ) 差分化は , 時間座標について は空間1 次元の波動方程式にな ら い , 空間座標について は , 空間2 次元の熱方程式に倣え ばよ い .
u
0i,j= ϕ
i,j:= ϕ(a
0+ ih
x, b
0+ jh
y) ( 既知の値 ), u
1i,j= u
0i,j+ h
t∂u
∂t (a
0+ ih
x, b
0+ jh
y0) = u
0i,j+ h
tψ(a
0+ ih
x, b
0+ jh
y) ( 既知の値 ),
u
ki,j= 2 1 − c
2h
2th
2x− c
2h
2th
2yu
ki,j−1+ c
2h
2th
2xu
ki+1,j−1+ c
2h
2th
2xu
ki−−11,j+ c
2h
2th
2yu
ki,j+1−1+ c
2h
2th
2yu
ki,j−−11− u
ki,j−2ただし , u
k0,j, u
kN,j, u
ki,0, u
ki,M= 0, k = 1, 2, . . .
差分スキームの安定性条件 12 空間1 次元の熱方程式 ∂u
∂t = ∂
2u
∂x
2の差分解法のプロ グラ ムを 実行し て みる と λ := ν∆t
∆x
2≤ 1
2 のと き (Courant-Friedrichs-Lewy の条件 , CFL 条件 ) 数値解は安定で, いつま でも 存在し 続ける ,
λ := ν∆t
∆x
2> 1
2 のと き 不安定で, 近似解は時間の経過と と も に振動を 始め,
やがて 爆発する .
と いう 現象が見ら れる . こ の数学的正当化:
上の場合, 0 < λ ≤ 1/2 と いう こ と なので,
|u
ji| = |(1 − 2λ)u
ji−1+ λu
ji+1−1+ λu
ji−−11|
≤ {(1 − 2λ) + λ + λ} max
0≤i≤N
|u
ji−1| = max
0≤i≤N
|u
ji−1| すなわち ,
0
max
≤i≤N|u
ji| ≤ sup
0≤i≤N