Top Banner
微分方程式・偏微分方程式 田浦健次朗 電子情報工学科 東京大学 1 / 24
25

微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

May 29, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

微分方程式・偏微分方程式

田浦健次朗電子情報工学科

東京大学

1 / 24

Page 2: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

Contents

1 常微分方程式

2 偏微分方程式

2 / 24

Page 3: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

Contents

1 常微分方程式

2 偏微分方程式

3 / 24

Page 4: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

(1階, 1変数, 常)微分方程式を解く

dy

dx= f(x, y),

y(a) = c

y : 未知の, xの関数 (y(x))a, c : 与えられた定数 (初期値)f : 与えられた関数

解釈:

ある xにおける yの値がわかれば右辺が計算できる→ その時点での dy

dx がわかる→ 少し異なる xに対する y (つまり y(x+ h))がわかる

4 / 24

Page 5: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

(1階, 1変数, 常)微分方程式を解く

dy

dx= f(x, y),

y(a) = c

y : 未知の, xの関数 (y(x))a, c : 与えられた定数 (初期値)f : 与えられた関数

解釈:

ある xにおける yの値がわかれば右辺が計算できる→ その時点での dy

dx がわかる→ 少し異なる xに対する y (つまり y(x+ h))がわかる

4 / 24

Page 6: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

離散化

数式で書けば: hを十分小さく取れば,

y(x+ h)− y(x)

h≈ f(x, y(x)) (1)

∴ y(x+ h) ≈ y(x) + f(x, y(x))h

y(a) → y(a+ h) → y(a+ 2h) → · · ·

キーは式 (1)で,元の微分方程式の「離散化」という

5 / 24

Page 7: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

プログラム化

y(x+ h) ≈ y(x) + f(x, y(x))h

プログラムにすると,�1 x = a

2 y = c

3 h = (b - a) / n_steps

4 for i in range(n_steps):

5 y = y + f(x, y) * h

6 x = x + h

誤差の積もりにくい計算の仕方 (離散化の方法)とかありますが,基本はこれだけです!

6 / 24

Page 8: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

よくある状況: xが時刻でyが位置

時刻は t, 位置は uで表すことにする微分方程式 : 時刻と位置 → 速度

du

dt= f(t, u)

離散化 : ある時刻における位置 → 一瞬後の位置

u(t+∆t) ≈ u(t)+f(t, u)∆t

�1 t = a

2 u = c

3 dt = (b - a) / n_steps

4 for i in range(n_steps):

5 # 位置+速度×微小時間6 u = u + f(t, u) * dt

7 t = t + dt

7 / 24

Page 9: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

2階だったら?

力学の多くの微分方程式 (ma = F )は,

加速度 = f(時刻,位置,速度)

x = f(t, x, x)

これのプログラムは�1 t = a

2 u = .. # 初期位置3 v = .. # 初速度4 dt = (b - a) / n_steps

5 for i in range(n_steps):

6 u = u + v * dt

7 v = v + f(t, u, v) * dt

8 t = t + dt

8 / 24

Page 10: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

Contents

1 常微分方程式

2 偏微分方程式

9 / 24

Page 11: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

まだできないこと

これでシミュレートできるのはせいぜい数個の質点 (または数個のパラメータ (e.g., 角度)だけで決まる系)の動き物理の多くの問題で求めたいものは,「時刻」と「場所」の関数 (「場」)

電場,磁場,重力場,鉄板表面の温度,速度の分布,圧力の分布,力の分布,電子の波動関数 (存在確率), . . .記号で書けば(u(t)ではなく),u(x, y, z, t)

別の言い方をすると,時間の関数が無数に (x, y, zごとに)ある

10 / 24

Page 12: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

場を記述する方程式

「時間 (t)」と「場所 (x, y, z)」の関数 u(x, y, z, t)の方程式

または定常状態を求める問題では場所だけの関数u(x, y, z)のこともある

式としては ∂u∂t, ∂u

∂x, ∂u

∂y, などが入り乱れた式 (偏微分方

程式)になる

11 / 24

Page 13: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

物理で目にする例

熱伝導: u(x, y, z, t) = 場所 (x, y, z), 時刻 tにおける温度

c∂u

∂t= λ

(∂2u

∂x2+∂2u

∂y2+∂2u

∂z2

)右辺の (· · · )の部分は他の方程式でも何故か非常によく現れるので,特別な記号 (∆または∇2)が用意されている.

∆u ≡ ∂2u

∂x2+∂2u

∂y2+∂2u

∂z2

これを使えば,

c∂u

∂t= ∆u

12 / 24

Page 14: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

物理で目にする例

マックスウェルの方程式 (真空中)

∇ ·B = 0

∇× E = −∂B∂t

∇ · E =1

ερ

∇×B = µj + µεE

注: B, Eはベクトル場

∇ · u ≡ ∂ux∂x

+∂uy∂y

+∂uz∂z

∇× u ≡ . . .教科書を見ま笑 . . .

(一粒子の)シュレディンガーの方程式

iℏ∂ψ

∂t=

