|
|
◆ Qagp()
| Sub Qagp |
( |
F As |
LongPtr, |
|
|
A As |
Double, |
|
|
B As |
Double, |
|
|
Npts As |
Long, |
|
|
Points() As |
Double, |
|
|
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 |
|
) |
| |
有限区間の積分 (適応自動積分) (積分区間内に既知の特異点がある場合) (21点ガウス・クロンロッド則)
- 目的
- 本ルーチンは要求精度を満たす I = [a, b]におけるf(x)の積分値 を求める. 被積分関数の積分が困難になるような(例えば, 特異性, 不連続性を持つ)積分区間の区切り点をユーザーが指定することができる.
21点ガウス・クロンロッド則を使用し, 要求精度を満足するように適応自動積分を行う.
- 引数
-
| [in] | F | 被積分関数f(x)を求めるユーザー定義サブルーチンで, 次のように定義すること. Function F(X As Double) As Double
F = f(X)
End Function
Xを変更しないこと. |
| [in] | A | 積分区間の下限 a. |
| [in] | B | 積分区間の上限 b. |
| [in] | Npts | ユーザーが指定する積分区間の区切り点の数. (Npts >= 0) |
| [in] | Points() | 配列 Points(LPoints - 1) (LPoints >= max(NPts, 1))
Points(0)〜Points(Npts - 1)に積分区間の区切り点を指定. (区切り点は積分区間内になければならない) |
| [out] | Result | 求められた積分値. |
| [out] | Info | = 0: 正常終了.
= -4: パラメータ Npts の誤り. (Npts < 0)
= -5: パラメータ Points() の誤り.
= 1: 部分区間数が最大数に達した.
= 2: 丸め誤差のため要求精度を満たすことができなかった.
= 3: 積分区間内での関数の挙動により積分不可能である.
= 4: 補外表の丸め誤差のためアルゴリズムが収束しなかった.
= 5: 発散する積分である, または, 収束が遅い積分である.
= 6: 指定された特異点が積分区間外にある. |
| [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 >= Npts + 1) (省略時 = Npts +
100) (Limit < Npts + 1 であれば省略時の既定値とみなす) |
| [out] | Last | (省略可)
分割により作り出された部分区間数. |
- 出典
- SLATEC (QUADPACK)
- 使用例
- 次の定積分を求める.
∫ x^3*ln(abs((x^2 - 1)(x^2 - 2))) dx [0, 3] (= 52.740748)
x = 1 と x = √2 に特異点がある. Function F2(X As Double) As Double
F2 = X ^ 3 * Log(Abs((X ^ 2 - 1) * (X ^ 2 - 2)))
End Function
Sub Ex_Qagp()
Const Npts = 2
Dim A As Double, B As Double, Result As Double, Points(Npts - 1) As Double
Dim Info As Long, Neval As Long, EpsRel As Double
A = 0: B = 3
Points(0) = 1: Points(1) = Sqr(2)
EpsRel = 0.00000001 '1.0e-8
Call Qagp(AddressOf F2, A, B, Npts, Points(), Result, Info, , Neval, , EpsRel)
Debug.Print "S =", Result, "Neval =", Neval
Debug.Print "Info =", Info
End Sub
Sub Qagp(F As LongPtr, A As Double, B As Double, Npts As Long, Points() As Double, 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) 有限区間の積分 (適応自動積分) (積分区間内に既知の特異点がある場合) (21点ガウス・クロンロッド則)
- 実行結果
S = 52.7407483840768 Neval = 3843
Info = 0
|