微分方程式 少し背伸びして挑戦 -...
Transcript of 微分方程式 少し背伸びして挑戦 -...
微分方程式 — 少し背伸びして挑戦桂田 祐史
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.html2やや、余談になるが、普通微分方程式を解くというのは、未知関数を求めることを意味するが、天体の軌跡が
円錐曲線であることを示すのは、天体の位置を表す関数 (x(t), y(t))を求めたこととは違っている。実際、Newton自身はそれに成功していない。
1
文部科学省は、高等学校の物理の説明に微積分を使わない方針を堅持しているが、ここではそういう制限を忘れて、微積分を使って説明する。すると、数学的には、要点は次の二つである。
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.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) = v cos θ, y′(0) = v sin θ.
x と y, 2つあって難しいようだけど、
x′′(t) = 0, x(0) = x0, x′(0) = v cos θ,
y′′(t) = −g, y(0) = y0, y′(0) = v sin θ
と並べ直してみると、実は両者は独立で、それぞれ上で説明した型の問題で、難しくなく解ける:
(3) x(t) = x0 + v0t cos θ, y(t) = y0 + v0t sin θ −1
2gt2.
簡単のため x0 = 0, y0 = 0 とすると
x = v0t cos θ, y = v0t sin θ −1
2gt2.
(後で、一般の場合の結果が欲しければ、結果の x, y をそれぞれ x− x0, y − y0 で置き換えればよい。)
θ = 0 の場合は、x(t) = 0, y(t) = v0t−1
2gt2.
0 ≤ θ < π/2 とすると、最初の式から t =x(t)
v0 cos θ. これを第 2式に代入して
y(t) = v0x(t)
v0 cos θsin θ − 1
2g
(x(t)
v0 cos θ
)2
= x(t) tan θ − g
2v20 cos2 θ
x(t)2
という軌跡の方程式が得られる。簡単のため、x(t), y(t) をそれぞれ x, y で表し、平方完成の式変形をすると
y = − g
2v20 cos2 θ
(x− v20 sin θ cos θ
g
)2
+v20 sin
2 θ
2g.
ゆえに、軌跡は軸が x =v20 sin θ cos θ
g, 頂点が
(v20 sin θ cos θ
g,v20 sin
2 θ
2g
), 下開きの放物線であ
る。最高の高さは v20 sin2 θ
g. これは θ = π/2 のときに最大になる (というのは、θ < π/2 とし
て議論しているので実は乱暴である)。y = 0 となるのは、x = 0 (これは明らか) と
x = tan θ · 2v20 cos
2 θ
g=
2v20 cos θ sin θ
g=
v20 sin 2θ
g.
3
これが地面に落ちる場所を表している。高校物理の暗記術としては、最高点に到達する時刻は dy/dt = 0 から t =
v0 sin θ
g, その位
置は
(x, y) =
(v0v0 sin θ
gcos θ, v0
v0 sin θ
gsin θ − 1
2g
(v0 sin θ
g
)2)
=
(v20 sin θ cos θ
g,v20 sin
2 θ
g
),
地面に落ちるには、最高点に到達するのに要する時間の 2倍かかるとして、その場所は
x =2v20 sin θ cos θ
g=
v20 sin 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 なども具体的な数値を与える必要がある。
4
� �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
での物体の冷却など、色々な現象を記述する方程式である。解き方はこれから学ぶであろうが、結果だけ述べておくと、
(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) = C1 cosωt+ C2 sinωt (C1, C2 は任意定数)
となる (有名なので高校生の時に習ったかもしれない)。C1 と C2 を定めるには、時刻 t = 0
での重りの位置 x(0), 速度 x′(0) を与えれば良い。
x(0) = x0, x′(0) = v0
とすると、C1 = x0, C2 =v0ωであるので、
x(t) = x0 cosωt+v0ω
sinωt.
このような問題も Mathematica を使って、前問と同様に解くことが出来る。
6
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 を使って数値解を求めて見よう。
7
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
0
ds√(1− s2)(1− k2s2)
8
� �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)
9
とおくと、x′(t) = y(t), y′(t) = − sin x(t), x(0) = θ0, y(0) = b0
となる (実際 x′(t) = θ′(t) = y(t), y′(t) = θ′′(t) = − sin θ(t) = − sin x(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).
10
[3] 桂田祐史:単振り子の話, http://www.math.meiji.ac.jp/~mk/labo/text/furiko/
(2007).
11