116
線形・非線形拡散方程式の差分解法と解の可視化 齊藤 宣一 東京大学大学院数理科学研究科 saito[AT]infsup.jp 2011 12 4 Version 111204 概要 本講義では,非線形偏微分方程式の実験的な解析手法の修得を目指して,拡散方程式 に対する差分法を扱う.講義では,はじめに,放物型偏微分方程式 () の差分法によ る数値的な解法とその数学理論 (安定性,収束性) を解説する.そして,実際に計算プ ログラムを作成・実行し,偏微分方程式の解を数値的・視覚的に捉えるための手法を修 得してもらう.また,それを応用して様々な拡散現象の記述に現れる非線形問題の研 究の最前線を体験する.受講者に,プログラミングの経験が (ほんとんど) 無いことを 前提に講義を行う.サンプルプログラムは C 言語で示す.可視化は主に gnuplot を用 い,アニメーションの作成方法も紹介する. これは,2011 (11 24, 25 日,12 1, 2 ) に首都大学東京 (数理科学コー ) で行われた集中講義・基盤数理科学 2 (R085) および基盤数理科学特論 2 (R086) の講義ノートです. 不完全なところや筆者の勘違いも多いので,参照する際には十分に注意して下さ い.また間違いを発見した際には,お知らせ下されば幸いです. Verison 111204 (2011 12 4 日版) は,定理 5.4(ADI の誤差評価) の証明が 未完成です.いずれ時間ができれば書く予定です (書きたいと思っています)http://www.infsup.jp/saito/の講義ノートのページから最新版がダウン ロードできます.

線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

線形・非線形拡散方程式の差分解法と解の可視化

齊藤 宣一東京大学大学院数理科学研究科

saito[AT]infsup.jp

2011年 12月 4日Version 111204

概要

本講義では,非線形偏微分方程式の実験的な解析手法の修得を目指して,拡散方程式に対する差分法を扱う.講義では,はじめに,放物型偏微分方程式 (系) の差分法による数値的な解法とその数学理論 (安定性,収束性) を解説する.そして,実際に計算プログラムを作成・実行し,偏微分方程式の解を数値的・視覚的に捉えるための手法を修得してもらう.また,それを応用して様々な拡散現象の記述に現れる非線形問題の研究の最前線を体験する.受講者に,プログラミングの経験が (ほんとんど) 無いことを前提に講義を行う.サンプルプログラムは C言語で示す.可視化は主に gnuplotを用い,アニメーションの作成方法も紹介する.

• これは,2011年 (11月 24, 25日,12月 1, 2日)に首都大学東京 (数理科学コース) で行われた集中講義・基盤数理科学 2 (R085) および基盤数理科学特論 2

(R086) の講義ノートです.• 不完全なところや筆者の勘違いも多いので,参照する際には十分に注意して下さい.また間違いを発見した際には,お知らせ下されば幸いです.

• Verison 111204 (2011年 12月 4日版) は,定理 5.4(ADIの誤差評価) の証明が未完成です.いずれ時間ができれば書く予定です (書きたいと思っています).

• http://www.infsup.jp/saito/の講義ノートのページから最新版がダウンロードできます.

Page 2: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

目次1 熱方程式 2

(a) 熱方程式の導出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

(b) 初期値境界値問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

(c) 一意性と最大値原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

(d) 可解性と Fourierの方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

(e) Duhamelの原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 熱方程式の差分近似 11

(a) 差分近似 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

(b) 陽的スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

(c) 陰的単純スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

(d) 陰的 θ スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

(e) 非斉次問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

(f) 連立一次方程式の解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3 熱方程式の差分近似 (続き) 30

(a) `∞ 誤差解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

(b) `2 誤差解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

(c) Neumann 境界条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

(d) 差分スキームの再考察 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

(e) 変数係数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4 反応拡散系 45

(a) 半線形拡散方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

(b) 差分解の安定性と収束 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

(c) パターンの形成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

5 空間 2次元の熱方程式 53

(a) 陽的スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

(b) ADIスキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

(c) ADIスキームの解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

A 数値計算の実行 (基礎編) 63

(a) 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

0

Page 3: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(b) 陽的スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

(c) 連立一次方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

(d) 陰的 θ スキームと非斉次問題 . . . . . . . . . . . . . . . . . . . . . . . . . 75

B 数値計算の実行 (技巧編) 83

(a) コマンド行引数の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

(b) アニメーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

C 数値計算の実行 (空間 2変数熱方程式) 98

(a) 陽的スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

(b) ADIスキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

D サンプルプログラム一覧 110

E 課題 111

(a) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

(b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

参考文献 114

1

Page 4: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

1 熱方程式(a) 熱方程式の導出

長さ lの針金が,x軸の区間 [0, l]に置かれている.針金は一様な材質でできているものとし,その場所 x ∈ [0, l],時刻 t ≥ 0における温度を u = u(x, t)と表す.(0, l)内の任意の点xを固定し,xを含む微小区間 V = [α, β] ⊂ [0, l]を考える.ただし,hを十分小さな正数として,α = x − h,β = x + h と置いている.cを針金の単位長さあたりの熱容量とする.

V における熱量とは,

J(t) = JV (t) =∫ β

α

cu(x, t) dx

で定義される量のことを言う.熱の移動は,場所・時刻による温度の違いによって引き起こされると考えられる.すなわち,|∂u/∂x| が大きいところでは,熱が流れやすく,小さいところでは,熱が流れにくいわけである.したがって,熱の流れを表す関数として,適当な正定数 κ を用いて,

F (x, t) = −κ∂u

∂x(x, t)

と置くのが普通である.この F を,u の流束 (flux)と言う.符号が負になっているのは,熱は高いところから低いところにへ流れるという認識に基づいている.そして,時間 ∆t の間に,x = α を通過して V に流入した熱量と x = β を通過して V に流入した熱量の和は,

(F (α, t) − F (β, t))∆t = −∆t

∫ β

α

∂xF (x, t) dx

と表されると考えられる.これが,Fourier の熱伝導の法則であり,このときの κ は熱伝導係数と呼ばれる.

V における熱量の保存により,∫ β

α

c [u(y, t + ∆t) − u(y, t)] dx = −∆t

∫ β

α

∂xF (x, t) dx

が成り立ち,両辺を ∆tで割って,∆t → 0とすれば,∫ β

α

c∂u

∂t(x, t) dx = −

∫ β

α

∂xF (x, t) dx

となる.さらに,この両辺を 2hで割って,h → 0とすれば,

c∂u

∂t(x, t) = − ∂

∂xF (x, t)

2

Page 5: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

を得る.xは任意であったので,結局,(0, l)内の任意の点と,任意の t > 0に対して,

∂u

∂t(x, t) = −1

c

∂xF (x, t) (1.1)

が成立することになる.これを熱方程式 (heat equation),あるいは,熱伝導方程式 (heat

conduction equation)と呼ぶ.(1.1)を扱う際には,付加条件が必要となる.まず,初期条件によって初期の温度分布を

指定する:

u(x, 0) = u0(x). (u0(x) は既知の関数.)

また,針金の両端での温度を,

u(0, t) = b0(t), u(1, t) = b1(t) (b0(t), b1(t) は既知の関数.) (1.2)

で指定する.このような条件を第一種の境界条件,あるいは,Dirichlet 境界条件と呼ぶ.また,「両端での熱の出入り」を指定するという条件を課すこともできる.この場合,(1.2)

の代わりに,

F (0, t) = b0(t), F (1, t) = b1(t) (b0(t), b1(t) は既知の関数.)

を課すことになる.これは,第二種の境界条件,あるいは,Neumann 境界条件と呼ばれる.偏微分方程式の問題としては,与えられたデータ (u0, b0, b1 など)に対して,方程式と付

加条件を満たす温度 u(x, t)を求める問題を考える.すなわち,あらためて,

k =κ

c

と置いて,∂u

∂t= k

∂2u

∂x2(0 < x < l, t > 0)

u(0, t) = b0(t), u(l, t) = b1(t) (t > 0)u(x, t) = u0(x) (0 ≤ x ≤ l)

(1.3)

や ∂u

∂t= k

∂2u

∂x2(0 < x < l, t > 0)

−κux(0, t) = b0(t), −κux(l, t) = b1(t) (t > 0)u(x, t) = u0(x) (0 ≤ x ≤ l)

を満たす u = u(x, t)を求める問題を考えるわけである.

3

Page 6: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

もし,針金が一様な材質でできておらず,熱伝導係数が場所や時刻によって変化するなら,κは定数でなく,関数 κ(x, t)としなければならない.この場合も,(1.1)を導く過程は全く同じで,方程式は,

∂u

∂t=

∂x

[k(x, t)

∂u

∂x

],

(k(x, t) =

κ(x, t)c

)(1.4)

となる.また,時間 ∆tの間に,単位長さあたり φ(x, t)∆tの熱量の湧き出し・吸収があるならば,(1.1)の代わりに,

∂u

∂t(x, t) = −1

c

∂xF (x, t) +

1cφ(x, t)

を考えることになり,方程式は,

∂u

∂t= k

∂2u

∂x2+

1cφ(x, t)

となる.両方の効果を同時に考えれば,もちろん,

∂u

∂t=

∂x

[k(x, t)

∂u

∂x

]+

1cφ(x, t)

となる.k や φが既知の関数ではなくて,これら自身が温度との関係から規定される場合,さらに一般に,

∂u

∂t=

∂x

[k(x, t, u)

∂u

∂x

]+

1cφ(x, t, u)

を考えることになる.k(x, t, u) と書いているのは k(x, t, u(x, t)) の意味である.実際の応用上はこういう場合の方が圧倒的に多い (例えば [1]等を見よ).

問題 1.1. 空間多次元 (2, 3次元)の熱方程式を導け.

問題 1.2. [1]などを見て,非線形偏微分方程式とその方程式の物理的 (化学的,生物学的)

背景を調べよ.(例を 5つ挙げよ.)

(b) 初期値境界値問題

改めて,次の初期値境界値問題 (initial-boundary value problem)を考える:ut = kuxx (0 < x < 1, t > 0)u(0, t) = 0, u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1),

(1.5)

ut = kuxx + f(x, t) (0 < x < 1, t > 0)u(0, t) = 0, u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1).

(1.6)

4

Page 7: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

仮定:

• k > 0: 定数.

• a(x): 初期値, [0, 1]上連続 (a ∈ C[0, 1])で,両立性条件 a(0) = a(1) = 0.

• f(x, t): 連続関数 (f ∈ C((0, 1) × (0,∞)))

注意 1.1. 非斉次境界条件

u(0, t) = b0(t), u(1, t) = b1(t)

の場合には,

v(x, t) = b0(t)(1 − x) + b1(t)x

と置いて,v(x, t) = u(x, t) − w(x, t)を考える.このとき,v(x, t)は,vt = kvxx + kwt かつ v(0, t) = v(1, t) = 0 を満たすので,f(x, t) = kwt(x, t) とおくことで (1.6) に帰着される.したがって,(1.5) や (1.6)のような斉次の境界条件について考えれば十分である.

定義 1.1. 関数 u = u(x, t)が (1.5)あるいは (1.6)の解 (古典解) def.⇐⇒

1. u ∈ C([0, 1] × [0,∞));

2. ut, ux, uxx ∈ C((0, 1) × (0,∞));

3. 方程式と境界条件を満たす;

4. limt→+0

‖u(·, t) − a‖∞ = 0.

定義 1.2 (最大値ノルム, L∞ ノルム). ‖v‖∞ = maxx∈[0,1]

|v(x)| (v ∈ C[0, 1]).

注意 1.2. ‖ · ‖ = ‖ · ‖∞ は X = C[0, 1]にノルムを定める.すなわち,次が成立:

(N1) ‖v‖ ≥ 0 (v ∈ X),かつ ‖v‖ = 0 ⇔ v(x) ≡ 0;

(N2) ‖αv‖ = |α| · ‖v‖ (α ∈ R, v ∈ X);

(N3) ‖v + w‖ ≤ ‖v‖ + ‖w‖ (v, w ∈ X).

注意 1.3. v ∈ C[0, 1]を固定すると,

limp→∞

‖v‖p = ‖v‖∞.

ただし,

‖v‖p =(∫ 1

0

|v(x)|p dx

)1/p

(Lp(0, 1)のノルム).

5

Page 8: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

問題 1.3. 注意 1.2を示せ.

問題 1.4. 注意 1.3を示せ.

(c) 一意性と最大値原理

定理 1.1. (1.5)の解は,(もし存在するなら)唯一つである.

定理 1.2. (1.6)の解は,(もし存在するなら)唯一つである.

記号: δ > 0に対して,

Qδ = (0, 1) × (0, δ], Qδ = [0, 1] × [0, δ],Γδ = (x, t)| 0 ≤ x ≤ 1, t = 0 ∪ (x, t)| x = 0, 1, 0 ≤ t ≤ δ

= Qδ\Qδ (放物型境界).

定理 1.3 (最大値原理). T > 0を任意に固定する.関数 u = u(x, t)は QT で連続,QT で滑らかとする.このとき,

(i) ut − kuxx ≤ 0 in QT ⇒ max(x,t)∈QT

u(x, t) = max(x,t)∈ΓT

u(x, t);

(ii) ut − kuxx ≥ 0 in QT ⇒ min(x,t)∈QT

u(x, t) = min(x,t)∈ΓT

u(x, t).

証明. (i) α = max(x,t)∈ΓT

u(x, t)と定義して,w = e−t(u − α)と置く.このとき,後で示すよ

うに,

w(x, t) ≤ 0 (x, t) ∈ QT (*)

が成り立ち,一方で w の定義から,ΓT 上では w(x, t) ≤ 0なのだから,したがって, 結局,QT 上で w(x, t) ≤ 0.これは,QT で u(x, t) ≤ α,すなわち (i)の右側の等式を意味する.さて,(*)を証明しよう.(x0, t0) ∈ QT において,w の正の最大値 µ が達成されたと仮

定する.すなわち,

µ = w(x0, t0) = max(x,t)∈QT

w(x, t) > 0

を仮定する.このとき,明らかに wt(x0, t0) ≥ 0,wxx(x0, t0) ≤ 0となっている.さて,w

は,QT 上で wt + w − kwxx ≤ 0を満たしているので,これを x = x0,t = t0 で考えると,

0 < wt(x0, t0) + µ − kuxx(x0, t0) ≤ 0

となり矛盾する.したがって,w は QT 上で正の最大値を達成することは有り得ず,(*)が成り立つ.

6

Page 9: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(ii) −uを考えれば (i)に帰着される.

定理 1.1 の証明. (1.5) に 2 つの解 u1(x, t) と u2(x, t) が存在すると仮定する.w(x, t) =

u1(x, t) − u2(x, t)とおくと,w はwt = kwxx (0 < x < 1, t > 0)w(0, t) = 0, w(1, t) = 0 (t > 0)w(x, 0) = 0 (0 ≤ x ≤ 1)

を満たすが,最大値原理により,[0, 1] × [0,∞)で w ≡ 0.したがって,u1 ≡ u2.

定理 1.2の証明. まったく同じ.

定理 1.4. (1.5)の解 u = u(x, t)は次を満たす:

(最大値原理) maxQT

u = maxx∈[0,1]

a(x), minQT

u = minx∈[0,1]

a(x);

(L∞ 安定性) ‖u(·, t)‖∞ ≤ ‖a‖∞;

(非負値性保存) a(x) ≥ 0 ⇒ u(x, t) ≥ 0 (x, t) ∈ [0, 1] × [0,∞).

証明. 定理 1.1の簡単な応用.

定理 1.5 (正値性保存). a(x) ≥ 0, 6≡ 0ならば,(1.5)の解 uは,

u(x, t) > 0 ((x, t) ∈ (0, 1) × (0,∞))

を満たす.

この定理の証明には,強最大値原理や Harnackの不等式などが必要となるので,ここでは述べない.

問題 1.5. Neumann境界条件 ux(0, t) = ux(1, t) = 0のときの最大値原理について考えよ.

(d) 可解性と Fourierの方法

(1.5)の解を Fourierの方法で具体的に構成する.u(x, t) = ϕ(x)η(t)の形に分解できることを仮定すると

−ϕ′′(x) = λϕ(x), ϕ(0) = ϕ(1) = 0, (*)

−η′(t) = kλη(t). (**)

(*)は,固有値問題であり,その解は,

λn = (nπ)2 , ϕ(x) =√

2 sin√

λnx =√

2 sin(nπx) (n = 1, 2, . . .)

7

Page 10: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

で与えられる.ただし,sinの係数は,次を満たすように採った:

(ϕn, ϕm) =∫ 1

0

ϕn(x)ϕm(x) dx = δnm.

また,(**)の解 (の内一つ)は,η(t) = e−kλnt である.したがって,方程式と境界条件のみを満たす解として,

un(x, t) = e−kλntϕn(x) (n = 1, 2, . . .)

を採れる.あとは,un∞n=1 の線形結合

u(x, t) =∞∑

n=1

αnun(x, t) =∞∑

n=1

αne−kλntϕn(x)

を考えて,初期条件を満たすように αn∞n=1 を決める.すなわち,

u(x, 0) = a(x) =∞∑

n=1

αnϕn(x)

の両辺に ϕm(x)を掛けて x ∈ (0, 1)で積分すると,

αm = (a, ϕm) =√

2∫ 1

0

a(x) sin(mπx) dx (m = 1, 2, . . .)

を得る.以上をまとめて,解の表現

u(x, t) =∞∑

n=1

αne−kλntϕn(x), αn = (a, ϕn) (1.7)

を得る.しかしながら,(1.7)の右辺の関数は無限級数で定義されているので,このような形式的

な計算には正当化が必要である.ここでは結果を述べるのみに留めよう (証明は [3]などを見よ).

定理 1.6. (1.7)の右辺の関数は,[0, 1] × [0,∞) で連続,[0, 1] × (0,∞)で C∞ 級であり,かつ (1.5)の解となる.

注意 1.4. (1.7)の右辺の関数自体は,a ∈ L2(0, 1)でも意味を持つ.実際,[0, 1] × (0,∞)

で C∞ 級でとなり (=平滑化効果),(1.5)の方程式と境界条件を満たす.初期条件は,

limt→+0

∫ 1

0

|u(x, t) − a(x)|2 dx = 0

の意味で満たされる.

8

Page 11: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(e) Duhamelの原理

(1.5)の解 u = u(x, t)は,次のように書ける:

u(x, t) =∞∑

n=1

(a, ϕn)e−kλntϕn(x),

=∞∑

n=1

(∫ 1

0

a(y)ϕn(y) dy

)e−kλntϕn(x)

=∫ 1

0

a(y)

( ∞∑n=1

e−kλntϕn(y)ϕn(x)

)dy

=∫ 1

0

G(x, y, t) a(y) dy.

ただし,

G(x, y, t) =∞∑

n=1

e−kλntϕn(y)ϕn(x).

ただし,G(x, y, t)は (1.5)の Green関数であり,次を満たす (cf. [3]):

1. G(x, y, t)は t > 0,x, y ∈ [0, 1]について無限回微分可能;

2. G(x, y, t)は (x, t), (y, t)の関数として (1.5)の第一式と第二式を満たす;

3. G(x, y, t) = G(y, x, t), G(x, y, t) ≥ 0;

4.∫ 1

0

G(x, y, t)dy ≤ 1.

次に熱源の効果を含む熱方程式の初期値境界値問題ut = kuxx + f(x, t) (0 < x < 1, t > 0)u(0, t) = 0, u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.6)

を考えよう.この場合には,Fourierの方法が使えないので工夫が必要となる.まず,方程式の線形性により,解は,u(x, t) = v(x, t) + w(x, t)と分解できる.ここに,

vt = kvxx (0 < x < 1, t > 0)v(0, t) = 0, v(1, t) = 0 (t > 0)v(x, 0) = a(x) (0 ≤ x ≤ 1),wt = kwxx + f(x, t) (0 < x < 1, t > 0)w(0, t) = 0, w(1, t) = 0 (t > 0)u(x, 0) = 0 (0 ≤ x ≤ 1).

9

Page 12: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

v(x, t)が,

v(x, t) =∫ 1

0

G(x, y, t)a(y) dy

と書けることは,もうわかっている.w(x, t)の表現を求めるために,パラメータ s > 0を導入して,関数W (x, t; s)を

Wt = kWxx (0 < x < 1, t > s)W (0, t) = 0, W (1, t) = 0 (t > s)W (x, s; s) = f(x, s) (0 ≤ x ≤ 1)

の解としよう.すなわち,W (x, t; s)は,初期時刻 t = sで初期値 f(x, s)を与えたときの熱方程式の初期値境界値問題の解である.このようなW (s, t; s)は,t ≥ sで存在し,

W (x, t; s) =∫ 1

0

G(x, y, t − s)f(y, s) dy (0 ≤ x ≤ 1, t ≥ s)

と書ける.このとき,求めたい w(x, t)は,

w(x, t) =∫ t

0

W (x, t; s) ds

と表現できる.実際,(少なくとも形式的には)

∂w

∂t(x, t) = W (x, t; t) +

∫ t

0

∂W

∂t(x, t; s) ds

= f(x, t) +∫ t

0

k∂2W

∂x2(x, t; s) ds = f(x, t) + k

∂2w

∂x2(x, t)

であり,方程式を満たす.一方,境界条件と初期条件を満たすことは明らかであろう.以上の考察により,(1.6)の解は,

u(x, t) =∫ 1

0

G(x, y, t)u0(y) dy +∫ t

0

W (x, t; s)ds

=∫ 1

0

G(x, y, t)u0(y) dy +∫ t

0

∫ 1

0

G(x, y, t − s)f(y, s) dyds

と表現できる.これを Duhamelの原理という.

10

Page 13: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

2 熱方程式の差分近似(a) 差分近似

関数 u(x)の x = a における微分:

u′(a) =du

dx(a) = lim

h→0

u(a + h) − u(a)h

.

したがって,次が期待できる:

u′(a) ≈ u(a + h) − u(a)h

(|h| 1)

実際,aを含むような開区間 I を固定すると,h > 0, a + h ∈ I に対して,

u(a + h) = u(a) + u′(a)h +12u′′(a + θh)h2 (∃θ ∈ (0, 1))

より,∣∣∣∣u′(a) − u(a + h) − u(a)h

∣∣∣∣ = ∣∣∣∣12u′′(a + θh)h∣∣∣∣ ≤ 1

2h‖u′′‖L∞(I) (2.1)

となる.あるいは,h > 0, a − h ∈ I に対して,∣∣∣∣u′(a) − u(a) − u(a − h)h

∣∣∣∣ = ∣∣∣∣12u′′(a − θh)h∣∣∣∣ ≤ 1

2h‖u′′‖L∞(I) (2.2)

も全く同様に導ける.一方で,

u(a + h) = u(a) + u′(a)h +12u′′(a)h2 +

13!

u(3)(a + θ1h)h3,

u(a − h) = u(a) − u′(a)h +12u′′(a)h2 − 1

3!u(3)(a − θ2h)h3 (θ1, θ2 ∈ (0, 1))

より,∣∣∣∣u′(a) − u(a + h) − u(a − h)2h

∣∣∣∣ ≤ ∣∣∣∣ 12 · 3!

u(3)(a + θ1h)h2

∣∣∣∣+ ∣∣∣∣ 12 · 3!

u(3)(a − θ2h)h2

∣∣∣∣≤ 1

6h2‖u(3)‖L∞(I).

hをあらためて h/2と取り直すと,上の不等式は∣∣∣∣∣u′(a) −u(a + h

2 ) − u(a − h2 )

h

∣∣∣∣∣ ≤ 124

h2‖u(3)‖L∞(I) (2.3)

となる.

11

Page 14: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

名前 定義 近似量 精度 仮定

前進差分 (前進 Euler近似)u(a + h) − u(a)

hu′(a) O(h) u ∈ C2

後退差分 (後退 Euler近似)u(a) − u(a − h)

hu′(a) O(h) u ∈ C2

中心差分u(a + h

2) − u(a − h

2)

hu′(a) O(h2) u ∈ C3

2階中心差分 u(a + h) − 2u(a) + u(a − h)

h2u′′(a) O(h2) u ∈ C4

O(h) u ∈ C3

表 2.1 代表的な差分商

次に 2階の微分の差分近似を考る.

u(a + h) = u(a) + u′(a)h +12u′′(a)h2 +

