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

◆ _defint()

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

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

目的
本ルーチンは要求精度を満たす[a, b]におけるf(x)の積分値を求める. ここで, f(x)はユーザー定義関数fにより与えられる関数である.
積分値は二重指数関数(DE)公式を使用した自動積分により求められる.

区間[-1, 1]における積分を変数変換により無限区間[-∞, ∞]の積分に変換する.
∫ f(x)dx [-1, 1] = ∫ g(t)dt [-∞, ∞]
ただし, x=φ(t), g(t) = f(φ(t))φ'(t)
ここで, φ(t)は単調で, かつ φ(-∞) = -1, φ(∞) = 1 とする.
φ(t)をうまく選べば、g(t)を指数関数の2乗で速く減衰する関数にすることができ, それに台形則を適用することにより効率よく積分を求めることができる. 本ルーチンでは次の変換関数を使用する.
φ(t) = tanh((π/2)sinh(t))
DE公式は端点に特異性があるときにも適用できる.
引数
[in]f被積分関数f(x)を求めるユーザー定義関数で, 通常(l = 0 の場合)は次のように定義すること.
double f(double x)
{
return f(x)の計算値;
}
f(x)が端点に特異性を持つ場合には, f2(y)が下のように表されるものとして, fではf(x)ではなくf2(y)を定義しパラメータ l = 1 としてdefintを呼び出すことにより, 通常より精度よく[a, b]におけるf(x)の積分値を計算することができる.
  f2(y) = f(a - y) (-(b - a)/2 < y < 0)
  f2(y) = f(b - y) (0 < y <= (b - a)/2)
[in]a積分区間の下限.
[in]b積分区間の上限.
[in]eps要求絶対誤差.
max(|eps|, 1.0e-32) を判定条件として使用する.
[in]l= 0: ユーザー定義サブルーチンfはf(x)を計算する.
= 1: ユーザー定義サブルーチンfはf2(y)を計算する.
(その他の値であれば l = 0 とみなす)
[out]result求められた[a, b]におけるf(x)の積分値.
[out]neval被積分関数の評価回数.
[out]info= 0: 正常終了
= 1: 負側の減衰が遅いため収束判定条件を緩めた
= 2: 正側の減衰が遅いため収束判定条件を緩めた
= 3: 上記の両方
= 4: 要求精度を満たすことができなかった
出典
森正武、「FORTRAN77数値計算プログラミング(増補版)」岩波書店 (1987)