微分方程式の数値解

「微分方程式の数値解法」で説明したNDSolveを使うと,微分方程式を数値解析的に解くことができる.また,単独の微分方程式でも連立の微分方程式でもNDSolveで解ける.さらに,広い範囲の常微分方程式と偏微分方程式の一部が扱える.常微分方程式系の場合,未知の関数 がいくつあっても構わないが,すべて単一の独立変数 のみに依存しているものとする.偏微分方程式の場合は,複数の独立変数を含んでいる.NDSolveは微分方程式と代数方程式が混ざった「微分代数方程式」も扱うことができる.

NDSolve[{eqn1,eqn2,},y,{x,xmin,xmax}]
から の範囲で関数 の数値解を求める
NDSolve[{eqn1,eqn2,},{y1,y2,},{x,xmin,xmax}]
複数の関数 の数値解を求める

微分方程式の数値解法

NDSolveで求まる関数 の解は,InterpolatingFunctionオブジェクトを使って表される.InterpolatingFunctionオブジェクトは,独立変数 から で指定される範囲にあるとき の近似を与える.

NDSolveでは解を求めるために反復手法が使われる.それは のある値を始点とし,一連の刻みを取りながら から の範囲をくまなく探索していく.

探索を開始するには,NDSolveの式の中に とその導関数に関する適切な初期条件や境界条件が備わっている必要がある.これらの条件を与えることで, の特定点における ,さらに導関数 の値を決定していく.少なくとも常微分方程式において,この条件は のどの点でもよい.それはNDSolve から の全範囲をくまなく自動的に探すからである.

について解く.の初期条件を与え,からの範囲で探索する.
In[1]:=
Click for copyable input
Out[1]=
の探索範囲はからのままだが,初期値はについて与えている.
In[2]:=
Click for copyable input
Out[2]=
簡単な境界値の問題を解く.
In[3]:=
Click for copyable input
Out[3]=

NDSolveを使う際は, の解を完全に決定するのに十分な初期条件,または,境界条件を与えておく必要がある.DSolveを使って微分方程式の厳密解を求めるときには,初期条件が足りなくてもどうにかなる.これは,指定しなかった初期条件のため発生する自由度を明示化するため,積分定数C[i]DSolveにより自動的に挿入されるからである.ところが,NDSolveでは解は数値として与えなければならないので,数値では余分に発生する自由度が表せない.このため,解を決定するのに十分な初期条件,または,境界条件を明示的に与えなければならない.

階の微分方程式を解くとき,通常,最大で次までの導関数について初期条件を与えるか,または, 点における境界条件を与える必要がある.

三階の微分方程式を解く.三階なので,最大で二次までの導関数を与えなければいけない.
In[4]:=
Click for copyable input
Out[4]=
得られた解をプロットする.
In[5]:=
Click for copyable input
Out[5]=
別の三階微分方程式を解く.境界条件を3点について与える.
In[6]:=
Click for copyable input
Out[6]=
Wolfram言語では,線形結合した関数値や微分値なら何でも境界条件として使える.
In[7]:=
Click for copyable input
Out[7]=

多くの場合,与える初期条件は必ず同一の 値,例えば を含む必要がある.このため, から の範囲は別に与えなくてもよくなる. の範囲をとして指定すると,Wolfram言語では自動的に から の範囲で有効な解が生成される.

0〜2の範囲で有効な解を求める.
In[8]:=
Click for copyable input
Out[8]=

初期条件とする方程式はどんな種類のものでもよい.場合によっては,これらの方程式は複数の解を持つことがある.そのような場合は,それに対応した形でNDSolveが複数の解を生成する.

この初期条件は,複数の解を与える.
In[9]:=
Click for copyable input
Out[9]=
求まる解をすべてプロットする.
In[10]:=
Click for copyable input
Out[10]=

NDSolveを使って,結合された微分方程式の系を解くことも可能である.

結合した方程式の対を数値的に解く.
In[11]:=
Click for copyable input
Out[11]=
求まったの解をプロットする.
In[12]:=
Click for copyable input
Out[12]=
の両方を使いパラメトリックプロットを生成する.
In[13]:=
Click for copyable input
Out[13]=

微分方程式に未知の関数を使うとき,関数の名前として必ずしも単一のシンボルを与える必要はない.未知の関数が複数個あるとき等は,例えば といった関数名にするとよい.

5組の微分方程式と初期条件を構築する.
In[14]:=
Click for copyable input
Out[14]=
この方程式を解く.
In[15]:=
Click for copyable input
Out[15]=
解をプロットする.
In[16]:=
Click for copyable input
Out[16]=

NDSolveは値がリストや配列である関数も扱える.のような初期条件を与えると,NDSolve を値が長さ のリストである関数だと仮定する.