13!

u(3)(a)h3 +14!

u(4)(a + θ1h)h4,

u(a − h) = u(a) − u′(a)h +12u′′(a)h2 − 1

3!u(3)(a)h3 +

14!

u(4)(a − θ2h)h4 (θ1, θ2 ∈ (0, 1))

より,∣∣∣∣u′′(a) − u(a − h) − 2u(a) + u(a + h)h2

∣∣∣∣≤∣∣∣∣ 14!

u(4)(a + θ1h)h2

∣∣∣∣+ ∣∣∣∣ 14!u(4)(a − θ2h)h2

∣∣∣∣ ≤ 112

h2‖u(4)‖L∞(I). (2.4)

(b) 陽的スキーム

熱方程式の初期値境界値問題ut = kuxx (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.5)

の考察に戻ろう.k > 0 は与えられた定数,a(x)は与えられた連続関数であった.

• 整数 N > 0を採って h =1

N + 1• τ > 0 を固定• 格子点の集合 Qτ

h = (xi, tn)| xi = ih, tn = nτ (0 ≤ i ≤ N + 1, n ≥ 0)

12

Page 15: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

• x0 = 0,xN+1 = 1に注意• un

i ≈ u(xi, tn)

まず,前節の考察から,ut, uxx の値は,

ut(xi, tn) ≈ un+1i − un

i

τ(前進差分)

uxx(xi, tn) ≈un

i−1 − 2uni + un

i+1

h2(後退差分)

と近似すればよさそうである.また,境界条件と初期条件はそれぞれ

un0 = un

N+1 = 0 (n ≥ 1)

u0i = a(xi) (0 ≤ i ≤ N + 1)

とすればよい.したがって,(1.5)に対する近似問題として:un+1

i − uni

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 0)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = a(xi) (1 ≤ i ≤ N).

(2.5)

λ = kτ

h2とおいて第 1式を書き直すと

un+1i = (1 − 2λ)un

i + λ(uni−1 + un

i+1) (1 ≤ i ≤ N, n ≥ 0)

すなわち,

• u0i = a(xi) (i = 1, · · · , N);

• n = 0, 1, 2, . . . , に対して,un+10 = un+1

N+1 = 0 かつ

un+1i = (1 − 2λ)un

i + λ(uni−1 + un

i+1) (1 ≤ i ≤ N)

という手順で

u0i N

i=1 → u1i N

i=1 → u2i N

i=1 → · · · → uni N

i=1 → · · ·

と逐次的に uni を計算していくことができる. または,

u(n) =

un

1

un2...

unN

∈ RN , a =

a(x1)a(x2)

...a(xN )

∈ RN ,

Kλ =

1 − 2λ λ 0. . .λ 1 − 2λ λ

. . .0 λ 1 − 2λ

∈ RN×N .

13

Page 16: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

とおくことで,(2.5)の解 u(n) は,

u(n) = Kλu(n−1) = Knλ a

と書ける.

定義 2.1 (∞ノルム, `∞ ノルム).

(`∞ ノルム) ‖u‖∞(= ‖u‖`∞) = max1≤i≤N

|ui| (u = (ui) ∈ RN ).

(行列 `∞ ノルム) ‖G‖∞ = maxu∈RN

‖Gu‖∞‖u‖∞

(G ∈ RN×N ).

注意 2.1.

(i) ‖ · ‖ = ‖ · ‖∞ は X = RN にノルムを定める.(cf. 注意 1.2)

(ii) ‖ · ‖を RN のあるノルムとする.G ∈ RN×N に対して,

‖G‖ = maxu∈RN

‖Gu‖‖u‖

をベクトルノルム ‖ · ‖に属する行列ノルムと言う.本講義では,これを単に行列ノルムと呼ぶことにする.行列ノルムは次を満たす.1. ‖G‖ ≥ 0 かつ ‖G‖ = 0 ⇔ G = O.

2. ‖αG‖ = |α| · ‖G‖ (α ∈ R).

3. ‖G + F‖ ≤ ‖G‖ + ‖F‖.4. ‖GF‖ ≤ ‖G‖ · ‖F‖.5. ‖Gu‖ ≤ ‖G‖‖u‖.

定義 2.2.

(i) u = (ui) ∈ RN に対して,u ≥ 0 def.⇐⇒ ui ≥ 0 (∀i).

(ii) G = (gij) ∈ RN×N に対して,G ≥ Odef.⇐⇒ gij ≥ 0 (∀i, j).

補題 2.1. ‖G‖∞ = max1≤i≤N

N∑j=1

|gij | (最大行和) (G = (gij) ∈ RN×N ).

証明. 示すべき式の右辺を αとおく.u ∈ RN とすると,

‖Gu‖∞ = max1≤i≤N

∣∣∣∣∣∣n∑

j=1

gijuj

∣∣∣∣∣∣ ≤ max1≤i≤N

N∑j=1

|gij | · |uj |

≤ ‖u‖∞ max1≤i≤N

n∑j=1

|gij | = α‖u‖∞.

14

Page 17: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

したがって,‖G‖∞ ≤ α.

次に,α =n∑

j=1

|gkj | (最大値が i = k で達成)とする.

v = (vj), vj =

1 (gkj ≥ 0)−1 (gkj < 0)

と定義すると,‖v‖∞ = 1かつ,各 gkjvj ≥ 0.したがって,

‖G‖∞ = maxu∈RN

‖Gu‖∞‖u‖∞

≥ ‖Gv‖∞‖v‖∞

= ‖Gv‖∞

= max1≤i≤N

∣∣∣∣∣∣N∑

j=1

gijvj

∣∣∣∣∣∣ ≥∣∣∣∣∣∣

N∑j=1

gkjvj

∣∣∣∣∣∣ =N∑

j=1

|gkj | = max1≤i≤N

N∑j=1

|gij | = α.

これらを合わせて,補題が証明できた.

定理 2.1. u(n) = (ui) ∈ RN を (2.5)の解とする.λ が,

(0 <)λ ≤ 12

を満たすなら,

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞;

(非負値性保存) a ≥ 0 ⇒ u(n) ≥ 0.

証明. 1− 2λ ≥ 0なので,Kλ ≥ O.すなわち,a ≥ 0ならば,u(n) = Knλa ≥ 0.一方で,

‖Kλ‖∞ = |λ| + |1 − 2λ| + |λ| = λ + (1 − 2λ) + λ = 1.

したがって,‖u(n)‖∞ ≤ ‖Kλ‖n∞‖a‖∞ ≤ ‖a‖∞.

例 2.1. λ > 1/2 のときには,安定性が成り立たない例が存在する.実際,k = 1,u0i =

(−1)i sin(iπh)とすると,

uni = (1 − 2λ − 2λ cos(πh))nu0

i . (2.6)

このとき,

|1 − 2λ − 2λ cos(πh)| ≥ |1 − 4λ| ≡ κ(λ)

であり,λ > 1/2のとき,κ(λ) > 1となる.したがって,nを固定して,‖un‖∞ = |unj |と

すると,‖u(n)‖∞ ≥ κ(λ)n|unj | → ∞ (h → 0).

問題 2.1. (2.6)を示せ.

15

Page 18: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

例 2.2. k = 1の場合の熱方程式を実際に計算してみる.次の 4つの初期値を考える.

a1(x) = x sin2(3πx), a2(x) =

x (0 ≤ x ≤ 1/2)1 − x (1/2 < x ≤ 1),

a3(x) =

0.3 (0 ≤ x ≤ 0.3)−2(x − 0.6) (0.3 < x ≤ 0.6)0.6 (0.6 < x ≤ 0.3),

a4(x) = sin(πx)

• 図 2.1,2.2,2.3 は,それぞれ,a1(x),a2(x),a3(x) を初期値としたときの数値解u(n) である.a2(x)は,x = 1/2で微分可能でなく,a3(x)はそもそも不連続であるが,tn > 0で,数値解が滑らかになっていく様子が確認できる.

• 初期値 a2(x)に対して,λ = 0.51 > 1/2と選んだときの数値解 u(n) を図 2.4,2.5に示した.このとき,定理 2.1は適用できないので,`∞ 安定性や非負値性保存は保障されない.実際,時間の経過とともに,不自然な振動が現れて (図 2.4),さらには,数値解に負の部分が現れる (図 2.5).そして,例えば,tn において正だった部分が,tn+1 では符号が反転して負になり,tn+2 では符号が反転して正になり,とこのようなことが続いて振動が拡大してしまう.

• 同じ,λ = 0.51の場合でも,安定に計算できる場合がある.例えば,初期値 a4(x)の場合がそれにあたる (図 2.6).しかし,この場合も λの値を大きくすると数値解は振動を起こす (図 2.7).

0

0.2

0.4

0.6

0.8

1 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

x axis

t axis 0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x axis

図 2.1 初期値 a1(x); λ = 0.49; N = 127; 0 ≤ t ≤ 0.1.

注意 2.2. λ ≤ 1/2を仮定することで,非負値性の保存を得るが,正値性保存は一般には成立しない.十分小さな ε > 0に対して,次のような極端な初期値

a(x) ≥ 0, a(x) > 0 (|x − 1/2| ≤ ε/2), a(x) = 0 (|x − 1/2| ≥ ε)

を考える.これは,x = 1/2を中心に ±ε/2の範囲に温度が集中し,±εの外では 0となっ

16

Page 19: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

x axist axis

0

0.1

0.2

0.3

0.4

0.5

0 0.2

0.4 0.6

0.8 1

0 0.05

0.1 0.15

0.2 0.25

0.3

0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x axis

図 2.2 初期値 a2(x); λ = 0.49; N = 23; 0 ≤ t ≤ 0.3.

0

0.2

0.4

0.6

0.8

1 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1

0

0.1

0.2

0.3

0.4

0.5

0.6

x axis

t axis 0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x axis

図 2.3 初期値 a3(x); λ = 0.49; N = 127; 0 ≤ t ≤ 0.1.

x axist axis

0

0.1

0.2

0.3

0.4

0.5

0 0.2

0.4 0.6

0.8 1

0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1

0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x axis

図 2.4 初期値 a3(x); λ = 0.51 ; N = 23; 0 ≤ t ≤ 0.1.

17

Page 20: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

x axist axis

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

0 0.2

0.4 0.6

0.8 1

0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

0 0.2 0.4 0.6 0.8 1x axis

図 2.5 初期値 a3(x); λ = 0.51 ; N = 23; 0 ≤ t ≤ 0.15.

0

0.2

0.4

0.6

0.8

1 0 0.05

0.1 0.15

0.2 0.25

0.3

0

0.2

0.4

0.6

0.8

1

x axis

t axis 0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x axis

図 2.6 初期値 a4(x); λ = 0.51 ; N = 23; 0 ≤ t ≤ 0.3.

0

0.2

0.4

0.6

0.8

1 0 0.05

0.1 0.15

0.2 0.25

-1

-0.5

0

0.5

1

1.5

x axis

t axis -1

-0.5

0

0.5

1

1.5

0 0.2 0.4 0.6 0.8 1x axis

図 2.7 初期値 a4(x); λ = 0.55 ; N = 23; 0 ≤ t ≤ 0.212.

18

Page 21: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

ている温度分布を表している.次に,N を 5以上の奇数とし,上記の a(x)で,ε < hとすると,

a(xj) > 0, a(xi) = 0 (i 6= j) j = (N + 1)/2

となり,これを初期値とすると

u1j−2 = (1 − 2λ)u0

j−2 + λ(u0j−3 + u0

j−1) = 0

となってしまう.

注意 2.3 (離散最大値原理). Qτh 上で定義された格子点関数 un

i が,

un+1i − un

i

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 0) (2.5a)

を満たすとする.このとき,λ ≤ 1/2ならば,

maxQτ

h

uni = max

max

0≤i≤N+1u0

i , maxn≥0

un0 , max

n≥0un

N+1

,

minQτ

h

uni = min

min

0≤i≤N+1u0

i , minn≥0

un0 , min

n≥0un

N+1

.

問題 2.2. 注意 2.3を示せ.

(c) 陰的単純スキーム

ut(xi, tn) の近似として,今度は,

ut(xi, tn) ≈ uni − un−1

i

τ(後退差分)

を採用する.このとき,un

i − un−1i

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 1)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = a(xi) (1 ≤ i ≤ N).

(2.7)

ベクトル形式で書くと,

1τu(n) − u(n−1) = − k

h2Au(n).

19

Page 22: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

ただし,

A =

2 −1 0. . .−1 2 −1

. . .0 −1 2

∈ RN×N . (2.8)

さらに,λ = kτ/h2,そして I を N 次の単位行列として,

Hλ = I + λA =

1 + 2λ −λ 0. . .−λ 1 + 2λ −λ

. . .0 −λ 1 + 2λ

(2.9)

と定義すると,

(2.7) ⇔ Hλu(n) = u(n−1).

初期条件から u(0) は既知なので,連立一次方程式を解くことで,u(1), u(2), · · · が順に求まる.このように,連立一次方程式を介して解を求める方法を陰的スキーム (implicit

scheme)と呼ぶ.すぐ後で説明するように,陰的スキームは無数にあるので,そのうち最も単純な (2.7)を単純陰的スキームと呼ぶ.一方で,連立一次方程式を介さない方法は,陽的スキーム (explicit scheme) である.もちろん,陰的スキームが意味を持つためには,Hλ が正則であることが要求される.次に,このことを考察する.

補題 2.2. ‖ · ‖ を RN の任意の行列ノルムとする.G ∈ RN×N が ‖G‖ < 1 を満たせば,I − Gは正則であり,

(I − G)−1 =∞∑

l=0

Gl, ‖(I − G)−1‖ ≤ 11 − ‖G‖

が成り立つ.

証明. I −Gを非正則と仮定すると,(I −G)u = 0を満たす u 6= 0が存在する.このとき,Gu = uより,‖u‖ ≤ ‖G‖ · ‖u‖.ゆえに,‖G‖ ≥ 1となり矛盾する.ゆえに,I − Gは正則.次に,

(I − G)(I + G + · · · + Gm) = I − Gm+1 ⇔m∑

l=0

Al = (I − G)−1(I − Gm+1).

20

Page 23: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

したがって,∥∥∥∥∥(I − G)−1 −m∑

l=0

Gl

∥∥∥∥∥ =∥∥(I − G)−1

[I − (I − Gm+1)

]∥∥≤ ‖(I − G)−1‖ · ‖G‖m+1 → 0 (m → ∞)

ゆえに,(I − G)−1 =∞∑

l=1

Gl.最後に,

(I − G)(I − G)−1 = I ⇔ (I − G)−1 = I + G(I − G)−1

より,

‖(I − G)−1‖ ≤ ‖I‖ + ‖G‖ · ‖(I − G)−1‖ ⇔ ‖(I − G)−1‖ ≤ 11 − ‖G‖

. 2

補題 2.3. 任意の λ > 0に対して,(2.9) で定義したHλ は正則となる.さらに,H−1λ > O,

かつ ‖H−1λ ‖∞ ≤ 1を満たす.

証明. Hλ = (1 + 2λ)(I − G)と分解できる.ただし,

G =λ

1 + 2λ

0 1. . .1 0 1

. . .1 0

.

このとき,‖G‖∞ =λ

1 + 2λ· 2 < 1なので,補題 2.2が適用できて,

H−1λ =

11 + 2λ

(I − G)−1 =1

1 + 2λ

∞∑l=0

Gl,

‖H−1λ ‖∞ =

11 + 2λ

‖(I − G)−1‖∞

≤ 11 + 2λ

· 11 − ‖G‖∞

=1

1 + 2λ· 11 − 2λ

1+2λ

= 1.

あとは,H−1λ > O を示せば良い.そのために,(I − G)−1 > O を示す.G ≥ O なので,

(I − G)−1 ≥ O は明らか.そこで,(I − G)−1 の第 j 行 v = (vi)に零成分が含まれているとする.ただし,I − Gが正則なので,v = 0は起こらない.すなわち,v ≥ 0, 6= 0である.一般性を失うことなく,vk = 0,vk+1 > 0とする.v は,(I − G)v = ej = (δij) ≥ 0

を満たすので,この第 k 行目を書きだすと,

− λ

1 + 2λvk−1 + vk − λ

1 + 2λvk+1 ≥ 0 ⇔ −vk−1 ≥ vk+1.

21

Page 24: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

したがって,vk−1 < 0となり,矛盾する.すなわち,v には零成分は含まれない.ゆえに,(I − G)−1 > O が示せた.

定理 2.2. (2.7)には一意的な解 u(n) = (uni ) ∈ RN が存在し (λ > 0に対する条件なしで)

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞;

(正値性保存) a ≥ 0, 6= 0 ⇒ u(n) > 0 (n ≥ 1)

が成り立つ.

証明. 補題 2.3より,ほとんど明らか.実際,u(n) = Hλu(n−1) なのだから,

‖u(n)‖∞ = ‖H−1λ u(n−1)‖∞ ≤ ‖H−1

λ ‖∞‖u(n−1)‖∞ ≤ ‖u(n−1)‖∞;

u(n−1) ≥ 0 ⇒ u(n) = H−1λ u(n−1) > 0. 2

(d) 陰的 θスキーム

陽適スキームと陰的スキームは,それぞれ,

uni − un−1

i

τ= k

un−1i−1 − 2un−1

i + un−1i+1

h2(1 ≤ i ≤ N, n ≥ 1)

uni − un−1

i

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 1).

でっあった (上付き添え字の番号を揃えてる).θ ∈ [0, 1]として,これらの平均をとったスキーム

uni − un−1

i

τ= (1 − θ)k

un−1i−1 − 2un−1

i + un−1i+1

h2

+θkun

i−1 − 2uni + un

i+1

h2(1 ≤ i ≤ N, n ≥ 1)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = u0(xi) (1 ≤ i ≤ N)

(2.10)

を陰的 θ スキーム (implicit θ scheme)という.λ = kτ/h2,θ′ = 1 − θ とおいて,第一式と第二式を書き直すと,

1τu(n) − u(n−1) = −θ′k

h2Au(n−1) − θk

h2Au(n).

この行列表現は,

Hθλu(n) = Kθ′λu(n−1)

22

Page 25: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

となる.ただし,λ = kτ/h2 かつ

Hθλ = I + θλA =

1 + 2θλ −θλ 0 0. . . . . .−θλ 1 + 2θλ −θλ

. . . . . .0 −θλ 1 + 2θλ

, (2.11)

Kθ′λ = I − θ′λA =

1 − 2θ′λ θ′λ 0 0. . .θ′λ 1 − 2θ′λ θ′λ

. . .0 θ′λ 1 − 2θ′λ

. (2.12)

なお,(2.10)は,θ = 0のとき陽解法に,θ = 1のとき陰解法に一致するので,θ 6= 0, 1の場合を考える.

定理 2.3. (2.10)には一意的な解 u(n) = (uni ) ∈ RN が存在し,条件

0 < θ < 1, 1 − 2(1 − θ)λ ≥ 0 (2.13)

の下で,

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞;

(非負値性の保存) a ≥ 0 ⇒ u(n) ≥ 0;

(正値性保存) λ 6= 12(1 − θ)

, a ≥ 0, 6= 0 ⇒ u(n) > 0 (n ≥ 1)

が成り立つ.

証明. 条件 (2.13)の下では,補題 2.3と全く同様に,Hθλ は正則, (θ 6= 0なので)H−1θλ > O,

かつ ‖H−1θλ ‖∞ ≤ 1が出る.一方で,Kθ′λ ≥ 0, ‖Kθ′λ‖∞ = 1は明らか.したがって,この

とき,

‖u(n+1)‖∞ = ‖H−1θλ Kθ′λu(n)‖∞ ≤ ‖u(n)‖∞.

さらに,

u(n−1) ≥ 0 ⇒ u(n) = H−1θλ Kθ′λu(n−1) ≥ 0.

次に,a ≥ 0, 6= 0と λ 6= 12(1−θ) を仮定する.そうすると,Kθ′λa ≥ 0, 6= 0である.ゆえ

に,u(1) = H−1θλ Kθ′λa > 0.すなわち,n ≥ 1で,u(n) > 0.

注意 2.4. 特に,θ = 1/2(Crank-Nicolsonスキーム)のとき,条件

(0 <)λ < 1

23

Page 26: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

の下で,`∞ 安定性と正値性保存が成立する.

注意 2.5 (離散最大値原理). Qτh 上で定義された格子点関数 un

i が,

un+1i − un

i

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 0) (2.5a)

を満たすとする.このとき,

1 − 2(1 − θ)λ ≥ 0

の下で,

maxQτ

h

uni = max

max

0≤i≤N+1u0

i , maxn≥0

un0 , max

n≥0un

N+1

,

minQτ

h

uni = min

min

0≤i≤N+1u0

i , minn≥0

un0 , min

n≥0un

N+1

.

問題 2.3. 注意 2.5を示せ.

(e) 非斉次問題

熱源の効果を含む熱方程式の初期値境界値問題ut = kuxx + f(x, t) (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.6)

を考える.f(x, t) は与えられた関数であり,熱の供給・吸収を表す.差分スキームの導出は,今までと全く同じである.陽解法は,

un+1i − un

i

τ= k

uni−1 − 2un

i + uni+1

h2+ f(xi, tn) (0 < i < N, n ≥ 0)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = a(xi) (1 ≤ i ≤ N)

となり,λ = kτ/h2 と置いて,書き下すと,

• u0i = a(xi) (i = 1, · · · , N);

• n = 0, 1, 2, . . . , に対して,un+10 = un+1

N+1 = 0 かつ

un+1i = (1 − 2λ)un

i + λ(uni−1 + un

i+1) + τf(xi, tn) (1 ≤ i ≤ N).

24

Page 27: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

陰解法は,un

i − un−1i

τ= k

uni−1 − 2un

i + uni+1

h2+ f(xi, tn) (0 < i < N, n ≥ 0)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = u0(xi) (1 ≤ i ≤ N).

書き直すと,

1τu(n) − u(n−1) = − k

h2Au(n) + f (n) ⇔ Hλu(n) = u(n−1) + τf (n).

ここで,

f (n) =

f(x1, tn)f(x2, tn)

...f(xN , tn)

と置いている.また,θ 法を行列形式で書くと,

Hθλu(n) = Kθ′λu(n−1) + τ (1 − θ)f (n−1) + θf (n)︸ ︷︷ ︸f (n−1+θ)

. (2.14)

ただし,Hθλ と Kθ′λ は (2.11)と (2.12)で定義した三重対角行列である.

定理 2.4. (2.14)には一意解 u(n) が存在する.また,条件

2(1 − θ)λ ≤ 1 (2.13)

の下で (θ = 1のときは無条件と解釈),

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞ + τ

n∑l=1

‖f (l−1+θ)‖∞;

(非負値性保存) a ≥ 0, f (l) ≥ 0 (0 ≤ l ≤ n) ⇒ u(n) ≥ 0;

(正値性保存)

θ 6= 0, λ 6= 12(1 − θ)

, a ≥ 0, 6= 0, f (l) ≥ 0 (0 ≤ l ≤ n) ⇒ u(n) > 0 (n ≥ 1)

が成り立つ.

証明. 定理 2.3の証明と同様.

注意 2.6. 定理 2.4,の非負値性保存について,θ = 0の際は,a ≥ 0,f (l) ≥ 0 (0 ≤ l ≤ n−1)

を仮定するのみで良い.

25

Page 28: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(f) 連立一次方程式の解法

今まで見てきたように,θ 法で熱方程式を解く際には,

Hθλ︸︷︷︸H

u(n)= Kθ′λu(n−1) + τf (n−1+θ)︸ ︷︷ ︸

g(n)

の形の連立一方程式を解く必要がある.H ∈ RN×N は,

H =

1 + 2µ −µ 0 0. . .−µ 1 + 2µ −µ

. . .0 −µ 1 + 2µ

, µ = (1 − θ)λ

で定義される三重対角行列であった.したがって,三重対角行列

A =

q1 r1 0 0. . .pi qi ri

. . .0 pN qN

(2.15)

を係数行列とする連立一次方程式

Au = g, u = (ui), g = (gi)

の解法を用意しておく必要がある.説明のため,はじめに N = 4の場合を考える.やや天下り式であるが,Aが,

q1 r1 0 0p2 q2 r2 00 p3 q3 r3

0 0 p4 q4

=

