DSolveの使用:ユーザガイド

はじめに

このチュートリアルの目的は,DSolveでさまざまな種類の問題を解くための自己充足的作業ガイドを提供することである.

DSolveを使用する最初のステップは,問題を正確に設定することである.次はDSolveを使って解の式を得ることである.一旦解が見付かると,記号的あるいは数値的方法を使って検証することができる.また,Wolframシステム関数のPlotPlot3DContourPlot等を使ってプロットすることもできる.プロットによって,閉形式の式では明確ではない解についての情報が分かることがよくある.

問題に境界条件が指定されていない場合,DSolveの出力は任意パラメータを含む一般解の形式となる.GeneratedParametersオプションを使うと,このような任意パラメータにラベルを付けることができる.

多くの分野では,ロジスティック方程式の成長率等,微分方程式に記号パラメータが含まれる.微分方程式には,直前の計算から生じた機械数のような非厳密な数値が含まれることもある.DSolveでは記号パラメータも非厳密な数値も使うことができるが,その存在を認識した上で解を正確に解釈するのがよい.

計算中にDSolveが仮定したり,不具合に遭遇したりすると,問題を描写する警告メッセージを発する.このメッセージは通常無視してもよいが,問題に対して与えられた答に重大な制約が存在することを指摘する場合もある.

問題の文は,曖昧さがないように分析するのがよい.つまり,問題が正しい形式であることを確認するのである.そうすることにより,DSolveから意味のある答が得られる.

問題の設定

DSolveに与える第1引数は微分方程式,第2引数は未知の関数であり,最後の引数で独立変数を識別する.

これは,DSolveで一階線形常微分方程式を解く場合の入力である.変数solは後の計算で使う解を識別する:

DSolveの出力は微分方程式の解のリストになる.方程式の中には複数解を持つものもあるので,別のリストが必要になる.ここでは,方程式は一階線形なので,解はy[x]->+-5 x C[1]の1つしかない.初期条件が指定されていないので,解には1つの未知定数C[1]がある.部分指定を使うと,解のリストから解を抽出することができる.

解を抽出する:

この解の形式は 自身を見付けるのには便利であるが,の導関数およびある点における の値を見付けるのには不便である.

以下は解によって与えられた の値を示す:
解は だけに対する規則なので,にも にも適用されない:

解を今後の計算で使う場合,ではなく を使って未知関数を指定するのが一番よい.これにより,Function[x,expr]という形式の純関数を使って解が与えられる.

ここでは未知関数が で指定してある.解は純関数である:

解が純関数の形式である場合,指定された点における の導関数の式と の値の式を見付けることができる.

以下は の式を与える:

問題に複数の解がある場合,解のリストから個々の解を選ぶことも,直接そのリストを使うこともできる.

一階非線形方程式を解く.2つの解がある:
解は部分指定を使って抽出することができる:
両方の式を含むリストを返す:

方程式系を解くためには,DSolveの第1引数は方程式のリストに,第2引数は未知関数のリストにしなければならない.

以下は,3つの未知関数を持つ一階線形方程式系の例である.この系は線形なので,解は1つしかない:

系のそれぞれの解は,未知関数の置換規則のリストになっている.未知関数の式は,前の例と同様にして抽出することができる.

以下は未知関数の式のリストを与える.式をコンパクトな形式で返すために, Simplify が使われる:

問題に初期条件が指定されている場合は,未知定数のいくつか,またはすべてが削除される.

以下では,初期値における未知関数の値とその導関数の両方が指定されている:
初期値だけが指定されている場合でも,解には任意定数が含まれる:

偏微分方程式では,DSolveの第3引数は方程式の独立変数のリストである.

以下で独立変数 を持つ偏微分方程式を解く.C[1]y+Cos[y[x]]の任意関数を表す:

微分代数方程式は,常微分方程式系と同様に指定される.

初期条件のある微分代数方程式の例である:

問題の解が常に陽形式で与えられるとは限らない.その場合,解は未評価のSolveオブジェクト,あるいは,InverseFunctionを使って与えられる.