これは4つの微分方程式が組み合された系の解を求める.
In[17]:=
Click for copyable input
Out[17]=
これが解である.
In[18]:=
Click for copyable input
Out[18]=
オプション名
デフォルト値
MaxStepsAutomatic の最大ステップ数
StartingStepSizeAutomatic が使用する初期刻み幅
MaxStepSizeAutomatic が使用する最大刻み幅
NormFunctionAutomatic誤差推定で使用するノルム

NDSolveの特別オプション

NDSolveには方程式を解く多くのメソッドが備わっているが,基本的にはすべてのメソッドが独立変数 内で一連のステップを取ることで解を求める.この手順は適応型であり,刻み幅は常に適当であるように自動調整される.値が特定の領域で急激に変化するときは,NDSolveが解を見逃さないように刻み幅が徐々に狭められるか,あるいはメソッドが変更される.

導関数に不連続点がある微分方程式を解いてみる.
In[19]:=
Click for copyable input
Out[19]=
NDSolveの解の探索において,の近傍では刻み幅が狭められ,折れ部でも正確に追跡ができている.
In[20]:=
Click for copyable input
Out[20]=

NDSolveの探索手順は適応型であるから,変数 の変化率が大きく異なるいくつかの要素を持つ,いわゆる「扱いにくい」微分方程式を解くこともできる.

これらの方程式において,より急激に変化する.
In[21]:=
Click for copyable input
Out[21]=
それでも,両方ともNDSolveで正確に追跡できている.
In[22]:=
Click for copyable input
Out[22]=

NDSolveで使われる手順では,解を確実に追跡できるまで刻み幅を徐々に狭めている.ただし,この手順では,真の解に特異点が存在すると問題が起る.つまり,NDSolveで刻み幅の細分化が限りなく行われてしまい,探索が終了しなくなってしまう.この問題を避けるため,NDSolveに許す最大ステップ数をオプションMaxStepsで指定しておく.常微分方程式の場合,このオプションはデフォルトでMaxSteps->10000になっている.

NDSolveは10000ステップに達した後に停止する.
In[23]:=
Click for copyable input
Out[23]=
確かに,において解は特異点を持つ.
In[24]:=
Click for copyable input
Out[24]=

解が滑らかなほとんどの関数では,MaxStepsのデフォルト値で十分間に合う.解が複雑な構造を取るようなときは,MaxStepsを大きく取っておくとよいだろう.また,MaxSteps->Infinityと設定しておくとステップの上限なしで探索ができる.

ローレンツ(Lorenz)方程式の解をここまで求めるためには,MaxStepsのデフォルトによる制限を除いておく必要がある.
In[25]:=
Click for copyable input
Out[25]=
求まった解を3Dパラメトリック形式でプロットする.
In[26]:=
Click for copyable input
Out[26]=

連立した微分方程式を解くとき,NDSolveではすべての方程式に適応するように刻み幅が自動調整される.しかし,場合によっては,NDSolveで最初に取るステップ幅が大きすぎて解の重要な特徴を見逃しかねない.このような問題を避けるには,オプションStartingStepSizeを使い第1ステップの幅を特別に指定しておく.

NDSolveに与える方程式すべてが導関数を含んでいる必要はない.単に代数的なだけでもよい.NDSolveを用いて多くの「微分代数方程式」を解くことができる.

これは微分代数方程式系を解く.
In[27]:=
Click for copyable input
Out[27]=
これが解である.
In[28]:=
Click for copyable input
Out[28]=
NDSolve[{eqn1,eqn2,},u,{t,tmin,tmax},{x,xmin,xmax},]
偏微分方程式系を について解く
NDSolve[{eqn1,eqn2,},{u1,u2,},{t,tmin,tmax},{x,xmin,xmax},]
偏微分方程式系を複数の関数 について解く

偏微分方程式を数値的に解く

これは波動方程式の数値解を求める.結果は二次元の補間関数である.
In[29]:=
Click for copyable input
Out[29]=
結果のプロットを生成する.
In[30]:=
Click for copyable input
Out[30]=
これで非線形波動方程式の数値解を求める.
In[31]:=
Click for copyable input
Out[31]=
これは結果の3Dプロットである.
In[32]:=
Click for copyable input
Out[32]=
これは結果の高解像度密度プロットである.
In[33]:=
Click for copyable input
Out[33]=
これはこの方程式の2+1次元におけるバージョンである.
In[34]:=
Click for copyable input
Out[34]=
これで方程式を解く.
In[35]:=
Click for copyable input
Out[35]=
これは解のプロットの配列を生成する.
In[36]:=
Click for copyable input
Out[36]=