27
12 1 を題 にして ~ 大学 2014 9 18 ( 大学 ) 12 2014 9 18 1 / 20

現象と数学 12 微分方程式の数値計算nalab.mind.meiji.ac.jp/~mk/20140918/20140918.pdf · はじめに 当初の予定では 音の作る模様: 微分方程式によるクラドニ図形の解析

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

現象と数学 12微分方程式の数値計算

~ 1次元波動方程式を題材にして ~

桂田 祐史

明治大学現象数理学科

2014年 9月 18日

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 1 / 20

はじめに

当初の予定では

音の作る模様: 微分方程式によるクラドニ図形の解析

という内容の講義をする予定でしたが、各自で数値計算を試せる方が良い、と考え直して、内容を入れ替えます。

この講演資料 (20140918.pdf) は

http://nalab.mind.meiji.ac.jp/~mk/20140918/

にあるので、保存してプレビューで表示し、適宜コピー&ペーストして使って下さい。

Mathematica を使います。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 2 / 20

今日の主役 — 1次元波動方程式

張られた弦の振動は次の 1次元波動方程式 (wave equation) で記述できる。

(WE)∂2u

∂t2(x , t) = c2

∂2u

∂x2(x , t).

u(x , t) 釣り合いの状態で x 軸上の点 x にある弦の、時刻 t での変位

c 正定数 (線密度 ρ, 張力 T が与えられると c =√

Tρ )

なぜこうなる?

… 今日は省略∂2u∂x2は、x 7→ u(x , t) のグラフが x の近傍で下に凸なら正、上に凸なら負

で、復元する向きの力が働くことを意味する

アナロジー:d2x

dt2= −ω2x (単振動の方程式)

この解は x(t) = A cosωt + B sinωt

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 3 / 20

今日の主役 — 1次元波動方程式

張られた弦の振動は次の 1次元波動方程式 (wave equation) で記述できる。

(WE)∂2u

∂t2(x , t) = c2

∂2u

∂x2(x , t).

u(x , t) 釣り合いの状態で x 軸上の点 x にある弦の、時刻 t での変位

c 正定数 (線密度 ρ, 張力 T が与えられると c =√

Tρ )

なぜこうなる? … 今日は省略∂2u∂x2は、x 7→ u(x , t) のグラフが x の近傍で下に凸なら正、上に凸なら負

で、復元する向きの力が働くことを意味する

アナロジー:d2x

dt2= −ω2x (単振動の方程式)

この解は x(t) = A cosωt + B sinωt

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 3 / 20

ダランベール (d’Alembert) の解

任意の関数 f , g に対して

(D) u(x , t) := f (x − ct) + g(x + ct)

は (WE) ∂2u∂t2

= c2 ∂2u

∂x2の解である。