1 0 0 0`2 1 0 00 `3 1 00 0 `4 1

m1 k1 0 00 m2 k2 00 0 m3 k3

0 0 0 m4

のように,(単位)下三角行列と上三角行列に分解できたと仮定して,`i, mi, ki を pi, qi, ri

(および,`i−1, mi−1, ki−1)で表すことを考える.直接の計算により,q1 r1 0 0p2 q2 r2 00 p3 q3 r3

0 0 p4 q4

=

m1 k1 0 0

m1`2 `2k1 + m2 k2 00 m2`3 `3k2 + m3 k3

0 0 m3`4 `4k3 + m4

.

26

Page 29: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

したがって,

m1 = q1, k1 = r1

`2 =p2

m1, m2 = q2 − `2r1, k2 = r2,

`3 =p3

m2, m3 = q3 − `3r2, k3 = r3,

`4 =p4

m3, m4 = q4 − `4r3, k4 = r4

となる.N が一般の場合でも話は同じである.すなわち,Aが,

A =

1 0 0. . .`i 1

. . .0 `N 1

︸ ︷︷ ︸

L

m1 r1 0. . .mi ri

. . .0 mN

︸ ︷︷ ︸

U

(2.16)

と分解できるとすると (ki = ri は最初から考慮した),

m1 = q1,

`i =pi

mi−1, mi = qi − `iri−1 (i = 2, . . . ,≤ N)

である.(2.16)のような分解を LU分解と呼ぶ.なお,途中でmi = 0とならなければ,LU分解は可能である.Aが特別な形のときには,

これが予め保証される.

補題 2.4. (2.15)の Aが

|qi| > |pi| + |ri| (1 ≤ i ≤ N) (2.17)

を満たすならば,これは正則であり,さらに,(2.16)の形に一意的に LU分解可能である.ただし,p1 = rN = 0とする.

証明. まず,正則性を背理法で示す.Aが正則でないと仮定する.すると,Ax = 0を満たす x 6= 0が存在する.|xk| = maxi |xi|として,Ax = 0の第 k 成分を考えると,

|qk| · |xk| = |qkxk| = |−pkxk−1 − rkxk+1| ≤ (|pk| + |rk|)|xk|.

明らかに,|xk| > 0なので,この式を |xk|で割れば,|qk| ≤ |pk|+ |rk|となり,(2.18)に矛盾する.したがって,Aは正則.

27

Page 30: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

続いて,LU分解可能であることを示す.(2.18)により,q1 = 0はあり得ない.ゆえに,m1 = q1 6= 0.次に,

|m2| =∣∣∣∣q2 −

p2

m1r1

∣∣∣∣ = ∣∣∣∣q2 − p2r1

q1

∣∣∣∣ ≥ |q2| − |p2||r1||q1|

.

ところが,(2.18)より,|r1|/|q1| < 1なので,再び (2.18)により,|m2| > |q2|−|p2| > |r2| > 0.これを用いて,

|m3| =∣∣∣∣q3 −

p3

m2r2

∣∣∣∣ ≥ |q3| − |p3||r2||m2|

> |q3| − |p3| > |r3| > 0

を得る.これを続けて行けば,mi 6= 0 (i = 1, . . . , N)なので,LU分解は可能である.

注意 2.7. 一般に,

|aii| >∑j 6=i

|aij | (1 ≤ i ≤ N)

を満たす A = (aij) ∈ RN×N を狭義優対角 (strictly diagonally dominant) 行列と呼ぶ.補題 2.4により,狭義優対角な三重対角行列は LU分解可能である.しかし,実は,狭義優対角行列は LU分解可能である.また,正定値実対称行列も LU分解可能である.詳しくは,[15]の §2.2あるいは [13]の §2.4などを参照されたい.

注意 2.8. 証明を良く検討すれば,(2.18)の代わりに,

|qi| ≥ |pi| + |ri|, pi 6= 0, ri 6= 0 (1 ≤ i ≤ N) (2.18)

であれば正則かつ LU 分解可能であることが示せる.これは,既約優対角行列は正則かつLU分解可能であることの特別な場合に相当する.

さて,LU分解可能な係数行列 Aを持つ連立一次方程式 Au = g は,次のように解くことになる.

1. Aを A = LU の形 (2.16)に分解する.そして,中間変数 cを導入して,

Au = g ⇔

Lc = g

Uu = c

と分解する.2. Lc = g を解いて cを求める.それには,Lの単位下三角性を利用して,

c1 = g1, ci = gi − `ici−1 (i = 2, . . . , N)

とすれば良い.

28

Page 31: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

3. Uu = cを解いて uを求める.それには,U の上三角性を利用して,

uN =cN

mN, ui =

ci − riui+1

mi(i = N − 1, . . . , 1)

とする.

もし,解くべき問題が,

Au(n) = g(n) (n = 1, 2, . . .)

の形をしているとき (熱方程式の θ 法による解法!)には,LU分解を一度だけ行い,各 nに対して,上記の 2と 3の手順を繰り返せば良く,計算時間が大幅に節約できる.プログラムの例は,§A(f)で示す.

29

Page 32: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

3 熱方程式の差分近似 (続き)

(a) `∞ 誤差解析

この節では,非斉次問題ut = kuxx + f(x, t) (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.6)

の解 u(x, t)と,差分スキーム

Hθλu(n) = Kθ′λu(n−1) + τf (n−1+θ) (2.14)

の解 u(n) = (uni )との誤差

e(n) = (eni ) ∈ RN , en

i = u(xi, tn) − uni

を考察する.ただし,

f (n−1+θ) = (1 − θ)f (n−1) + θf (n) = (Fni )

と書くことにする.

記号: 差分商

Dτvni =

vni − vn−1

i

τ, ∆hvn

i =vn

i−1 − 2vni + vn

i+1

h2.

このとき,(2.14) ⇔Dτun

i = (1 − θ)k∆hun−1i + θk∆hun

i + Fni (0 < i < N, n ≥ 0)

un0 = un

N+1 = 0 (n > 0)u0

i = a(xi) (0 ≤ i ≤ N).(2.14′)

次に,

Uni = u(xi, tn)

と書くと,

Dτeni − (1 − θ)k∆hen−1

i − θk∆heni

= DτUni − (1 − θ)k∆hUn−1

i − θk∆hUni − [Dτun

i − (1 − θ)k∆hun−1i − θk∆hun

i ]

= DτUni − (1 − θ)k∆hUn−1

i − θk∆hUni − Fn

i

≡ rni .

30

Page 33: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

すなわち,e(n) = (eni )は,

Dτeni = (1 − θ)k∆hen−1

i + θk∆heni + rn

i (0 < i < N, n ≥ 0)en0 = en

N+1 = 0 (n > 0)e0i = 0 (0 ≤ i ≤ N)

を満たす.さらに,r(n) = (rni )と定義すると,

Hθλe(n) = Kθ′λe(n−1) + τr(n) (n ≥ 1), e(0) = 0.

したがって,定理 2.4より,次を得る.

補題 3.1. 誤差ベクトルは e(n) = (eni )は,条件 2(1 − θ)λ ≤ 1の下で,

‖e(n)‖∞ ≤ τn∑

l=1

‖r(l)‖∞

を満たす.

記号: (1.6)の解 u(x, t)に対して,

M lm(T ) = max

t∈[0,T ]max

x∈[0,1]

∣∣∣∣ ∂m

∂xm

∂l

∂tlu(x, t)

∣∣∣∣とおく (T は正数, l, mは自然数).

補題 3.2. T > 0を任意に固定して,(1.6)の解 u(x, t)に対して,次を仮定する:

∂lu

∂tl,∂mu

∂xm∈ C([0, 1] × [0, T ])

θ = 1

2 のとき 0 ≤ l ≤ 3, 0 ≤ m ≤ 4θ 6= 1

2 のとき 0 ≤ l ≤ 2, 0 ≤ m ≤ 4.(3.1)

すると,残差ベクトル r(n) = (rni )は,

‖r(n)‖∞ ≤ αθ(tn) =

5τ2

12M3

0 (tn) + kh2

12M0

4 (tn) (θ = 12 )

12τM2

0 (tn) + kh2

12M0

4 (tn) (θ 6= 12 )

を満たす.

証明. 方程式を (xi, tn)と (xi, tn−1)で考えると,

f(xi, tn) = ut(xi, tn) − kuxx(xi, tn),

f(xi, tn−1) = ut(xi, tn−1) − kuxx(xi, tn−1)

31

Page 34: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

なので,これを rni の定義に代入して

rni = Dτu(xi, tn) − (1 − θ)ut(xi, tn−1) − θut(xi, tn)︸ ︷︷ ︸

R1

−(1 − θ)k [∆hu(xi, tn−1) − uxx(xi, tn−1]︸ ︷︷ ︸R2

−θk [∆hu(xi, tn) − uxx(xi, tn)]︸ ︷︷ ︸R3

.

まず,二階中心差分近似の誤差評価式 (2.4)より,

|∆hu(xi, tn−1) − uxx(xi, tn−1)| ≤24!

h2M04 (tn−1),

|∆hu(xi, tn) − uxx(xi, tn)| ≤ 24!

h2M04 (tn).

したがって,自明な関係M04 (tn−1) ≤ M0

4 (tn)より,

|R2| + |R3| ≤k

12h2M0

4 (tn).

次に,|R1|の評価を導く.まず,θ 6= 1/2の場合を考える.簡単のため v(t) = u(xi, t)と書く.前進・後退差分近似の誤差評価式 (2.1)と (2.2)より,

|Dτv(tn) − v′(tn−1)|, |Dτv(tn) − v′(tn)| ≤ 12τM2

0 (tn).

これを用いて,

|R1| ≤ (1 − θ)|Dτv(tn) − v′(tn−1)| + θ|Dτv(tn) − v′(tn)|

≤ (1 − θ)12τM2

0 (tn) + θ12τM2

0 (tn)

=12τM2

0 (tn).

これらを合わせて,|rni | ≤ |R1| + |R2| + |R3| ≤ α(tn)を得る.

引き続き,θ = 1/2の場合を考える.このとき,適当な tn−1 < t, t < tn に対して,

v(tn) = v(tn−1) + v′(tn−1)τ +12v′′(tn−1)τ2 +

13!

v(3)(t)τ3,

v(tn−1) = v(tn) − v′(tn)τ +12v′′(tn)τ2 − 1

3!v(3)(t)τ3

と書ける.すなわち,

v(tn) − v(tn−1)τ

− v′(tn−1) =12v′′(tn−1)τ +

13!

v(3)(t)τ2,

v(tn) − v(tn−1)τ

− v′(tn) = −12v′′(tn)τ +

13!

v(3)(t)τ2.

32

Page 35: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

これを用いて,

R1 = Dτv(tn) − 12v′(tn−1) −

12v′(tn)

=12[Dτv(tn) − v′(tn−1)] +

12[Dτv(tn) − v′(tn)]

4[v′′(tn−1) − v′′(tn)] +

τ2

2 · 3![v(3)(t) + v(3)(t)]

= −τ

4

∫ tn

tn−1

v(3)(s)ds +τ2

2 · 3![v(3)(t) + v(3)(t)].

したがって,

|R1| ≤ M30 (tn)

τ

4

∫ tn

tn−1

ds +τ2

2 · 3!· 2M3

0 (tn)

=τ2

4M3

0 (tn) +τ2

6M3

0 (tn) =5τ2

12M3

0 (tn).

ゆえに,この場合も,|rni | ≤ |R1| + |R2| + |R3| ≤ α(tn)を得る.

定理 3.1. T > 0を固定して,(1.6)の解 u(x, t)に対して,(3.1)を仮定する.このとき,条件 2(1 − θ)λ ≤ 1の下で,次の誤差評価が成立:

max0≤tn≤T

‖e(n)‖∞ ≤ Tαθ(T ).

ただし,αθ(T )は補題 3.2で定義したもの.特に,

max0≤tn≤T

‖e(n)‖∞ ≤

CT,1/2

(τ2 + h2

)(θ = 1

2のとき),

CT,θ

(τ + h2

)(θ 6= 1

2のとき)(3.2)

が成り立つ.ただし,

CT,θ =

T max

512

M30 (T ),

k

12M0

4 (T )

(θ = 12 のとき),

T max

12M2

0 (T ),k

12M0

4 (T )

(θ 6= 12 のとき)

(3.3)

としている.

証明. 補題 3.1と 3.2の結果を合わせればよい.

33

Page 36: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(b) `2 誤差解析

準備として,三重対角行列

A =

2 −1 0. . .−1 2 −1

. . .0 −1 2

∈ RN×N

に対する固有値問題

1h2

Aϕ = µϕ(0 6= ϕ = (ϕi) ∈ RN

)⇔

−ϕi−1 − 2ϕi + ϕi+1

h2= µϕi (1 ≤ i ≤ N)

ϕ0 = ϕN+1 = 0, ϕi 6≡ 0

を考える.この固有値と固有ベクトルは

µ〈m〉h =

4h2

sin2

(mπh

2

), ϕ

〈m〉i =

√2 sin(mπxi) (1 ≤ m ≤ N) (3.4)

となる (問題 3.1).特に,Aの固有値は

µ〈m〉 = µ〈m〉1 = 4 sin2

(mπ

2

)である.ところで,常微分方程式の固有値問題

−ϕ′′(x) = µϕ(x) (0 < x < 1), ϕ(0) = ϕ(1) = 0, ϕ 6≡ 0

の固有値と固有ベクトルは

µm = (mπ)2, ϕm(x) =√

2 sin(mπx) (m = 1, 2, . . .)

であった.このとき,

µ〈m〉h → µm (h → 0), ϕm(xi) = ϕ

〈m〉i

という関係がある.

定義 3.1.

(i) (`2 ノルム) ‖u‖2 =

(N∑

i=1

|ui|2)1/2

(u ∈ RN );

34

Page 37: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(ii) (`2 行列ノルム) ‖G‖2 = maxu∈RN

‖Gu‖2

‖u‖2(G ∈ RN×N ).

補題 3.3. G ∈ RN×N を対称とし,λ1, . . . , λn をその固有値とすると,‖G‖2 = maxi

|λi|.

証明. 問題 3.2.

さて,熱方程式ut = kuxx (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.5)

とその θ 法による差分近似

Hθλu(n) = Kθ′λu(n−1) (n ≥ 1), u(0) = a ∈ RN (2.10)

の考察に戻ろう.復習すると,

• 陽解法: u(n+1) = (I − λA)u(n);

• 陰解法: u(n+1) = (I + λA)−1u(n);

• Crank-Nicolson法: u(n+1) =(

I +λ

2A

)−1(I − λ

2A

)u(n);

• θ 法: u(n+1) = (I + θλA)−1 (I − θλ′A)u(n) (0 < θ < 1, θ′ = 1 − θ)

であった.ここで,実数値関数

rθ(s) = (1 + θ′λs)−1(1 − θλs) =1 − θλs

1 + θ′λs(s ≥ 0)

と,これに “形式的に Aを代入した行列”

rθ(A) = (1 + θ′λA)−1(1 − θλA)

を考える*1.そうすると,θ 法 (2.10)は,

u(n+1) = rθ(A)u(n), u(0) = a

と表現できるのである.

補題 3.4. 条件

0 ≤ θ <12のとき 2λ(1 − 2θ) ≤ 1 (3.5)

の下で (θ ≥ 1/2のときは無条件),‖rθ(A)‖2 ≤ 1.

*1 正確には,rθ(A)を右辺の行列として定義する.

35

Page 38: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

証明. 次に注意する (証明は問題 3.3と問題 3.4):

1. rθ(A)は実対称行列,2. rθ(µ〈m〉)N

m=1 は rθ(A)の固有値 (これらはちょうど N 個あり,これ以外に固有値はない).

したがって,補題 3.3より,

‖rθ(A)‖2 = max1≤m≤N

|rθ(µ〈m〉)|. (3.6)

ここで,

rθ(0) = 1;d

dsrθ(s) =

−λ

(1 + θ′λs)2< 0;

rθ(s) = −1 ⇔ sλ(1 − 2θ) = 2.

したがって,

0 ≤ θ < 12 のとき 0 ≤ s ≤ 2

λ(1−2θ)12 ≤ θ ≤ 1 のとき s ≥ 0

⇒ |rθ(s)| ≤ 1.

ゆえに, 12 ≤ θ ≤ 1のときは,(3.6)より,‖rθ(A)‖2 ≤ 1を得る.一方で,0 ≤ θ < 1

2 のとき,条件 (3.5)が成り立てば,常に,

(0 <)µ〈m〉 = 4 sin2(mπ

2

)≤ 4 ≤ 2

λ(1 − 2θ)(1 ≤ m ≤ N)

が成り立つので,(3.6)より,‖rθ(A)‖2 ≤ 1.

定理 3.2. u(n) を (2.10)の解とする.このとき,条件 (3.5)の下で,

‖u(n)‖2 ≤ ‖a‖2

が成り立つ.

証明. ‖u(n+1)‖2 = ‖rθ(A)u(n)‖2 ≤ ‖rθ(A)‖2‖u(n)‖2 と補題 3.4より直ちに従う.

次に,非斉次問題ut = kuxx + f(x, t) (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.6)

と,差分近似

Hθλu(n) = Kθ′λu(n−1) + τf (n−1+θ)

⇔ u(n) = rθ(A)u(n−1) + τ(I + θλA)−1f (n−1+θ) (2.14)

36

Page 39: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

を考える.ただし,

f (n−1+θ) = (1 − θ)f (n−1) + θf (n).

定理 3.3. (2.14)の解 u(n) について,条件 (3.5)の下で,

‖u(n)‖2 ≤ ‖a‖2 + τn∑

l=1

‖f (l−1+θ)‖2

が成り立つ.

証明. 補題 3.4 と同様に考えれば,‖(I + θλA)−1‖2 ≤ 1 (θ′, λ > 0).これと,補題 3.4 より,ただちに従う.

記号: ‖v‖h =√

h‖v‖2 =

(h

m∑i=1

v2i

)1/2

. 自明な関係式:‖v‖h ≤ ‖v‖∞.

定理 3.4. T > 0を固定して,(1.6)の解 u(x, t)に対して,(3.1)を仮定する.このとき,条件 (3.5)の下で,次の誤差評価が成立:

max0≤tn≤T

‖e(n)‖2 ≤

CT,1/2

(τ2 + h2

)(θ = 1

2のとき),

CT,θ

(τ + h2

)(θ 6= 1

2のとき)

が成り立つ.ただし,CT,θ は (3.3)で定義した正定数.

証明. 定理 3.3を用いて,

‖e(n)‖2 ≤ τn∑

l=1

‖r(l)‖2 ≤ τn∑

l=1

‖r(l)‖∞.

これと補題 3.2を合わせる.

問題 3.1. 次の手順で (3.4)を導け.

1. 任意の µに対して,2次方程式 t2 − (2 − µh2)t + 1 = 0の (異なる)2根を α, β とするとき,ϕi = c1α

i + c2βi (c1, c2 は任意の定数)が,方程式を満たすことを示せ.

2. ϕ0 = ϕN+1 = 0より,c1, c2 の関係式を導き,

α

β= e2mhπ

√−1 (m = 1, 2, . . . , N) (3.7)

を導け.(ヒント:zN+1 = 1の根の求め方は?)

3. 根と係数の関係から α + β = 2 − λh2,αβ = 1.これと (3.7)をあわせて,半角の公式などを使うと (3.4) が出る.

37

Page 40: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

問題 3.2. 補題 3.3を示せ.

問題 3.3. rθ(A) は対称行列であることを示せ.考え方はいろいろあるが,P =

(φ〈1〉, . . . ,φ〈N〉) ∈ RN×N とおいて,対角化

AP = P

µ〈1〉

. . .µ〈N〉

⇔ A = P

µ〈1〉

. . .µ〈N〉

P−1

を使うのは一つの手であろう.

問題 3.4. r(µ〈m〉)Nm=1 は rθ(A)の固有値であることを示せ.

(c) Neumann 境界条件

Neumann境界条件の下での熱方程式の初期値境界値問題ut = kuxx (0 < x < 1, t > 0)ux(0, t) = ux(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(3.8)

を考える.次のように記号を定める:

• 整数 N > 0を採って, h =1N

• τ > 0

• Qτh =

(xi, tn)| xi =

(i − 1

2

)h, tn = nτ (0 ≤ i ≤ N + 1, n ≥ 0)

• un

i ≈ u(xi, tn).

方程式を陽解法で近似すると,

un+1i − un

i

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 0)

となり,Dirichlet境界条件の場合と同じである.しかし今の場合,un0 と un

N+1 の値が与えられていないので,差分スキームで i = 1, N としたときに現れる un

0 と unN+1 の処理が問題

となる.ここで,Neumann 境界条件を使おう.すなわち,

ux(0, t) = 0 より u(x1, t) − u(x0, t)h

≈ 0 (x = 0 で中心差分),

ux(1, t) = 0 より u(xN+1, t) − u(xN , t)h

≈ 0 (x = 1 で中心差分).

38

Page 41: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

これより,

un1 − un

0

h= 0 ⇔ un

0 = un1 ,

unN+1 − un

N

h= 0 ⇔ un

N+1 = unN

とすれば良さそうである.結局,(3.8)に対する陽解法は,un+1

i − uni

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 0)

un0 = un

1 , unN+1 = un

N (n ≥ 0)u0

i = a(xi) (0 ≤ i ≤ N + 1)

となる.これは,前と同様に,λ = kτ/h2 と置いて,

• u0i = a(xi) (i = 1, · · · , N);

• n = 0, 1, 2, . . . , に対して,

un+11 = (1 − λ)un

1 + λun2 ,

un+1i = (1 − 2λ)un

i + λ(uni−1 + un

i+1) (2 ≤ i ≤ N − 1),

un+1N = (1 − λ)un

N + λunN−1

を計算すれば良い.あるいは,同値な表現として,

1τu(n+1) − u(n) = − k

h2Bu(n) ⇔ u(n+1) = Lλu(n).

ただし,

B =

1 −1 0 0. . . . . .−1 2 −1

. . . . . .0 −1 1

∈ RN×N , Lλ = I − λB.

一方で,陰解法は,un

i − un−1i

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, n ≥ 1)

un0 = un

1 , unN+1 = un

N (n ≥ 0)u0

i = a(xi) (0 ≤ i ≤ N + 1)

,

となる.行列表示は,

1τu(n) − u(n−1) = − k

h2Bu(n−1) ⇔ (I + λB)︸ ︷︷ ︸

u(n) = u(n−1).

39

Page 42: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

さらに θ 法の行列表示は, 0 ≤ θ ≤ 1,θ′ = 1 − θ に対して,

Mθλu(n) = Lθ′λu(n−1) (3.9)

となる.

定理 3.5. (3.9)には一意的な解 u(n) が存在する.そして,条件

1 − 2(1 − θ)λ ≥ 0 (3.10)

の下で,

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞;

(非負値性の保存) a ≥ 0 ⇒ u(n) ≥ 0;

(正値性保存) λ 6= 12(1 − θ)

, a ≥ 0, 6= 0 ⇒ u(n) > 0 (n ≥ 1)

が成り立つ.

証明. まず,非負値性・正値性の保存を考える.(3.10)の下では,Lθ′λ ≥ O.次に,θ 6= 0

として,M−1θλ > O を示すために,補題 2.3 の証明と同様に進む.s = θλ とおくと,

Ms = I + sB = D(I − G)と書ける.ただし,

D =

1 + s

1 + 2s. . .

1 + 2s1 + s

,

G =

0 µ1

µ2 0 µ2

. . .µ2 0 µ2

µ1 0

, µl =s

1 + ls

いま,‖G‖∞ = max

s

1 + s,

2s

1 + 2s

=

2s

1 + 2s< 1なので,補題 2.2が適用できて,I−G

は正則.したがって,Ms = D(I−G)も正則で,M−1s = (I−G)−1D−1 =

∞∑l=0

GlD−1 ≥ O.

一方で,M−1s > Oであることの証明は,補題 2.3と全く同様である.すなわち,非負値性・

