微分方程式を解く(高度な話題)

微分方程式には常微分方程式、偏微分方程式、全微分方程式など いくつかの型がある。ここではこれらの解き方について、 解説する。

常微分方程式の解法

Mathematicaはすべての常微分方程式を解けるわけではないが、かなり 多くの問題をとくことができる。 まず次の例からはじめる。

DSolve[y'[x] == a y[x],y[x],x]
DSolve[y''[x] == a y[x],y,x]
DSolve[y''[x] == a y[x],y[x],x]

ここで、微分方程式を解く命令はDSolveである。 この命令に続いて、方程式
y'[x] == a y[x]、未知関数y[x] あるいはy、独立変数xを順に書く。
未知関数の書き方は二通りあるが、いずれにしても解はもとまる。 ただし、関数として、解を求めたいのであれば、yを用いるのがよい。

y[x]を未知関数として指定すれば、関数y[x]をもとめるが、yと指定すれば純関数の形で 解を求める。この純関数の概念は数学上の関数の概念に近い。
y'[x]y[x]の一階微分をあらわす。それ以外の2階微分についても同様である。 この時、解は通常任意定数C[1], C[2]などを含んだ形の一般解が もとまる。 基本的にはこの形で解けるものはすべて解の一般解をあたえる。

常微分方程式の初期値問題

次の例はいわゆる初期値問題といわれるものである。 これはある時刻(x=0とすることが多い)に未知関数の値とその微分係数をあたえてその後の 解を決定するものである。この時、括弧の中に方程式と初期値が与えられている。

DSolve[{y'[x] == a y[x],y[0] == 1},y[x],x]
DSolve[{y'[x] == - y[x],y[0] == 1},y[x],x]
DSolve[{x^2 y''[x] - 3 x y'[x] + 4 y[x] == 0,y[0] == 0,
y'[0]==1},y,x]

以下でこれ以外の例をあたえる。各自確認して欲しい。

DSolve[y''[x] - 2y'[x] + 10y[x] == 0,y,x]
DSolve[y''[x] - 2y'[x] + y[x] == 0,y,x]
DSolve[x^2 y''[x] - 3 x y'[x] + 4y[x] == 0,y,x]
DSolve[y'''[x] - y[x] == 0,y,x]
DSolve[y''''[x] + 3y''[x] - y[x] == 0,y,x]
DSolve[x^3 y'''[x] - 3 x^2 y''[x] - y[x] == 0,y,x]
DSolve[x^3 y'''[x] + x^2 y''[x]-2x y'[x] +2 y[x] == 0,y,x]
DSolve[y'''[x] - 2 y''[x]- y'[x] + 2 y[x] == 2x^2 - 6x + 4,y,x]
DSolve[y''[x] - y'[x] + 2 y[x] == 2Exp[x],y,x]
DSolve[y''[x] - y'[x] + 2 y[x] == 2Exp[x] + Sin[x],y,x]
DSolve[y''[x] + 2y'[x] + 5 y[x] == 16Exp[x] + Sin[2x],y,x]
DSolve[y'''[x] - y''[x]- 4y'[x] +4 y[x] == 6 Exp[-x] ,y,x]
DSolve[y'''[x] - y''[x]- 4y'[x] +4 y[x] == 6 Exp[-x]+Sin[x] ,y,x]
DSolve[y''[x] - 4y'[x] + 4 y[x] == Exp[-2x]/x^2 ,y,x]
DSolve[y''[x] + 4y'[x] + 4 y[x] == Exp[-2x]/x^2 ,y,x]
DSolve[x^2 y''[x]- x y'[x] == 2 Exp[x] x^3 ,y,x]

数値解法

方程式の一般解あるいは初期値問題の解が関数の形で求まらない時にもその 数値的な解を求めることはできる。これは解のグラフを描いてその性質を調べたりするのに役立つ。 数値的に微分方程式を解くためにはNDSolve命令を用いる。次の例はさらにグラフを描いている。 ここで/.は置換命令である。すなわち、y[x]をsolutionで置換する。 Evaluate命令はy[x]を評価する。

solution =NDSolve[{y''''[x] + 3y''[x] - y[x] == 0, y[0]==0, y'[0]==0, y''[0]==1, y'''[0]==0},y,{x,-5,5}];
Plot[Evaluate[y[x] /. solution], {x,-5,5} ]

この方法を用いて上の方程式の解のグラフを描くことができる。

solution =NDSolve[{y'''[x] - y''[x]- 4y'[x] +4 y[x] == 6 Exp[-x]+Sin[x] , y[0]==0, y'[0]==0, y''[0]==1},y,{x,-5,5}];
Plot[Evaluate[y[x] /. solution], {x,-5,5} ]

方程式が特異性を持っているときはxの範囲に注意する必要がある。たとえば次の例では x=0は特異性なので解の範囲からのぞいておく必要がある。

solution =NDSolve[{x^2 y''[x]- x y'[x] == 2 Exp[x] x^3, y[1]==0, y'[1]==1},y,{x,1,2}];
Plot[Evaluate[y[x] /. solution], {x,1,2} ]

非線型方程式を解く

非線型方程式の厳密解を求めるのは可積分の場合を除いて難しいが、数値的に解くのは 可能である場合がある。このようないくつかの場合について述べる。 まず、調和振動子の場合を考える。

solution =NDSolve[{y''[x] +y[x] == 0, y[0]==0, y'[0]==1},y,{x,-6,6}];
Plot[Evaluate[y[x] /. solution], {x,-6,6} ]

このグラフは単振動である。これに非線形の外力項を付け加える。するとグラフは次のようになる。

solution =NDSolve[{y''[x] +y[x] -y[x]^2 == 0, y[0]==0, y'[0]==1},y,{x,-4,3.5}];
Plot[Evaluate[y[x] /. solution], {x,-4,3.5} ]

ここで注意することは解の存在範囲はかならずしもすべてのxを指定することはできない。 いまのばあい、x=4付近では解が急速の増加していることがわかる。すなわち、解は爆発すると 思われる。
これに対して、非線形項の符号を逆にしてみる。このときは次のようになる。

solution =NDSolve[{y''[x] +y[x] + y[x]^2 == 0, y[0]==0, y'[0]==1},y,{x,-3.5,4}];
Plot[Evaluate[y[x] /. solution], {x,-3.5,4} ]

この場合もxの絶対値が大きくなると解は爆発することがわかる。このように非線型性は解の爆発を起こすことがある。
次の例をみる。

solution1 =NDSolve[{y''''[x] + 3y''[x] - y[x] == 0, y[0]==0, y'[0]==0, y''[0]==1, y'''[0]==0},y,{x,-5,5}];
Plot[Evaluate[y[x] /. solution1], {x,-5,5} ]

これに非線型性を与えてみる。グラフの形に大きな変化はみられない。

solution2 =NDSolve[{y''''[x] + 3y''[x] - y[x]^2 == 0, y[0]==0, y'[0]==0, y''[0]==1, y'''[0]==0},y,{x,-5,5}];
Plot[Evaluate[{y[x] /. solution2, u(x) /. solution1}], {x,-5,5} ]

xの範囲を大きくとってみる。解の様子はかなり異なっている。解の爆発が観察できる。

solution1 = NDSolve[{y''''[x] + 3y''[x] - y[x] == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -10, 10}];
Plot[Evaluate[y[x] /. solution1], {x, -10, 10}];
solution2 = NDSolve[{y''''[x] + 3y''[x] - y[x]^2 == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -10, 10}];
Plot[Evaluate[y[x] /. solution2], {x, -10, 10}]

別の非線型性を与えてみよう。この場合にははっきりとした爆発現象は観察できない。

solution1 = NDSolve[{y''''[x] + 3y''[x] - y[x] == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -10, 10}];
Plot[Evaluate[y[x] /. solution1], {x, -10, 10}];
solution2 = NDSolve[{y''''[x] + 3y''[x] - y[x] +y'[x]^2 == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -10, 10}];
Plot[Evaluate[y[x] /. solution2], {x, -10, 10}]

そこでxのとりうる範囲をもっと広げてみる。 この場合にも解の爆発がおきている。

solution1 = NDSolve[{y''''[x] + 3y''[x] - y[x] == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -10, 10}];
Plot[Evaluate[y[x] /. solution1], {x, -10, 10}];
solution2 = NDSolve[{y''''[x] + 3y''[x] - y[x] +y'[x]^2 == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -14, 14}];
Plot[Evaluate[y[x] /. solution2], {x, -14, 14}]

非線型性の次数を変えてみる。するとつぎのようになる。

solution1 = NDSolve[{y''''[x] + 3y''[x] - y[x] == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -10, 10}];
Plot[Evaluate[y[x] /. solution1], {x, -10, 10}];
solution2 = NDSolve[{y''''[x] + 3y''[x] - y[x] + Sqrt[1+ y'[x]^2] == 0, y[0] == 0, y'[0] == 0, y''[0] == 1, y'''[0] == 0}, y, {x, -14, 14}];
Plot[Evaluate[y[x] /. solution2], {x, -14, 14}]

戻る


このノートに関する著作権など

このたびは、このファイルをアクセスしていただきありがとうございました。 内容もいろいろなレベルを含んでいます。また、全体は各項目ができるだけ 独立になるようにしました。内容は入門編ですので Mathematicaの構造に関する説明は意識的に避けました。 数学的にもまだ多くの内容が不足しています。 その点は御容赦ください。また、Unix で表示するとおかしな表示が出ることがあります。 その点は前後の関係から推察をしていただけるとありがたいのですが。 忙しいのであまり改良をしていませんのであしからず。
このプリントの著作権は
〒192-0393 八王子市東中野742ー1
中央大学経済学部
吉野正史

に属します。ただし、まったくのフリーですので自由にご利用ください。
ただ、当然のことですがこのプリントに関して、読者におこりうるいかなる ことにも著者は責任をとりません。
再配布は自由ですが内容を変更しないでください。また、再配布に関しておこるいかなることにも 著者は責任をとりません。