微分方程式の数値計算
〜1次元波動方程式を題材にして 〜
桂田 祐史 2014 年 9 月 18 日
講演資料は
http://nalab.mind.meiji.ac.jp/~mk/20140918/
にあるファイル
20140918.pdf (nalab
のl
はL
の小文字)。Safari
で直接読めなくはないが、プログラムのコピー&ペーストがしにくいので、control+クリックで保存して、プレビューで読むことを勧める。
問
1
では次の微分方程式を考えている。(WE) ∂
2u
∂t
2(x, t) = c
2∂
2u
∂x
2(x, t) (x ∈ R , t > 0).
ただし
c
は正定数である(実は波の速さを表す)。
問
1
任意の関数f, g
に対して、(D) u(x, t) := f(x − ct) + g(x + ct)
で定まる
u
は(WE)
の解であることを確かめよ。ヒント: 一般に
{ F (ax + b) }
′= aF
′(ax + b).
だから例えば∂
∂t F (at + bx) = aF
′(at + bx).
問
2
では、xの範囲を0 ≤ x ≤ 1
に限定した次の問題を考えている。∂
2u
∂t
2(x, t) = c
2∂
2u
∂x
2(x, t) (0 < x < 1, t > 0) (WE)
u(0, t) = u(1, t) = 0 (t > 0) (DBC)
u(x, 0) = ϕ(x), ∂u
∂t (x, 0) = ψ(x) (0 ≤ x ≤ 1) (IC)
p
とf
は次式で定まる関数とする。p(x) = {
(x
2− 1)
4( | x | < 1)
0 ( | x | ≥ 1), f (x) = p (
10 (
x − 1 2
))
(0 ≤ x ≤ 1)
1
0.2 0.4 0.6 0.8 1.0 -0.2
0.2 0.4 0.6 0.8 1.0 1.2
図
1: f
のグラフ( x −
12< 0.1
だけ盛り上がっている) たたき台プログラム(山が割れて左右に進む)
Clear[p,f,phi,psi,nextu];
p[x_] := If[Abs[x] < 1, (x^2 - 1)^4, 0];
f[x_] := p[10(x-0.5)];
phi[x_] := f[x];
psi[x_] := 0;
NN = 100; c = 1; lambda = 1; dx = 1.0/NN; dt = lambda*dx/c;
lambda2=lambda^2;
u = Table[phi[i*dx], {i, 0, NN}];
oldu = u;
u = oldu + dt*Table[psi[i*dx], {i, 0, NN}];
nextu[n_] :=
(v = 2*(1 - lambda2)*Take[u, {2, NN}]
+ lambda2*(Take[u, {3, NN + 1}] + Take[u, {1, NN - 1}]) - Take[oldu, {2, NN}];
oldu = u;
u = Append[Prepend[v, 0], 0]
);
Animate[ListPlot[nextu[n], Joined -> True, PlotRange -> {-1.1, 1.1}], {n, 1, Infinity},AnimationRunning->False]
問
2 t = 0
のときf
に一致して、最初のうちは右方向に進む波、つまり(⋆) u(x, t) = f(x − ct) (t
が小さいうち)となる解
u
をシミュレートしてみたい。(波が端に到達しないうちは、無限の長さの弦と同じ で、こういう式で表される解があるだろう。)(1) (⋆)
と(IC)
からϕ
とψ
を求めよ(f
で表せる)。(2)
プログラムのphi[], psi[]
を、(1) で求めたϕ, ψ
を計算するように必要に応じて書き換 える(f , p
の導関数が必要になる)。(3)
プログラムを実行して、どうなるか調べ、簡単に説明する。2