正値性の保存が示せた.次に,`∞ 安定性を示す.そのために,α(n) = (αn

i ) = (‖a‖∞) ∈ RN (定数ベクトル)と定義する.明らかに,(αn

0 , αnN+1 も含めて)

αn+1i − αn

i

τ= 0,

αni − αn

i−1

h= 0,

αni−1 − 2αn

i − αni+1

h2= 0

40

Page 43: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

なので,α(n) は,Msα(n) = Ls′α(n−1),s′ = θ′λを満たす.したがって,

v(n) = α(n) − u(n)

とおくと,

Msv(n) = Msα

(n) − Msu(n)

= Ls′α(n−1) − Ls′u(n−1)

= Ls′v(n−1)

を得る.一方,明らかに,v(0) = α(0) − u(0) ≥ 0なので,非負値性の保存より,n ≥ 1のとき,v(n) ≥ 0,すなわち,u(n) ≤ α(n) を得る.さらに,

w(n) = α(n) + u(n)

とおいて,同様の議論をすれば,n ≥ 1のとき,u(n) ≥ −α(n) を得る.これらを合わせて,‖u(n)‖∞ ≤ ‖α‖∞ = ‖a‖∞ が示せた.

注意 3.1. 定理 3.5の証明において,‖Lθ′λ‖∞ = 1だが,

‖(I − G)−1‖∞ ≤ 11 − ‖G‖∞

=1

1 − 2s1+2s

= 1 + 2s

より,

‖M−1s ‖∞ ≤ ‖(I − G)−1‖∞‖D−1‖∞ ≤ (1 + 2s) · 1

1 + s> 1

であり,単純には `∞ 安定性を結論できない.

熱量保存. (3.8)の解は熱量保存則

J(t) = J(0) =∫ 1

0

ca(x) dx (t ≥ 0)

を満たす.ただし,

J(t) =∫ 1

0

cu(x, t) dx (c: 熱容量)

は総熱量である.実際,(3.8)の解の微分可能性としては

u ∈ C([0, 1] × [0,∞)), ux ∈ C([0, 1] × (0,∞)), ut, uxx ∈ C((0, 1) × (0,∞))

を要請することになるが,このことに注意して,

d

dtJ(t) =

∫ 1

0

cut(x, t) dx =∫ 1

0

cuxx(x, t) dx = [cux(x, t)]x=1x=0 = 0

41

Page 44: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

を得る.いま,(3.9)の解 u(n) = (uni )に対して離散熱量

Jn =N∑

i=1

cuni h

を定義する.このとき,離散的熱量保存則

Jn =N∑

i=1

ca(xi)h

が成立する.

(d) 差分スキームの再考察

ここでまでの差分スキームの導出において,空間変数の離散化はすべて 2階中心差分近似(2.4)に基づいている.この節では,物理的考察に基づき,中心差分近似 (2.3)のみを用いたスキームの導出方法を述べる.例として,初期値境界値問題 (3.8)を考えよう.解を,§3(c)で定義した格子点集合 Qτ

h を使って,un

i ≈ u(xi, tn)と近似するのは前と同じである.ただし,h = 1/N としている.さて,もともと熱方程式とは,流束 F (x, t) = −kux を用いて ut = −Fx(x, t)と表現できるのであった (この節では,簡単のため熱容量は c = 1とする.このとき κ = k となることに注意する).そこで,F (x, t)の近似を考えることにする.そのために,§2(b)で定義した格子点集合 Qτ

h を使う.ただし,§2(b)とは,刻み幅 hの大きさが違うので注意を要する.すなわち,今の場合

Qτh = (xi, tn) | xi = ih, tn = nτ (0 ≤ i ≤ N, n ≥ 0) (3.11)

である.そして,Qτh 上で F (x, t) の近似を考える; Fn

i ≈ F (xi, tn). x = xi において (幅h/2の)中心差分近似を考えると,

F (xi, tn) ≈ −ku(xi+1, tn) − u(xi, tn)

h

なので,したがって

Fni = −k

uni+1 − un

i

h(0 ≤ i ≤ N, n ≥ 0) (3.12)

と定義すれば良いであろう.次に,x = xi で (幅 h/2の)中心差分近似を考えると,

−∂F

∂x(xi, tn) ≈ −F (xi, tn) − F (xi−1, tn)

h

なので,結局 (xi, tn)における (1.1)の近似は,陽解法では

un+1i − un

i

τ= −

Fni − Fn

i−1

h(0 ≤ i ≤ N, n ≥ 0) (3.13)

42

Page 45: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

と,陰解法では

uni − un−1

i

τ= −

Fni − Fn

i−1

h(0 ≤ i ≤ N, n ≥ 1) (3.14)

となる.また,Neumann境界条件はそもそも「境界での流速が 0」という条件だったのだから,いずれの場合も

Fn0 = 0, Fn

N = 0 ⇔ un1 = un

0 , unN+1 = un

N (3.15)

とすればよい.これらのスキームを uni のみで書き下せば,§3(c) で導いた陽解法および単

純陰解法に一致する.

(e) 変数係数

k が定数でなく関数 k(x)の場合を考える.例として,Neuman境界条件の問題を採りあげよう.すなわち,熱方程式の初期値境界値問題

ut = [k(x)ux]x (0 < x < 1, t > 0)k(0)ux(0, t) = k(1)ux(1, t) = 0 (t > 0)u(x, t) = u0(x) (0 ≤ x ≤ 1)

(3.16)

を考える (cf. (1.4)).ただし,k ∈ C1[0, 1]かつ k(x) ≥ k0 > 0 (x ∈ [0, 1])と仮定する.また,境界条件 k(0)ux(0, t) = 0は k(0)で両辺を割れば ux(0, t) = 0となるが,あえて上のように書いておく.第一式は,流束 F (x, t) = −k(x)ux を導入することにより,ut = −Fx

と書ける事に注意する.h = 1/N,τ > 0 として,前節に引き続き格子点の集合 Qτ

h と Qτh を考える.近似関数を

uii ≈ u(xi, tn), Fn

i ≈ F (xi, tn) = −k(xi)ux(xi, tn)

で求めよう.ki = k(xi)とおいて,前節と同様に考えれば,

Fni = −ki

uni+1 − un

i

h(0 ≤ i ≤ N, n ≥ 0)

であり,したがって,陽解法の場合は,

un+1i − un

i

τ= −

Fni − Fn

i−1

h(1 ≤ i ≤ N, n ≥ 0) (3.17)

となる.境界条件は,

Fn0 = 0, Fn

N = 0 ⇔ −k0un

1 − un0

h= 0, −kN

unN+1 − un

N

h= 0 (3.18)

となる.

43

Page 46: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(3.17)を書き直すと,

un+1i − un

i

τ=

1h

(ki

uni+1 − un

i

h− ki−1

uni − un

i−1

h

).

すなわち,

un+1i = ki

τ

h2un

i+1 +[1 − (ki + ki+1)

τ

h2

]un

i + ki−1τ

h2un

i−1

となる.このとき,

λ = kmaxτ

h2

(kmax = max

x∈[0,1]k(x)

)と置くと,条件

(0 <)λ ≤ 12

の下で,

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞;

(非負値性保存) a ≥ 0 ⇒ u(n) ≥ 0

を示すことができる.

44

Page 47: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

4 反応拡散系(a) 半線形拡散方程式

半線形拡散程式の初期値境界値問題ut = kuxx + ε(1 − u)u (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, t) = a(x) (0 ≤ x ≤ 1)

(4.1)

を考えよう.ただし,次を仮定する:

• k, ε > 0: 定数,

• a(x): 初期関数,a ∈ C[0, 1], a 6≡ 0, 0 ≤ a ≤ 1, a(0) = a(1) = 0.

定理 4.1. (4.1)には,[0, 1] × [0,∞)において唯一の解 (時間大域的な古典解)が存在し,

0 ≤ u(x, t) ≤ 1 (0 ≤ x ≤ 1, t ≥ 0)

を満たす.

証明. 亀高 [4]の第 2章 §6,あるいは [11]の §3.4を見よ.

次に,(4.1)に対応する定常問題 w = w(x) (0 ≤ x ≤ 1)0 = kw′′ + ε(1 − w)w, w > 0 (0 < x < 1)w(0) = w(1) = 0.

(4.2)

を考える.この問題に対して,

• 自明解 w ≡ 0

• 非自明解: 自明でない解

と言う.

定理 4.2. (i) ε > kπ2 のとき,(4.2)には,非自明解 w(x) が唯一つ存在する.(ii) ε ≤ kπ2 のとき,(4.2)には,非自明解は存在しない.

証明. [K]の第 1章 §8,あるいは [11]の §3.2を見よ.

定理 4.3. u(x, t)を (4.1)の解とする.このとき,

(i) ε > kπ2 のとき, limt→∞

‖u(·, t) − w‖∞ = 0.ただし,w(x)は (4.2)の非自明解.(ii) ε ≤ kπ2 のとき, lim

t→∞‖u(·, t)‖∞ = 0.

45

Page 48: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

証明. [K]の第 1章 §8,あるいは [11]の §3.4を見よ.

(b) 差分解の安定性と収束

次のように記号を定める.

• 整数 N > 0を採って h =1

N + 1;

• τ > 0 を固定;

• 格子点の集合

Qτh = (xi, tn)| xi = ih, tn = nτ (0 ≤ i ≤ N + 1, n ≥ 0);

• uni ≈ u(xi, tn).

(4.1)に対する次の差分近似 (陽解法)を考える.un+1

i − uni

τ= k

uni−1 − 2un

i + uni+1

h2+ ε(1 − un

i )uni (1 ≤ i ≤ N, n ≥ 0)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = a(xi) (0 ≤ i ≤ N + 1)

(4.3)

いつものように λ = kτ/h2 とおき,さらに,次のように記号を定める:

• r =ε

kπ2;

• ρ = τ

(ε +

2k

h2

).

0

0.2

0.4

0.6

0.8

1 0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18 0.2

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

x

time 0 0.2 0.4 0.6 0.8 1 0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18 0.2 0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

図 4.1 k = 10, ε = 10, N = 50, λ = 0.4, 0 ≤ t ≤ 0.2; r = 0.0101, ρ = 0.8002

定理 4.4. 条件

1 − ετ − 2λ ≥ 0 ⇔ τ ≤(

ε +2k

h2

)−1

(4.4)

46

Page 49: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

0

0.2

0.4

0.6

0.8

1 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

x

time 0 0.2 0.4 0.6 0.8 1 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

図 4.2 k = 1, ε = 10, N = 50, λ = 0.4, 0 ≤ t ≤ 0.5; r = 1.0132, ρ = 0.8015

0

0.2

0.4

0.6

0.8

1 0 0.2

0.4 0.6

0.8 1

1.2 1.4

1.6

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

1

x

time 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

図 4.3 k = 0.1, ε = 10, N = 50, λ = 0.4, 0 ≤ t ≤ 1.6; r = 101.32, ρ = 0.8145

0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x

(a) k = 1; r = 1.0132,

ρ = 0.8015

0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1x

(b) k = 0.1; r = 101.32, ρ = 0.8154

図 4.4 ε = 10, N = 50, λ = 0.5

47

Page 50: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

0

0.2

0.4

0.6

0.8

1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

x

time 0 0.2 0.4 0.6 0.8 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

図 4.5 k = 10, ε = 10, N = 50, λ = 0.5, 0 ≤ t ≤ 0.2; r = 0.0101, ρ = 1.0002

0

0.2

0.4

0.6

0.8

1 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

x

time 0 0.2 0.4 0.6 0.8 1 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

図 4.6 k = 1, ε = 10, N = 50, λ = 0.5, 0 ≤ t ≤ 0.5; r = 1.0132, ρ = 0.8015

0

0.2

0.4

0.6

0.8

1 0 0.2

0.4 0.6

0.8 1

1.2 1.4

1.6

0

0.2

0.4

0.6

0.8

1

1.2

x

time 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 0

0.2

0.4

0.6

0.8

1

1.2

図 4.7 k = 0.1, ε = 10, N = 50, λ = 0.5, 0 ≤ t ≤ 1.6; r = 101.32, ρ = 1.0192

48

Page 51: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

の下で,(4.3)の解 uni は,

0 ≤ uni ≤ 1 (1 ≤ i ≤ N, n ≥ 0)

を満たす.

証明. 帰納法で示す.まず,0 ≤ a(x) ≤ 1より,

0 ≤ u0i ≤ 1 (1 ≤ i ≤ N).

次に,0 ≤ uni ≤ 1を仮定する.(4.3)を変形して,

un+1i = λ(un

i−1 + uni+1) + (1 − 2λ)un

i + ετuni (1 − un

i )

なので,un+1i ≥ 0.一方で,vn

i = 1− uni とおくと,帰納法の仮定より 0 ≤ vn

i ≤ 1であり,さらに,

vn+1i = λ(vn

i−1 + vni+1) + (1 − 2λ − ετun

i )︸ ︷︷ ︸≥1−2λ−ετ≥0

vni ≥ 0

を満たす.すなわち,un+1i ≤ 1.

定理 4.5. • T > 0を固定して,(4.4)を仮定• u(x, t): (4.1)の解,un

i : (4.3)の解• e(n) = [en

i ] ∈ RN,eni = u(xi, tn) − un

i

• QT = [0, 1] × [0, T ]

• ZT =12

max(x,t)∈QT

∣∣∣∣∂2u

∂t2(x, t)

∣∣∣∣+ k

12max

(x,t)∈QT

∣∣∣∣∂4u

∂x4(x, t)

∣∣∣∣このとき,次の誤差評価式が成立:

max0≤tn≤T

‖e(n)‖∞ ≤ eεT − 1ε

(τ + h2)ZT .

証明. Uni = u(xi, tn)とおく.そして,

Dτen+1i =

en+1i − en

i

τ, ∆hen

i =eni−1 − 2en

i + eni+1

h2

などと書くと,

Dτen+1i − k∆hen

i

= DτUn+1i − k∆hUn

i − [Dτun+1i − k∆hun

i ]

= DτUn+1i − k∆hUn

i − ε(1 − uni )un

i

= DτUn+1i − k∆hUn

i − [ut(xi, tn) − kuxx(xi, tn)]︸ ︷︷ ︸rn

i

+ ε(1 − Uni )Un

i − ε(1 − uni )un

i︸ ︷︷ ︸gn

i

.

49

Page 52: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

すなわち,Dτen+1

i = k∆heni + rn

i + gni (0 < i < N, n ≥ 0)

en0 = en

N+1 = 0 (n > 0)e0i = 0 (0 ≤ i ≤ N).

さらに,r(n) = [rni ],g(n) = [gn

i ]と定義すると,

e(n+1) = Kλe(n) + τr(n) + τg(n) (n ≥ 1), e(0) = 0.

(4.4)の下では,1 − 2λ > 0なので,

‖Kλ‖∞ ≤ 1, Kλ ≥ O.

次に,

|rni | ≤

∣∣DτUn+1i − ut(xi, tn)

∣∣+ k |∆hUni − uxx(xi, tn)|

≤ τ12

maxt∈[0,T ]

|utt(xi, t)| + h2 k

12max

x∈[0,1]|uxxxx(x, tn)|.

より,

‖r(n)‖∞ ≤ ZT (τ + h2).

さらに,

gni = ε(1 − Un

i )Uni − ε(1 − un

i )uni

= ε(1 − Uni )Un

i − (1 − Uni )un

i + (1 − Uni )un

i − ε(1 − uni )un

i

= ε(1 − Uni )(Un

i − uni ) − ε(Un

i − uni )un

i

= ε(1 − Uni )en

i − εeni un

i

= ε(1 − Uni − un

i )eni .

したがって,−1 ≤ 1 − Uni − un

i ≤ 1に注意して,

‖g(n)‖∞ ≤ ε‖e(n)‖∞.

以上を合わせて,

‖e(n)‖∞≤ (1 + τε)‖e(n−1)‖∞ + τ(τ + h2)ZT

≤ (1 + τε)2‖e(n−2)‖∞ + [(1 + τε) + 1]τ(τ + h2)ZT

≤ · · ·≤ (1 + τε)n‖e(0)‖∞ + [(1 + τε)n−1 + · · · + (1 + τε) + 1]τ(τ + h2)ZT

≤ (1 + τε)n − 1τε

· τ(τ + h2)ZT

≤ enτε − 1ε

· (τ + h2)MT ≤ eεT − 1ε

(τ + h2)ZT .

50

Page 53: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(c) パターンの形成

ある自己触媒反応を記述する数理モデルとしてグレイ–スコットモデル (の空間変数 1 次元版)

ut = kuuxx + u2v − (β + γ)u (0 < x < L, t > 0)vt = kvvxx − u2v + β(1 − v) (0 < x < L, t > 0)ux(0, t) = ux(L, t) = vx(0, t) = vx(L, t) = 0 (t > 0)u(x, 0) = u0(x), v(x, 0) = v0(x) (0 ≤ x ≤ L)

(4.5)

が知られてる.Lは正定数である.u = u(x, t),v = v(x, t)はある 2つの化学物質の濃度を表わし,正定数 ku,kv はそれぞれの拡散率を表す.正定数 β, γ は反応における原料化学物質の供給や中間生成物質の除去の割合を表現している.詳しい説明は,[7]を参照されたい.

(4.5)についての陽的差分スキームは,次のようになる.

un+1i − un

i

τ= ku

uni+1 − 2un

i + uni−1

h2+ (un

i )2vni − (β + γ)un

i ,

vn+1i − vn

i

τ= kv

vni+1 − 2vn

i + vni−1

h2− (un

i )2vni + β(1 − vn

i )

(1 ≤ i ≤ N, n ≥ 0),

un+10 = un+1

1 , un+1N = un+1

N+1, vn+10 = vn+1

1 , vn+1N = vn+1

N+1 (n ≥ 0),

u0i = u0(xi), v0

i = u0(xi) (1 ≤ i ≤ N).

(4.6)

ただし,

• h = L/N (N ∈ N), τ > 0,

• Qτh =

(xi, tn)| xi =

(i − 1

2

)h, tn = nτ (0 ≤ i ≤ N + 1, n ≥ 0)

• un

i ≈ u(xi, tn), vni ≈ v(xi, tn)

としている.図 4.8にグレイ–スコットモデルの数値計算例を示す.横軸が時間 0 ≤ t ≤ 1000, 縦軸が

場所 0 ≤ x ≤ L = 0.5を表す.初期時刻に 1つであった解の峰が時間の経過とともに 2つ 4

つと増えていく様子が一目瞭然である.実際,グレイ–スコットモデルは自己複製過程を表現する数理モデルとして,いろいろな立場から研究がなされている.また,歴史的にも,まずはコンピュータによる数値解法で,このような解の挙動が確認され,その後に数学的な説明が与えられるという順番で方程式そして現象の研究がなされてきた.その数学的な解析を理解することは,大学数学の範囲を超えているが,数値解法によって解の様子を観察することは,微分とコンピュータに関するほんの少しの知識があれば,大学 1,2年生でも可能でである.

51

Page 54: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

0 0.1

0.2 0.3

0.4 0.5

0.6 0.7

0.8 0.9

1 0 50

100 150

200 250

300 350

400 450

500 0

0.1

0.2

0.3

0.4

0.5

xtime

(a) (β, γ) = (0.1504, 0.1400)

0 0.1

0.2 0.3

0.4 0.5

0.6 0.7

0.8 0.9

1 0 50

100 150

200 250

300 350

400 450

500 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7

xtime

(c) (β, γ) = (0.1504, 0.0308)

0 0.1

0.2 0.3

0.4 0.5

0.6 0.7

0.8 0.9

1 0 50

100 150

200 250

300 350

400 450

500 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8

xtime

(e) (β, γ) = (0.0192, 0.0448)

0 0.1

0.2 0.3

0.4 0.5

0.6 0.7

0.8 0.9

1 0 50

100 150

200 250

300 350

400 450

500 0

0.1 0.2 0.3 0.4 0.5 0.6

xtime

(b) (β, γ) = (0.1504, 0.0392)

0 0.1

0.2 0.3

0.4 0.5

0.6 0.7

0.8 0.9

1 0 50

100 150

200 250

300 350

400 450

500 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

xtime

(d) (β, γ) = (0.1504, 0.0056)

0 0.1

0.2 0.3

0.4 0.5

0.6 0.7

0.8 0.9

1 0 50

100 150

200 250

300 350

400 450

500 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8

xtime

(f) (β, γ) = (0.0096, 0.0308)

図 4.8 (4.6)の解 uni . ku = 10−5, kv = 2ku, N = 128, λ = 1/6, L = 0.5, T = 500.

52

Page 55: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

5 空間 2次元の熱方程式(a) 陽的スキーム

長方形領域 Ω = (a1, a2)× (b1, b2)上で,未知関数 u = u(x, y, t)を求める熱方程式の初期値問題

ut = k(uxx + uyy) + f(x, y, t) ((x, y) ∈ Ω, 0 < t < T )u(x, y, t) = 0 ((x, y) ∈ ∂Ω, t > 0)u(x, y, 0) = a(x, y) ((x, y) ∈ Ω)

(5.1)

を考える.ここで,

• k > 0 定数;

• f ∈ C(Ω × [0, T ]);

• a ∈ C(Ω), a(x, y) = 0 ((x, y) ∈ ∂Ω)

を仮定している.この問題を差分法で解くために,

Nx, Ny,m ∈ N, N = NxNy;

xi = a1 + ihx, yj = b1 + jhy, hx =a2 − a1

Nx + 1, hy =

b2 − b1

Ny + 1;

tn = nτ, τ =T

m;

Λ = (i, j) | 1 ≤ i ≤ Nx, 1 ≤ j ≤ Ny;

∂Λ = (0, j), (Nx + 1, j), (i, 0), (i, Ny + 1) | 1 ≤ i ≤ Nx, 1 ≤ j ≤ Ny;

uni,j ≈ u(xi, yj , tn) ((i, j) ∈ Λ = Λ ∪ ∂Λ, 0 ≤ n ≤ m);

Dτun+1i,j =

un+1i,j − un

i,j

τ;

∆xuni,j =

uni−1,j − 2un

i,j + uni+1,j

h2x

, ∆yuni,j =

uni,j−1 − 2un

i,j + uni,j+1

h2y

と記号を定める.このとき,(5.1)への陽的スキームは,

Dτun+1i,j = k∆xun

i,j + k∆yuni,j + f(xi, yj , tn)

((i, j) ∈ Λ, 0 ≤ n ≤ m − 1),

uni,j = 0 ((i, j) ∈ ∂Λ, 1 ≤ n ≤ m), u0

i,j = a(xi, yj) ((i, j) ∈ Λ)

(5.2)

53

Page 56: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

となる.1変数のときと同様に,

λx = kτ

h2x

, λy = kτ

h2y

(5.3)

と置くと,(5.2)は,次のように書き換えられる:

• u0i,j = a(xi, yj) ((i, j) ∈ Λ)で初期値を定める.

• n = 0, 1, . . . ,m − 1に対して,次を計算:

un+1i,j = 0 ((i, j) ∈ ∂Λ), (5.4)

un+1i,j = (1 − 2λx − 2λy)un

i,j + λx(uni−1,j + ui+1,j)

+ λy(uni,j−1 + ui,j+1) + τf(xi, yj , tn) ((i, j) ∈ Λ). (5.5)

このスキームの安定性を述べるために,次のように記号を定める:

u(n)j =

un1,j...

unNx,j

, aj =

a1,j

...aNx,j

∈ RNx (1 ≤ j ≤ Ny), (5.6)

f(n)j =

f(x1, yj , tn)...

f(xNx , yj , tn)

∈ RNx (1 ≤ j ≤ Ny), (5.7)

u(n) =

u

(n)1...

u(n)Ny

, a =

a1

...aNy

,f (n) =

f

(n)1...

f(n)Ny

∈ RN . (5.8)

