|
|
◆ _qk15i_r()
| void _qk15i_r |
( |
double |
bound, |
|
|
int |
inf, |
|
|
double |
a, |
|
|
double |
b, |
|
|
double * |
result, |
|
|
double * |
abserr, |
|
|
double * |
resabs, |
|
|
double * |
resasc, |
|
|
double * |
xx, |
|
|
double |
yy, |
|
|
int * |
irev |
|
) |
| |
半無限区間/無限区間の積分 (ガウス・クロンロッド則 15固定分点) (リバースコミュニケーション版)
- 目的
- 関数f(x)の半無限あるいは無限区間の積分を15点ガウス・クロンロッド則により求める. 被積分関数f(x)は変数irevに従ってユーザーが必要な関数値を計算して与える.
関数f(x)を変数変換して関数f01(t)に変換することにより, 半無限区間の積分を有限区間[0, 1]の積分にマップする. ∫ f(x)dx [bound, +∞] = ∫ f01(t)dt [0, 1] ただし, f01(t) = f(bound+ (1 - t)/t)/t^2
なお, 無限積分は 2つの半無限積分の和として求められる. ∫ f(x)dx [-∞, +∞] = ∫ (f(x) + f(-x)) dx [0, +∞]
本ルーチンは
I = [a, b]におけるf01の積分値(誤差推定付き) および
J = [a, b]におけるabs(f01)の積分値
を計算する. ここで, [a, b]は[0, 1]の部分区間である.
- 引数
-
| [in] | bound | オリジナルの積分区間の下限または上限. (無限積分(inf = 2)の場合には無視される) |
| [in] | inf | オリジナルの積分区間の指定.
= 1: 半無限積分 [bound, +∞]
= -1: 半無限積分 [-∞, bound]
= 2: 無限積分 [-∞, +∞]
(その他の値が指定された場合, inf = 2 とみなす) |
| [in] | a | 変換後の積分区間の下限. (0 <= a <= 1) |
| [in] | b | 変換後の積分区間の上限. (0 <= b <= 1) |
| [out] | result | 求められた I = [a, b]におけるf01の積分値. |
| [out] | abserr | 絶対誤差の推定値. 真の誤差に等しいかそれより大きい. |
| [out] | resabs | 求められた J = [a, b]におけるabs(f01)の積分値. |
| [out] | resasc | 求められた [a, b]におけるabs(f01 - I/(b - a))の積分値. |
| [out] | xx | irev = 1〜6: 再呼び出し時に与える関数値を求めるべき点を返す. |
| [in] | yy | irev = 1〜6: 再呼び出し時に関数値f(xx)を与えること. |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いirevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了.
= 1〜6: xxにおける関数値を求めyyに設定する. yy以外の変数を変更してはならない. |
- 出典
- SLATEC (QUADPACK)
|