|
|
◆ Qk15i_r()
| Sub Qk15i_r |
( |
A As |
Double, |
|
|
Inf As |
Long, |
|
|
Result As |
Double, |
|
|
XX As |
Double, |
|
|
YY As |
Double, |
|
|
IRev As |
Long, |
|
|
Optional AbsErr As |
Double |
|
) |
| |
半無限区間/無限区間の積分 (ガウス・クロンロッド則 15固定分点) (リバースコミュニケーション版)
- 目的
- 関数f(x)の半無限あるいは無限区間の積分を15点ガウス・クロンロッド則により求める. 被積分関数f(x)は変数IRevに従ってユーザーが必要な関数値を計算して与える.
関数f(x)を変数変換して関数f01(t)に変換することにより, 半無限区間の積分を有限区間[0, 1]の積分によって計算する. ∫ f(x)dx [a, +∞] = ∫ f01(t)dt [0, 1] ただし, f01(t) = f(a + (1 - t)/t)/t^2
なお, 無限積分は 2つの半無限積分の和として求められる. ∫ f(x)dx [-∞, +∞] = ∫ (f(x) + f(-x)) dx [0, +∞]
- 引数
-
| [in] | A | 半無限積分の積分区間の下限または上限 a. (無限積分(Inf = 2)の場合には無視される) |
| [in] | Inf | 積分区間の指定.
= 1: 半無限積分 [a, +∞]
= -1: 半無限積分 [-∞, a]
= 2: 無限積分 [-∞, +∞]
(その他の値が指定された場合, Inf = 2 とみなす) |
| [out] | Result | 求められた積分値. |
| [out] | XX | IRev = 1の場合, 関数値を求めるべき点を返す. |
| [in] | YY | IRev = 1の場合, 再呼び出し時に関数値f(XX)を与えること. |
| [in,out] | IRev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いIRevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックせよ.
= 1: XXにおける関数値を求めYYに設定する. YY以外の変数を変更してはならない. |
| [out] | AbsErr | (省略可)
絶対誤差の推定値. 真の誤差に等しいかそれより大きい. |
- 出典
- SLATEC (QUADPACK)
- 使用例
- 次の定積分を求める.
∫ 1/(1 + x^2) dx [0, +∞] (= π/2)
Sub Ex_Qk15i_r()
Dim A As Double, Inf As Long, Result As Double
Dim XX As Double, YY As Double, IRev As Long
A = 0
Inf = 1
IRev = 0
Do
Call Qk15i_r(A, Inf, Result, XX, YY, IRev)
If IRev = 1 Then YY = 1 / (1 + XX ^ 2)
Loop While IRev <> 0
Debug.Print "S =", Result, "S(true) =", Dconst(13) / 2
End Sub
Function Dconst(I As Long, Optional Info As Long) As Double 基本定数
Sub Qk15i_r(A As Double, Inf As Long, Result As Double, XX As Double, YY As Double, IRev As Long, Optional AbsErr As Double) 半無限区間/無限区間の積分 (ガウス・クロンロッド則 15固定分点) (リバースコミュニケーション版)
- 実行結果
S = 1.57079632684678 S(true) = 1.5707963267949
|