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

◆ Qagi_r()

Sub Qagi_r ( Bound As  Double,
Inf As  Long,
Result As  Double,
Info As  Long,
XX As  Double,
YY As  Double,
IRev As  Long,
Optional AbsErr As  Double,
Optional Neval As  Long,
Optional EpsAbs As  Double = -1,
Optional EpsRel As  Double = -1,
Optional Limit As  Long = -1,
Optional Last As  Long 
)

半無限区間/無限区間の自動積分 (適応自動積分) (リバースコミュニケーション版)

目的
本ルーチンは要求精度を満たす 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 とみなす)
[out]Result求められた積分値.
[out]Info= 0: 正常終了.
= -7: パラメータ IRev の誤り.
= 1: 部分区間数が最大分割数に達した.
= 2: 要求精度の達成を阻害する丸め誤差の発生が検出された.
= 3: 積分区間内において被積分関数の挙動が非常に悪い点がある.
= 4: アルゴリズムが収束しない. 要求精度は達成できず, ここで返される結果が得られる最良のものと考えられる.
= 5: 積分が発散した, または, 収束が遅い.
[out]XXIRev = 1の場合, 関数値を求めるべき点を返す.
[in]YYIRev = 1の場合, 再呼び出し時に関数値f(XX)を与えること.
[in,out]IRevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いIRevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了.
= 1: XXにおける関数値を求めYYに設定する. YY以外の変数を変更してはならない.
[out]AbsErr(省略可)
絶対誤差の推定値. 真の誤差に等しいかそれより大きい.
[out]Neval(省略可)
被積分関数の評価回数.
[in]EpsAbs(省略可)
要求絶対誤差. (省略時 = 0)
AbsErr <= max(EpsAbs, EpsRel*|Result|) であれば要求精度を満足したものとする.
(EpsAbs < 0 であれば省略時の既定値とみなす)
[in]EpsRel(省略可)
要求相対誤差. (省略時 = 1.0e-12)
AbsErr <= max(EpsAbs, EpsRel*|Result|) であれば要求精度を満足したものとする.
EpsAbs <= 0 かつ EpsRel < 50*eps であれば, EpsRel = 50*eps とみなす(epsはマシンイプシロン).
(EpsRel < 0 であれば省略時の既定値とみなす)
[in]Limit(省略可)
積分区間を分割する部分区間の最大数 (limit >= 1) (省略時 = 100)
[out]Last(省略可)
分割により作り出された部分区間数.
出典
SLATEC (QUADPACK)
使用例
次の定積分を求める.
∫ 1/(1 + x^2) dx [0, +∞] (= π/2)
Sub Ex_Qagi_r()
Dim Bound As Double, Inf As Long, Result As Double, Info As Long
Dim XX As Double, YY As Double, IRev As Long
Bound = 0: Inf = 1
IRev = 0
Do
Call Qagi_r(Bound, Inf, Result, Info, 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
Debug.Print "Info =", Info
End Sub
実行結果
S = 1.5707963267949 S(true) = 1.5707963267949
Info = 0