XLPack 6.1
C/C++ API リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ _derkf_r()

void _derkf_r ( int  n,
double *  t,
double  y[],
double  tout,
double *  rtol,
double *  atol,
int  itol,
int  mode,
double  work[],
int  lwork,
int  iwork[],
int  liwork,
int *  info,
double *  tt,
double  yy[],
double  yyp[],
int *  irev 
)

常微分方程式の初期値問題 (5(4)次 ルンゲ・クッタ・フェールベルグ法) (リバースコミュニケーション版)

目的
本ルーチンは1階の常微分方程式の初期値問題
dy/dt = f(t, y), ただし t = t0 において y = y0
の解を求める. ただし, t0およびy0は既知でそれぞれtおよびyの初期値である. 上の方程式が連立微分方程式であれば, yはベクトルで表される.

本ルーチンは, 微分方程式ソルバー・パッケージDEPACに収録されているプログラムのひとつである(DEPACは, derkf, deabmおよびdebdfからなる).
derkfは5(4)次ルンゲ・クッタ・フェールベルグ法のプログラムである. 3つの中ではアルゴリズムおよび使用法の両面で最もシンプルなルーチンである. 主に, 微分係数の計算に時間がかからない非スティフおよびややスティフな微分方程式を解くために設計されている. 一般的には, 高精度な解を求める場合や非常に多くの点における解を求める場合には適さない. derkfはオーバーヘッドが非常に小さいため, 中程度の精度が必要で方程式の計算に時間がかからない場合に, 通常は最も短い計算時間で解を求める.

derkfは H. A. Watts および L. F. Shampine によるプログラム RKF45 の修正版のドライバー・ルーチンである.

derkf_rはderkfのリバースコミュニケーション版である.
引数
[in]n微分方程式の数. (n >= 1)
[in,out]t本ルーチンはtからtoutまでの積分を行う. 積分を開始する点を与え, 最終ステップの最後の点が返される.
新たなtoutにおける解を求めるために積分を継続することができる(インターバル・モードとよぶ). その場合, 2回目以降の呼び出しでは, tは前回のtoutに等しくなければならない.
また, toutまでの各中間ステップにおいて戻ることもできる(中間結果出力モードとよぶ). 本モードは解の挙動をみたい場合に使うとよい.
モードはパラメータmodeで指定できる.
[in] 独立変数tの初期値.
[out] 独立変数tの最終ステップの最後の点の値 (インターバル・モードでは通常toutに等しい). 解がこの点まで正常に求められたことを示す.
[in,out]y[]配列 y[ly] (ly >= n)
[in] tの初期値における従属変数y[]の初期値.
[out] 最終のt(インターバル・モードにおいてはtoutに等しい)において求められた解(の近似値).
[in]tout解を求めたい点を設定する. tout = t とすることができ, その場合はtにおける微分係数を計算して戻る. 積分を行うのはtについて前進方向(tout > t)でも後退方向(tout < t)でもよい. ただし, 初期化時でなければ積分方向を変更することはできない.
要求精度を満たすように自動的に選ばれたステップ幅を用いてtからtoutに向かって解が求められる. 必要であれば, 各中間ステップにおける解とその微分係数を確認するために戻ることができる(中間結果出力モード). ただし, その場合であっても従来どおりtoutを指定しなければならない.
[in,out]rtolスカラー(itol = 0 の場合) または 配列 rtol[lrtol] (itol = 1 の場合) (lrtol >= n) (rtolまたはrtol[i] >= 0)
求める解の精度を指定する相対誤差許容値. 本パラメータはitolに従ってスカラーまたは配列のどちらでもよい. 配列は誤差テストをより細かく制御したい場合に使うことができる.
許容値は各ステップにおける局所誤差テストに使われ, y[]の各要素がおおむね次式を満たすようにする (i = 0 〜 n-1).
  abs(局所誤差) <= rtol*abs(y[i]) + atol (itol = 0 の場合)
    または
  abs(局所誤差) <= rtol[i]*abs(y[i]) + atol[i] (itol = 1 の場合)
rtol = 0 と設定するとその要素については純粋に絶対誤差テストとなる.
誤差が約1.0e-8以下の相対精度を必要とするならば, 通常はderkfを使わないほうがよい. DEPACのdeabmルーチンは厳しい精度を必要とする場合により効率的である.
[in] 誤差テストのための相対誤差許容値.
[out] info = 4 で戻ったときには計算を続けるために適当な大きさに調節した値を返す. それ以外の場合には変更されない.
[in,out]atolスカラー(itol = 0 の場合) または 配列 atol[latol] (itol = 1 の場合) (latol >= n) (atolまたはatol[i] >= 0)
求める解の精度を指定する絶対誤差許容値. 本パラメータはitolに従ってスカラーまたは配列のどちらでもよい. 配列は誤差テストをより細かく制御したい場合に使うことができる.
許容値は各ステップにおける局所誤差テストに使われ, y[]の各要素がおおむね次式を満たすようにする (i = 0 〜 n-1).
  abs(局所誤差) <= rtol*abs(y[i]) + atol (itol = 0 の場合)
    または
  abs(局所誤差) <= rtol[i]*abs(y[i]) + atol[i] (itol = 1 の場合)
