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

◆ _dehint()

void _dehint ( double(*)(double)  f,
double  a,
double  eps,
double *  result,
int *  neval,
int *  l,
int *  info 
)

半無限区間の積分 (自動積分) (二重指数関数(DE)公式)

目的
本ルーチンは要求精度を満たす[a, +∞]におけるf(x)の積分値を求める. ここで, f(x)はユーザー定義サブルーチンfにより与えられる関数である.
積分値は二重指数関数(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]f被積分関数f(x)を求めるユーザー定義サブルーチンで, 次のように定義すること.
double f(double x)
{
return f(x)の計算値
}
[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: 要求精度を満たすことができなかった
出典
森正武、「FORTRAN77数値計算プログラミング(増補版)」岩波書店 (1987)