|
|
◆ _dehint_r()
| void _dehint_r |
( |
double |
a, |
|
|
double |
eps, |
|
|
double * |
result, |
|
|
int * |
neval, |
|
|
int * |
l, |
|
|
int * |
info, |
|
|
double * |
xx, |
|
|
double |
yy, |
|
|
int * |
irev |
|
) |
| |
半無限区間の積分 (自動積分) (二重指数関数(DE)公式) (リバースコミュニケーション版)
- 目的
- 本ルーチンは要求精度を満たす[a, +∞]におけるf(x)の積分値を求める. ここで, 被積分関数f(x)は変数irevに従ってユーザーが必要な関数値を計算して与える.
積分値は二重指数関数(DE)公式を使用した自動積分により求められる.
二重指数関数(DE)公式(defintを参照)において以下の変換関数を使用することにより半無限区間[0, +∞]に対する公式を得る. (1) φ(t) = exp(t/2 - exp(-t))
(2) φ(t) = exp(t - exp(-t))
(3) φ(t) = exp(2sinh(t))
(1)は f(x) = f1(x)exp(-x^2) のように急激に減衰する場合に適している. (2)は f(x) = f2(x)exp(-x) のように指数的に減衰する場合に適している. (3)はゆるやかに減衰する有理関数や代数関数に適している.
本ルーチンでは被積分関数の挙動を調べて自動的に変換関数を選択して使用する(引数lにどれを使用したか返す).
- 引数
-
| [in] | a | 積分区間の下限. |
| [in] | eps | 要求絶対誤差.
max(|eps|, 1.0e-32) を判定条件として使用する. |
| [out] | result | 求められた[a, +∞]におけるf(x)の積分値. |
| [out] | neval | 被積分関数の評価回数. |
| [out] | l | 積分に使用した変換関数.
= 0: x = exp(0.5*t-exp(-t))
= 1: x = exp(t-exp(-t))
= 2: x = exp(2*sinh(t)) |
| [out] | info | = 0: 正常終了
= 1: 負側の減衰が遅いため収束判定条件を緩めた
= 2: 正側の減衰が遅いため収束判定条件を緩めた
= 3: 上記の両方
= 4: 要求精度を満たすことができなかった |
| [out] | xx | irev = 1〜5: 再呼び出し時に関数値を求めるべき点を返す. |
| [in] | yy | irev = 1〜5: 再呼び出し時に関数値f(xx)を与えること. |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いirevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了.
= 1〜5: xxにおける関数値を求めyyに設定する. yy以外の変数を変更してはならない. |
- 出典
- 森正武、「FORTRAN77数値計算プログラミング(増補版)」岩波書店 (1987)
|