atol = 0 と設定するとその要素については純粋に相対誤差テストとなる.
誤差が約1.0e-8以下の相対精度を必要とするならば, 通常はderkfを使わないほうがよい. DEPACのdeabmルーチンは厳しい精度を必要とする場合により効率的である.
[in] 誤差テストのための絶対誤差許容値.
[out] info = 4 で戻ったときには計算を続けるために適当な大きさに調節した値を返す. それ以外の場合には変更されない.
[in]itolrtolおよびatolがスカラーか配列かを指定する. 現問題について初回呼び出し後にこれを変更することはできない.
= 0: rtol および atolはスカラー.
= 1: rtol および atolは配列.
(他の値であれば itol = 0 とみなす.)
[in]mode動作モード.
= 0: toutで戻る (インターバル・モード).
= 1: ステップごとに戻る (中間結果出力モード).
= 2: ステップごとに戻る (中間結果出力モード). 密出力を可能にする. すなわち, info = 2 (最後のステップでは info = 1) で戻ったときに derkf_int ルーチンを使って直近のステップの区間内で補間値を求めることができる.
(他の値であれば mode = 0 とみなす.)
[out]work[]配列 work[lwork]
作業領域.
[in]lwork配列 work[]のサイズ. (lwork >= 7*n + 20 (ただし, mode = 2 のときは 9*n + 20))
[out]iwork[]配列 iwork[liwork]
作業領域.
[in]liwork配列 iwork[]のサイズ. (liwork >= 20)
[out]info[in] 制御コード.
= 0: 問題の最初の呼び出し時(新たに問題を開始する場合)には info = 0 と設定せよ. 初期化が行われ, 新たな問題についての計算が開始される.
= 1, 2, 11〜15: info = 1, 2, 11〜15 で戻った場合, 計算を継続するために, infoの値を変えずに再呼び出しすることができる(下記説明を参照せよ).
[out] リターンコード. ユーザーはこの値をチェックし, info = 1, 2, 11〜15 であれば必要により次のアクションとして本ルーチンを再度呼び出すことができる.
= -1: 入力パラメータ n の誤り (n < 1)
= -2: 入力パラメータ t の誤り (継続呼び出しで t = tout または t != 前回のtout)
= -4: 入力パラメータ tout の誤り (積分の方向を変更した)
= -5: 入力パラメータ rtol の誤り (rtol < 0 または rtol[i] < 0)
= -6: 入力パラメータ atol の誤り (atol < 0 または atol[i] < 0)
= -10: 入力パラメータ lwork の誤り (lworkが小さすぎる)
= -12: 入力パラメータ liwork の誤り (liworkが小さすぎる)
= -13: 入力パラメータ info の誤り (info != 0, 1, 2, 11〜15)
= 1: 正常終了 (t = tout). toutを再設定して再呼び出しすることができる. toutはtと異なる値であること.
= 2: 中間結果出力モードのため戻った (まだ toutに達していない). tout方向の次のステップを続行するために再呼び出しすることができる.
= 11: 最大ステップ数(10000)を超えた. 再呼び出しして続行することができる. さらに10000ステップ続けることができる.
= 12: 誤差許容値が厳しすぎる. 再呼び出しして, 自動的に調節された許容値を使って続行することができる. 許容値を自分で変更してから再呼び出しすることもできる.
= 13: 求められた解が0であるため, 純粋な相対誤差テスト(atol = 0)ができない. atolを正の値にして再呼び出しして続行することができる.
= 14: スティフな問題の可能性がある. 再呼び出しして続行することができる. しかし, スティフな問題を効率的に扱うことができるDEPACのdebdfのような他のプログラムが推奨される.
= 15: 頻繁な出力のためステップサイズが制限された. 再呼び出しして続行することができる. しかし, 密出力機能を持った他のプログラムが推奨される.
= 16: 無限ループが検出された.
[out]ttirev = 1〜11: 再呼び出し時に微分係数値を求めてyyp[]に入れるべき点のtの値を返す.
[out]yy[]配列 yy[lyy] (lyy >= n)
irev = 1〜11: 再呼び出し時に微分係数値を求めてyyp[]に入れるべき点のyの値を返す.
[in]yyp[]配列 yyp[lyyp] (lyyp >= n)
irev = 1〜11: t(= tt)およびy(= yy[])における微分係数, すなわち, yyp[i] = dyi/dt = fi(tt, yy[0], ..., yy[n-1]) (i = 0 〜 n-1) を計算して, 再呼び出し時に返す.
[in,out]irevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いirevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること.
= 1〜11: ttおよびyy[]における微分係数の計算値をyyp[]に設定する. yyp[]以外の変数を変更してはならない.
出典
SLATEC (DEPAC)