定義 5.1 (`∞ ノルム). ‖u‖∞ = max(i,j)∈Λ

|ui,j |, (u ∈ RN ).

定理 5.1. 条件 1 − 2λx − 2λy ≥ 0の下で,(5.2)の解 u(n) は

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞ + τn−1∑l=0

‖f (l)‖∞;

(非負値性保存) a ≥ 0,f (l) ≥ 0 ⇒ u(n) ≥ 0

を満たす.

証明. (5.5)より直ちにわかる.

(b) ADIスキーム

前節と全く同じ記号を用いる.(5.1)への陰的スキームを考えることもできるが,そうすると,現れる係数行列のサイズは N = NxNy であり,一般にとても大きくなってしまう.

54

Page 57: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

中間的な未知数

un+ 1

2i,j ≈ u(xi, yj , tn+ 1

2), tn+ 1

2=(

n +12

を導入して,次のようなスキームを考える:

D τ2u

n+ 12

i,j = k∆xun+ 1

2i,j + k∆yun

i,j + f(xi, yj , tn),

D τ2un+1

i,j = k∆xun+ 1

2i,j + k∆yun+1

i,j + f(xi, yj , tn+1),

((i, j) ∈ Λ, 0 ≤ n ≤ m − 1),

un+1i,j = u

n+ 12

i,j = 0 ((i, j) ∈ ∂Λ, 0 ≤ n ≤ m − 1),

u0i,j = a(xi, yj) ((i, j) ∈ Λ)

(5.9)

このスキームでは,uxx + uyy を近似する際に,uxx と uyy を交互に陰的にしており,交互方向陰的 (alternating direction implicit, ADI)スキームと呼ばれる.このスキームを計算しやすいよう書き換える,そのために,(5.6)–(5.8)に加えて,さらに

次のように記号を定める.

µx = kτ

2h2x

, µy = kτ

2h2y

, (5.10)

v(n)i =

uni,1...

uni,Ny

, g(n)i =

f(xi, y1, tn)...

f(xi, yNy , tn)

∈ RNy (1 ≤ i ≤ Nx), (5.11)

p(n)j =

(1 − 2µy)un

1,j + µy(un1,j−1 + un

1,j+1)

...

(1 − 2µy)unNx,j + µy(un

Nx,j−1 + unNx,j+1)

∈ RNx , (5.12)

q(n+ 1

2 )j =

(1 − 2µx)un+ 1

2i,1 + µx(un+ 1

2i−1,1 + u

n+ 12

i+1,1)

...

(1 − 2µx)un+ 12

i,Ny+ µx(un+ 1

2i−1,Ny

+ un+ 1

2i+1,Ny

)

∈ RNy . (5.13)

そうすると,(5.9)は次のように表現できる:(Ix + µxAx)u(n+ 1

2 )j = p

(n)j + τ

2f(n)j (1 ≤ j ≤ Ny),

(Iy + µyAy)v(n+1)i = q

(n+ 12 )

i + τ2g

(n+1)i (1 ≤ i ≤ Nx),

u(0) = a.

(5.9)

ここで,Ix ∈ RNx×Nx , Iy ∈ RNy×Ny は単位行列,Ax ∈ RNx×Nx , Ay ∈ RNy×Ny は (2.8)

の形の三重対角行列である.すなわち,tn から tn+1 に進む際に,Nx 次の連立一次方程式

55

Page 58: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

を Ny 回,Ny 次の連立一次方程式を Nx 回解くことになる.これらの連立一次方程式の係数行列は三重対角なので,§2(f)で説明した方法が便利である.

ADIスキームの詳しい解析は次節にまわして,ここで,ADIスキームに対して一つの解釈を与えよう.以下の議論は,形式的である.

L1 = −k∂2/∂x2,L2 = −k∂2/∂y2 と置くと,考えている熱方程式は,ut = −(L1u +

L2u) + f と書ける.そして,方程式を時間変数についてのみ離散化することを考える;

t = nτ (n = 0, 1, . . .),τ > 0と定義して,Un = u(x, y, tn)と書くことにする.そうして,まず,Crank-Nicolsonスキーム

Un+1 − Un

τ= (−L1 − L2)

12(Un + Un+1) +

12(fn + fn+1) + O(τ2)

を考える.これを変形して,(I +

τ

2L1 +

τ

2L2

)Un+1 =

(I − τ

2L1 −

τ

2L2

)Un +

τ

2(fn + fn+1) + O(τ3)

を得る.これは,やや天下り的であるが,(I +

τ

2L1 +

τ

2L2+

τ2

4L1L2

)Un+1

=(

I − τ

2L1 −

τ

2L2+

τ2

4L1L2

)Un +

τ

2

[(I−τ

2L1

)fn +

(I+

τ

2L1

)fn+1

]+

τ2

4L1(fn − fn+1)︸ ︷︷ ︸

=I1

+τ2

4L1L2(Un+1 − Un)︸ ︷︷ ︸

=I2

+O(τ3)

と書ける.ここで,f(x, y, t)や u(x, y, t)が十分滑らかなら,|I1|, |I2| = O(τ3)と考えられるので,この式は,さらに,因数分解により,(

I +τ

2L1

)(I +

τ

2L2

)Un+1

=(I − τ

2L1

)(I − τ

2L2

)Un +

τ

2

[(I − τ

2L1

)fn +

(I +

τ

2L1

)fn+1

]+ O(τ3)

となる.以下,un は u(x, y, tn)の近似値を表すものとし,これを,(

I +τ

2L1

)(I +

τ

2L2

)un+1

=(I − τ

2L1

)(I − τ

2L2

)un +

τ

2

[(I − τ

2L1

)fn +

(I +

τ

2L1

)fn+1

]

56

Page 59: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

で求める.さらに変形して,

un+1 =(I +

τ

2L2

)−1 (I +

τ

2L1

)−1 (I − τ

2L1

)(I − τ

2L2

)un

2

[(I +

τ

2L2

)−1 (I +

τ

2L1

)−1 (I − τ

2L1

)fn +

(I +

τ

2L2

)−1

fn+1

]=(I +

τ

2L2

)−1 (I − τ

2L1

)(I +

τ

2L1

)−1 (I − τ

2L2

)un

2

[(I +

τ

2L2

)−1 (I − τ

2L1

)(I +

τ

2L1

)−1

fn +(I +

τ

2L2

)−1

fn+1

]=(I +

τ

2L2

)−1 (I − τ

2L1

)[(I +

τ

2L1

)−1 (I − τ

2L2

)un +

τ

2

(I +

τ

2L1

)−1

fn

]︸ ︷︷ ︸

=un+ 12

2

(I +

τ

2L2

)−1

fn+1.

上で示したように,中間的な変数 un+ 12 を導入すると,

un+ 12 =

(I +

τ

2L1

)−1 (I − τ

2L2

)un +

τ

2

(I +

τ

2L1

)−1

fn,

un+1 =(I +

τ

2L2

)−1 (I − τ

2L1

)un+ 1

2 +τ

2

(I +

τ

2L2

)−1

fn+1.

すなわち,(I +

τ

2L1

)un+ 1

2 =(I − τ

2L2

)un +

τ

2fn,(

I +τ

2L2

)un+1 =

(I − τ

2L1

)un+ 1

2 +τ

2fn+1.

さらに,書き換えて,

un+ 12 − un

(τ/2)= −L1u

n+ 12 − L2u

n + fn,

un+1 − un+ 12

(τ/2)= −L1u

n+ 12 − L2u

n+1 + fn+1

を得る.これを,空間変数を 2階中心差分で離散化したものが (5.9)に他ならない.スキームの構成によりmax

n‖e(n)‖∞ = O(τ2 + h2

x + h2y)が予想される.ただし,e(n) = (en

i ) ∈ RN,eni,j = u(xi, yj , tn) − un

i,j.実際,u(x, y, t)の微分可能性に対する若干の仮定の下で,これが正しいことが数学的に証明できる.それを次節で説明する.

この節の最後に,ADIスキームによる計算例を示す.計算条件は次の通りである.

k = 1,

a(x, y) = | sin(2πx) sin(3πy)|, f(x, y, t) = | sin(2πx) sin(3πy)|e3xe3y/2e5t,

Nx = Ny = 31, µx = µy = 0.5.

57

Page 60: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

0 0.2

0.4 0.6

0.8 1 0

0.2

0.4

0.6

0.8

1

0

0.2

0.4

0.6

0.8

1

1.2

u

t = 0.000000

x

y

u

0

0.2

0.4

0.6

0.8

1

(a) t0 = 0.0

0 0.2

0.4 0.6

0.8 1 0

0.2

0.4

0.6

0.8

1

0

0.2

0.4

0.6

0.8

1

1.2

u

t = 0.015625

x

y

u

0

0.1

0.2

0.3

0.4

0.5

0.6

(c) tn

0 0.2

0.4 0.6

0.8 1 0

0.2

0.4

0.6

0.8

1

0

0.2

0.4

0.6

0.8

1

1.2

u

t = 0.121094

x

y

u

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8

(e) tn =

0 0.2

0.4 0.6

0.8 1 0

0.2

0.4

0.6

0.8

1

0

0.2

0.4

0.6

0.8

1

1.2

u

t = 0.003906

x

y

u

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8

(b) tn =

0 0.2

0.4 0.6

0.8 1 0

0.2

0.4

0.6

0.8

1

0

0.2

0.4

0.6

0.8

1

1.2

u

t = 0.062500

x

y

u

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

(d) tn =

0 0.2

0.4 0.6

0.8 1 0

0.2

0.4

0.6

0.8

1

0

0.2

0.4

0.6

0.8

1

1.2

u

t = 0.199219

x

y

u

0

0.2

0.4

0.6

0.8

1

1.2

(f) tn =

図 5.1 ADIスキームによる (5.1)の数値解

(c) ADIスキームの解析

この節では,前節で導入した,ADI スキーム (5.9) の解析的な性質を詳しく調べる.そのために,Kronecker 積と呼ばれる表記法を導入する.これは,P = (pij) ∈ Rm×n と

58

Page 61: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

Q ∈ Rk×` に対して,P ⊗ Q ∈ R(ml)×(n`) を,

P ⊗ Q =

p11Q p12Q · · · p1nQp21Q p22Q

. . .pm1Q pm2Q · · · pmnQ

と定義するものである.(登場する量に意味がある限り)次の関係式が成り立つ:

(P ⊗ Q)T = PT ⊗ QT, (5.14)

(P1 ⊗ Q1)(P2 ⊗ Q2) = (P1P2) ⊗ (Q1Q2), (5.15)

(P ⊗ Q)−1 = P−1 ⊗ Q−1, (5.16)

λi : P の固有値, λ′j : Qの固有値 ⇒ λiλ

′j : P ⊗ Qの固有値. (5.17)

そうすると,(5.9)は,

[Iy ⊗ (Ix + µxAx)]︸ ︷︷ ︸Hx

u(n+ 12 ) = [(Iy − µyAy) ⊗ Ix]︸ ︷︷ ︸

Ky

u(n) + τ2f (n),

[(Iy + µyAy) ⊗ Ix]︸ ︷︷ ︸Hy

u(n+1) = [Iy ⊗ (Ix − µxAx)]︸ ︷︷ ︸Kx

u(n+ 12 ) + τ

2f (n+1),

u(0) = a

(5.18)

と書ける.

補題 5.1. 任意の µx, µy > 0 に対して,Hx,Hy ∈ RN×N は正則であり,‖H−1x ‖∞ ≤ 1,

‖H−1x ‖∞ ≤ 1,H−1

x > O,および,H−1y > O を満たす.

証明. 補題 2.3の証明と全く同じなので,明らかであるが,念のために証明を記す.まず,

Hx = (1 + 2µx)(

I − µx

1 + 2µxBx

)の形に分解する.ただし,I ∈ RN×N は単位行列,Bx ∈ RN×N は隣接対角成分 (=

(Bx)i,i±1) のみが 1 で,残りの成分がすべて 0 であるような行列である.このとき,補題2.1より,‖Bx‖∞ = 2なので,Gx = µx

1+2µxBx と定義すると,‖Gx‖∞ = 2µx

1+2µx< 1とな

る.したがって,補題 2.2より,I − Gx は正則であり,

‖(I − Gx)−1‖∞ ≤ 11 − ‖Gx‖∞

= 1 + 2µx, (I − Gx)−1 =∞∑

l=0

Glx ≥ O

となる.(I −Gx)−1 に零成分が含まれないことは,補題 2.3の証明と全く同じように確かめられる.以上を合わせて,Hx は正則であり,その逆行列は,H−1

x = 11+2µx

(I −Gx)−1 > O

で与えられる.また,‖H−1x ‖∞ ≤ 1

1+2µx(1 + 2µx) = 1を満たす.次に,Hy も,

Hy = (1 + 2µy)(

I − µy

1 + 2µyBy

)59

Page 62: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

の形に分解する.このとき,By ∈ RN×N は,各行について,非零成分 1が最大で 2個あるような行列となっている (2個ある行が必ず存在し,それは非対角成分).したがって,上と同じ議論が辿れて,Hy についても結論を得ることになる.

定理 5.2 (ADI法の `∞ 条件安定性). 条件

µx ≤ 12, µy ≤ 1

2(5.19)

の下で,(5.9)の解 u(n) は

(`∞ 安定性) ‖u(n)‖∞ ≤ ‖a‖∞ + τn−1∑l=1

‖f (l)‖∞ +τ

2(‖f (n)‖∞ + ‖f (0)‖∞)

を満たす.また,f (l) ≥ 0 (0 ≤ l ≤ n)ならば,

(非負値性保存) a ≥ 0 ⇒ u(n) ≥ 0;

(正値性保存) µy < 1/2, a ≥ 0, 6= 0 ⇒ u(n) > 0 (n ≥ 1)

を満たす.

証明. (5.18)は,u(n+1) = H−1

y KxH−1x Kyu(n)

+ τ2H−1

y KxH−1x f (n) + τ

2H−1y f (n+1) (n ≥ 0)

u(0) = a

(5.20)

と書ける.条件 (5.19)の下で,Kx, Ky ≥ O,かつ,‖Kx‖∞ = ‖Ky‖∞ = 1が成り立つので,補題 5.1と合わせて,

‖u(n+1)‖∞ ≤ ‖u(n)‖∞ +τ

2(‖f (n)‖∞ + ‖f (n+1)‖∞).

これより,`∞ 安定性を得る.また,非負値性の保存は明らか.一方で,µy 6= 1/2ならば,Kya ≥ 0なので,正値性保存を得る.

定理 5.3 (ADI法の無条件 `2 安定性). (5.9)の解 u(n) は

(`2 安定性) ‖u(n)‖2 ≤ ‖a‖2 + τ

n−1∑l=1

‖f (l)‖2 +τ

2(‖f (n)‖2 + ‖f (0)‖2)

を満たす.

証明. 次を示せば良い:

(i) ‖H−1y KxH−1

x Ky‖2 < 1;

60

Page 63: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(ii) ‖KxH−1x ‖2 < 1;

(iii) ‖H−1y ‖2 < 1.

実際,(5.20)において,これらを用いれば,

‖u(n+1)‖2 = ‖H−1y KxH−1

x Ky‖2 · ‖u(n)‖2

2‖H−1

y ‖2‖KxH−1x ‖2‖f (n)‖2 +

τ

2‖H−1

y ‖2‖f (n+1)‖2

≤ ‖u(n)‖2 +τ

2‖f (n)‖2 +

τ

2‖f (n+1)‖2.

これより,`2 安定性がで出る.(i)の証明. (5.14)と (5.18)より,(Ax と Ay は対称なので) Hx,Hy,H−1

x ,H−1y ,Kx,

Ky はすべて対称である.したがって,補題 3.3により,

‖F‖2 = maxi

|ζi|, ζi : F = H−1y KxH−1

x Ky の固有値

が成り立つ.ゆえに,F の任意の固有値 ζ が,|ζ| < 1 を満たすことを示せば良い.まず,(5.15)と (5.16)を用いて,

F = [(Iy + µyAy) ⊗ Ix]−1[Iy ⊗ (Ix − µxAx)] ·· [Iy ⊗ (Ix + µxAx)]−1[(Iy − µyAy) ⊗ Ix]

= [(Iy + µyAy)−1 ⊗ Ix][Iy ⊗ (Ix − µxAx)] ·· [Iy ⊗ (Ix + µxAx)−1][(Iy − µyAy) ⊗ Ix]

= [(Iy + µyAy)−1 ⊗ (Ix − µxAx)][(Iy − µyAy) ⊗ (Ix + µxAx)−1]

= (Iy + µyAy)−1(Iy − µyAy)︸ ︷︷ ︸Fy

⊗ (Ix − µxAx)(Ix + µxAx)−1︸ ︷︷ ︸Fx

と変形して,ϕ(s) =1 − µys

1 + µys(s ∈ R)おく.補題 3.4の証明で述べたように,λを Ay の固

有値とすると,κ = ϕ(λ)は Fy の固有値となる.ところが,Ay の固有値がすべて正であることと,任意の s ≥ 0に対して |ϕ(s)| < 1であることにより,|κ| < 1.同様に,Fx の任意の固有値 κも,|κ′| < 1を満たすことがわかる.(5.17)より,F の任意の固有値は κκ′ の形をしているので,これは,|κκ′| < 1を満たす.(ii)の証明. KxH−1

x の任意の固有値 ζ が,|ζ| < 1を満たすことを示す.ところが,

KxH−1x = [Iy ⊗ (Ix − µxAx)][Iy ⊗ (Ix + µxAx)]−1

= [Iy ⊗ (Ix − µxAx)][Iy ⊗ (Ix + µxAx)−1]

= Iy ⊗ [(Ix − µxAx)(Ix + µxAx)−1] = Iy ⊗ Fx.

すなわち,“Fx の固有値 = KxH−1x の任意の固有値”なので,(i)の結果が使える.

(iii)の証明. 同様に考える.

H−1y = [(Iy + µyAy) ⊗ Ix]−1 = (Iy + µyAy)−1 ⊗ Ix

61

Page 64: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

なので,関数 ϕ(s) = (1 + µys)−1 (s ∈ R) を考えることになる.|ϕ(s)| < 1 (s ≥ 0) なので,H−1

y の任意の固有値 ζ は,|ζ| < 1を満たす.

最後に,(5.1)の解 u(x, y, t)と ADIスキーム (5.9)の解 u(n) の誤差

eni,j = u(xi, yj , tn) − un

i,j ,

e(n)j = (en

i,j) ∈ RNx (1 ≤ j ≤ Ny), e(n) = (e(n)j ) ∈ RN

の挙動を調べる.‖ · ‖∞ と共に,

‖u‖h =

∑(i,j)∈Λ

|ui,j |2hxhy

1/2

(u ∈ RN )

も考える.

定理 5.4 (ADI法の誤差評価). T > 0を任意に固定する.(5.1)の解 u(x, y, t)について,(∂

∂x

)α(∂

∂y

)β (∂

∂t

u ∈ C(Ω × [0, T ]) (0 ≤ α, β ≤ 4, 0 ≤ γ ≤ 3) (5.21)

を仮定する.さらに,hx, hy, τ ≤ 1を仮定する.このとき,条件 (5.19)の下で,

max0≤tn≤T

‖e(n)‖∞ ≤ CT (h2x + h2

y + τ2) (5.22)

が成り立つ.ここで,CT は,u(の偏導関数),T,k に依存して定まる正定数.また,同じCT を用いて,hx,hy,τ に対して無条件で,

max0≤tn≤T

‖e(n)‖h ≤ CT (h2x + h2

y + τ2) (5.23)

が成り立つ.

(証明はいずれ書きます.ヒントは,前節の後半に書いた形式的な議論です.)

62

Page 65: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

A 数値計算の実行 (基礎編)

(a) 準備

§2で考察した差分スキームを実際に実行するには,計算の環境を整えなければならない.10 年前であれば,“おすすめの環境” を提示することができたが,しかし,現状は混沌であり,何をすすめて良いかのか,よくわからない.したがって,以下で述べるのは,あくまで一例であり,最良・最適なものを示しているわけではないので注意して欲しい.なお,Windows系 (7, Vista, XP, ...)での作業を前提にするが,これは,Windowsユーザ以外は,この説明を読んで,自分の環境に「変換」できるであろう,との理由による.まず,コンピュータ上で数値計算を行うには,

コンパイラ. プログラミング言語で書かれたプログラムを,コンピュータが直接実行可能な機械語のプログラムに変換するソフトウェア.

テキストエディタ. プログラムの編集をする際に必要なソフトウエア.可視化ツール. 数値的なデータをグラフなどで表示するソフトウエア.

などが必要である.すでにこの段階で 2つの立場がある:

(a) これらをひとつの対話型操作環境から利用できるようにした統合開発環境 (IDE)を使う.多くは市販のソフトウエアとして提供されているが,フリーソフトウエアもある.

(b) これらを個別にインストールする.フリーソフトウエアも市販のソフトウエアも数多く利用できる.

この講義では,初心者は,作業の流れを理解しておいた方が,後の応用の幅が広がるであろうとの判断により,(b)の立場を取る.ということで,各自で下記のソフトウエアをインストールして使えるようにすること.

テキストエディタ. 例えば次のようなものがある.• 秀丸*2(シェア)

http://somewhere.com/∼someone/something.html (秀まるお)

• Meadow (フリー)

http://www.meadowy.org/meadow/ (The Meadow Project)

• xyxxy(フリー)

http://www.vector.co.jp/soft/win95/writing/se102920.html

*2 秀丸を使うときには,必ず使用料金を払いましょう.

63

Page 66: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

コンパイラ. この文章では,プログラミング言語は C 言語,コンパイラは gcc を利用する.Cygwin(フリー)http://cygwin.com/での作業を前提とする.• http://cygwin.com/ (Cygwin公式)

• インストールとサンプルプログラムの実行に際しては,http://home.mims.meiji.ac.jp/∼wiki/index.php

(Unofficial Wiki of Meiji GCOE)

の中の「Cygwin でシミュレーションの前半」が最も参考になる.可視化ツール gnuplot*3(フリー) を使う.公式ページは,http://gnuplot.info/ だが,

いくらでも有益なページが見つかるので,自分で探して欲しい.

すべて個人でインストールできるものばかりなので,一度は自分で環境を整えてみること.仮に,上では,使えそうなウェブページの URLを示したが,現在は,世の中の移り変わりが激しすぎるため,いつまでリンクが辿れるか,なんの保証もできない.むしろ,自分で必要な情報を辿れるようにした方が,有益であろう.そこで,必要に迫られたら,その時点で,検索エンジン (Googleや Yahoo!など)を用いて情報を探すことをお勧めする.例えば,言葉の意味が知りたいときには, テキストエディタ wikipedia Meadow

など検索語を指定する.あるいは,はじめから,Wikipadia(http://ja.wikipedia.org/

wiki/)で調べる.また,インストール方法や使い方が知りたいときには, gnuplot インストール Windows Cygwin 使い方

などと検索語を指定して,調べるのが良いであろう.それでも,次の 2つのページは,数値計算を行うという点で,(特に困ったときに)役に立

つし,今後も適度に情報が更新されて行くと思われるので,紹介しておく.

• 桂田祐史先生 (明治大学)による「桂田研 Know How ページ」http://www.math.meiji.ac.jp/∼mk/labo/howto/

• 明治大学 GCOE プログラム「現象数理学の形成と発展」の研究メンバーによるUnofficial Wiki of Meiji GCOE

*3 ニュープロットと呼ぶのが正式だそうです.

64

Page 67: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

http://home.mims.meiji.ac.jp/∼wiki/index.php

注意 A.1. プログラミング言語や数値計算一般について,ここで詳しく解説する余裕はない.[5],[8],[9],[10]などを参考にすること.

なお,以下で示すサンプルプログラムは,すべて

http://www.infsup.jp/saito/sample/

からダウンロードできる.例えば,heat11.cをダウンロードしたいときには,

http://www.infsup.jp/saito/sample/heat11.c

にアクセスすれば良い.

(b) 陽的スキーム

まずは,熱方程式の初期値境界値問題ut = kuxx (0 < x < 1, 0 < t < T )u(0, t) = u(1, t) = 0 (0 ≤ t ≤ T )u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.5)

に対する陽解法un+1

i − uni

τ= k

uni−1 − 2un

i + uni+1

h2(1 ≤ i ≤ N, 0 ≤ n < m)

un0 = un

N+1 = 0 (0 ≤ n ≤ m)u0

i = a(xi) (0 ≤ i ≤ N + 1)

(2.5)

からはじめよう.T > 0は正定数で,m = [T/τ ]としている.その他の記号は §2(b)と全く同じである.計算の手順としては,§2(b)で述べた通り,

• N , h, τ , λ, T , m の値を定義.u0i = a(xi) (i = 0, · · · , N + 1)とする.

• n = 0, 1, . . . ,m − 1 に対して,un+10 = un+1

N+1 = 0 かつ

un+1i = (1 − 2λ)un

i + λ(uni−1 + un

i+1) (1 ≤ i ≤ N)

で uni を求める

とする.ソースコード 1(heat11.c)にプログラムの例を示す*4.ただし,初期値は a(x) =

sin(πx)とし (したがって,u(x, t) = e−π2t sin(πx)が厳密解),次のように定数・変数・配列を定義している.

*4 使っているシステムによっては,円マーク “Y=”のキーを押してもバックスラッシュ “\”が表示されるが,意味は同じである.その場合は,以下のサンプルプログラムで,“Y=”を “\”に読み替えて欲しい.

65

Page 68: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

グローバル (mainの外に)に定義する定数一覧定数名 定義 備考

DIM 500 確保する配列のサイズ (DIM ≥ N + 2とする)

PI 3.141· · · π の値

変数一覧変数名 定義 型 変数名 定義 型

N N int h h = 1/(N + 1) double

tau τ double Tmax T double

m m = [T/τ ] int lam λ = τ/h2 double

配列一覧配列名 定義 型 確保する iの範囲 実際に使用する iの範囲

X[i] xi double 0, 1, ..., DIM-1 0, 1, ..., N+1

u[i] u(xi, tn) double 0, 1, ..., DIM-1 0, 1, ..., N+1

u_new[i] u(xi, tn+1) double 0, 1, ..., DIM-1 0, 1, ..., N+1

関数一覧関数名 定義 型 引数

u0(x) a(x) double double x

ソースコード 1 熱方程式の陽的スキーム heat11.c

/∗ program heat11.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<math.h>#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/double u0(double);

/∗ initial value ∗/double u0(double x)

return sin(PI∗x);

/∗ main ∗/int main(void)

int i, j, n, N, m;double tau, lam, h, Tmax, t, k;double u[DIM], u new[DIM], X[DIM];

66

Page 69: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ parameters ∗/k = 1.0;N = 15;h = 1.0/(N + 1);lam = 0.4;tau = lam∗h∗h/k;Tmax = 0.5;m = (int)(Tmax/tau);

/∗ initialization ∗/for(i = 0; i <= N+1; i++)

X[i] = i∗h;u[i] = u0(X[i]);

/∗ results ∗/printf("# heat11.c N:%d h:%lf tau:%lf lam:%lf Tmax:%lfY=n", N,h,tau,lam,Tmax);t = 0.0;for(i = 0; i <= N+1; i++)

printf("%lf %lf %lfY=n", X[i], t, u[i]);printf("Y=nY=n");

/∗ iteration ∗/for(n = 1; n <= m; n++)

/∗ current time ∗/t = n∗tau;

/∗ u new = u(x, (n+1)∗tau) u = u(x, n∗tau) ∗/u new[0] = 0.0;for(i = 1; i <= N; i++)

u new[i] = (1.0 − 2.0∗lam)∗u[i] + lam∗(u[i−1] + u[i+1]);u new[N+1] = 0.0;

/∗ renewal ∗/for(i = 0; i <= N+1; i++)

u[i] = u new[i];

/∗ results ∗/for(i = 0; i <= N+1; i++)

printf("%lf %lf %lfY=n", X[i], t, u[i]);printf("Y=nY=n");

/∗ end of program ∗/return 1;

67

Page 70: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

念のためコンパイルと実行の仕方を示す.

$ gcc heat11.c -o heat11

$ ./heat11.exe > dat11

そうすると実行結果は,dat11という名前のファイルに保存される.dat11

# heat11.c N:15 h:0.062500 tau:0.001563 lam:0.400000 Tmax:0.500000

0.000000 0.000000 0.000000

0.062500 0.000000 0.195090

0.125000 0.000000 0.382683

0.187500 0.000000 0.555570

0.250000 0.000000 0.707107

0.312500 0.000000 0.831470

0.375000 0.000000 0.923880

0.437500 0.000000 0.980785

0.500000 0.000000 1.000000

0.562500 0.000000 0.980785

0.625000 0.000000 0.923880

0.687500 0.000000 0.831470

0.750000 0.000000 0.707107

0.812500 0.000000 0.555570

0.875000 0.000000 0.382683

0.937500 0.000000 0.195090

1.000000 0.000000 0.000000

0.000000 0.001563 0.000000

(略)

1.000000 0.001563 0.000000

(略)

この dat11には,

dat11

68

Page 71: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

x0 t0 u00

x1 t0 u01

· · · · · · · · ·xN+1 t0 u0

N+1

(空白 2行)

x0 t1 u10

· · · · · · · · ·xN+1 t1 u1

N+1

(空白 2行)

· · · · · · · · ·· · · · · · · · ·(空白 2行)

x0 tm um0

· · · · · · · · ·xN+1 tm um

N+1

のようにデータが並んでいる.これを,gnuplotで

gnuplot gnuplot> splot "dat11" with lines

とすれば,関数 u = u(x, t)の鳥瞰図が得られる (図 A.1(a)).ただし,このようにすると t

方向に線が詰まり過ぎて,見難い.これは,すべての t = nτ (n = 0, 1, . . . , m)で結果を出力しているからである.そこで,t方向の線の数を適当に間引くようにプログラムを修正しておく.次のソースコード 2(heat12.c) では,どのようにパラメータを選んでも,t = `τ

(` = 0, 1, . . . , 60; 60` ≤ m)でしか結果を出力しない (なお,線の数 (=60)は step_numという変数で定義している).

ソースコード 2 熱方程式の陽的スーム (改良版) heat12.c

/∗ program heat12.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<math.h>#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/double u0(double);

69

Page 72: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ initial value ∗/double u0(double x)

return sin(PI∗x);

/∗ main ∗/int main(void)

int i, j, n, N, m, step num, step;double tau, lam, h, Tmax, t, k;double u[DIM], u new[DIM], X[DIM];

/∗ parameters ∗/k = 1.0;N = 15;h = 1.0/(N + 1);lam = 0.4;tau = lam∗h∗h/k;Tmax = 0.5;m = (int)(Tmax/tau);step num = 60;step = m/step num;if(step == 0) step = 1;

/∗ initialization ∗/for(i = 0; i <= N+1; i++)

X[i] = i∗h;u[i] = u0(X[i]);

......(heat11.cと同じなので略)......

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

for(i = 0; i <= N+1; i++)printf("%lf %lf %lfY=n", X[i], t, u[i]);

printf("Y=nY=n");

/∗ end of program ∗/return 1;

heat12.cの結果を dat12に出力して,gnuplotで表示するといくらか見やすくなる (図A.1(b)).

70

Page 73: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

0

0.2

0.4

0.6

0.8

1 0 0.1

0.2 0.3

0.4 0.5

0

0.2

0.4

0.6

0.8

1

"dat1"

(a)

0

0.2

0.4

0.6

0.8

1 0 0.1

0.2 0.3

0.4 0.5

0

0.2

0.4

0.6

0.8

1

"dat2"

(b)

図 A.1 (a) dat11.cと (b) dat12.cの出力結果

なお,描画結果を EPSファイル dat12.epsに保存する場合は,

gnuplot gnuplot> set term postscript eps enhanced color

Terminal type set to ’postscript’

Options are ’eps enhanced color dashed defaultplex "Helvetica" 14’

gnuplot> set output "dat12.eps"

gnuplot> replot

gnuplot> set term win とすれば良い.

問題 A.1. heat12.cを作成して,実行せよ.いろいろなパラメータで計算して結果を吟味せよ.さらに,いろいろな初期値 (振幅の激しいもの,角のあるもの,不連続なもの,両立性条件を満たさないもの)について計算を実行して結果を検討せよ.特に,λ = 0.1, 1/6, 0.5, 0.51

などで計算を実行し,λ > 1/2の際に,非負値性保存や安定性などが破綻する例を報告せよ.

71

Page 74: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(c) 連立一次方程式

§2(f)で説明した,三重対角行列

A =

q1 r1 0 0. . .pi qi ri

. . .0 pN qN

を係数行列とする連立一次方程式

Au = g, u = (ui), g = (gi)

の LU分解に基づく解法のプログラムは次のようになる.先に,コンパイルと実行の仕方を示す.

$ gcc lu1.c -o lu1

$ ./lu1

u(1) = 1.000000

u(2) = 2.000000

u(3) = 3.000000

u(4) = 4.000000

ソースコード 3 三重対角方程式の解法 lu1.c

/∗ program lu1.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<math.h>#define DIM 10 /∗ max number of equations ∗/

/∗ functions ∗/void decomp(int, double ∗, double ∗, double ∗, double ∗, double ∗);void solve(int, double ∗, double ∗, double ∗, double ∗, double ∗, double ∗);

void decomp(int N, double ∗p, double ∗q, double ∗r, double ∗ell, double ∗m)

int i;/∗ forward elimination ∗/m[1] = q[1];for (i = 2; i <= N; i++)

ell[i] = p[i]/m[i−1];m[i] = q[i] − r[i−1]∗ell[i];

72

Page 75: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

void solve(int N, double ∗ell, double ∗m, double ∗r, double ∗g, double ∗c, double ∗u)

int i;/∗ solve Lc = g ∗/c[1] = g[1];for (i = 2; i <= N; i++)

c[i] = g[i] − c[i−1]∗ell[i];/∗ solve Uu = c ∗/u[N] = c[N]/m[N];for (i = N−1; i >= 1; i−−)

u[i] = (c[i] − r[i]∗u[i+1])/m[i];

/∗ MAIN ∗/int main(void)

int N, i, j;double p[DIM], q[DIM], r[DIM], ell[DIM], m[DIM], g[DIM], c[DIM], u[DIM];

/∗ number of equations ∗/N = 4;

/∗ coefficient matrix ∗/q[1] = 2.1; r[1] = −1.0;

p[2] = −1.0; q[2] = 2.1; r[2] = −1.0;p[3] = −1.0; q[3] = 2.1; r[3] = −1.0;p[4] = −1.0; q[4] = 2.1;

/∗ righthand−side vector ∗/g[1] = 0.1; g[2] = 0.2; g[3] = 0.3; g[4] = 5.4;

/∗ LU decomposition ∗/decomp(N, p, q, r, ell, m);

/∗ Solve A u = f ∗/solve(N, ell, m, r, g, c, u);

/∗ result ∗/for(i = 1; i <= N; i++)

printf("u(%d) = %lfY=n",i,u[i]);

/∗ end of program ∗/return 0;

次のソースコード 4(lu2.c) は,ソースコード 3(lu1.c) と同じ計算をしているが,ソースコード 4 の方が,配列を節約している.すなわち,ell[i] と m[i] の値は,それぞれ,p[i] と

73

Page 76: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

q[i]に上書きすれば良いので,新たに定義する必要は無い.また,g[i]と c[i]も,一つの配列u[i]で済ますことができる.

ソースコード 4 三重対角方程式の解法 (配列節約版) lu2.c

/∗ program lu2.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<math.h>#define DIM 10 /∗ max number of equations ∗/

/∗ functions ∗/void decomp(int, double ∗, double ∗, double ∗);void solve(int, double ∗, double ∗, double ∗, double ∗);

void decomp(int N, double ∗p, double ∗q, double ∗r)

int i;/∗ forward elimination ∗/for (i = 2; i <= N; i++)

p[i] = p[i]/q[i−1];q[i] = q[i] − r[i−1]∗p[i];

void solve(int N, double ∗p, double ∗q, double ∗r, double ∗u)

int i;/∗ Lc = g ∗/for (i = 2; i <= N; i++)

u[i] = u[i] − u[i−1]∗p[i];/∗ Uu = c ∗/u[N] = u[N]/q[N];for (i = N−1; i >= 1; i−−)

u[i] = (u[i] − r[i]∗u[i+1])/q[i];

/∗ MAIN ∗/int main(void)......(lu1.cと同じなので略)......

問題 A.2. lu1.cおよび lu2.cを作成して,実行せよ.さらに,係数行列と右辺行列を自分で設定して実行結果を確かめよ.

74

Page 77: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

(d) 陰的 θスキームと非斉次問題

続いて,(1.5)に対する陰的 θ スキーム

uni − un−1

i

τ= (1 − θ)k

un−1i−1 − 2un−1

i + un−1i+1

h2

+θkun

i−1 − 2uni + un

i+1

h2(1 ≤ i ≤ N, n ≥ 1)

un0 = un

N+1 = 0 (n ≥ 0)u0

i = u0(xi) (1 ≤ i ≤ N)

(2.10)

のプログラムを作成しよう.この場合,各時間ステップ tn で,連立一次方程式

Hθλu(n) = Kθ′λu(n−1)

を解く事になる.ただし,HθλとKθ′λは (2.11)と (2.12)で定義した行列である.この連立一次方程式は,§2(f)と §A(c)で説明した方法を用いる.新たに追加する配列は,次の通り.

追加変数一覧変数名 定義 型 変数名 定義 型

theta θ double

diag (Kθ′λ)ii double sdiag (Kθ′λ)i,i±1 double

追加配列一覧配列名 定義 型 確保する iの範囲 実際に使用する iの範囲

a[i] (Hθλ)i,i−1 double 0, 1, ..., DIM-1 1, 2, ..., N

b[i] (Hθλ)i,i double 0, 1, ..., DIM-1 1, 2, ..., N

c[i] (Hθλ)i,i+1 double 0, 1, ..., DIM-1 1, 2, ..., N

プログラムはソースコード 5(heat21.c) のようになる.コンパイルや実行の方法は,heat12.cと同じである.

ソースコード 5 熱方程式の陰的 θ 法 heat21.c

/∗ program heat21.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<math.h>#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/void decomp(int, double ∗, double ∗, double ∗);void solve(int, double ∗, double ∗, double ∗, double ∗);

75

Page 78: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

double u0(double);

/∗ initial value ∗/double u0(double x)

return sin(PI∗x);

/∗ LU decomposition ∗/void decomp(int N, double ∗p, double ∗q, double ∗r)

int i;/∗ forward elimination ∗/for (i = 2; i <= N; i++)

p[i] = p[i]/q[i−1];q[i] = q[i] − r[i−1]∗p[i];

/∗ Solve ∗/void solve(int N, double ∗p, double ∗q, double ∗r, double ∗u)

int i;/∗ Lc = g ∗/for (i = 2; i <= N; i++)

u[i] = u[i] − u[i−1]∗p[i];/∗ Uu = c ∗/u[N] = u[N]/q[N];for (i = N−1; i >= 1; i−−)

u[i] = (u[i] − r[i]∗u[i+1])/q[i];

/∗ main ∗/int main(void)

int i, n, N, m, step num, step;double tau, lam, h, Tmax, t, theta, diag, sdiag;double u[DIM], u new[DIM], a[DIM], b[DIM], c[DIM], X[DIM];

/∗ parameters ∗/N = 63;h = 1.0/(N + 1);lam = 1.0;tau = lam∗h∗h;theta = 0.5;Tmax = 0.5;m = (int)(Tmax/tau);step num = 60;step = m/step num;

76

Page 79: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

if(step == 0) step = 1;

/∗ initialization ∗/for(i = 0; i <= N+1; i++)

X[i] = i∗h;u[i] = u0(X[i]);

/∗ results: t = 0 ∗/printf("# heat21.c N:%d h:%lf tau:%lf lam:%lf Tmax:%lf theta:%lfY=n", N,h,tau,lam,

Tmax,theta);t = 0.0;for(i = 0; i <= N+1; i++)

printf("%lf %lf %lfY=n", X[i], t, u[i]);printf("Y=nY=n");u[0] = u[N+1] = 0.0;

/∗ coefficient matrix: H ∗/for(i = 1; i <= N; i++)

a[i] = c[i] = −theta∗lam;b[i] = 1.0 + 2.0∗theta∗lam;

a[1] = c[N] = 0.0;

/∗ coefficient matrix: K ∗/diag = 1.0 − 2.0∗(1.0 − theta)∗lam;sdiag = (1.0 − theta)∗lam;

/∗ LU decomposition of H ∗/decomp(N, a, b, c);

/∗ iteration ∗/for(n = 1; n <= m; n++)

/∗ current time ∗/t = n∗tau;

/∗ right−hand side vector ∗/u new[1] = sdiag∗u[2] + diag∗u[1];for(i = 2; i <= N−1; i++)

u new[i] = sdiag∗(u[i−1] + u[i+1]) + diag∗u[i];u new[N] = sdiag∗u[N−1] + diag∗u[N];

/∗ Solve H uˆn = K uˆn−1 ∗/solve(N, a, b, c, u);

for(i = 1; i <= N; i++)u[i] = u new[i];

77

Page 80: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

for(i = 0; i <= N+1; i++)printf("%lf %lf %lfY=n", X[i], t, u[i]);

printf("Y=nY=n");

/∗ end ∗/return 1;

引き続き,熱源の効果を含む熱方程式の初期値境界値問題 (非斉次問題)ut = kuxx + f(x, t) (0 < x < 1, t > 0)u(0, t) = u(1, t) = 0 (t > 0)u(x, 0) = a(x) (0 ≤ x ≤ 1)

(1.6)

への陰的 θ スキーム

Hθλu(n) = Kθ′λu(n−1) + τ (1 − θ)f (n−1) + θf (n)︸ ︷︷ ︸f (n−1+θ)

(2.14)

を実行してみよう.ほとんど heat21.cと同じだが,右辺ベクトルの算出の際に,はじめに配列

f[i] = (1 − θ)f(xi, tn−1) + θf(xi, tn)

を用意しておくと便利である.プログラムの例をソースコード 6(heat31.c)に示す.なお,そこでは,例題として,

u(x, t) = (1.2 − cos t) sin(πx)

を考えている.すなわち,

a(x) = 0.2 sin(πx), f(x, t) =[sin(t) + π2(1.2 − cos t) sin(πx)

]を既知関数として与えている.

追加変数一覧変数名 定義 型

tm1 tn−1 double

追加配列一覧

78

Page 81: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

配列名 定義 型 確保する iの範囲 実際に使用する iの範囲

f[i] (f (n+1−θ))i double 0, 1, ..., DIM-1 1, 2, ..., N

追加関数一覧関数名 定義 型 引数

func_f(x, t) f(x, t) double double x, t

ソースコード 6 非斉次問題の陰的 θ 法 heat31.c

/∗ program heat31.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<math.h>#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/void decomp(int, double ∗, double ∗, double ∗);void solve(int, double ∗, double ∗, double ∗, double ∗);double u0(double);double func f(double, double);

/∗ initial value ∗/double u0(double x)

return 0.2∗sin(PI∗x);

/∗ righthand side function ∗/double func f(double x, double t)

return (sin(t) + PI∗PI∗(1.2 − cos(t)))∗sin(PI∗x);

/∗ LU decomposition ∗/void decomp(int N, double ∗p, double ∗q, double ∗r)

int i;/∗ forward elimination ∗/for (i = 2; i <= N; i++)

p[i] = p[i]/q[i−1];q[i] = q[i] − r[i−1]∗p[i];

/∗ Solve ∗/void solve(int N, double ∗p, double ∗q, double ∗r, double ∗u)

int i;/∗ Lc = g ∗/

79

Page 82: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

for (i = 2; i <= N; i++)u[i] = u[i] − u[i−1]∗p[i];

/∗ Uu = c ∗/u[N] = u[N]/q[N];for (i = N−1; i >= 1; i−−)

u[i] = (u[i] − r[i]∗u[i+1])/q[i];

/∗ main ∗/int main(void)

int i, n, N, m, step num, step;double tau, lam, h, Tmax, t, theta, diag, sdiag, tm1;double u[DIM], u new[DIM], a[DIM], b[DIM], c[DIM], X[DIM], f[DIM];

/∗ parameters ∗/N = 63;h = 1.0/(N + 1);lam = 1.0;tau = lam∗h∗h;theta = 0.5;Tmax = 10.0;m = (int)(Tmax/tau);step num = 60;step = m/step num;if(step == 0) step = 1;

/∗ initialization ∗/for(i = 0; i <= N+1; i++)

X[i] = i∗h;u[i] = u0(X[i]);

/∗ results: t = 0 ∗/printf("# heat22.c N:%d h:%lf tau:%lf lam:%lf Tmax:%lf theta:%lfY=n", N,h,tau,lam,

Tmax,theta);t = 0.0;for(i = 0; i <= N+1; i++)

printf("%lf %lf %lfY=n", X[i], t, u[i]);printf("Y=nY=n");u[0] = u[N+1] = 0.0;

/∗ coefficient matrix: H ∗/for(i = 1; i <= N; i++)

a[i] = c[i] = −theta∗lam;b[i] = 1.0 + 2.0∗theta∗lam;

a[1] = c[N] = 0.0;

80

Page 83: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ coefficient matrix: K ∗/diag = 1.0 − 2.0∗(1.0 − theta)∗lam;sdiag = (1.0 − theta)∗lam;

/∗ LU decomposition of H ∗/decomp(N, a, b, c);

/∗ iteration ∗/for(n = 1; n <= m; n++)

/∗ current time ∗/tm1 = t;t = n∗tau;

/∗ right−hand side vector ∗//∗ set values of f ∗/f[1] = (1 − theta)∗func f(X[1],tm1) + theta∗func f(X[1], t);for(i = 2; i <= N−1; i++)

f[i] = (1 − theta)∗func f(X[i],tm1) + theta∗func f(X[i], t);f[N] = (1 − theta)∗func f(X[N],tm1) + theta∗func f(X[N], t);

/∗ set vector ∗/u new[1] = sdiag∗u[2] + diag∗u[1] + tau∗f[1];for(i = 2; i <= N−1; i++)

u new[i] = sdiag∗(u[i−1] + u[i+1]) + diag∗u[i] + tau∗f[i];u new[N] = sdiag∗u[N−1] + diag∗u[N] + tau∗f[N];

/∗ Solve H uˆn = K uˆn−1 ∗/solve(N, a, b, c, u new);

for(i = 1; i <= N; i++)u[i] = u new[i];

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

for(i = 0; i <= N+1; i++)printf("%lf %lf %lfY=n", X[i], t, u[i]);

printf("Y=nY=n");

/∗ end ∗/return 1;

問題 A.3. heat21.cおよび heat31.cを作成して,実行せよ.いろいろなパラメータで計

81

Page 84: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

算して結果を吟味せよ.さらに,いろいろな初期値 (振幅の激しいもの,角のあるもの,不連続なもの,両立性条件を満たさないもの)や関数 f(x, t)について計算を実行して結果を検討せよ.正値性保存や安定性と,条件 2(1 − θ)λ ≤ 1の関係を実験的に確かめよ.

82

Page 85: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

B 数値計算の実行 (技巧編)

(a) コマンド行引数の利用

今までのプログラムでは,パラメータを変える毎に,コンパイル・実行をしなければならず面倒である.そこで,コマンド行引数を利用してみよう.引き続き,非斉次問題 (1.6)に対する陰的 θ スキーム (2.14)を考える.heat31を次のように変更する.

ソースコード 7 非斉次問題の陰的 θ 法 (改良版 I) heat41.c

/∗ program heat41.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<stdlib.h>#include<math.h>#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/void decomp(int, double ∗, double ∗, double ∗);void solve(int, double ∗, double ∗, double ∗, double ∗);double u0(double);double func f(double, double);

/∗ initial value ∗/double u0(double x)

return 0.2∗sin(PI∗x);

/∗ righthand side function ∗/double func f(double x, double t)

return (sin(t) + PI∗PI∗(1.2 − cos(t)))∗sin(PI∗x);

/∗ LU decomposition ∗/void decomp(int N, double ∗p, double ∗q, double ∗r)

int i;/∗ forward elimination ∗/for (i = 2; i <= N; i++)

p[i] = p[i]/q[i−1];q[i] = q[i] − r[i−1]∗p[i];

/∗ Solve ∗/void solve(int N, double ∗p, double ∗q, double ∗r, double ∗u)

83

Page 86: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

int i;/∗ Lc = g ∗/for (i = 2; i <= N; i++)

u[i] = u[i] − u[i−1]∗p[i];/∗ Uu = c ∗/u[N] = u[N]/q[N];for (i = N−1; i >= 1; i−−)

u[i] = (u[i] − r[i]∗u[i+1])/q[i];

/∗ main ∗/int main(argc,argv)int argc;char ∗∗argv;

FILE ∗f1;int i, n, N, m, step num, step;double tau, lam, h, Tmax, t, theta, diag, sdiag, tm1;double u[DIM], u new[DIM], a[DIM], b[DIM], c[DIM], X[DIM], f[DIM];char res1[20];

/∗ input parameters ∗/N = atoi(argv[2]);lam = atof(argv[3]);theta = atof(argv[4]);Tmax = atof(argv[5]);

/∗ parameters ∗/h = 1.0/(N + 1);tau = lam∗h∗h;m = (int)(Tmax/tau);step num = 60;step = m/step num;if(step == 0) step = 1;

/∗ output −> file name: argv[1].res ∗/sprintf(res1,"%s.res",argv[1]);if((f1 = fopen(res1,"w")) == NULL)

fprintf(stderr,"Can’t open %s",argv[1]);exit(1);

/∗ initialization ∗/for(i = 0; i <= N+1; i++)

X[i] = i∗h;u[i] = u0(X[i]);

u[0] = u[N+1] = 0.0;

84

Page 87: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ results: t = 0 ∗/fprintf(f1,"# %s.c N:%d h:%lf tau:%lf lam:%lf Tmax:%lf theta:%lfY=n",

argv[0],N,h,tau,lam,Tmax,theta);t = 0.0;for(i = 0; i <= N+1; i++)

fprintf(f1,"%lf %lf %lfY=n", X[i], t, u[i]);fprintf(f1,"Y=nY=n");

/∗ coefficient matrix: H ∗/for(i = 1; i <= N; i++)

a[i] = c[i] = −theta∗lam;b[i] = 1.0 + 2.0∗theta∗lam;

a[1] = c[N] = 0.0;

/∗ coefficient matrix: K ∗/diag = 1.0 − 2.0∗(1.0 − theta)∗lam;sdiag = (1.0 − theta)∗lam;

/∗ LU decomposition of H ∗/decomp(N, a, b, c);

/∗ iteration ∗/for(n = 1; n <= m; n++)

/∗ current time ∗/tm1 = t;t = n∗tau;

/∗ right−hand side vector ∗//∗ set values of f ∗/f[1] = (1 − theta)∗func f(X[1],tm1) + theta∗func f(X[1], t);for(i = 2; i <= N−1; i++)

f[i] = (1 − theta)∗func f(X[i],tm1) + theta∗func f(X[i], t);f[N] = (1 − theta)∗func f(X[N],tm1) + theta∗func f(X[N], t);

/∗ set vector ∗/u new[1] = sdiag∗u[2] + diag∗u[1] + tau∗f[1];for(i = 2; i <= N−1; i++)

u new[i] = sdiag∗(u[i−1] + u[i+1]) + diag∗u[i] + tau∗f[i];u new[N] = sdiag∗u[N−1] + diag∗u[N] + tau∗f[N];

/∗ Solve H uˆn = K uˆn−1 ∗/solve(N, a, b, c, u new);

for(i = 1; i <= N; i++)u[i] = u new[i];

85

Page 88: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

for(i = 0; i <= N+1; i++)fprintf(f1,"%lf %lf %lfY=n", X[i], t, u[i]);

fprintf(f1,"Y=nY=n");

/∗ end ∗/fclose(f1);return 1;

これを実行するには,例えば,$ gcc heat41.c -o heat41

$ ./heat41.exe dat41 63 0.1 0.5 10

とする.このとき,N = 63,λ = 0.1,θ = 0.5,Tmax = 10の場合の計算が実行され,結果が自動的に生成されたファイル dat41.resに書き込まれる.これを,dat11や dat12と同様に gnuplotで表示すれば良い.

簡単に説明しよう.まず,

#include<stdlib.h>

.........

int main(int argc, char **argv)

.........

における argv は文字列ポインタの配列*5で,コマンド行に与えた文字列を順番に表す.ただし,argv[0] はプログラム自身で,コマンド行に与えた文字列は順番に argv[1],

argv[2], ... , argv[argc-1] となる.例えば,上の実行例では,

argv[1] = dat41,argv[2] = 63,argv[3] = 0.1,argv[4] = 0.5,argv[5] = 10,(argc = 5)

である.これをそれぞれの変数に代入すれば良いが,argv[ ]は文字列なので,その前に,適当な変数の型に変換しなければならない.具体的には,文字列を対応する整数値に変換す

*5 何のことかわからない人は,とりあえず気にしない.

86

Page 89: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

る関数 atoi()と文字列を対応する doubleの値に変換する関数 atof()を用いて*6,

/* input parameters */

N = atoi(argv[2]);

lam = atof(argv[3]);

theta = atof(argv[4]);

Tmax = atof(argv[5]);

とする.このように,パラメータをコマンドライン引数で与えたのだから,出力ファイルについて

も同様の扱いをする.すなわち,1番目の引数 argv[1] = dat41は出力ファイル名であり,

........

FILE *f1;

........

/* output -> file name: argv[1].res */

sprintf(res1,"%s.res",argv[1]);

if((f1 = fopen(res1,"w")) == NULL)

fprintf(stderr,"Can’t open %s",argv[1]);

exit(1);

することで,argv[1].resという名前で書き込みモード (w)のファイル f1を開く.もし,argv[1] が指定されていなければ,エラーメッセージ Can’t open を出力して,プログラムは終了する.以後,

fprintf(f1,"%lf %lf %lfY=n", X[i], t, u[i]);

fprintf(f1,"# %s.c N:%d h:%lf tau:%lf lam:%lf Tmax:%lf theta:%lfY=n",

argv[0],N,h,tau,lam,Tmax,theta);

などと書けば," ... "の内容が,ファイル f1に書き込まれる.argv[0]が実行プログラムそのものであることに注意して欲しい.一度開いたファイルは

*6 argcは argument count の略,argvは argument value の略であり,他の名前を用いても良いが,習慣に従いこのようにした.また,atoi()は alphanumeric to integer,atof()は alphanumeric to floating

point の略.

87

Page 90: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/* close output file */

fclose(f1);

として閉じること.

次に,プログラム中から直接 gnuplot を呼び出して描画を行うように改良する.ソースコード 8(heat42.c)がそれである.

ソースコード 8 非斉次問題の陰的 θ 法 (改良版 II) heat42.c

/∗ program heat42.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<stdlib.h>#include<math.h>#define GNUPLOT PATH "c:/gnuplot/binary/pgnuplot -persist"

/∗ #define GNUPLOT PATH ”gnuplot −persist” ∗/#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/..........(heat41.cと同じなので略)........../∗ main ∗/int main(argc,argv)int argc;char ∗∗argv;

FILE ∗f1, ∗gp;int i, n, N, m, step num, step;double tau, lam, h, Tmax, t, theta, diag, sdiag, tm1;double u[DIM], u new[DIM], a[DIM], b[DIM], c[DIM], X[DIM], f[DIM];char res1[20];

..........(heat41.cと同じなので略)..........

/∗ close output file ∗/fclose(f1);

/∗ gnuplot ∗/gp = popen(GNUPLOT PATH,"w");fprintf(gp, "set view 45,60Y=n");fprintf(gp, "splot Y="%s\" with linesY=n",res1);fflush(gp);pclose(gp);

88

Page 91: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ end ∗/return 1;

追加した部分を説明する.まず,

#define GNUPLOT_PATH "c:/gnuplot/bin/pgnuplot -persist"

/* #define GNUPLOT_PATH "gnuplot -persist" */

GNUPLOT_PARH には,wgnuplot.exe(と pgnuplot.exe) が在るフォルダ名を指定しておく.これは,使っているシステムによって異なるので,必要に応じて各自で書き換えて欲しい.もし,wgnuplot.exe(と pgnuplot.exe)が,パスの通ったフォルダにあるのならば,

/* #define GNUPLOT_PATH "c:/gnuplot/binary/pgnuplot -persist" */

#define GNUPLOT_PATH "gnuplot -persist"

としても良い.次に,gnuplotを使う部分は最後にまとめられている.

.............

FILE *f1, *gp;

.............

/* gnuplot */

gp = popen(GNUPLOT_PATH,"w");

fprintf(gp, "set view 45,60Y=n");

fprintf(gp, "splot Y="%sY=" with linesY=n",res1);

fflush(gp);

pclose(gp);

gp=... で gnuplot を起動して,あとは,fprintf(...) でコマンドを送れば良い.fflush(gp)でデータをすべて吐き出し,pclose(gp)で gnuplotを閉じる.

問題 B.1. heat41.cおよび heat42.cを作成して,実行せよ.

問題 B.2. heat42.c をさらに次のように変更すると,描画結果を自動的に EPS ファイル (ファイル名は argv[1].eps)に保存する.heat43.cを新たに作りこの変更を実行してみよ.

89

Page 92: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/* gnuplot */

gp = popen(GNUPLOT_PATH,"w");

fprintf(gp, "set view 45,60Y=n");

fprintf(gp, "splot Y="%sY=" with linesY=n",res1);

fprintf(gp, "set term postscript eps enhanced colorY=n");

fprintf(gp, "set output Y="%s.epsY="Y=n",argv[1]);

fprintf(gp, "replotY=n");

fflush(gp);

pclose(gp);

(b) アニメーション

gnuplot を利用すると,アニメーションで解を表示することができる.ソースコード 6,7,8と同じ問題でプログラム例を示そう.

ソースコード 9 非斉次問題の陰的 θ 法 (改良版 III) heat51.c

/∗ program heat51.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>#include<stdlib.h>#include<math.h>/∗ #define GNUPLOT PATH ”c:/gnuplot/bin/pgnuplot −persist” ∗/#define GNUPLOT PATH "gnuplot -persist"

#define MAX(x,y) ((x) > (y) ? (x) : (y))#define MIN(x,y) ((x) < (y) ? (x) : (y))#define DIM 500 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/............(heat41.cと同じなので略)............

/∗ main ∗/int main(argc,argv)int argc;char ∗∗argv;

FILE ∗f1, ∗gp;int i, n, N, m, step num, step, iter;double tau, lam, h, Tmax, t, theta, diag, sdiag, tm1;double u min, u max, time interval, pause interval;double u[DIM], u new[DIM], a[DIM], b[DIM], c[DIM], X[DIM], f[DIM];char res1[20];

90

Page 93: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ input parameters ∗/N = atoi(argv[2]);lam = atof(argv[3]);theta = atof(argv[4]);Tmax = atof(argv[5]);

/∗ parameters ∗/h = 1.0/(N + 1);tau = lam∗h∗h;m = (int)(Tmax/tau);step num = 200;step = m/step num;if(step == 0) step = 1;time interval = 10.0; /∗ seconds ∗/

/∗ initialization ∗/u min = u max = 0.0;for(i = 0; i <= N+1; i++)

X[i] = i∗h;u[i] = u0(X[i]);u min = MIN(u[i], u min);u max = MAX(u[i], u max);

u[0] = u[N+1] = 0.0;

/∗ results: t = 0 ∗/iter = 0;sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);f1 = fopen(res1,"w");t = 0.0;fprintf(f1,"# t = %lfY=n", t);for(i = 0; i <= N+1; i++)

fprintf(f1,"%lf %lfY=n", X[i], u[i]);fclose(f1);

/∗ coefficient matrix: H ∗/for(i = 1; i <= N; i++)

a[i] = c[i] = −theta∗lam;b[i] = 1.0 + 2.0∗theta∗lam;

a[1] = c[N] = 0.0;

/∗ coefficient matrix: K ∗/diag = 1.0 − 2.0∗(1.0 − theta)∗lam;sdiag = (1.0 − theta)∗lam;

/∗ LU decomposition of H ∗/decomp(N, a, b, c);

/∗ iteration ∗/

91

Page 94: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

for(n = 1; n <= m; n++)

/∗ current time ∗/............(heat41.cと同じなので略)............

/∗ Solve H uˆn = K uˆn−1 ∗/solve(N, a, b, c, u new);

for(i = 1; i <= N; i++)u[i] = u new[i];u min = MIN(u[i], u min);u max = MAX(u[i], u max);

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

iter++;sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);f1 = fopen(res1,"w");fprintf(f1,"# t = %lfY=n", t);for(i = 0; i <= N+1; i++)

