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

◆ Qawc_r()

Sub Qawc_r ( A As  Double,
B As  Double,
C As  Double,
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 
)

有限区間の積分 (適応自動積分) (コーシーの主値積分) (25点クレンショー・カーチス公式および15点ガウス・クロンロッド則) (リバースコミュニケーション版)

目的
本ルーチンは要求精度を満たすコーシーの主値 I = [a, b]におけるf(x)*w(x)の積分 を求める. ただし, 重み関数 w(x) = 1/(x - c) である.
25点修正クレンショー・カーチス則および15点ガウス・クロンロッド則を使用し, 要求精度を満足するように適応自動積分を行う.
引数
[in]A積分区間の下限 a.
[in]B積分区間の上限 b.
[in]C重み関数のパラメータ c. (C <> A かつ C <> B)
[out]Result[a, b] における f(x)/(x - c) のコーシーの主値積分.
[out]Info= 0: 正常終了.
= -3: パラメータ C の誤り. (C = A or C = B)
= 1: 部分区間数が最大数に達した.
= 2: 丸め誤差のため要求精度を満たすことができなかった.
= 3: 積分区間内での関数の挙動により積分不可能である.
[out]XXIRev = 1の場合, 関数値を求めるべき点を返す.
[in]YYIRev = 1の場合, 再呼び出し時に関数値を与えること.
[in,out]IRevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いIRevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックせよ.
= 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(省略可)
積分区間[a, b]を分割する部分区間の最大数 (limit >= 1) (省略時 = 100)
(Limit < 1 であれば省略時の既定値とみなす)
[out]Last(省略可)
分割により作り出された部分区間数.
出典
SLATEC (QUADPACK)
使用例
次の定積分を求める.
∫ 1/(x*(5*x^3 + 6)) dx [-1, 5] (= -0.08994401)
Sub Ex_Qawc_r()
Dim A As Double, B As Double, C As Double, Result As Double, Info As Long
Dim XX As Double, YY As Double, IRev As Long
A = -1: B = 5: C = 0
IRev = 0
Do
Call Qawc_r(A, B, C, Result, Info, XX, YY, IRev)
If IRev = 1 Then YY = 1 / (5 * XX ^ 3 + 6)
Loop While IRev <> 0
Debug.Print "S =", Result
Debug.Print "Info =", Info
End Sub
Sub Qawc_r(A As Double, B As Double, C As Double, 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)
有限区間の積分 (適応自動積分) (コーシーの主値積分) (25点クレンショー・カーチス公式および15点ガウス・クロンロッド則) (リバースコミュニケーション版)
実行結果
S = -8.99440069577173E-02
Info = 0