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

◆ Qaws()

Sub Qaws ( F As  LongPtr,
A As  Double,
B As  Double,
Alpha As  Double,
Beta As  Double,
Integr As  Long,
Result As  Double,
Info 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) が積分区間の端に代数的/対数的な特異性を持つ. パラメータIntegrを参照せよ.
25点修正クレンショー・カーチス則および15点ガウス・クロンロッド則を使用し, 要求精度を満足するように適応自動積分を行う.
引数
[in]F被積分関数f(x)を求めるユーザー定義サブルーチンで, 次のように定義すること.
Function F(X As Double) As Double
F = f(X)
End Function
Xを変更しないこと.
[in]A積分区間の下限 a.
[in]B積分区間の上限 b.
[in]Alpha重み関数のパラメータα. (Alpha > -1)
[in]Beta重み関数のパラメータβ. (Beta > -1)
[in]Integr重み関数を指定する.
= 1: w(x) = (x - a)^α * (b - x)^β
= 2: w(x) = (x - a)^α * (b - x)^β * ln(x - a)
= 3: w(x) = (x - a)^α * (b - x)^β * ln(b - x)
= 4: w(x) = (x - a)^α * (b - x)^β * ln(x - a) * ln(b - x)
[out]Result求められた積分値.
[out]Info= 0: 正常終了.
= -2: パラメータ A (または B) の誤り. (A >= B)
= -4: パラメータ Alpha の誤り. (Alpha <= -1)
= -5: パラメータ Beta の誤り. (Beta <= -1)
= -6: パラメータ Integr の誤り. (Integr < 1 or Integr > 4)
= 1: 部分区間数が最大数に達した.
= 2: 丸め誤差のため要求精度を満たすことができなかった.
= 3: 積分区間内での関数の挙動により積分不可能である.
[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 >= 2) (省略時 = 100)
(Limit < 2 であれば省略時の既定値とみなす)
[out]Last(省略可)
分割により作り出された部分区間数.
出典
SLATEC (QUADPACK)
使用例
次の定積分を求める.
∫ ln(x)/(1 + ln(x)^2)^2 dx [0, 1] (= 0.1892752)
Function F4(X As Double) As Double
F4 = 0
If X > 0 Then F4 = 1 / (1 + Log(X) ^ 2) ^ 2
End Function
Sub Ex_Qaws()
Dim A As Double, B As Double, Result As Double, Info As Long
Dim Alpha As Double, Beta As Double, Integr As Long
A = 0: B = 1
Alpha = 0: Beta = 0: Integr = 2
Call Qaws(AddressOf F4, A, B, Alpha, Beta, Integr, Result, Info)
Debug.Print "S =", Result
Debug.Print "Info =", Info
End Sub
Function Beta(A As Double, B As Double, Optional Info As Long) As Double
ベータ関数 B(a, b)
Sub Qaws(F As LongPtr, A As Double, B As Double, Alpha As Double, Beta As Double, Integr As Long, Result As Double, Info 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 = -0.189275187882035
Info = 0