この方程式の解は,明示的には求められない.出力は,陰解を表す:
解は,通常通り部分指定で抽出することができる:
下の方程式の解はInverseFunctionオブジェクトとして与えられる:
各解は,以下のようにInverseFunctionオブジェクトを削除することにより,陰関数に書き換えられる:

解の検証

DSolveで与えられた解は,さまざまな方法を使って検証することができる.その中でも最も簡単な方法は,解を方程式に代入することである.結果がTrueとなれば,解は有効である.

この簡単な例では,代入で解を検証する.DSolveの第1引数には後の作業の便宜上 eqn を割り当てる:
この例では,代入で方程式と初期条件を検証する:

時として,代入の結果がTrueFalseよりも複雑になることがある.そのような場合は,Simplifyを使って代入の結果を簡約し,検証することができる.簡約された結果がTrueであれば,解は有効である.

二階非同次方程式の一般解である:
解を方程式に代入する:
解はSimplifyを使って検証することができる:
以下の線形偏微分方程式の解はSimplifyを使って検証することができる:

方程式に特殊関数が含まれている場合は,FullSimplifyを使って解を検証する必要があるかもしれない.

その一例である.これにはベッセル(Bessel)関数が含まれている:

解が大きい場合,あるいはSimplifyおよびFullSimplifyでは解が検証できない場合は,RandomRealまたはRandomComplexを使って問題の変数とパラメータすべての値を生成することにより,数値的チェックを行うことができる.その場合,乱数値の集合をいくつか使ってチェックを繰り返した方がよい.

数値検証が使われる例である:

数値チェックでは,確実に解を検証することはできないが,より高い精度を使ったり,変数に複素数値を許可したりすることにより,さらに厳密なチェックを行うことができる.

上記の解をより高い精度で検証する:
ランダムな複素数値を使って上の解を検証する:

上記の方法は,解が陽形式で求められるときだけ使用できる.最後の例では,一階常微分方程式の解が陰形式で与えられるときの検証方法を示す.

一階常微分方程式を解く:
解の導関数を簡約することにより解を検証する:

解のプロット

DSolveで与えられる解のプロットは,解の性質(例えば,振動するものかどうか)についての有用な情報を与えることがある.また,グラフの形状が理論から,あるいは,微分方程式に関連するベクトル場のプロットから判明する場合は,プロットは解の検証方法としての役割を果たすことができる.異なるWolfram言語のグラフィックス関数を使用する例を以下に挙げる.

一階線形方程式の一般解である:
Plotを使って,定数C[1]の指定値に対する解をプロットすることができる.Evaluateを使うことにより,Plotでかかる時間を削減し,解が不連続性を持つ場合にも役に立つ:
初期値がゼロで指定されている二階線形常微分方程式のプロットである:
次の非線形方程式には,同一グラフ上にプロットできる2つの解がある:
以下のアーベル常微分方程式の解は,陰形式で与えられる:
解の性質は,等高線プロットを使って調べることができる.各等高線はC[1]固定値に対する常微分方程式の解に対応する:
2つの線形常微分方程式からなる系の解のプロットである.解が非常に複雑なので,PlotWorkingPrecisionオプションが必要である:
関数ParametricPlotは平面上の解曲線{x[t],y[t]}を追跡するのに使うことができる:
以下は微分代数方程式の解のプロットである:
線形偏微分方程式の一般解である:
任意関数C[1]を特別に選んだときの解曲面のプロットである:

生成されたパラメータ

微分方程式の一般解にはC[1]C[2]等のラベルの付く未定係数が含まれる.

下の例にはC[1]という未定係数が1つある:

未定係数の名前を変更するためには,GeneratedParametersオプションを使う.

以下で,未定係数の名前をP[1]に変更する:

パラメータCは,異なる定数C[i]を生成する指標の集合に作用する純関数と考えなければならない.

これはCの挙動を示している:

内部的に純関数を使用することにより,DSolveは高階常微分方程式および常微分方程式系にあるC[i]の引数 i を正確に増加させることができる.

GeneratedParametersは純関数を使って指定することができる:

1(デフォルト)以外の任意の値でパラメータの指標付けを開始したい場合は,純関数を使うと特に便利である.

純関数を使って上の例のパラメータ const[2]const[3]にラベルを付ける:

パラメータ指標に添え字付き変数やその他のスタイルを使って解を表示すると便利なことがある.

ここでは,パラメータは添え字付き変数を使って指定されている:

Module変数を使うと,各DSolveの呼出しで一意であるパラメータ名を得ることができる.

同一のDSolveの呼出しで異なるパラメータ名を生成する:

ホロノミック解

多項式係数または有理関数係数を持つ線形常微分方程式の解はホロノミック関数DifferentialRootで表すことができる.

以下は多項式係数を持つ線形微分方程式を解く:
解をプロットする:

オプションMethod"Holonomic"を使うと,DSolveが線形微分方程式にホロノミック解を返すよう強制する.

以下で線形常微分方程式を解く:
線形常微分方程式にホロノミック解を返す:

特異解

DSolveはデフォルトでは線形または非線形の常微分方程式に対して,任意のパラメータに依存する一般解を返す.非線形微分方程式によっては特異解を持つものもある.これらの特異解は特定の値を一般解の任意の定数に割り当てることで得ることはできないが,力学系等の研究では便利である.

DSolveのオプションIncludeSingularSolutionsTrueを使うと,非線形常微分方程式について一般解と一緒に特異解が返される.

これを説明するために,一般解が直線群である,次のクレロー(Clairaut)の常微分方程式を考える:
この場合の特異解は,直線群の「包絡線」 である:
以下のプロットは,一般解とこの直線群によって形成された包絡線を示している:
2つ目の例として,次のロジスティック方程式を考える:
この場合の特異解は「平衡」解 および である:
次のプロットは一般解とこの群によって形成された包絡線を示している:

仮定

常微分方程式は,パラメータ・変数の特定のタイプや範囲によって異なる解を持つ場合がある.DSolveAssumptionsを使うと,パラメータおよび変数のタイプや範囲を指定して,必要な解を選ぶことができる.

次は線形二階微分方程式について固有値問題を解く:
ここでAssumptionsオプションでパラメータ の範囲を指定する:
独立変数 が実数であると指定して,常微分方程式を解く:

記号パラメータと非厳密な数値

実際に生じる微分方程式には,下の2つのタイプがある.

  • 唯一の変数が独立・従属変数である方程式.従って,DSolveの第1引数に現れる変数がすべて第2,第3引数にも現れる.
  • 質量あるいはバネ定数等,他の記号的数量を含む方程式.この場合の解は,独立変数,従属変数,付加的な記号的パラメータに依存する.
最初のタイプの例である:
2つ目のタイプの例である.この方程式には記号パラメータ がある:

DSolveは上記のどちらのタイプの方程式も扱うことができる.2つ目のタイプの方程式では,可能なパラメータ値すべてについての解が使えるようにしておくと非常に便利である.

パラメータ の異なる値に対する上の解のプロットである:

記号パラメータがあると,かなり複雑な出力になる可能性がある.

次の例の出力は複雑である([K59]の401ページ,方程式2.14):

しかし,パラメータが特殊値のときは,解は格段に簡単になる.

の値が下のような場合は,解はさらに簡単になる:

解がパラメータの大部分の値については有効であるが,すべての値については有効でないという場合がある.

この例の入力は では有効ではないので,解にも同じ制約がある:
ここで と設定すると制約はなくなる:

つまり,記号パラメータを持つ微分方程式が解けるということは,DSolveのような記号ソルバのパワフルで不可欠な機能なのである.しかし,下記の点には注意しなければならない.

  • 解が複雑になることがある.そのような計算には,かなりの時間とメモリが必要となることが多い.
  • パラメータが例外的な値のときは,答が有効ではない場合がある.
  • パラメータが特殊値のときは,解の検証を記号的に行うと簡単であるが,一般的には数値検証法の方がよい.

Wolfram言語の数には,無限精度,機械精度,任意精度の3種類がある.無限精度数は「厳密数」といわれ,残りの2つは不完全な情報を表すため「非厳密数」と呼ばれる.

以下は3種類の数を示す例である:

DSolveは記号ソルバなので,使用されるアルゴリズムは主に入力が厳密であるという前提に基づいている.しかし,DSolveは非厳密な数値を含む方程式も通常通りに扱う.