(−ℏ2

2m∇2 + V

13 / 24

Page 15: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

物理で目にする例

流体の速度場の方程式 (ナビエストークス)

∂u

∂t+ (u · ∇)u = −1

ρ∇p+ ν∇2u+ F

波動方程式 (音とか光とか)

1

s2∂2u

∂t2= ∆u

14 / 24

Page 16: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

コワイ??

15 / 24

Page 17: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

しかし恐れる必要はない

根本的な考えは同じ; (常)微分方程式がたくさん並んでいるだけと思えば良い例えば 1次元の場 u(x, t)の方程式が,

∂u

∂t= . . .

と書けているならこれを用いて,

u(0, t)u(0.1, t)u(0.2, t)u(0.3, t)u(0.4, t)

...

u(0, t+∆t)u(0.1, t+∆t)u(0.2, t+∆t)u(0.3, t+∆t)u(0.4, t+∆t)

...

u(0, t+ 2∆t)u(0.1, t+ 2∆t)u(0.2, t+ 2∆t)u(0.3, t+ 2∆t)u(0.4, t+ 2∆t)

...

→ · · ·

という計算をしていくだけ (リストや配列が必須かつ有用) 16 / 24

Page 18: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

ともかく例を見る

簡単のため 1次元空間の例題 (xは単なる実数):∂u

∂t= 3

∂u

∂x(0 < x < 1),

u(0, t) = 0u(1, t) = 0u(x, 0) = f(x)

uは「場所 (x)」と「時刻 (t)」の関数1次元 (xが単なる実数)だから視覚的には,弦が時間につれどう変化していくかを求める問題

x

t = 0

x

t = T

x

t = ∆t

· · ·

17 / 24

Page 19: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

離散化

微分方程式:∂u

∂t= 3

∂u

∂x

離散化:

u(x, t+∆t)− u(x, t)

∆t≈ 3

∂u(x+∆x, t)− u(x, t)

∆x

∴ u(x, t+∆t) ≈ u(x, t) + (u(x+∆x, t)− u(x, t))3∆t

∆x

18 / 24

Page 20: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

離散化

∴ u(x, t+∆t) ≈ u(x, t) + (u(x+∆x, t)− u(x, t))3∆t

∆x

x

∆x

ある時点における自分と,右隣 (+∆x)の人の値がわかれば,自分の一瞬 (+∆t)後の値がわかる

19 / 24

Page 21: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

プログラム化

用意する変数: 先の●たちを格納した一次元の配列 u

uの要素数を nとする

xa b

u[0] u[n-1]

これを踏まえ,更新式

u(x, t+∆t) = u(x, t) + (u(x+∆x, t)− u(x, t))3∆t

∆x

に相当する Pythonのプログラムは?20 / 24

Page 22: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

プログラム化

u(x, t+∆t) = u(x, t) + (u(x+∆x, t)− u(x, t))3∆t

∆x

�1 for i in range(1, n-1):

2 u[i] = u[i] + (u[i+1] - u[i]) * (3*dt/dx)

ポイント: 端の点 (u[0], u[n-1]) はこの式では更新しない.何故か?

21 / 24

Page 23: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

端の点の扱い

一般に端の点の扱いはよく考えて慎重に.いい加減にやるとおかしな結果になるまずプログラム上も,右端の点 (u[n-1])を更新しようとすると困ったことになる�

1 u[n-1] = u[n-1] + (u[n] - u[n-1]) * (3*dt/dx)

uは n要素.u[n]などという要素はないただしそれが u[n-1] を更新しない理由ではない微分方程式に立ち返る

∂u

∂t= 3

∂u

∂x(0<x<1) (2)

そもそも式 (2)は,端点において成り立つとは言われていない (0 < x < 1でしか成り立たない式を x = 0, 1に適用するのは,純粋に間違い)

22 / 24

Page 24: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

端の点の扱い

端の点は,別途与えられた条件で求める本問題の場合,u(0, t) = u(1, t) = 0だったよって,�

1 for i in range(1, n-1):

2 u[i] = u[i] + (u[i+1] - u[i]) * (3*dt/dx)

3 u[0] = u[n-1] = 0

が与えられた条件に忠実な,正しい更新式本問においては, u[0], u[n-1]は常に 0なのだから,実は毎回更新する必要もない�

1 for i in range(1, n-1):

2 u[i] += (u[i+1] - u[i]) * (3*dt/dx)

(注: A += Bは,A = A + Bと同じ意味)23 / 24

Page 25: 微分方程式・偏微分方程式 - 東京大学(1階, 1変数, 常)微分方程式を解く dy dx = f(x;y); y(a) = c y: 未知の, xの関数(y(x)) a;c: 与えられた定数(初期値)

numpyの配列機能を使ってスッキリと

for文を使った更新式:�1 for i in range(1, n-1):

2 u[i] += (u[i+1] - u[i]) * (3*dt/dx)

同じことは numpyの配列に対する+, * などを使ってより簡潔に書ける�

1 u[1:n-1] += (u[2:n] - u[1:n-1]) * (3*dt/dx)

簡潔なだけでなく,圧倒的に (> 100倍)速い10000要素の更新に必要な時間

for文: 2× 10−2秒程度配列で: 8× 10−5秒程度

24 / 24