(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
(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
離散化
数式で書けば: 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
プログラム化
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
よくある状況: 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
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
まだできないこと
これでシミュレートできるのはせいぜい数個の質点 (または数個のパラメータ (e.g., 角度)だけで決まる系)の動き物理の多くの問題で求めたいものは,「時刻」と「場所」の関数 (「場」)
電場,磁場,重力場,鉄板表面の温度,速度の分布,圧力の分布,力の分布,電子の波動関数 (存在確率), . . .記号で書けば(u(t)ではなく),u(x, y, z, t)
別の言い方をすると,時間の関数が無数に (x, y, zごとに)ある
10 / 24
場を記述する方程式
「時間 (t)」と「場所 (x, y, z)」の関数 u(x, y, z, t)の方程式
または定常状態を求める問題では場所だけの関数u(x, y, z)のこともある
式としては ∂u∂t, ∂u
∂x, ∂u
∂y, などが入り乱れた式 (偏微分方
程式)になる
11 / 24
物理で目にする例
熱伝導: 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
物理で目にする例
マックスウェルの方程式 (真空中)
∇ ·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
物理で目にする例
流体の速度場の方程式 (ナビエストークス)
∂u
∂t+ (u · ∇)u = −1
ρ∇p+ ν∇2u+ F
波動方程式 (音とか光とか)
1
s2∂2u
∂t2= ∆u
14 / 24
しかし恐れる必要はない
根本的な考えは同じ; (常)微分方程式がたくさん並んでいるだけと思えば良い例えば 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
ともかく例を見る
簡単のため 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
離散化
微分方程式:∂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
離散化
∴ u(x, t+∆t) ≈ u(x, t) + (u(x+∆x, t)− u(x, t))3∆t
∆x
x
∆x
ある時点における自分と,右隣 (+∆x)の人の値がわかれば,自分の一瞬 (+∆t)後の値がわかる
19 / 24
プログラム化
用意する変数: 先の●たちを格納した一次元の配列 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
プログラム化
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
端の点の扱い
一般に端の点の扱いはよく考えて慎重に.いい加減にやるとおかしな結果になるまずプログラム上も,右端の点 (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
端の点の扱い
端の点は,別途与えられた条件で求める本問題の場合,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