以下の方程式には,それぞれ非厳密数3.,3.`40が含まれている:

非厳密な入力が生じるのは,例えば,方程式の係数が前の計算から導かれており,近似的にのみ分かっている場合等である.そのような場合,方程式を厳密形式に変換することは,計算を著しく遅くするので,実践的ではない.

すべての方程式に厳密数の係数が含まれている線形常微分方程式系である. の値がかなり小さくても,計算が終了するには長い時間がかかる:
解を検証する.解は複雑なので,数値検証法が使われる:
関数 に単独の非厳密な値が導入されると,解はより速く返される:

このように,DSolveのような記号関数の中でも,非厳密数を使い続けたほうがよい場合がよくある.しかし,そのような場合に得られる解にはある程度の数値誤差が含まれるため,注意深くチェックしなければならない.問題が大きすぎない(方程式が5つ未満である等)場合は,関数Rationalizeを使って入力を厳密形に変換しなければならない.

以下の方程式には非厳密数が含まれている:
ここで,方程式を解く前に厳密形式に変換する:

問題が適切であるかどうか

DSolveは初期条件か境界条件が指定されていない場合,問題の一般解を返す.

この方程式では一般解が返される:

しかし,初期条件か境界条件が指定されている場合は,DSolveの出力は内在する微分方程式と与えられた条件の両方を満足しなければならない.

境界条件を持つ例である:

このような場合,DSolveへ与える問題が妥当であるかどうかをチェックしてみるとよい.つまり,問題が正しい形式であるかどうかをチェックするのである.初期値あるいは境界値問題の解が有名な関数(正則関数等)に存在することが保証される場合,解が一意の場合,解がデータに連続的に依存する場合,問題は適切であるといえる. 階常微分方程式(あるいは 個の一階方程式からなる系)と 個の初期条件があるとすると,指定された条件の下で問題は適切であることを示す標準的な存在・一意性定理がある.前の例の一階線形常微分方程式の右辺は の多項式なので,無限に微分可能である.これは,右辺がLipschitz連続であることしか必要としないピカール(Picard)の存在・一意性定理を適用するのに十分である.

実際に生じる問題は,正しい理論的原則から導かれているため,ほとんどが適切である.しかし,注意事項として,DSolveが問題を満足する解を見付けることが難しい例を以下に挙げる.

以下の一階常微分方程式の解では,右辺が0付近においてLipschitz条件を満足しない:
この一般解には2つの分岐がある:
この初期値問題は初期条件付近の領域で正当な形式であるため,DSolveは与えられた初期条件に対して,正しい分岐を選ぶ:
以下は二階常微分方程式である.境界条件のため,この問題には解がない:

問題に解があっても,一般解が陰形式であったり高次の超越関数を含んでいたりするために,DSolveでは見付けることができないことがある.

次の例では,従属および独立変数の役割を交換した後で初めて解が求められる:

DSolveValueを使う

DSolveとともに,関数DSolveValueも微分方程式を解くために使うことができる.DSolveValueは常微分方程式,偏微分方程式,微分代数方程式,遅延微分方程式,積分方程式,積分微分方程式,ハイブリッド微分方程式を解くことができる.

DSolveValueの出力は従属関数の形式 または で制御される.

以下で微分方程式を解く:
これは に対する「純関数」解を返す:
以下は解を検証する:
解をプロットする:

DSolveとは対照的に,DSolveValueの第2引数は従属および独立変数の任意の式でよい.DSolveValue[eqn,expr,x]は独立変数 を持つ常微分方程式 eqn の記号解によって決定された expr の値を与える.

次の例は常微分方程式を解き,点 における解の値を返す:
次は解の微分を返す:

微分方程式の解が複数の分岐を持つ場合,DSolveValueは警告メッセージを生成し解のうちの一つだけを返す.

次の常微分方程式の解には複数の分岐がある:
DSolveを使うと,すべての解の分岐を得ることができる:

以上でDSolveを効率的に使うための基本原則についての説明を終わる.DSolveの開発中やこのドキュメントの執筆中に役立った「参考文献」のリストがある.