fprintf(f1,"%lf %lfY=n", X[i], u[i]);fclose(f1);

/∗ gnuplot ∗/pause interval = time interval/step num;u min = u min − 0.05∗fabs(u min);u max = u max + 0.05∗fabs(u max);gp = popen(GNUPLOT PATH,"w");fprintf(gp, "set size ratio 1Y=n");fprintf(gp, "set xrange [%lf:%lf]Y=n",X[0],X[N+1]);fprintf(gp, "set yrange [%lf:%lf]Y=n",u min,u max);fprintf(gp, "set xlabel Y="x\"Y=n");fprintf(gp, "set ylabel Y="u\"Y=n");for(i = 0; i <= iter; i++)

fprintf(gp, "plot Y="%s/%s %.3d.plt\" title Y="t = %lf\"with linesY=n",argv[1],argv[1],i,i∗step∗tau);

fflush(gp);fprintf(gp, "pause %lfY=n",pause interval);

pclose(gp);

/∗ end ∗/return 1;

これを実行するには,

92

Page 95: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

$ mkdir dat51

$ gcc heat51.c -o heat51

$ ./heat51.exe dat51 23 0.1 0.5 10

とする (1行目と 2行目の順番は入れ替えても良い).重要な違いは,プログラムを実行する前に,mkdir dat51で dat51というフォルダを用意しておくことである.これを忘れて実行すると,Segmentation faultというエラーで怒られる.こうすると,各時刻 tn のおける (xi, u(xi, tn)) (i = 0, . . . , N +1)のデータが,フォルダ dat51の中の,dat51_000.dat,dat51_001.dat,dat51_002.dat. . .という名前のファイルに書き込まれる.そして,これを,gnuplotで順に表示して行けば,簡単なアニメーションを作ることができるのである.もう少し詳しく説明してみよう.

