|
3.5.10 微分方程式
1.5.9で説明したように,Mathematicaの関数DSolveを使って常微分方程式および偏微分方程式の解をシンボル的に求めることが可能である.
微分方程式を解くということは,未知な関数の取る形を見出すことが基本的である. Mathematicaでは,未知の関数はy[x]のような式で表される.また,導関数は y'[x]や y''[x]のように表される.
組込み関数 DSolveは,関数規則として求まる解をリスト形式で返す.ここで,解が割り当てられる関数がどのように表されているかで,その先の解の応用が左右されることがある. DSolveに y[x]について解くように指定すると,解である規則は確かに y[x]について定義されるものになる.問題に よっては,この割付規則で十分事が足りる.ただし,そのままでは, y'[x]の値,さらには, y[0]の値さえも生成できない.このため, DSolveでは, y[x]についてではなく y自体について解くように指定した方が都合よくなる.そうすれば, DSolveからは yを純粋関数として与える規則が求まる.純粋関数に関しては 2.2.5を参照のこと.
DSolveを使い y[x]について解く. y[x] に対する規則が求まる.
In[1]:= DSolve[y'[x] + y[x] == 1, y[x], x]
Out[1]= 
この規則は y[x]だけに限って適用可能である. y[0]や y'[x]には適用できない.
In[2]:= y[x] + 2y'[x] + y[0] /. %
Out[2]= 
一方, DSolveを使って yについて解くと,関数 yを純粋関数とする規則が求まる.
In[3]:= DSolve[y'[x] + y[x] == 1, y, x]
Out[3]= 
今度の規則は, yが微分の形で現れても適用可能である.
In[4]:= y[x] + 2y'[x] + y[0] /. %
Out[4]= 
解をもとの方程式に代入すると Trueとなる.
In[5]:= y'[x] + y[x] == 1 /. %%
Out[5]= 

微分方程式の解法と2つの解の形
標準的な数学表記法では,微分方程式の解を構成するとき,よく「ダミー変数」を導入し解に現れる関数の引数を表すようにする.解を表すための数式だけが必要なら,ダミー変数を導入することは確かに便利である.しかし,解をその他の計算に適用したい場合には,ダミー変数を使わずに純粋な関数として解を得た方が有利だろう.ただし,純粋な関数は Mathematicaでは簡単に表せるが,それに直接相当する数学の標準的な記述は存在しないことに注意されたい.

連立微分方程式の解法
連立している2つの微分方程式を解く.
In[6]:= DSolve[{y[x] == -z'[x], z[x] == -y'[x]}, {y, z}, x]
Out[6]= 
この式では, yに関して2つの異なる解が求まる.
In[7]:= DSolve[y[x] y'[x] == 1, y, x]
Out[7]= 
y[0] == 0のような式を特別に追加することで,微分方程式に初期条件や境界条件が付加できる.
y[0] == 1の条件を満たす解を求める.
In[8]:= DSolve[{y'[x] == a y[x], y[0] == 1}, y[x], x]
Out[8]= 
制約条件や境界条件なしで連立微分方程式を解くと, Mathematicaでは一般解が求められる.一般解には未定な「積分定数」がいくつか含まれる.各方程式の持つ導関数の階数に応じて1つずつ新たな定数が導入される.
定数にはデフォルトでC[n]というように名前が付けられる.添数nは開始値が1で,DSolveが使われるたびにリセットされる.また,オプションGeneratedParametersを特別に設定することでnに任意な値を割り当てることができる.関数をオプションに割り当てると,DSolveが使われるたびにそれがnの取る各添数値に適用され各定数の添数が決定される.
4次方程式の一般解を求める.解には未定係数が4つ必要になる.
In[9]:= DSolve[y''''[x] == y[x], y[x], x]
Out[9]= 
独立した初期条件や境界条件を1つ与えると必要になる未定係数が1つ減る.
In[10]:= DSolve[{y''''[x] == y[x], y[0] == y'[0] == 0}, y[x], x]
Out[10]= 
微分方程式の解を厳密な数式として求めることは非常に難しい.事実,標準的な数学関数で構成できるような式が存在するのはごく限られた数の方程式しかない.
最もよく研究されてきた微分方程式は,解法の対象になる関数とその導関数が線形な系である線形方程式である.
斉次1次線形方程式を解く.簡単な解が求まる.
In[11]:= DSolve[y'[x] - x y[x] == 0, y[x], x]
Out[11]= 
非斉次方程式にすると,途端に複雑な解になってしまう.
In[12]:= DSolve[y'[x] - x y[x] == 1, y[x], x]
Out[12]= 
単一の線形微分方程式を解くとき,解法の対象にする関数の1次導関数だけを方程式が持つとき,積分をするだけで必ず解が求まることが分かっている.
しかし,微分方程式が2つ以上になるか,2次以上の導関数を持つと,その限りではなくなる.それでも,単純な2次の線形微分方程式によっては, 3.2.10に示した各種特殊関数を使い解くことが可能である.事実,特殊関数の多くはそもそもこの種の方程式を解くために導入された,という歴史的な経緯を持っている.
エアリー方程式を解く.解法にはエア リー関数が使われる.
In[13]:= DSolve[y''[x] - x y[x] == 0, y[x], x]
Out[13]= 
ベッセル関数が使われ解が求まる.
In[14]:= DSolve[y''[x] - Exp[x] y[x] == 0, y[x], x]
Out[14]= 
マシュー関数が使われ解が求まる.
In[15]:= DSolve[y''[x] + Cos[x] y[x] == 0, y, x]
Out[15]= 
2次の線形方程式によっては,初等関数だけで解けるものもある.
In[16]:= DSolve[x^2 y''[x] + y[x] == 0, y[x], x]
Out[16]= 
2次より高次の線形微分方程式になると,ごく単純な形を持ったものでも解法に必要な関数は非常に難解になる.3次の場合,方程式によってはマイヤーのG関数 MeijerGが使えるときがある.4次とそれ以上の高次方程式には,標準的な数学関数はごくまれなケースを除き全く使えない.
3次の線形微分方程式を解く.一般化された超幾何関数が使われ解が求まる.
In[17]:= DSolve[y'''[x] + x y[x] == 0, y[x], x]
Out[17]= 
この方程式にはさらに一般化されたマイヤーのG関数が必要になる.
In[18]:= DSolve[y'''[x] + Exp[x] y[x] == 0, y[x], x]
Out[18]= 
非線形な微分方程式だと,限られた特殊ケースにおいてだけ標準的な数学関数を使って解くことが可能である.ただし, DSolveには汎用的な手続きが使われているので,標準公式集に解が載っているような非線形微分方程式であればほとんど解けるようになっている.
1次非線形微分方程式を解いてみる. 自体が式になければ割合簡単に解が求まる.
In[19]:= DSolve[y'[x] - y[x]^2 == 0, y[x], x]
Out[19]= 
リッカチ(Riccati)方程式になると,解法は非常に複雑なものになってしまう.
In[20]:= DSolve[y'[x] - y[x]^2 == x, y[x], x] // FullSimplify
Out[20]= 
それでも,このベルヌーイ(Bernoulli)の方程式は割合簡単に解ける.
In[21]:= DSolve[y'[x] - x y[x]^2 - y[x] == 0, y[x], x]
Out[21]= 
このアーベル(Abel)方程式も解けるが,解は陰的な形でしか求まらない.
In[22]:= DSolve[y'[x] + x y[x]^3 + y[x]^2 == 0, y[x], x]

Out[22]= 
常微分方程式以上の場合は,微分方程式と代数方程式を混合したものを含む「微分代数方程式」と考えることができる.
微分代数方程式を解く.
In[23]:= DSolve[{y'[x] + 3z'[x] == 4 y[x] + 1/x, y[x] + z[x] == 1}, {y[x], z[x]}, x]
Out[23]= 

偏微分方程式を解く
DSolveは1変数の常微分方程式だけでなく,2個以上の変数が現れる偏微分方程式も扱えるようになっている.
2変数の簡単な偏微分方程式の解を求める.
In[24]:= DSolve[D[y[x1, x2], x1] + D[y[x1, x2], x2] == 1/(x1 x2), y[x1, x2], {x1, x2}]
Out[24]= 
純粋関数として表された解.
In[25]:= DSolve[D[y[x1, x2], x1] + D[y[x1, x2], x2] == 1/(x1 x2), y, {x1, x2}]
Out[25]= 
偏微分方程式の数学理論は常微分のそれと比べてかなり複雑である.その1つの理由は,常微分方程式の一般解は単に定数しか含まないのに対し,偏微分方程式の一般解は,見付かったとしても任意関数を含んだ形となることである.実際 変数の偏微分方程式の一般解には 変数の任意関数が含まれる. DSolveはデフォルトでこのような関数を C[n]で表す.
3変数の簡単な偏微分方程式.
In[26]:= (D[#, x1] + D[#, x2] + D[#, x3])& [y[x1, x2, x3]] == 0
Out[26]= 
解は2変数の任意関数を含む.
In[27]:= DSolve[%, y[x1, x2, x3], x1, x2, x3]
Out[27]= 
1次元波動方程式.
In[28]:= (c^2 D[#, x, x] - D[#, t, t])& [y[x, t]] == 0
Out[28]= 
この2階の方程式の解は2つの任意関数を含む.
In[29]:= DSolve[%, y[x, t], {x, t}]
Out[29]= 
常微分方程式には解の存在が保証されており,初期条件あるいは境界条件を与えることは,一般解に含まれる積分定数の値を決定することにすぎない.しかし偏微分方程式に関してはそうではない.実際,線形偏微分方程式かその他のまれな特別の型の偏微分方程式しかそのような一般解を持たない.
他の偏微分方程式は初期条件あるいは境界条件が与えられたときのみ解くことができる.そしてほとんどの場合,解が標準的な数学関数で表せることはない.
yとその微分が線形に現れるとき,一般解が存在する.
In[30]:= DSolve[x1 D[y[x1, x2], x1] + x2 D[y[x1, x2], x2] == Exp[x1 x2], y[x1, x2], {x1, x2}]
Out[30]= 
この非線形微分不定式は,一般解を持つ.
In[31]:= DSolve[D[y[x1, x2], x1] + D[y[x1, x2], x2] == Exp[y[x1, x2]], y[x1, x2], {x1, x2}]
Out[31]= 
この偏微分方程式は一般解を持たない.
In[32]:= DSolve[D[y[x1, x2], x1] D[y[x1, x2], x2] == a, y[x1, x2], {x1, x2}]
Out[32]= 
|