XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ qagi_r()

void qagi_r ( double  bound,
int  inf,
double  epsabs,
double  epsrel,
int  limit,
double *  result,
double *  abserr,
int *  neval,
int *  last,
double  work[],
int  lwork,
int  iwork[],
int *  info,
double *  xx,
double  yy,
int *  irev 
)

半無限区間/無限区間の積分 (適応自動積分) (15点ガウス・クロンロッド則) (リバースコミュニケーション版)

目的
本ルーチンは要求精度を満たす I = [bound, +∞], [-∞, bound] または [-∞, +∞]におけるf(x)の積分値 を求める. ここで, 被積分関数f(x)は変数irevに従ってユーザーが必要な関数値を計算して与える.

15点ガウス・クロンロッド則を使用し, 要求精度を満足するように積分区間を分割して計算する適応自動積分を行う.
半無限積分を有限区間[0, 1]の積分に変数変換し, それに積分公式を適用することにより必要な積分を求める.
∫ f(x)dx [bound, +∞] = ∫ f(bound + (1 - t)/t) / t^2 dt [0, 1]
また, 無限積分は 2つの半無限積分の和として求められる.
∫ f(x)dx [-∞, +∞] = ∫ (f(x) + f(-x)) dx [0, +∞]
引数
[in]bound半無限積分の積分区間の下限または上限 (無限積分(inf = 2)の場合には無視される).
[in]inf積分区間の指定.
= 1: 半無限積分 [bound, +∞]
= -1: 半無限積分 [-∞, bound]
= 2: 無限積分 [-∞, +∞]
(その他の値が指定された場合, inf = 2 とみなす)
[in]epsabs要求絶対誤差.
abserr <= max(epsabs, epsrel*|result|) であれば要求精度を満足したものとする.
[in]epsrel要求相対誤差.
abserr <= max(epsabs, epsrel*|result|) であれば要求精度を満足したものとする.
epsabs <= 0 かつ epsrel < 50*eps であれば, epsrel = 50*eps とみなす(epsはマシンイプシロン).
[in]limit積分区間を分割する部分区間の最大数. (limit >= 1)
[out]result求められた積分値.
[out]abserr絶対誤差の推定値. 真の誤差に等しいかそれより大きい.
[out]neval被積分関数の評価回数.
[out]last分割により作り出された部分区間数.
[out]work[]配列 work[lwork]
作業領域.
work[0], ..., work[last-1]: 部分区間の左端点.
work[limit], ..., work[limit+last-1]: 部分区間の右端点.
work[2*limit], ..., work[2*limit+last-1]: 部分区間の積分値.
work[3*limit], ..., work[3*limit+last-1]: 部分区間の誤差推定値.
[in]lwork配列 work[]のサイズ. (lwork >= 4*limit)
[out]iwork[]配列 iwork[liwork] (liwork >= limit)
作業領域.
最初のk要素は部分区間の誤差推定値へのポインタで, work[3*limit+iwork[0]-1], ..., work[3*limit+iwork[k-1]-1] は降順に並ぶ. last <= limit/2+2 であれば k = last, その他の場合には k = limit+1-last である.
[out]info= 0: 正常終了
= -5: 入力パラメータ limit の誤り (limit < 1)
= -11: 入力パラメータ lwork の誤り (lwork < 4*limit)
= 1: 部分区間数が最大分割数に達した
= 2: 要求精度の達成を阻害する丸め誤差の発生が検出された
= 3: 積分区間内において被積分関数の挙動が非常に悪い点がある
= 4: アルゴリズムが収束しない. 要求精度は達成できず, ここで返される結果が得られる最良のものと考えられる
= 5: 積分が発散した, または, 収束が遅い
[out]xxirev = 1〜18: 再呼び出し時に与える関数値を求めるべき点を返す.
[in]yyirev = 1〜18: 再呼び出し時に関数値f(xx)を与えること.
[in,out]irevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いirevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了.
= 1〜18: xxにおける関数値を求めyyに設定する. yy以外の変数を変更してはならない.
出典
SLATEC (QUADPACK)