#define MAX(x,y) ((x) > (y) ? (x) : (y))

#define MIN(x,y) ((x) < (y) ? (x) : (y))

この関数はすぐ後で使う.例えば,5=MAX(2, 5),2=MIN(2, 5)のように値を返す.

/* initialization */

u_min = u_max = 0.0;

for(i = 0; i <= N+1; i++)

X[i] = i*h;

u[i] = u0(X[i]);

u_min = MIN(u[i], u_min);

u_max = MAX(u[i], u_max);

u[0] = u[N+1] = 0.0;

描画の際に,xの範囲を 0 ≤ x ≤ 1,uの範囲を umin = min(x,t)

u(x, t) ≤ u ≤ umax = max(x,t)

u(x, t)

とするために,umin と umax の値が必要である.まず,初期値に対して最小値と最大値を保存しておく.

/* results: t = 0 */

iter = 0;

sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);

f1 = fopen(res1,"w");

t = 0.0;

fprintf(f1,"# t = %lfY=n", t);

93

Page 96: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

for(i = 0; i <= N+1; i++)

fprintf(f1,"%lf %lfY=n", X[i], u[i]);

fclose(f1);

argv[1] = dat51としたとしよう.フォルダ dat51の中に,dat51_000.pltというファイルを生成して,(xi, u(xi, t0))のデータを記録しておく.

/* results: t = l*step*tau */

if(n%step == 0)

iter++;

sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);

f1 = fopen(res1,"w");

fprintf(f1,"# t = %lfY=n", t);

for(i = 0; i <= N+1; i++)

fprintf(f1,"%lf %lfY=n", X[i], u[i]);

fclose(f1);

同様に,各 tn において,フォルダ dat51の中に,dat51_00n.pltというファイルを生成して,(xi, u(xi, tn))のデータを記録しておく.

/* gnuplot */

pause_interval = time_interval/step_num;

u_min = u_min - 0.05*fabs(u_min);

u_max = u_max + 0.05*fabs(u_max);

gp = popen(GNUPLOT_PATH,"w");

fprintf(gp, "set xrange [%lf:%lf]Y=n",X[0],X[N+1]);

fprintf(gp, "set yrange [%lf:%lf]Y=n",u_min,u_max);

fprintf(gp, "set xlabel Y="xY="Y=n");

fprintf(gp, "set ylabel Y="uY="Y=n");

for(i = 0; i <= iter; i++)

fprintf(gp, "plot Y="%s/%s_%.3d.pltY=" title Y="t = %lfY="with linesY=n",

argv[1],argv[1],i,i*step*tau);

fflush(gp);

fprintf(gp, "pause %lfY=n",pause_interval);

pclose(gp);

94

Page 97: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

描画範囲にゆとりを持たせるため,uminと umaxの値を少し修正する.gnuplotを起動して,上で作成した dat51_000.plt,dat51_001.plt,dat51_002.plt,. . .,dat51_200.plt

を順に表示していけば良い.ここでは表示時間の間隔を pause_interval で制御している.これは,pause_interval = time_interval/step_numで定義される.いまの場合,time_interval = 10,step_num = 200となっているが (mainの始めの部分を参照),これを,例えば,time_interval = 15,step_num = 300と変更すると,「300枚の画像を15秒間で表示する」という意味になる.

この節の最後にアニメーションを表示し,それを動画ファイルに保存する方法を紹介する.説明が面倒なので,とりあえず,次の heat52.cを実行して欲しい.

$ mkdir dat52

$ gcc heat52.c -o heat52

$ ./heat52.exe dat52 23 0.1 0.5 10

実行結果は,前と同様にアニメーションが表示され,さらに,フォルダ dat52に,dat52.gnuというファイルができる.これを,gnuplot で,

gnuplot gnuplot> cd "dat52"

gnuplot> load "dat52.gnu" とすると,フォルダ dat52の中に,dat52_000.png,dat52_001.png,dat52_002.png. . .という名前の画像ファイルが生成される.そして,これを,Windowsムービーメーカーなどで動画ファイルにすれば良いのである.なお,Windowsムービーメーカーが利用できなくても,ImageMagick (http://www.imagemagick.org/script/index.php)をインストールしてあれば,

$ cd dat52

$ convert dat52*.png dat52.gif

で GIF アニメができる (ブラウザなどで見れば良い).ImageMagick や convert コマンドについては,自分で調べて下さい.

ソースコード 10 非斉次問題の陰的 θ 法 (改良版 IV) heat52.c

/∗ program heat52.c ∗//∗ 2011.10.26: N. Saito ∗/#include<stdio.h>............(heat41.cと同じなので略)............

95

Page 98: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ main ∗/int main(argc,argv)int argc;char ∗∗argv;

FILE ∗f1, ∗f2, ∗gp;int i, n, N, m, step num, step, iter;double tau, lam, h, Tmax, t, theta, diag, sdiag, tm1;double u min, u max, time interval, pause interval;double u[DIM], u new[DIM], a[DIM], b[DIM], c[DIM], X[DIM], f[DIM];char res1[20], res2[20];

/∗ input parameters ∗/N = atoi(argv[2]);lam = atof(argv[3]);theta = atof(argv[4]);Tmax = atof(argv[5]);

............(heat51.cと同じなので略)............

fclose(f1);

/∗ gnuplot load file −> file name: argv[1].gnu ∗/sprintf(res2,"%s/%s.gnu",argv[1],argv[1]);if((f2 = fopen(res2,"w")) == NULL)

fprintf(stderr,"Can’t open %s",argv[1]);exit(1);

/∗ gnuplot ∗/pause interval = time interval/step num;u min = u min − 0.05∗fabs(u min);u max = u max + 0.05∗fabs(u max);gp = popen(GNUPLOT PATH,"w");fprintf(gp, "set size ratio 1Y=n");fprintf(gp, "set xrange [%lf:%lf]Y=n",X[0],X[N+1]);fprintf(gp, "set yrange [%lf:%lf]Y=n",u min,u max);fprintf(gp, "set xlabel Y="x\"Y=n");fprintf(gp, "set ylabel Y="u\"Y=n");fprintf(f2, "clearY=n");fprintf(f2, "resetY=n");fprintf(f2, "set size ratio 1Y=n");fprintf(f2, "set xrange [%lf:%lf]Y=n",X[0],X[N+1]);fprintf(f2, "set yrange [%lf:%lf]Y=n",u min,u max);fprintf(f2, "set xlabel Y="x\"Y=n");fprintf(f2, "set ylabel Y="u\"Y=n");for(i = 0; i <= iter; i++)

fprintf(gp, "plot Y="%s/%s %.3d.plt\" title Y="t = %lf\"with linesY=n",argv[1],argv[1],i,i∗step∗tau);

96

Page 99: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

fflush(gp);fprintf(gp, "pause %lfY=n",pause interval);fprintf(f2, "set terminal pngY=n");fprintf(f2, "set output Y="%s %.3d.png\"Y=n",argv[1],i);fprintf(f2, "plot Y="%s %.3d.plt\" title Y="t = %lf\" with linesY=n",

argv[1],i,i∗step∗tau);fprintf(f2, "set terminal x11Y=n");

pclose(gp);

/∗ ∗/fclose(f2);/∗ end ∗/return 1;

97

Page 100: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

C 数値計算の実行 (空間 2変数熱方程式)

(a) 陽的スキーム

空間 2変数の熱方程式の初期値問題ut = k(uxx + uyy) + f(x, y, t) ((x, y) ∈ Ω, 0 < t < T )u(x, y, t) = 0 ((x, y) ∈ ∂Ω, t > 0)u(x, y, 0) = a(x, y) ((x, y) ∈ Ω)

(5.1)

を §5(a)で説明した陽的スキーム

• u0i,j = a(xi, yj) ((i, j) ∈ Λ);

• n = 0, 1, . . . ,m − 1に対して,

un+1i,j = 0 ((i, j) ∈ ∂Λ),

un+1i,j = (1 − 2λx − 2λy)un

i,j + λx(uni−1,j + ui+1,j)

+ λy(uni,j−1 + ui,j+1) + τf(xi, yj , tn) ((i, j) ∈ Λ).

で計算する.記号は,すべて §5(a)で定義した通り.特に,Ωは長方形領域 (a0, a1)×(b0, b1)

を表すのであった.ソースコード 10(heat52.c) を元にこの計算を行うプログラムの例をソースコード

11(heat71.c)に示す.このプログラムでは,

k = 1, f(x, y, t) = (1 + π2)et sin(πx) sin(πy), a(x, y) = sin(πx) sin(πy)

の場合を計算する (この場合,厳密解は u(x, y, t) = et sin(πx) sin(πy) となる).コンパイルと実行方法は,heat52.cと同じである.すなわち,次のようにする.

$ mkdir dat71

$ gcc heat71.c -o heat71

$ ./heat71.exe dat71 31 0.2 1

このとき,Nx = Ny = 31,λx = λy = 0.2,Tmax = 1の場合の計算が実行され,結果がアニメーションで表示される. 画像ファイルは,gnuplotで,

gnuplot gnuplot> cd "dat71"

gnuplot> load "dat71.gnu" とすると,フォルダ dat71の中に,dat71_000.png,dat71_001.png,dat71_002.png. . .という名前で生成される.

98

Page 101: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

ソースコード 11 空間 2次元熱方程式の陽的スキーム heat71.c

/∗ program heat71.c ∗//∗ 2011.11.26: N. Saito ∗/#include<stdio.h>#include<stdlib.h>#include<math.h>#define GNUPLOT PATH "c:/gnuplot/binary/pgnuplot -persist"

/∗ #define GNUPLOT PATH ”gnuplot −persist” ∗/#define MAX(x,y) ((x) > (y) ? (x) : (y))#define MIN(x,y) ((x) < (y) ? (x) : (y))#define DIM 110 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/double u0(double, double);double func f(double, double, double);

/∗ initial value ∗/double u0(double x, double y)

return sin(PI∗x)∗sin(PI∗y);

/∗ righthand side function ∗/double func f(double x, double y, double t)

return (1.0 + 2.0∗PI∗PI)∗sin(PI∗x)∗sin(PI∗y)∗exp(t);

/∗ main ∗/int main(argc,argv)int argc;char ∗∗argv;

FILE ∗f1, ∗f2, ∗gp;int i, j, n, Nx, Ny, m, step num, step, iter;double tau, tau2, lamx, lamy, lam, hx, hy, Tmax, t, tm1;double k, u min, u max, time interval, pause interval;double a0, a1, b0, b1;double u[DIM][DIM], u new[DIM][DIM], X[DIM], Y[DIM];char res1[20], res2[20];

/∗ input parameters ∗/Nx = Ny = atoi(argv[2]);lam = atof(argv[3]);Tmax = atof(argv[4]);

/∗ parameters ∗/k = 1.0;a0 = b0 = 0.0;

99

Page 102: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

a1 = b1 = 1.0;hx = (a1 − a0)/(Nx + 1);hy = (b1 − b0)/(Ny + 1);if(Nx >= Ny)

lamx = lam;tau = (1.0/k)∗lamx∗hx∗hx;lamy = k∗tau/(hy∗hy);

else lamy = lam;tau = (1.0/k)∗lamy∗hy∗hy;lamx = k∗tau/(hx∗hx);

m = (int)(Tmax/tau);step num = 50;step = m/step num;if(step == 0) step = 1;time interval = 10.0; /∗ seconds ∗/

/∗ initialization ∗/u min = u max = 0.0;for(i = 0; i <= Nx + 1; i++)

X[i] = i∗hx;for(j = 0; j <= Ny + 1; j++)

Y[j] = j∗hy;u[i][j] = u0(X[i], Y[j]);u min = MIN(u[i][j], u min);u max = MAX(u[i][j], u max);

/∗ results: t = 0 ∗/iter = 0;sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);f1 = fopen(res1,"w");t = 0.0;fprintf(f1,"# t = %lfY=n", t);for(i = 0; i <= Nx + 1; i++)

