微分方程式 — 少し背伸びして挑戦
桂田 祐史
katurada @ meiji.ac.jp 2013 年 7 月 7 日 , 2013 年 7 月 14 日
Mathematicaの使い方は、Mathematica のオンライン・ヘルプで調べるか、桂田 [1] (特に
「微分方程式を解く DSolve[], NDSolve[]」1)を見よ。
1 万有引力と Kepler の法則 — 計算して確かめてみませんか?
ゼミのテキストである中村 [2] の第5章(最終章)は、万有引力に従う惑星の運動は Kepler の法則に従う(特に軌道は円錐曲線である — Kepler 自身の主張は軌道が楕円であるという ものであった) ことの証明が与えられている。これは、微分積分学と力学の確立をしたこと で有名な Isaac Newton (1642–1727) の高名な著書『自然哲学の数学的諸原理』(Philosophiæ Naturalis Principia Mathematica) の主結果の一つであり、微分積分学と Newton力学の輝か しい成果である。円錐曲線に関するテキストの最後を飾るにふさわしい結果であると言えるだ ろう。
カリキュラム上は微分方程式を学ぶのは後のことなので、少し背伸びをする感じがあるが、
5章の解読にチャレンジする価値は高いと思う。
一方、微分方程式を数値計算で解いて、軌道が円錐曲線になることを確認するのも有意義で ある2。微分方程式の数値解法も学ぶのは後になるが、Mathematica を用いれば計算すること は難しくない。
試しに計算してみませんか?
この文書は、そのために参考になるようなことを色々書いてみた、というものです。
2 微分方程式ことはじめ — ものを投げる
重力が働く場合に、ものを投げた時にどのような運動が起こるか、高等学校の物理学を習っ た人にはお馴染みである。
1http://www.math.meiji.ac.jp/~mk/syori2/mathematica/node37.html
2やや、余談になるが、普通微分方程式を解くというのは、未知関数を求めることを意味するが、天体の軌跡が 円錐曲線であることを示すのは、天体の位置を表す関数(x(t), y(t))を求めたこととは違っている。実際、Newton 自身はそれに成功していない。
文部科学省は、高等学校の物理の説明に微積分を使わない方針を堅持しているが、ここでは そういう制限を忘れて、微積分を使って説明する。
すると、数学的には、要点は次の二つである。
1. 鉛直下向きに x軸を取って、物体の時刻 tでの位置を x(t)で表すとき,加速度x′′(t)は 重力加速度と呼ばれる定数になる。
2. 数学的には、a を定数として、
f′′(t) = a であれば、1回積分して
f′(t) =at+C (Cは積分定数).
もう1回積分すると
f(t) = 1
2at2+Ct+D (Dは積分定数).
— 要するに単に積分するだけで解けてしまう。
2.1 自由落下 (free fall)
時刻t における高さをx(t)とする。1階微分 x′(t)が速度、2階微分 x′′(t)が加速度である。
物理学では、重力による加速度は下向きに大きさ g (重力加速度と呼ばれる定数、SI単位系で ほぼ 9.8 ms−2)であると言われている。
x′′(t) =−g.
この解は (a=−g というだけだから) x(t) = −1
2gt2+Ct+D (C, D は積分定数).
例えば最初 (t = 0) に高さ0, 速度0 だったとすると、C = 0, D= 0 であることが分るので、
x(t) =−1 2gt2. この場合、時刻 t での速度 v(t) は、
v(t) = x′(t) = −gt.
以上の事実は、有名なガリレオ・ガリレイ (Galileo Galilei, 1564–1642) が明らかにしたが、微 積分がまだなかったので非常に苦労した。
2.2 放物運動 (projectile motion, parabolic motion of projectiles)
物を投げたときの運動を考える。鉛直上向きに y 軸を取り、投げる方向の水平方向に x軸
を取ると(やや苦しい説明…)、
(1) x′′(t) = 0, y′′(t) =−g.
最初 (t= 0) の位置を (x0, y0),投げる速さを v0,投げ上げる角度を (地面から測った角度で)θ (0≤θ≤π/2)とすると、
(2)
{
x(0) = x0, y(0) =y0,
x′(0) =vcosθ, y′(0) =vsinθ.
x と y, 2つあって難しいようだけど、
x′′(t) = 0, x(0) =x0, x′(0) =vcosθ, y′′(t) = −g, y(0) =y0, y′(0) =vsinθ
と並べ直してみると、実は両者は独立で、それぞれ上で説明した型の問題で、難しくなく解け る:
(3) x(t) =x0+v0tcosθ, y(t) =y0+v0tsinθ−1 2gt2. 簡単のため x0 = 0, y0 = 0 とすると
x=v0tcosθ, y=v0tsinθ−1 2gt2.
(後で、一般の場合の結果が欲しければ、結果のx, y をそれぞれ x−x0, y−y0 で置き換えれ ばよい。)
θ= 0 の場合は、x(t) = 0, y(t) = v0t−1 2gt2. 0≤θ < π/2 とすると、最初の式からt = x(t)
v0cosθ. これを第2式に代入して y(t) = v0 x(t)
v0cosθsinθ−1 2g
( x(t) v0cosθ
)2
=x(t) tanθ− g
2v02cos2θx(t)2
という軌跡の方程式が得られる。簡単のため、x(t), y(t)をそれぞれ x,y で表し、平方完成の 式変形をすると
y=− g 2v02cos2θ
(
x− v02sinθcosθ g
)2
+ v02sin2θ 2g . ゆえに、軌跡は軸が x= v02sinθcosθ
g , 頂点が
(v20sinθcosθ
g ,v20sin2θ 2g
)
,下開きの放物線であ る。最高の高さは v20sin2θ
g . これは θ =π/2のときに最大になる(というのは、θ < π/2 とし て議論しているので実は乱暴である)。y = 0 となるのは、x= 0 (これは明らか) と
x= tanθ· 2v02cos2θ
g = 2v02cosθsinθ
g = v20sin 2θ
g .
これが地面に落ちる場所を表している。
高校物理の暗記術としては、最高点に到達する時刻は dy/dt = 0 からt = v0sinθ
g , その位
置は
(x, y) = (
v0v0sinθ
g cosθ, v0v0sinθ
g sinθ−1 2g
(v0sinθ g
)2)
=
(v02sinθcosθ
g ,v02sin2θ g
) ,
地面に落ちるには、最高点に到達するのに要する時間の2倍かかるとして、その場所は x= 2v20sinθcosθ
g = v02sin 2θ g
という求め方をする。軌跡が放物線であることは、ある意味ズルして覚えておくわけだ。
3 Mathematica の DSolve[]
前節の例2.2 を Mathematica を使って解いてみよう。
Mathematica には、微分方程式 (differential equation) を解くための DSolve[ ] という関 数がある。微分方程式 (1) と初期条件 (3)を与えれば解を求めてくれる。
以下では念のため最初にRemove[] で掃除している(Mathematica 起動直後ならば不要)。
Remove["Global‘*"]
DSolve[{x’’[t] == 0, y’’[t] == -g, x[0] == 0, y[0] == 0,
x’[0] == v Cos[theta], y’[0]== v Sin[theta]}, {x, y}, t]
または
DSolve[{x’’[t] == 0, y’’[t] == -g, x[0] == 0, y[0] == 0,
x’[0] == v Cos[theta], y’[0]== v Sin[theta]}, {x[t], y[t]}, t]
解や軌跡を図示してみよう。そのためには、sol=x[t],y[t]/.DSolve[...] として、変数 (ここでは sol)に代入しておくのが便利である。また、g, v, theta なども具体的な数値を与 える必要がある。
sol={x[t],y[t]} /. DSolve[{x’’[t] == 0, y’’[t] == -g, x[0] == 0, y[0] == 0,
x’[0] == v Cos[theta], y’[0]== v Sin[theta]}, {x[t], y[t]}, t]
g1=Plot[sol /. {g->9.8, v-> 20, theta->45Degree}, {t,0, 2}]
g2=ParametricPlot[sol /. {g -> 9.8, v -> 20, theta -> 45 Degree}, {t, 0,3}]
Export["projection.eps",g2]
(ここでは{g->9.8, v->20, theta->45Degree}と一時的な代入を行なったが、g=9.8; v=20;
theta=45Degree と代入しておくことも可能である。)
0.5 1.0 1.5 2.0
5 10 15 20 25
図 1: x(t)と u(t)
10 20 30 40
2 4 6 8 10
図 2: (x, y)の軌跡
4 少し難しい ( 単に積分だけでは解けない ) 微分方程式
前節の問題は、要するに原始関数を求めよ、という問題なので、積分するだけで解けてし まった。ここでは高校数学だけでは解けない、大学初年級の微分方程式の講義内容で解き方を 学ぶ、問題を紹介する (結果は天下りに与える)。
未知関数の導関数が分かっている場合は、積分することで未知関数が求められたが、導関数 ともとの未知関数との関係が与えられている場合に、未知関数を求めよ、という問題がある。
というよりも、それが普通の微分方程式である。
ここでは有名な(しかしそれほど難しくない) 微分方程式を(解法抜きで) 二つ紹介する。
4.1 マルサスの法則 y
′= ay
a を定数として、
(4) dy
dx =ay
という微分方程式は後々分かるように基本中の基本と考えられる微分方程式で、環境が良い場 合の生物の増殖 (人口増加に関するマルサスの法則)、放射性元素の崩壊、単純化した状況下
での物体の冷却など、色々な現象を記述する方程式である。解き方はこれから学ぶであろう が、結果だけ述べておくと、
(5) y=Ceax.
ここで C は「積分定数」のような定数である。きちんというと、微分方程式 (4)の任意の解 y は適当な定数 C を用いて (5)のように表され,逆に任意の定数 C に対して、(5) で定めた y は (4) を満たす。(5)を (4) の一般解、(5)の中の C を任意定数と呼ぶ。
もちろんMathematiaca で解くことが出来る。
DSolve[y’[x]==a y[x],y,x]
あるいは
DSolve[y’[x]==a y[x],y[x],x]
いずれの場合も (5)が確認できる。
4.2 単振動の方程式 x
′′(t) = − ω
2x(t)
ω を正定数として、
(6) x′′(t) = −ω2x(t)
という微分方程式は単振動 (simple harmonic motion, simple harmonic oscillation) の方程式 と呼ばれる。振動現象において、釣り合いの位置からの変位を x(t) として、微小な振動を考 えると、多くの場合に x(t) は適当な ω に対して、(6) を満たす。例えば物理学の初歩を学ん であれば、バネ定数 k のバネに質量m の重りをつけて作ったバネ振り子の運動が
x′′(t) = −ω2x(t), ω:=
√k m
に従うことを学んでいると思う。これについても、解き方は後回しにして、結果だけを述べて おくと
x(t) = C1cosωt+C2sinωt (C1,C2 は任意定数)
となる (有名なので高校生の時に習ったかもしれない)。C1 と C2 を定めるには、時刻 t = 0 での重りの位置 x(0), 速度x′(0) を与えれば良い。
x(0) =x0, x′(0) =v0 とすると、C1 =x0, C2 = v0
ω であるので、
x(t) =x0cosωt+v0
ω sinωt.
このような問題も Mathematica を使って、前問と同様に解くことが出来る。
5 10 15 20
-1.0 -0.5 0.5 1.0
図 3: 単振動の方程式の解 — 時間に関するサイン・カーブ
sol=x[t]/.DSolve[{x’’[t]==-omega^2 x[t],x[0]==x0,x’[0]==v0},x,t]
g=Plot[sol/.{omega->1,x0->1,v0->1},{t,0,20}]
関数 x(t)のグラフはサイン・カーブになる(sin, cosの合成は一つのsin で表せることに注意 しよう)。
5 難しい微分方程式 — 数値解法で扱う NDSolve[] のお出まし
式変形で解くのが難しい微分方程式に対して、数値計算で立ち向かおう。
5.1 イントロ
微分方程式について、重要な事実を二つ述べる。一つは
1. 大抵の微分方程式は ( 解が存在しても ) 式変形で求めることが出来ない
ということである。
ここで解を求めると言っているのは、「既に知っている関数を使って、解を表す式を求める」
という意味である。ある意味では、それまでに知っている関数が足りない、ということも出来 る。微分方程式の問題を考えることで、新しい関数を定義することが出来ることになる。
実は歴史上多くの関数がそのようにして定義されることになった。例えばNapier による対 数関数の導入もそのようになされたと言えなくもない(普通はそのように説明されないが…興 味のある人は質問して下さい)。
色々な現象をあらかじめ用意した関数を用いて表そうとすると、多くの関数を導入する必要 があるが、かなり面倒なことが多い。しかし、実は次のことが言える。
2. 大抵の微分方程式は比較的簡単に数値解を求めることが出来る
その計算方法そのものもそのうちに学ぶことになり、そこにも数理がある(桂田はそういう 数学の専門家) が、ここではMathematica を使って数値解を求めて見よう。
5.2 単振り子の方程式
単振り子の運動は、鉛直線から測った振れの角度θ(t) について、
(7) θ′′(t) =−g
ℓ sinθ(t)
という微分方程式を満たす。ここで g は重力加速度、ℓは振り子の長さである。入門段階の物 理では、通常は、微小振動の場合、θ ;sinθ であるとして、
θ′′(t) = −ω2θ(t), ω :=
√g ℓ
という単振動方程式で近似して議論する (これから近似的に周期運動であり、周期が 2π ω = 2π
√ℓ
g であることが分かる)。
近似をしないで(7)の解を得るのはちょっと難しい。一応書くだけ書いておくと、k ∈(0,1]
として、初期条件
(8) θ(0) = 0, θ′(0) = 2kω
を与えた初期値問題の解は
(9) θ(t) = 2 sin−1(k sn(ωt, k)).
ただし snは Jacobiの楕円関数である3 (桂田 [3])。
こうしてとりあえずは、解を「既知の」関数を使って表すことが出来たが(sin−1 を習った ばかりで、snなんて「既知」と言われても困るという人がいるかもしれないが…)、いざ解の 数値を求めたり、解を図示しようとすると、コンピューターの助けでも借りないと、sin−1 や sn の計算が出来ないことに気づく(特に snの計算にはコンピューターがあっても結構手こず る)。解の数値が知りたい場合や、解のグラフが描きたい場合、(9)を使う方法は、後述する数 値解を使う方法と比べて、特に優れているとは言えないのである。
初期値問題の解を微分方程式の数値解法で求めるのは簡単である。数値解法の詳細について は、そのうち学ぶ機会があると思われるが、ここでは Mathematica にやらせてみよう。これ までと同様に
DSolve[] では解けない
sol=DSolve[{x’’[t]==-Sin[x[t]], x[0]==0, x’[0]==1.6},x,t]
としても、残念ながら解は得られない。DSolve[]の代わりにNDSolve[],tの代わりに{t,0,10} とする。
NDSolve[] で解ける
sol=NDSolve[{x’’[t] == -Sin[x[t]], x[0] == 0, x’[0] == 1.6}, x, {t, 0, 10}]
ただし、結果は式の形では得られず、InterpolatingFunction (Mathematica 用語) というもの で、そのままでは正体が分からない。グラフ表示をしてみよう。
3 sn−1(z, k) =
∫ z ds
√ − −
g1=Plot[x[t] /. sol,{t,0,10}]
g2=ParametricPlot[{x[t],x’[t]} /. sol,{t,0,10}]
とすれば計算した解の表示が得られる。
2 4 6 8 10
-1.5 -1.0 -0.5 0.5 1.0 1.5
図 4: 横軸t, 縦軸 θ(t)
-1.5 -1.0 -0.5 0.5 1.0 1.5
-1.5 -1.0 -0.5 0.5 1.0 1.5
図 5: 横軸θ(t), 縦軸θ′(t)
5.3 まとめ ( 繰り返し )
式変形で解が求まらない、あるいは知られてはいても計算が面倒な関数を使わないと解が表 せないような微分方程式も、数値解法を使えば比較的簡単に(予備知識ほぼ 0 で) 数値解が得 られる。解の数値が知りたい場合、グラフ等が描きたい場合は、それ (数値解)で十分な場合 が多い。数値解法は多くの微分方程式を統一的な方法で扱うことが出来、比較的簡単である。
Mathematica には、微分方程式の解を数値解法で求めるNDSolve[] という関数が用意されて
いる。
6 連立微分方程式は怖くない
前節まで、一つの未知関数に関する微分方程式だけを扱ってきたが、目標とするKepler問 題では、未知関数が複数ある連立微分方程式を解く必要がある。
解の存在を問題にしたり、数値解法を用いたりする場合、未知関数が複数個あることで本質 的な難しさは生じない。Mathematica でも扱いは難しくない。
逆に、微分の階数が高い場合、未知関数を増やすことで、1階の微分方程式に帰着して考え るというテクニックがしばしば使われるくらいである。これを説明した上で、Mathematicaで 連立微分方程式を解いてみよう。
単振り子の方程式
θ′′(t) =−sinθ(t), θ(0) =θ0, θ′(0) =b0 を例に取る。
x(t) :=θ(t), y(t) :=θ′(t)
とおくと、
x′(t) = y(t), y′(t) =−sinx(t), x(0) =θ0, y(0) =b0
となる (実際 x′(t) = θ′(t) = y(t), y′(t) = θ′′(t) = −sinθ(t) = −sinx(t), x(0) = θ(0) = θ0, y(0) = θ′(0) =b0)。
θ0 = 0, b0 = 1.6の場合、この問題を解く Mathematica のコマンドは、次のようになる。
sol=NDSolve[{x’[t]==y[t], y’[t]==-Sin[x[t]], x[0]==0, y[0]==1.6},
{x,y}, {t,0,20}]
g1=Plot[x[t] /. sol, {t,0,10}]
g2=ParametricPlot[{x[t],y[t]} /. sol, {t,0,10}]
結果はもちろん前節のものと同じである。
複数の初期値に対する、曲線(x(t), y(t))を描いてみよう(微分方程式の本に良く載っている)。
sol = Table[{x[t], y[t]} /.
NDSolve[{x’[t] == y[t], y’[t] == -Sin[x[t]], x[0]==a*Pi,y[0]==b}, {x, y}, {t, -20, 20}], {b, -2.4, 2.4, 0.2}, {a, -2, 2, 2}];
g = ParametricPlot[sol, {t, -20, 20}, PlotRange -> {{-3 Pi, 3 Pi}, {-Pi,Pi}}]
-5 5
-3 -2 -1 1 2 3
図 6: 振り子の運動の相図 (横軸は角度、縦軸は角度の時間変化率)
というわけで
惑星の運動の微分方程式をMathematica で解いて、軌道が円錐曲線 (典型的な場合として 楕円)になることを試しにやってみませんか?
参考文献
[1] 桂田祐史:Mathematica 入門, 明治大学数学科向け講義科目「情報処理2」の資料.http:
//www.math.meiji.ac.jp/~mk/syori2/mathematica/(1999〜).
[2] 中村滋:円錐曲線— 歴史とその数理 —, 共立出版 (2011).
[3] 桂 田 祐 史:単 振 り 子 の 話, http://www.math.meiji.ac.jp/~mk/labo/text/furiko/
(2007).