問 1 確認せよ。 ヒント: 一般に {(F (ax + b)}′ = aF ′(ax + b)

実は逆に (WE) の任意の解 u は適当な f , g を取れば (D) の形に表せる。どうして? … 今日は省略 (これも微積分で済む話だけど)

— つまり (D) は (WE) の一般解である。ダランベールの解と呼ばれる。

f (x − ct) は時刻 t = 0 で f (x) だったものが速度 c で動く。g(x + ct) は時刻 t = 0 で g(x) だったものが速度 −c で動く。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 4 / 20

ダランベール (d’Alembert) の解

任意の関数 f , g に対して

(D) u(x , t) := f (x − ct) + g(x + ct)

は (WE) ∂2u∂t2

= c2 ∂2u

∂x2の解である。

問 1 確認せよ。 ヒント: 一般に {(F (ax + b)}′ = aF ′(ax + b)

実は逆に (WE) の任意の解 u は適当な f , g を取れば (D) の形に表せる。どうして?

… 今日は省略 (これも微積分で済む話だけど)

— つまり (D) は (WE) の一般解である。ダランベールの解と呼ばれる。

f (x − ct) は時刻 t = 0 で f (x) だったものが速度 c で動く。g(x + ct) は時刻 t = 0 で g(x) だったものが速度 −c で動く。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 4 / 20

ダランベール (d’Alembert) の解

任意の関数 f , g に対して

(D) u(x , t) := f (x − ct) + g(x + ct)

は (WE) ∂2u∂t2

= c2 ∂2u

∂x2の解である。

問 1 確認せよ。 ヒント: 一般に {(F (ax + b)}′ = aF ′(ax + b)

実は逆に (WE) の任意の解 u は適当な f , g を取れば (D) の形に表せる。どうして? … 今日は省略 (これも微積分で済む話だけど)

— つまり (D) は (WE) の一般解である。ダランベールの解と呼ばれる。

f (x − ct) は時刻 t = 0 で f (x) だったものが速度 c で動く。g(x + ct) は時刻 t = 0 で g(x) だったものが速度 −c で動く。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 4 / 20

ダランベールの解を見る

Mathematica でやってみよう� �Clear[p,f,g,c,u];

p[x_]:=If[Abs[x]<1, (x^2-1)^4, 0];

f[x_]:=p[10(x-0.2)];

g[x_]:=-2*p[10(x-0.7)];

c=1;

u[x_,t_]:=f[x-c*t]+g[x+c*t];

Animate[Plot[u[x,t],{x,0,1},PlotRange->{-2,2}],{t,0,2}]� �p[], f[], g[] のグラフも描いてみよう (PlotRange-> が要るかも)。

-2 -1 1 2

0.2

0.4

0.6

0.8

1.0

0.2 0.4 0.6 0.8 1.0

-2

-1

1

2

Figure: p のグラフ と u[ ,0] のグラフ

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 5 / 20

有限の長さの弦では…

実は上の話は無限の長さの弦の話。有限の長さの弦では、弦の端で波の反射が起こる。

長さ 1の弦の両端を固定する場合

∂2u

∂t2(x , t) = c2

∂2u

∂x2(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)

WE wave equation (波動方程式)DBC Dirichlet boundary condition (ディリクレ境界条件)IC initial condition (初期条件)

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 6 / 20

フーリエ級数による解 — 答をカンニング

フーリエ級数を使えば解が書ける:

u(x , t) =∞∑n=1

(an cos cnπt + bn sin cnπt) sin nπx ,

an = 2

∫ 1

0ϕ(x) sin nπx dx , bn =

2

cnπ

∫ 1

0ψ(x) sin nπx dx

どうしてこうなる?

今日は説明しない (短時間ではとても説明しきれない)。ひょっとするとさわりは聴いた人もいるかも。奇跡のような話なので、一度はゆっくり勉強することを勧める。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 7 / 20

フーリエ級数による解 — 答をカンニング

フーリエ級数を使えば解が書ける:

u(x , t) =∞∑n=1

(an cos cnπt + bn sin cnπt) sin nπx ,

an = 2

∫ 1

0ϕ(x) sin nπx dx , bn =

2

cnπ

∫ 1

0ψ(x) sin nπx dx

どうしてこうなる?

今日は説明しない (短時間ではとても説明しきれない)。ひょっとするとさわりは聴いた人もいるかも。奇跡のような話なので、一度はゆっくり勉強することを勧める。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 7 / 20

簡単な場合のフーリエ級数による解を見てみる

c = 1, ϕ(x) = sinπx , ψ(x) =3π

2sin 3πx

とすると

a1 = 1, b3 =1

2, その他の an=0, bn = 0

となって級数は実質 2項だけの和になる:

u(x , t) = cosπt sinπx +1

2sin 3πt sin 3πx .

Mathematica で見てみよう� �Clear[u];

a = 1; b = 1/2; m = 1; n = 3;

u[x_,t_]:=a Cos[m Pi t]Sin[m Pi x]+b Sin[n Pi t]Sin[n Pi x];

Animate[Plot[u[x,t],{x,0,1},PlotRange->{-2,2}],

{t,0,2},AnimationRate->0.2]� �注: u(x , t) は t について周期 2 なので {t,0,2} で十分。桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 8 / 20

反省

簡単?

ϕ, ψ が特殊だったから簡単になっただけ。ϕ, ψ を勝手に取ると (例えば ϕ(x) = p(5(x − 0.2))− 2p(5(x − 0.7)) 等)、無限個の項の和の計算が必要で計算は難しくなる。

1次元波動方程式の初期値境界値問題は、厳密解がフーリエ級数で表す公式があって解決、ということになっているが、実際の解の様子を見るにはそれほど使いやすくない。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 9 / 20

反省

簡単?

ϕ, ψ が特殊だったから簡単になっただけ。ϕ, ψ を勝手に取ると (例えば ϕ(x) = p(5(x − 0.2))− 2p(5(x − 0.7)) 等)、無限個の項の和の計算が必要で計算は難しくなる。

1次元波動方程式の初期値境界値問題は、厳密解がフーリエ級数で表す公式があって解決、ということになっているが、実際の解の様子を見るにはそれほど使いやすくない。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 9 / 20

差分法 (1) 格子点

考えている範囲 {(x , t) | 0 ≤ x ≤ 1, t ≥ 0} を格子に分割し、格子点

(xi , tn), xi = i∆x , tn = n∆t, ∆x =1

N, ∆t > 0

での値 uni = u(xi , tn) を求めることを考える。

0 1 x

t

x0 = 0, xN = 1, xN/2 = 1/2, t0 = 0 等に注意。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 10 / 20

差分法 (2) 差分方程式

(WE) ∂2u∂t2

= c2 ∂2u

∂x2の導関数を差分商で近似すると

un+1i − 2uni + un−1

i

∆t2= c2

uni+1 − 2uni + uni−1

∆x2.

分母を払って λ := c∆t

∆xとおき、移項すると

(♯) un+1i = 2

(1− λ2

)uni + λ2

(uni+1 + uni−1

)− un−1

i (1 ≤ i ≤ N − 1).

(DBC) u(0, t) = u(1, t) = 0 から u(x0, tn) = u(xN , tn) = 0 なので

(♭) un0 = unN = 0.

n = 0 と n = 1 に対して uni が求まれば、後は (♯), (♭) を用いてn = 2, 3, . . . の順に計算出来る。(Cf. フィボナッチ数列 an+1 = an+an−1)

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 11 / 20

差分法 (2) 差分方程式

(WE) ∂2u∂t2

= c2 ∂2u

∂x2の導関数を差分商で近似すると

un+1i − 2uni + un−1

i

∆t2= c2

uni+1 − 2uni + uni−1

∆x2.

分母を払って λ := c∆t

∆xとおき、移項すると

(♯) un+1i = 2

(1− λ2

)uni + λ2

(uni+1 + uni−1

)− un−1

i (1 ≤ i ≤ N − 1).

(DBC) u(0, t) = u(1, t) = 0 から u(x0, tn) = u(xN , tn) = 0 なので

(♭) un0 = unN = 0.

n = 0 と n = 1 に対して uni が求まれば、後は (♯), (♭) を用いてn = 2, 3, . . . の順に計算出来る。(Cf. フィボナッチ数列 an+1 = an+an−1)

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 11 / 20

差分法 (3) 初期条件から u0i , u1i を定める

u(x , 0) = ϕ(x) から

u0i = u(xi , t0) = ϕ(xi ) = ϕ(i∆x).

∂u∂t (x , 0) = ψ(x) から

u1i = u(xi , t1) = u(xi ,∆t)

≒ u(xi , 0) + ∆t∂u

∂t(xi , 0)

= ϕ(xi ) + ∆t ψ(xi ).

u0i , u1i は簡単に計算出来ることが分かる。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 12 / 20

Mathematica で差分解を計算して見てみよう(あまりきれいなプログラムとは言えない…)

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]

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 13 / 20

プログラムの簡単な解説

(♯) から un+1i (1 ≤ i ≤ N − 1) が求まるが、v に入れておく。

v1v2...

vN−1

= 2(1− λ2)

un1un2...

unN−1

+ λ2

un0un1...

unN−2

+

un2un3...unN

un−11

un−12...

un−1N−1

,

(♭) から、最初と最後に 0 を埋めれば良いことが分かる:

un+10

un+11

un+12...

un+1N−1

un+1N

=

0v1v2...

vN−1

0

.

Take[] (リストの部分を取る), Append[] (リストの末尾に加える),Prepend[] (リストの先頭に加える) などは Mathematica のヘルプ参照桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 14 / 20

レポート課題 問 2

( 問 1 も忘れずに)

f (x) = p(10(x − 0.5)) で定まる f は f (x) = 0 (∣∣x − 1

2

∣∣ > 0.1) を満たすことに注意する。

問 2 t = 0 のとき f に一致して、最初のうちは右方向に進む波、つまり

(⋆) u(x , t) = f (x − ct) (t が小さいうち)

となる解 u をシミュレートしてみたい。(波が端に到達しないうちは、無限の長さの弦と同じで、こういう式で表される解があるだろう。)

(1) (⋆) と (IC) を用いて、ϕ と ψ を f で表せ。

(2) プログラムの phi[], psi[] を、(1) で求めた ϕ, ψ を計算するように書き換える (p の導関数が必要になる)。

(3) プログラムを実行して、どうなるか調べ、簡単に説明する。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 15 / 20

レポートの提出の仕方, 取り組み方

レポート提出 BOX に投函する。

問 1, 問 2 (1) は微積分の計算のみで出来る。関係する式をノートに書き並べて考えること。

問 2 (2) では、f の導関数が必要になる。f (x) = p(10(x − 0.5)) と、

p の定義式 p(x) =

{(x2 − 1)4 (|x | < 1)0 (|x | ≥ 1)

を思い出して、ϕ と ψ

をどう計算すれば良いか調べる。phi[], psi[] がその ϕ, ψ を計算するようにプログラムを書き換える (nextu[] をいじる必要はないはず)。

プログラムの書きかえが正しいかどうか、実行してみれば明らかに分かる。

この問題は決して Mathematica 向きというわけではないので (苦し紛れのプログラム)、C, Java, Processing 等々、自分の好きなプログラミング言語でやっても構わない (サンプル・プログラムをたたき台にする方が早く試せるとは思うけれど)。桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 16 / 20

もし余裕があれば (あるいは後から) もっと遊べる

g を自由に与えて、u(x , t) = f (x − ct) + g(x + ct) という右に進む成分と左に進む成分がある場合を計算してみよう。

端が自由端である場合、つまり (DBC) の代わりに Neumann 境界条件

(NBC)∂u

∂x(0, t) =

∂u

∂x(1, t) = 0

である場合を計算してみよ。波の反射の様子がどのように変わるか。

上では λ を 1 としたが、その前後の値に変えて計算してみる。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 17 / 20

まとめ

1次元波動方程式を題材に微分方程式のシミュレーションを行なった。

無限の長さの弦では反射が起こらないので、数値計算が必要ないくらい簡単な公式 (ダランベールの公式) がある。

有限の長さの弦の場合、端で波の反射が起こる。フーリエ級数で解が表せるが、無限項必要になるのが普通であり、計算は簡単ではない。

差分法により能率良く解が計算出来て、(Fourier 級数ではやりにくかった) 色々なシミュレーションが可能である。

(数値計算の一番の利点は、厳密解が求まらないような場合にも、数値シミュレーションが出来ることにあると考えられるが、厳密解が求まっている場合にも有用である。)

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 18 / 20

まとめ

1次元波動方程式を題材に微分方程式のシミュレーションを行なった。

無限の長さの弦では反射が起こらないので、数値計算が必要ないくらい簡単な公式 (ダランベールの公式) がある。

有限の長さの弦の場合、端で波の反射が起こる。フーリエ級数で解が表せるが、無限項必要になるのが普通であり、計算は簡単ではない。

差分法により能率良く解が計算出来て、(Fourier 級数ではやりにくかった) 色々なシミュレーションが可能である。

(数値計算の一番の利点は、厳密解が求まらないような場合にも、数値シミュレーションが出来ることにあると考えられるが、厳密解が求まっている場合にも有用である。)

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 18 / 20

おまけ: 桂田の研究室では

比較的最近の (数学科)卒研生の卒業研究レポートのタイトルから

「楕円体の酒場」3次元波動方程式の解の数値計算。楕円形の酒場では盗み聞きが出来るというけれど…

「代用電荷法による正則関数の有理関数近似」正則関数 (複素関数論の主役) を

∑Nk=1

Qk

z−ζkという形の (Cauchy積分公式

似の) 関数で近似する方法の数学的解析。

「Ritz 法による Chladni 図形の数値計算」

板の振動もある種の波動方程式∂2u

∂t2= −c2△2u に従うが、板の上に粉を

まいたときに現れるクラドニ図形と呼ばれるパターンを数値計算することで法則性を調べる。

「建部賢弘の日本最初の冪級数展開」江戸時代の和算家は数値計算をすることで色々な数学的事実を「帰納的に解明した」 (証明したわけではない)。彼らのした仕事を解読する。

実際に数値計算を行い、本当だろうか、なぜだろう、に迫る。

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 19 / 20

差分商

f ′(x) = limh→0

f (x + h)− f (x)

hから示唆されるように、|h| が小さいとき

f ′(x) ≒ f (x + h)− f (x)

h(前進差分近似)

と期待できる。同様に

f ′(x) ≒ f (x)− f (x − h)

h(後退差分近似),

f ′(x) ≒ f (x + h/2)− f (x − h/2)

h(中心差分近似), . . .

2階微分 f ′′(x) についても

f ′′(x) ≒ f (x + h)− 2f (x) + f (x − h)

h2.

(中心差分近似を 2回続けたf (x+h/2+h/2)−f (x−h/2+h/2)

h− f (x+h/2−h/2)−f (x−h/2−h/2)

hh )

桂田 祐史 (明治大学現象数理学科) 現象と数学 12 微分方程式の数値計算 2014 年 9 月 18 日 20 / 20