微分方程式と物理 - nihon universitymori/2009jyugyou/visual_math... · 2009-11-25 ·...
TRANSCRIPT
微分方程式と物理
森 真
マルサスの微分方程式
人口は現在の人口に比例して増加するということでたてられたモデルです.x は人口を表すとすると,その変化 (微分)は人口 x に比例すると考え
dx
dt= ax
が成り立つと考えました.
この方程式は1
xdx = a dt
と変形してから,両辺を積分すると
log x = at + c
書き直してx(t) = eatC (C = ec)
と解けます.こういう方程式を変数分離形と言います.解は a > 0ならば,t → ∞で無限に増えていき,a < 0ならば,t → ∞で 0に収束します.マルサスは食料は線形 (at + bの形)でしか増産できないので,人類はいずれ滅びると予想したのです.これがマルサスの人口論と言われ,真偽はともかく,多くの議論を生みました.数学が社会科学に用いられた初めての例ではないでしょうか.
コンピュータで求める方法
それには,微分の定義に戻る必要があります.
dx
dt= lim
h→0
x(t + h) − x(t)
h
ですから,hが十分小さければ
x(t + h) − x(t)
h
は x(t)の時刻 t での微分に近いと考えられます.マルサスの方程式は
x(t + h) − x(t)
h+ ax(t)
つまりx(t + h) + x(t) + ahx(t)
が成り立ちます.時刻を 0, h, 2h, 3h, . . .と考えて,次々に代入していけば解が近似できます.
Mathematicaで解く
a=1;h=0.1;
For[i = 1; x = 1; kinji = {{0, x}};, i <= 10, i++,
x += a*x*h; AppendTo[kinji, {i*h, x}]];
ListPlot[kinji,PlotJoined−>True]
とやれば,解が描けます.
解の図微分方程式
dx
dt= x
Figure: 初期値 1と −1のときのオイラー法による近似
0.2 0.4 0.6 0.8 1
-2
-1
1
2
問題
人類が絶滅するのは嫌だというので,人口が増えると,増加が鈍る項を加えて,マルサスの方程式を改良した人口モデルのロジスティック方程式
dx
dt= ax − bx2
の解をオイラー法で近似してください.
問題点オイラー法では,より正確にするためには hを小さくすればいいのですが,そうすると,計算の回数が増えます.コンピュータは四捨五入をしますから,回数が増えると誤差が増える (丸め誤差)危険があります.これを回避するには,もっと近似のよい式を使う必要があります.
Figure: h = 0.1のときの,真の解との差 (赤が真の解)
0.2 0.4 0.6 0.8 1
1.25
1.5
1.75
2
2.25
2.5
2.75
2次元の線形微分方程式
2次元の微分方程式で
dx
dt= ax + by
dy
dt= cx + dy
の形のものを,線形微分方程式といいます.
行列による表現
dx
dt= ax + by
dy
dt= cx + dy
は
A =
(a bc d
)とおくと
d
dt
(xy
)= A
(xy
)と変形できることにまず注目しましょう.
対角化
Aが対角化 P−1AP =
(λ 00 µ
)できれば,
(XY
)= P−1
(xy
)とお
くと
d
dt
(XY
)=
d
dtP−1
(xy
)= P−1A
(xy
)= P−1AP
(XY
)により,
dX
dt= λX
dY
dt= µY
と 2つのマルサスの微分方程式にわかれますので,解くことができます.
対角化できる微分方程式
dx
dt=
7
3x − 2
3y
dy
dt= −1
3x +
8
3y
を解こう.ここでは
A =
(73 −2
3−1
383
)とおいて対角化すればよい.
固有値,固有ベクトル
A = {{7/3,−2/3}, {−1/3, 8/3}}
とおいて,固有値と固有ベクトルを求める.
Eigenvalues[A]
Q=Eigenvectors[A]
Qは固有ベクトルが横に並んでいるので,縦に並べ直して
P=Transpose[Q]
対角化
Inverse[P].A.P
とすれば,対角行列 (3 00 2
)を得る.すなわち (
XY
)= P−1
(xy
)とおけば
dX
dt= 3X
dY
dt= 2Y
になる.
問題点
もちろん対角化できない場合も困りますが,それ以上に固有値が複素数になってしまう固有値が複素数になる微分方程式
dx
dt= x − y
dy
dt= x + y
では上の方法が使えません.こんな場合でも,オイラー法で微分方程式を近似することができます.
Mathematicaによる解法
h = 0.1;
For[i = 1; x = 0.1; y = 0; kinji = {{x, y}}, i <= 67, i++, x +=
h(x - y); y += h(x + y); AppendTo[kinji, {x, y}]];
ListPlot[kinji, PlotJoined −> True, Ticks −> None]
と行えば,解がオイラー法で近似できます.
この解法には誤りがある
方法に誤りはなさそうですが,新しい x を y を求めるのに使ってしまっています.
x += h(x -y);
y += h(x + y);
この場合には,x や y は大きくは変わりませんので,大した問題にはなりませんが,正しくは,一旦,x をしまっておいて,全部求めてからもとへ戻せばいいのです.
Mathematicaによる正しい解法
x を新しくした x は uとしてしまっておいて,新しい y を求めるときにはとっておいた x を使えばいいわけです.その後,uを xに戻します.h = 0.1;
For[i = 1; x = 0.1; y = 0; kinji = {{x, y}}, i <= 67, i++,
u=x+ h(x - y); y += h(x + y);x=u; AppendTo[kinji, {x, y}]];
ListPlot[kinji, PlotJoined −> True, Ticks −> None]
と行えば,解がオイラー法で近似できます.
Figure: 初期値 (0.1, 0)での近似解
問題
A =
(1 21 1
)の固有値と固有ベクトルを求め,さらに Aを対角化してください.さらにこの行列に対応する微分方程式
dx
dt= x + 2y
dy
dt= x + y
の解をオイラー法で求めてください.
物理と微分方程式
ニュートンの力学は
I 等速直線運動I F = ma,力は加速度に比例するI 作用反作用の法則
というたった 3つの原理に基づいています.
これと万有引力の法則
F = GmM
r2
からりんごの落下から太陽と惑星の方程式まで導きだしたのです.
落下の方程式物体は下に向かって,mg の力で引っ張られます.
md2y
dt2= −mg
これは
dy
dt= v
dv
dt= −g
と速度 v も入れると簡単に解けて初期位置 y0,初期速度 v y0 とお
けば
v(t) = v y0 − gt
y(t) = y0 + v0t −1
2gt2
となる.
放物線
x 方向も考えると,水平には力が働いていないので
d2x
dt2= 0
になります.x 方向の初期位置 x0,初期速度 v x0 とすると
x(t) = x0 + v x0 t
となります,これから t を消去すると
y(t) = y0 +v y0
v x0
(x(t) − x0) −1
2g
(x(t) − x0
v x0
)2
と放物線が現れます.
Mathematicaで描く
x , y 方向それぞれに速度があるので 4次元になります.そのうち,x , y だけをとっておいて,図にします.g=1;h = 0.1;
For[i = 1; x = 0; y = 0;vx=0.5;vy=20; kinji = {{x, y}},
i <= 100, i++,ux=x+ h*vx; vx += 0; uy=y+h*vy;vy+=-g*y;x=ux;y=uy; AppendTo[kinji, {x, y}]];
ListPlot[kinji, PlotJoined −> True, Ticks −> None]
落下の運動
バネの方程式バネの力は自然な状態からの長さの変化に比例する力が働きます(フックの法則).
mdx2
dt2= −kx
これもdx
dt= v
dv
dt= −kx
と速度 v も入れると,見通しが良くなりますが落下の方程式のように解くことはできません.しかし,勘がよければ,x(t) = A sin(Bt + C )のような形をしていることに気がつくはずで,そうなると解は
x(t) = A sin(√
kt + C )
v(t) = A cos(√
kt + C )
であることがわかり,A, C は初期位置と初期速度から求めることができます.
ふりこの方程式
これまでの方程式は線形でしたから,線形代数で解くことができました.しかし,ふりこでは
md2x
dt2= −mg sin x
の形をしています.x が 0に近ければ sin x ∼ x とみることができてバネの方程式と同じになります.これがふりこが振れ幅によらず一定のリズムをする理由です.でも正しい解はこれとは違うはずです.このような方程式を非線形の方程式といいます.解けないものはコンピュータで近似解を求めるしか方法はありません.
問題ふりこの方程式を解くプログラムを作ってさまざまな初期値について解の挙動を調べてください.予想通りの行動はしてくれません.これはオイラー法があまり良い近似でないために時間がたつと正確な解から遠ざかってしまうからです.
本当の答え
問題
dx
dt= −10x + 10y
dy
dt= 29x − y − xz
dz
dt= −8
3z + xy
の解を xy 平面に射影した図を作ってください.
ローレンツの方程式
この方程式は気象の長期予報について研究していたローレンツが考えたものです.この解をみて,彼は長期予報は不可能であると結論をしました.解の形が蝶に似ていることから,北京で蝶が羽ばたきをすると,ニューヨークに嵐が起きるなどと象徴的に言われています.
ローレンツ方程式をMathematicaで解くh = 0.01;
For[i = 1; x = 0.1; y = 0.1; z = 0.1; kinji = {{x, y}}, i < 5000,i++,
u=x + h(-10x + 10y);
v=y + h(28x - y - x*z);
z += h(-8z/3 + x*y);
x=u;
y=v;
AppendTo[kinji, {x, y}]
]
ListPlot[kinji, PlotJoined −> True]
ローレンツ方程式の解
-15 -10 -5 5 10 15 20
-20
-10
10
20
ファンデルポルの微分方程式
dx
dt= y
dy
dt= εy(1 − x2) − x
は周期解にまつわりついて行く図になります.
ファンデルポルの微分方程式
h = 0.1; m = 2;
For[i = 1; x = 0.1; y = 0; kinji = {{x, y}}, i <=1000, i++,
u =x+ h*y;
y += h(m*(1 -x2)*y - x);
x=u
AppendTo[kinji, {x, y}]];
ListPlot[kinji, PlotJoined −> True, Ticks −> None]
ファンデルポルの微分方程式
Figure: 初期値が内側からと外側からの図
コンピュータによる解法
オイラー法は x(t + h)を x(t) + x ′(t)hで近似する方法です.これは x(t + h)のテイラー展開
x(t + h) = x(t) + x ′(t)h +x ′′(t)
2h2 + · · ·
の初めの 2項だけを用いたものです.もっとテイラー展開を長く一致させればより正確な近似が得られるはずです.
方程式をy ′ = f (x , y)
とします.これを時間刻み h毎に初期値 y(0)から導く.x を T までなら, 0, h, 2h, . . .と T/h回繰り返すことにしましょう.このm回目を ymで表しましょう.xm = mhです.l 段階法 ymを得るのに,ymから ym−l+1を用います.この方法には初期値として,y0 = y(0)の他に y1, . . . , yl−1までを別の方法で求めることが必要になります.ym+1を求めるのに y ′
m+1 = f (xm+1, ym+1)が必要な場合を陰的公式,必要としないものを陽的公式といいます.陰的公式では ym+1
を解く必要があります.
オイラー法 (陽的公式)
ym+1 = ym + hy ′m (y ′
m = f (xm, ym))
台形公式 (陰的公式)
ym+1 = ym +h
2(y ′
m + y ′m+1)
h
y ′m
オイラー法
h
y ′m y ′
m+1
台形法
オイラー法では xm < x < xm+1の点では
y(x) = ym + (x − xm)y ′m
台形公式では
ym+1 = ym +h
2y ′m +
h
2y ′m+1
= ym +h
2y ′m +
h
2(y ′
m + hy ′′m + · · · )
= ym + hy ′m +
h2
2y ′′m + · · ·
なので
y(x) = ym + (x − xm)y ′m +
(x − xm)
2y ′′m + · · ·
となります.台形公式はテイラー展開が 2次まで一致していることがわかります.しかし,陰的公式なので y ′
m+1 = f (xm+1, ym+1)なので,ym+1を別の方法で近似するか,式を解かなければなりません.
後退オイラー法
ym+1 = ym + hy ′m+1
ym+1 = ym−1 + 2hy ′m
中点法は
ym+1 = ym − hy ′m +
h2
2y ′′m + · · · + 2hy ′
m
= ym + hy ′m +
h2
2y ′′m + · · ·
と 2次までテイラー展開が一致します.
中点法の実装初期値を y に代入する.次に,1時刻前 y−1を求めて,これを zにしまいます.
y−1 = y0 − hy ′0
だからz = y − hy ′
これらを用いて,中点法を次々に繰り返すのですが,一度,現在の y の値を仮の保存場所 w にしまいます.
w = y
次に新しい y を中点法に従い計算します.
y = z + 2h ∗ y ′
これが次の時刻の y になります.そして,仮に保存をしておいた今の y の値を 1時刻前になるので,
z = w
にしてしまいます.これを繰り返せばよいというわけです.
2回微分
y ′′(x) ∼y ′(x+h)−y ′(x)
h − y ′(x)−y ′(x−h)h
h
=y ′(x + h) − 2y ′(x) + y ′(x − h)
h2
を使うと 2回の微分方程式を近似することができますが,2段階法なので最初に 2つ求めなければなりません.