for(j = 0; j <= Ny + 1; j++) fprintf(f1,"%lf %lf %lfY=n", X[i], Y[j], u[i][j]);

fprintf(f1,"Y=n");

fclose(f1);

/∗ parameters ∗/lam0 = 1 − 2.0∗lamx − 2.0∗lamy;

/∗ iteration ∗/for(n = 1; n <= m; n++)

/∗ current time ∗/

100

Page 103: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

tm1 = t;t = n∗tau;

/∗ ∗/for(i = 1; i <= Nx; i++)

for(j = 1; j <= Ny; j++)u new[i][j] = lam0∗u[i][j] + lamx∗(u[i−1][j] + u[i+1][j])

+ lamy∗(u[i][j−1] + u[i][j+1]) + tau∗func f(X[i], Y[j], tm1);u min = MIN(u[i][j], u min);u max = MAX(u[i][j], u max);

for(i = 1; i <= Nx; i++)

for(j = 1; j <= Ny; j++)u[i][j] = u new[i][j];u min = MIN(u[i][j], u min);u max = MAX(u[i][j], u max);

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

iter++;sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);f1 = fopen(res1,"w");fprintf(f1,"# t = %lfY=n", t);for(i = 0; i <= Nx + 1; i++)

for(j = 0; j <= Ny + 1; j++) fprintf(f1,"%lf %lf %lfY=n", X[i], Y[j], u[i][j]);

fprintf(f1,"Y=n");

fclose(f1);

/∗ gnuplot load file −> file name: argv[1].gnu ∗/sprintf(res2,"%s/%s.gnu",argv[1],argv[1]);if((f2 = fopen(res2,"w")) == NULL)

fprintf(stderr,"Can’t open %s",argv[1]);exit(1);

/∗ gnuplot ∗/pause interval = time interval/step num;u min = u min − 0.05∗fabs(u min);u max = u max + 0.05∗fabs(u max);gp = popen(GNUPLOT PATH,"w");fprintf(gp, "set xrange [%lf:%lf]Y=n",a0,a1);fprintf(gp, "set yrange [%lf:%lf]Y=n",b0,b1);fprintf(gp, "set zrange [%lf:%lf]Y=n",u min,u max);

101

Page 104: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

fprintf(gp, "set xlabel Y="x\"Y=n");fprintf(gp, "set ylabel Y="y\"Y=n");fprintf(gp, "set zlabel Y="u\"Y=n");fprintf(f2, "clearY=n");fprintf(f2, "resetY=n");fprintf(f2, "set xrange [%lf:%lf]Y=n",a0,a1);fprintf(f2, "set yrange [%lf:%lf]Y=n",b0,b1);fprintf(f2, "set zrange [%lf:%lf]Y=n",u min,u max);fprintf(f2, "set xlabel Y="x\"Y=n");fprintf(f2, "set ylabel Y="y\"Y=n");fprintf(f2, "set zlabel Y="u\"Y=n");for(n = 0; n <= iter; n++)

fprintf(gp, "splot Y="%s/%s %.3d.plt\" title Y="t = %lf\"with linesY=n",argv[1],argv[1],n,n∗step∗tau);

fflush(gp);fprintf(gp, "pause %lfY=n",pause interval);fprintf(f2, "set terminal gifY=n");fprintf(f2, "set output Y="%s %.3d.gif\"Y=n",argv[1],n);fprintf(f2, "splot Y="%s %.3d.plt\" title Y="t = %lf\" with linesY=n",

argv[1],n,n∗step∗tau);fprintf(f2, "set terminal winY=n");

pclose(gp);

/∗ ∗/fclose(f2);

/∗ end ∗/return 1;

問題 C.1. heat71.cを実行せよ.描画の色を変えるために,ソースコード 12のように修正したプログラム heat72.cを作成し,計算を実行せよ.条件 1− 2λx − 2λy ≥ 0が満たされないときに何が起こるか実験的に観察せよ.

ソースコード 12 空間 2次元熱方程式の陽的スキーム (改良版) heat72.c

............(heat71.cと同じ)............

/∗ gnuplot ∗/pause interval = time interval/step num;u min = u min − 0.05∗fabs(u min);u max = u max + 0.05∗fabs(u max);gp = popen(GNUPLOT PATH,"w");fprintf(gp, "set xrange [%lf:%lf]Y=n",a0,a1);fprintf(gp, "set yrange [%lf:%lf]Y=n",b0,b1);fprintf(gp, "set zrange [%lf:%lf]Y=n",u min,u max);fprintf(gp, "set xlabel Y="x\"Y=n");fprintf(gp, "set ylabel Y="y\"Y=n");

102

Page 105: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

fprintf(gp, "set zlabel Y="u\"Y=n");fprintf(gp, "set palette rgbformulae 33,13,10Y=n");fprintf(f2, "clearY=n");fprintf(f2, "resetY=n");fprintf(f2, "set xrange [%lf:%lf]Y=n",a0,a1);fprintf(f2, "set yrange [%lf:%lf]Y=n",b0,b1);fprintf(f2, "set zrange [%lf:%lf]Y=n",u min,u max);fprintf(f2, "set xlabel Y="x\"Y=n");fprintf(f2, "set ylabel Y="y\"Y=n");fprintf(f2, "set zlabel Y="u\"Y=n");fprintf(f2, "set palette rgbformulae 33,13,10Y=n");for(n = 0; n <= iter; n++)

fprintf(gp, "splot Y="%s/%s %.3d.plt\" title Y="t = %lf\"with lines palY=n",argv[1],argv[1],n,n∗step∗tau);

fflush(gp);fprintf(gp, "pause %lfY=n",pause interval);fprintf(f2, "set terminal pngY=n");fprintf(f2, "set output Y="%s %.3d.png\"Y=n",argv[1],n);fprintf(f2, "splot Y="%s %.3d.plt\" title Y="t = %lf\" with lines palY=n",

argv[1],n,n∗step∗tau);fprintf(f2, "set terminal winY=n");

pclose(gp);

/∗ ∗/fclose(f2);

/∗ end ∗/return 1;

(b) ADIスキーム

引き続き (5.1)を解くために,ADIスキーム(Ix + µxAz)u

(n+ 12 )

j = p(n)j + τ

2f(n)j (1 ≤ j ≤ Ny),

(Iy + µyAy)v(n+1)i = q

(n+ 12 )

i + τ2g

(n+1)i (1 ≤ i ≤ Nx),

u(0) = a.

(5.9)

を適用するプログラム例をソースコード 13(adi11.c)に示す.記号は,すべて §5(b)で定義した通り.実行方法は,heat71.cと同じである.

ソースコード 13 空間 2次元熱方程式の ADIスキーム adi11.c

/∗ program adi11.c ∗//∗ 2011.11.26: N. Saito ∗/#include<stdio.h>#include<stdlib.h>

103

Page 106: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

#include<math.h>#define GNUPLOT PATH "c:/gnuplot/binary/pgnuplot -persist"

/∗ #define GNUPLOT PATH ”gnuplot −persist” ∗/#define MAX(x,y) ((x) > (y) ? (x) : (y))#define MIN(x,y) ((x) < (y) ? (x) : (y))#define DIM 110 /∗ maximun number of unknowns ∗/#define PI M PI

/∗ functions ∗/void decomp(int, double ∗, double ∗, double ∗);void solve(int, double ∗, double ∗, double ∗, double ∗);double u0(double, double);double func f(double, double, double);

/∗ initial value ∗/double u0(double x, double y)

return sin(PI∗x)∗sin(PI∗y);

/∗ righthand side function ∗/double func f(double x, double y, double t)

return (1.0 + 2.0∗PI∗PI)∗sin(PI∗x)∗sin(PI∗y)∗exp(t);

/∗ LU decomposition ∗/void decomp(int N, double ∗p, double ∗q, double ∗r)

int i;/∗ forward elimination ∗/for (i = 2; i <= N; i++)

p[i] = p[i]/q[i−1];q[i] = q[i] − r[i−1]∗p[i];

/∗ Solve ∗/void solve(int N, double ∗p, double ∗q, double ∗r, double ∗u)

int i;/∗ Lc = g ∗/for (i = 2; i <= N; i++)

u[i] = u[i] − u[i−1]∗p[i];/∗ Uu = c ∗/u[N] = u[N]/q[N];for (i = N−1; i >= 1; i−−)

u[i] = (u[i] − r[i]∗u[i+1])/q[i];

104

Page 107: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ main ∗/int main(argc,argv)int argc;char ∗∗argv;

FILE ∗f1, ∗f2, ∗gp;int i, j, n, Nx, Ny, m, step num, step, iter;double tau, tau2, mux, muy, mumux, mumuy, mu, hx, hy, Tmax, t, tm1;double k, u min, u max, time interval, pause interval;double a0, a1, b0, b1;double u[DIM][DIM], u new[DIM][DIM];double ax[DIM], bx[DIM], cx[DIM], ay[DIM], by[DIM], cy[DIM];double uj[DIM], vi[DIM], X[DIM], Y[DIM];char res1[20], res2[20];

/∗ input parameters ∗/Nx = Ny = atoi(argv[2]);mu = atof(argv[3]);Tmax = atof(argv[4]);

/∗ parameters ∗/k = 1.0;a0 = b0 = 0.0;a1 = b1 = 1.0;hx = (a1 − a0)/(Nx + 1);hy = (b1 − b0)/(Ny + 1);if(Nx >= Ny)

mux = mu;tau = (2.0/k)∗mux∗hx∗hx;muy = k∗tau/(2.0∗hy∗hy);

else muy = mu;tau = (2.0/k)∗muy∗hy∗hy;mux = k∗tau/(2.0∗hx∗hx);

m = (int)(Tmax/tau);step num = 50;step = m/step num;if(step == 0) step = 1;time interval = 10.0; /∗ seconds ∗/

/∗ initialization ∗/u min = u max = 0.0;for(i = 0; i <= Nx + 1; i++)

X[i] = i∗hx;for(j = 0; j <= Ny + 1; j++)

Y[j] = j∗hy;u[i][j] = u0(X[i], Y[j]);u min = MIN(u[i][j], u min);u max = MAX(u[i][j], u max);

105

Page 108: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

/∗ results: t = 0 ∗/iter = 0;sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);f1 = fopen(res1,"w");t = 0.0;fprintf(f1,"# t = %lfY=n", t);for(i = 0; i <= Nx + 1; i++)

for(j = 0; j <= Ny + 1; j++) fprintf(f1,"%lf %lf %lfY=n", X[i], Y[j], u[i][j]);

fprintf(f1,"Y=n");

fclose(f1);

/∗ parameters ∗/mumux = 1 − 2.0∗mux;mumuy = 1 − 2.0∗muy;tau2 = tau/2.0;

/∗ coefficient matrix: Hx ∗/for(i = 1; i <= Nx; i++)

ax[i] = cx[i] = −mux;bx[i] = 1.0 + 2.0∗mux;

ax[1] = cx[Nx] = 0.0;

/∗ coefficient matrix: Hy ∗/for(i = 1; i <= Ny; i++)

ay[i] = cy[i] = −muy;by[i] = 1.0 + 2.0∗muy;

ay[1] = cy[Ny] = 0.0;

/∗ LU decomposition of Hx and Hy ∗/decomp(Nx, ax, bx, cx);decomp(Ny, ay, by, cy);

/∗ iteration ∗/for(n = 1; n <= m; n++)

/∗ current time ∗/tm1 = t;t = n∗tau;

/∗ solve the first equations ∗/for(j = 1; j <= Ny; j++)

/∗ right−hand side vector ∗/

106

Page 109: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

for(i = 1; i <= Nx; i++)uj[i] = mumuy∗u[i][j] + muy∗(u[i][j−1] + u[i][j+1]) + tau2∗func f(X[i], Y[j], tm1);

/∗ Solve Hx u j = p j ∗/solve(Nx, ax, bx, cx, uj);

/∗ set global array ∗/for(i = 1; i <= Nx; i++)

u new[i][j] = uj[i];

/∗ u[i][j] = uˆn + 1/2[i][j] ∗/for(i = 1; i <= Nx; i++)

for(j = 1; j <= Ny; j++)u[i][j] = u new[i][j];u min = MIN(u[i][j], u min);u max = MAX(u[i][j], u max);

/∗ solve the second equations ∗/for(i = 1; i <= Nx; i++)

/∗ right−hand side vector ∗/for(j = 1; j <= Ny; j++)

vi[j] = mumux∗u[i][j] + mux∗(u[i−1][j] + u[i+1][j]) + tau2∗func f(X[i], Y[j], t);

/∗ Solve Hy v i = q i ∗/solve(Ny, ay, by, cy, vi);

/∗ set global array ∗/for(j = 1; j <= Ny; j++)

u new[i][j] = vi[j];

/∗ u[i][j] = uˆn+1[i][j] ∗/for(i = 1; i <= Nx; i++)

for(j = 1; j <= Ny; j++)u[i][j] = u new[i][j];u min = MIN(u[i][j], u min);u max = MAX(u[i][j], u max);

/∗ results: t = l∗step∗tau ∗/if(n%step == 0)

iter++;

107

Page 110: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

sprintf(res1,"%s/%s_%.3d.plt",argv[1],argv[1],iter);f1 = fopen(res1,"w");fprintf(f1,"# t = %lfY=n", t);for(i = 0; i <= Nx + 1; i++)

for(j = 0; j <= Ny + 1; j++) fprintf(f1,"%lf %lf %lfY=n", X[i], Y[j], u[i][j]);

fprintf(f1,"Y=n");

fclose(f1);

/∗ gnuplot load file −> file name: argv[1].gnu ∗/sprintf(res2,"%s/%s.gnu",argv[1],argv[1]);if((f2 = fopen(res2,"w")) == NULL)

fprintf(stderr,"Can’t open %s",argv[1]);exit(1);

/∗ gnuplot ∗/pause interval = time interval/step num;u min = u min − 0.05∗fabs(u min);u max = u max + 0.05∗fabs(u max);gp = popen(GNUPLOT PATH,"w");fprintf(gp, "set xrange [%lf:%lf]Y=n",a0,a1);fprintf(gp, "set yrange [%lf:%lf]Y=n",b0,b1);fprintf(gp, "set zrange [%lf:%lf]Y=n",u min,u max);fprintf(gp, "set xlabel Y="x\"Y=n");fprintf(gp, "set ylabel Y="y\"Y=n");fprintf(gp, "set zlabel Y="u\"Y=n");fprintf(gp, "set palette rgbformulae 33,13,10Y=n");fprintf(f2, "clearY=n");fprintf(f2, "resetY=n");fprintf(f2, "set xrange [%lf:%lf]Y=n",a0,a1);fprintf(f2, "set yrange [%lf:%lf]Y=n",b0,b1);fprintf(f2, "set zrange [%lf:%lf]Y=n",u min,u max);fprintf(f2, "set xlabel Y="x\"Y=n");fprintf(f2, "set ylabel Y="y\"Y=n");fprintf(f2, "set zlabel Y="u\"Y=n");fprintf(f2, "set palette rgbformulae 33,13,10Y=n");for(n = 0; n <= iter; n++)

fprintf(gp, "splot Y="%s/%s %.3d.plt\" title Y="t = %lf\"with lines palY=n",argv[1],argv[1],n,n∗step∗tau);

fflush(gp);fprintf(gp, "pause %lfY=n",pause interval);fprintf(f2, "set terminal pngY=n");fprintf(f2, "set output Y="%s %.3d.png\"Y=n",argv[1],n);fprintf(f2, "splot Y="%s %.3d.plt\" title Y="t = %lf\" with lines palY=n",

argv[1],n,n∗step∗tau);fprintf(f2, "set terminal winY=n");

108

Page 111: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

pclose(gp);

/∗ ∗/fclose(f2);

/∗ end ∗/return 1;

問題 C.2. adi11.cを実行せよ.

109

Page 112: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

D サンプルプログラム一覧プログラム名 説明 備考

heat11.c §2(b) (1.5)に対する陽的スキームheat12.c §2(b) (1.5)に対する陽的スキームlu1.c §2(f) LU分解と Gaussの消去法lu2.c §2(f) LU分解と Gaussの消去法heat21.c §2(d) (1.5)に対する陰的 θ スキームheat31.c §2(e) (1.6)に対する陰的 θ スキームheat41.c §B(a) (1.6)に対する陰的 θ スキーム + コマンド行引数heat42.c §B(a) (1.6)に対する陰的 θ スキーム + コマンド行引数 + gnuplot

heat51.c §B(b) (1.6)に対する陰的 θ スキーム + アニメーションheat52.c §B(b) (1.6)に対する陰的 θ スキーム + アニメーション + 画像の保存heat71.c §5(a) (5.1)に対する陽的スキーム + アニメーション + 画像の保存heat72.c §5(a) (5.1)に対する陽的スキーム + アニメーション + 画像の保存adi11.c §5(b) (5.1)に対する ADIスキーム + アニメーション + 画像の保存

ダウンロードするには,

http://www.infsup.jp/saito/sample/heat11.c

などにアクセスする.

110

Page 113: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

E 課題(a)

Ω = (0, 1) × (0, 1)で半線形熱方程式ut = k(uxx + uyy) + u(1 − u) ((x, y) ∈ Ω, 0 < t < T )u(x, y, t) = 0 ((x, y) ∈ ∂Ω, t > 0)u(x, y, 0) = 0.5 sin(πx) sin(πy) ((x, y) ∈ Ω)

を考える.これを ADI スキームで解け.特に,k = 0.01 ∼ 0.1 の範囲で計算を実行して,解 u = u(x, y, t)の t → ∞での挙動を調べよ.参考のため,adi11.cからの変更点のみ列挙する (実行の仕方は adi11.cと同じ):

.................

.................

double func_f(double);

.................

.................

/* righthand side function */

double func_f(double u)

return u*(1.0 - u);

.................

.................

/* input parameters */

Nx = Ny = atoi(argv[2]);

mu = atof(argv[3]);

Tmax = atof(argv[4]);

k = atof(argv[5]);

/* parameters */

/* k = 1.0;*/

a0 = b0 = 0.0;

a1 = b1 = 1.0;

.................

.................

/* initialization */

u_min = u_max = 0.0;

for(i = 0; i <= Nx + 1; i++)

111

Page 114: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

X[i] = i*hx;

for(j = 0; j <= Ny + 1; j++)

Y[j] = j*hy;

u[i][j] = 0.5*u0(X[i], Y[j]);

.................

.................

/* right-hand side vector */

for(i = 1; i <= Nx; i++)

uj[i] = mumuy*u[i][j] + muy*(u[i][j-1] + u[i][j+1]) + tau2*func_f(u[i][j]);

.................

.................

/* right-hand side vector */

for(j = 1; j <= Ny; j++)

vi[j] = mumux*u[i][j] + mux*(u[i-1][j] + u[i+1][j]) + tau2*func_f(u[i][j]);

.................

.................

これを実行するには次のようにする (変更を加えたプログラム名を adi12.cとする,計算結果を保存するフォルダを adat12とする).

$ mkdir adat12

$ gcc adi12.c -o adi12

$ ./adi12.exe adat12 31 0.1 2.0 0.05

これで,Nx = Ny = 31,µx = µy = 0.1,T = 2.0,k = 0, 05の場合の計算が実行される.

(b)

前の問題で,初期値を a(x, y) = ε sin(πx) sin(πy)として,εを 0.2 ∼ 3の範囲で動かして,前の問題と同様の計算と考察を行え.参考のため,変更点のみ列挙する:

.................

.................

double a0, a1, b0, b1, ep;

double u[DIM][DIM], u_new[DIM][DIM];

.................

.................

/* input parameters */

Nx = Ny = atoi(argv[2]);

112

Page 115: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

mu = atof(argv[3]);

Tmax = atof(argv[4]);

k = atof(argv[5]);

ep = atof(argv[6]);

/* parameters */

/* k = 1.0;*/

a0 = b0 = 0.0;

a1 = b1 = 1.0;

.................

.................

/* initialization */

u_min = u_max = 0.0;

for(i = 0; i <= Nx + 1; i++)

X[i] = i*hx;

for(j = 0; j <= Ny + 1; j++)

Y[j] = j*hy;

u[i][j] = ep*u0(X[i], Y[j]);

u_min = MIN(u[i][j], u_min);

u_max = MAX(u[i][j], u_max);

これを実行するには次のようにする (変更を加えたプログラム名を adi13.c,計算結果を保存するフォルダを adat13とする).

$ mkdir adat13

$ gcc adi13.c -o adi13

$ ./adi13.exe adat13 31 0.1 2.0 0.05 1.2

これで,Nx = Ny = 31,µx = µy = 0.1,T = 2.0,k = 0, 05,ε = 1.2の場合の計算が実行される.

113

Page 116: 線形・非線形拡散方程式の差分解法と解の可視化infsup.jp/saito/materials/fdm_heat11b.pdf · 空間多次元(2, 3 次元) の熱方程式を導け. 問題1.2

参考文献[1] W. F. Ames: Nonlinear Partial Differential Equations in Engineering, Academic

Press, Vol. I: 1965, Vol. II: 1972. (三村昌泰,小西芳雄訳: 工学における非線形偏微分方程式 I上下, II,産業図書)

[2] L. C. Evans: Partial Differential Equations, American Mathematical Society, 1998.

[3] 藤田宏,池部晃生,犬井鉄郎,高見穎郎:数理物理に現れる偏微分方程式 I [岩波講座基礎数学,解析学 II-iv],岩波書店,1977年.

[4] 亀高惟倫:非線型偏微分方程式,産業図書,1977年.[5] 菊地文雄,山本 昌宏:微分方程式と計算機演習,山海堂,1991年.[6] 三村昌泰:微分方程式と差分方程式—数値解は信用できるか?—,「数値解析と非線形現象 (山口昌哉編)」の第 3章,日本評論社,1996年 (オリジナルは 1981年).

[7] 三村昌泰 (編): パターン形成とダイナミクス (非線形・非平衡現象の数理 4),東京大学出版会,2006年

[8] 皆本晃弥:C言語による数値計算入門 — 解法・アルゴリズム・プログラム,サイエンス社,2005年.

[9] 皆本晃弥:やさしく学べる C言語入門 — 基礎から数値計算入門まで,サイエンス社,2004年.

[10] W. H. Press, W. T. Vetterling, S. A. Teukolsky and B. P. Flannery: Numerical

Recipes in C: The Art of Scientific Computing, Cambridge Univ. Press, (2nd edit.)

1993. ニューメリカルレシピ・イン・シー (日本語版—C 言語による数値計算のレシピ),丹慶勝市, 佐藤俊郎, 奥村晴彦, 小林誠 (訳),技術評論社,1993年.

[11] 齊藤宣一: 非線形拡散方程式に対する差分法 (愛媛大学集中講義ノート),2007 年,http://www.infsup.jp/saito/

[12] 齊藤宣一: 有限要素法と非線形楕円型方程式の解の可視化 (首都大学東京集中講義ノート),2009年,http://www.infsup.jp/saito/

[13] 齊藤宣一: 数値解析入門,東京大学出版会,2012年出版予定.[14] G. D. Smith: Numerical Solution of Partial Differential Equations, Oxford Univer-

sity Press, 1965. (藤川洋一郎訳:コンピュータによる偏微分方程式の解法,新訂版,サイエンス社,1996年)

[15] 杉原正顯,室田一雄,線形計算の数理,岩波書店,2009年.[16] 田端正久: 偏微分方程式の数値解析,岩波書店, 2010年.

[17] 山口昌哉:非線型現象の数学,復刊版,基礎数学シリーズ,朝倉書店,2005年.(オリジナルは 1972年)

[18] 山本哲朗:数値解析入門 [増訂版],サイエンス社,2003年.

114