dsolve/numeric/rkf45 - 常微分方程式の数値解を求める
使い方
dsolve(odesys, numeric, method=rkf45, vars, options)
dsolve(numeric, method=rosenbrock, procopts, options)
パラメータ
odesys - 集合またはリスト ; ( 連立 ) 常微分方程式および初期条件
numeric - 名前 ; dsolve に数値解を要求します
method=rkf45 - method=rkf45を指定 ; 数値解法として使用します
vars - ( オプション ) 常微分方程式の未知変数を含む全ての一変数の不定関数, あるいはそれらの集合かリスト
options - ( オプション ) keyword = value 形式の方程式
procopts - 連立常微分方程式に用いる手続きの指定オプション (procedure, initial, start, number, procvars のいずれか。 ) 。詳細は dsolve[numeric,IVP] をご参照ください。
|
説明
|
|
•
|
オプションに numeric および method=rkf45 を指定した dsolve コマンドは、4次の補間を含む 4-5 次 Runge-Kutta Fehlberg 法 (Fehlberg fourth-fifth order Runge-Kutta method) を用いて数値解を求めます。stiff を用いない場合、この解法は初期値問題 (IVP) を type=numeric と指定して解く場合のデフォルトの解法となっています。
|
|
Modes of Operation(操作方法?)
|
|
•
|
rkf45 による解法には、二つの異なった ( 手続き型出力のための ) 操作方法があります。
|
|
range オプションを用いる場合、この解法は、指定範囲 (range) において、返された手続きを全て呼び出すために要求された解の値を高速に補間し、それを解の情報として内部に記憶して初期値問題 (IVP) の解を計算します。
|
|
この操作方法では、steppast が false としてデフォルト設定されており、積分の端点でステップが端点を越えてステップを踏まないように調整すべきであることを表示しています。指定範囲外の点で呼び出された手続きを返すことも可能ですが、あまり薦められません。
|
|
この方法は、適応型プロットとして odeplot の refine オプションと組み合わせて使用することができます ( つまり、refine が指定されたとき、odeplot はプロットのために前計算された点を使います。) 。
|
|
この方法は、解が特異になれるような問題に使用することは薦められません。各ステップを保存すると、特異性の近くでは多くのステップを取ることになり、メモリの使用量が深刻な問題となります。
|
|
この方法を使用している間に記憶する補間の情報は、以下で説明するようように interpolation=false オプションを用いることで無効にすることができます。これは、 ( 離散解に加えて ) 補間の記憶により多くのメモリを必要とする場所で高精度な解を得るために薦められます。解の値は最も近い5点の補間から得られるため、補間を無効にすることは一般的に薦められません。さらに、必ずしも4つのエラーのを補間に提供するわけではありません。
|
|
range オプションを用いない場合、初期値問題 (IVP) の解の値は記憶されませんが、要求される度に計算することになります。
|
|
この操作方法では、steppast が true としてデフォルト設定されており、解の値の出力は補間を使用する方法によって計算されます。このアプローチは、複数の点が必要となる場合により効率的な解の計算を提供しています。
|
|
この方法を含む補間の使用は、以下で説明する interpolation=false オプションを使用することによって無効にすることができますが、常に steppast=false を指定することが必要となります。
|
|
全ての解の値が記憶されるわけではないので、初期点と最も新しく計算された点の間の点が要求された場合はいつも、( 積分の反転を避けるために ) 初期値から計算しなおさなければなりません。したがって、初期値から移動した解の値を集めることが賢明です。
|
|
|
オプション
|
|
•
|
以下のオプションは rkf45 で使用することが可能です。
|
'output' = keyword or array
'known' = name or list of names
'abserr' = numeric
'relerr' = numeric
'initstep' = numeric
'maxfun' = integer
'number' = integer
'procedure' = procedure
'start' = numeric
'initial' = array
'procvars' = list
'startinit' = boolean
'implicit' = boolean
'optimize' = boolean
'range' = numeric..numeric
'interpolate' = boolean
'steppast' = boolean
'stop_cond' = list
'complex' = boolean
|
dsolve の出力形式を指定します。procedurelist, listprocedure, および operator は手続き型が出力を指定し、piecewise は指定された範囲の独立変数の値で piecewise 関数の形式で出力することを指定します。さらに 1-D 配列および配列は固定された独立変数の値を出力します。詳細は dsolve[numeric] をご参照ください。
|
|
abserr, relerr, and initstep
|
|
解の精度と、解法の最初のステップ幅を指定します。詳細は dsolve[Error_Control] をご参照ください。rkf45 でのデフォルトの値は abserr=Float(1,-7) と relerr=Float(1,-6) となります。もし指定しなかった場合、initstep の値は連立常微分方程式の局所的な振る舞いを考慮して、解法が決定します。
|
|
一階の連立常微分方程式の右辺の評価数の最大値を指定します。このオプションは maxfun=0 と指定することで無効にできます。rkf45 でのデフォルトの値は 30000 です。
|
|
number, procedure, start, initial, and procvars
|
|
startinit, implicit, and optimize
|
|
解の値が必要とする独立変数の値の範囲を決定します。このオプションの使用は、dsolve[numeric] に説明がある手続き型の出力形式 (output types) のために計算法の振る舞いを大きく変えることになります (range を使用するか否かについては、このページの操作方法 ( Modes of Operation ) をご参照ください。 ) 。
|
|
もし補間が Runge-Kutta 積分のステップの間に加えられた解の値を計算すべきであるならば、論理演算子の値を受け入れます。これはデフォルトでは true と設定されています。ゆるい許容誤差 ( デフォルトと同様な ) のために、より計算された点、および滑らかなプロット、さらに補間された解のための一貫した精度を与えます。指定した範囲でより厳しい許容誤差を持つ問題には、この false 設定によって計算した解を記憶するメモリの量を減らすことを薦めます。
|
|
(range が指定されている場合に) 計算に範囲外の値を利用するか、(range が指定されていいない場合に) 要求した点で値を計算するかを計算法に指示した場合、論理演算子の値を受け入れます。デフォルトの値は range オプションが存在するかに依存します。範囲 (range) が指定されていれば false となり、それ以外では true となります。
|
|
記憶を行わない場合、このオプションは 補間 (interpolate) を含み、より一定の解の値を与え、解がより効果的に連続であるように同意しなければなりません。この場合、steppast=false, interpolate=false は計算法が出力点の近くでステップ幅を調整しなくてはならず、計算を続けるためにステップ幅を以前の調整に戻さなくてはならならことを意味します。
|
|
停止の評価基準のリストを受け入れます。このリストは、常微分方程式の解の数値積分をモニタする評価基準となります。評価基準の一つが満たされたとき、積分は停止し、現在のポイントを解として与えます。詳細は dsolve[Stop_Conditions] をご参照ください。
|
|
問題が複素数値である ( またはそうなるような ) 場合を表示する論理演算子を受け入れます。デフォルトでは方程式系と初期データの入力に基づいて検出するように設定されていますが、入力した方程式系が手続き型で定義されている場合や、初期データが実数である場合には、解を得るために complex=true を指定する必要があります。これは最初の実方程式系が複素方程式系になる可能性があります。この変化が起こる点は特異であると考えられるので、もし complex=true が指定されていなければ、この点で積分が停止することになります。
|
|
|
追加項目
|
|
•
|
infolevel[dsolve] を 2 と設定することで、最後の格子点での評価値の情報に誤差が含まれます。
|
•
|
rkf45 による方法は、Digits の環境変数を変更して計算精度を上げることで、連立初期値問題 (IVPs) の解を高精度に計算することが可能になります。しかしながら、これは高階な dverk78 か gear を使う場合に薦められる方法です。
|
•
|
結果は plots パッケージの odeplot 関数を使用してプロットすることができます。
|
|
|
|
例
|
|
範囲を指定した解 - 区間 0..1 の解を記憶します。:
>
|
dsys1 := {diff(x(t),t)=y(t), diff(y(t),t)=x(t)+y(t),
x(0)=2, y(0)=1};
|
| (2.1) |
>
|
dsol1 := dsolve(dsys1, numeric, output=listprocedure,
range=0..1):
dsol1x := subs(dsol1,x(t)): dsol1y := subs(dsol1,y(t)):
dsol1x(0), dsol1y(0);
|
| (2.2) |
>
|
dsol1x(0.4), dsol1y(0.4);
|
| (2.3) |
>
|
dsol1x(1.0), dsol1y(1.0);
|
| (2.4) |
範囲を指定しない解 - 各点では要求されたときに計算します。:
>
|
dsol2 := dsolve(dsys1, numeric, method=rkf45,
output=procedurelist):
dsol2(0);
|
| (2.5) |
| (2.6) |
| (2.7) |
配列の解 :
>
|
dsys3 := {(D@@2)(x)(t)=-y(t), (D@@2)(y)(t)=D(x)(t)+y(t)};
|
| (2.8) |
>
|
init3 := {x(0)=1, D(x)(0)=0, y(0)=0, D(y)(0)=1};
|
| (2.9) |
>
|
dsol3 := dsolve(dsys3 union init3, numeric, method=rkf45,
output=array([0,.6,1.1,1.5,2.3,2.5]));
|
| (2.10) |
procedurelist 出力 :
>
|
deqn4 := { diff(y(t),t$3) - 2*diff(y(t),t$2) + 2*y(t) };
|
| (2.11) |
>
|
init4 := { y(0)=1, D(y)(0)=1, (D@@2)(y)(0)=1 };
|
| (2.12) |
>
|
dsol4 := dsolve(deqn4 union init4, numeric, method=rkf45,
relerr=Float(1,-8), abserr=Float(1,-8),
maxfun=0, output=procedurelist);
|
| (2.13) |
| (2.14) |
| (2.15) |
複素数値問題における Piecewise 出力 :
>
|
deqn5 := { diff(y(t),t) = I*y(t) };
|
| (2.16) |
| (2.17) |
>
|
dsol5 := dsolve(deqn5 union init5, numeric, method=rkf45,
output=piecewise, complex=true, range=0..Pi):
length(dsol5);
|
| (2.18) |
| (2.19) |
>
|
eval(dsol5[2],t=evalf[15](Pi));
|
| (2.20) |
|
|
参照
|
|
dsolve[classical], dsolve[dverk78], dsolve[Error_Control], dsolve[gear], dsolve[lsode], dsolve[maxfun], dsolve[numeric], dsolve[numeric,IVP], dsolve[rosenbrock], dsolve[Stiffness], dsolve[Stop_Conditions], dsolve[taylorseries], infolevel, plots[odeplot]
|
|
参考文献
|
|
|
Fehlberg, E. "Klassische Runge-Kutta-Formeln vierter und niedrigerer Ordnung mit Schrittweiten-Kontrolle und ihre Anwendung auf Waermeleitungsprobleme" Computing, vol. 6 (1970) 61-71.
|
|
Enright, W.H.; Jackson, K.R.; Norsett, S.P.; and Thomsen, P.G. "Interpolants for Runge-Kutta Formulas" ACM TOMS, vol. 12 (1986) 193-218.
|
|
Shampine, L.F. and Corless, R.M. "Initial Value Problems for ODEs in Problem Solving Environments" J. Comp. Appl. Math, vol. 125(1-2) (2000) 31-40.
|
|
Forsythe, G.E.; Malcolm, M.A.; and Moler, C.B. Computer Methods for Mathematical Computations. Prentice Hall, Englewood Cliffs, NJ, 1977.
|
|
|