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

◆ Deiint_r()

Sub Deiint_r ( Result As  Double,
Info As  Long,
XX As  Double,
YY As  Double,
IRev As  Long,
Optional Neval As  Long,
Optional Eps As  Double = 0 
)

無限区間の積分 (自動積分) (二重指数関数(DE)公式) (リバースコミュニケーション版)

目的
本ルーチンは要求精度を満たす[-∞, +∞]におけるf(x)の積分値を求める. 被積分関数f(x)は変数IRevに従ってユーザーが必要な関数値を計算して与える.
積分値は二重指数関数(DE)公式を使用した自動積分により求められる.

二重指数関数(DE)公式(Definを参照)において以下の変換関数を使用することにより無限区間[-∞, +∞]に対する公式を得る.
φ(t) = sinh((π/2)sinh(t))
これはゆるやかに減衰するような被積分関数に適している.
引数
[out]Result求められた積分値.
[out]Info= 0: 正常終了.
= -5: パラメータ IRev の誤り.
= 1: 負側の減衰が遅いため収束判定条件を緩めた.
= 2: 正側の減衰が遅いため収束判定条件を緩めた.
= 3: 上の両方.
= 4: 積分計算が収束しなかった. (Epsが小さすぎる, 区間内に特異点があるなどの原因による)
[out]XXIRev = 1の場合, 関数値を求めるべき点を返す.
[in]YYIRev = 1の場合, 再呼び出し時に関数値f(XX)を与えること.
[in,out]IRevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いIRevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックせよ.
= 1: XXにおける関数値を求めYYに設定する. YY以外の変数を変更してはならない.
[out]Neval(省略可)
被積分関数の評価回数.
[in]Eps(省略可)
要求絶対誤差. (省略時 = 1.0e-14)
(Eps <= 0 であれば省略時の既定値とみなす)
出典
森正武、「FORTRAN77数値計算プログラミング(増補版)」岩波書店 (1987)
使用例
次の定積分を求める.
∫ 1/(1 + x^2) dx [-∞, +∞] (= π)
Sub Ex_Deiint_r()
Dim Result As Double, Info As Long
Dim XX As Double, YY As Double, IRev As Long
IRev = 0
Do
Call Deiint_r(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)
Debug.Print "Info =", Info
End Sub
Function Dconst(I As Long, Optional Info As Long) As Double
基本定数
Sub Deiint_r(Result As Double, Info As Long, XX As Double, YY As Double, IRev As Long, Optional Neval As Long, Optional Eps As Double=0)
無限区間の積分 (自動積分) (二重指数関数(DE)公式) (リバースコミュニケーション版)
実行結果
S = 3.14159265358979 S(true) = 3.14159265358979
Info = 0