|
|
◆ Qagp_r()
| Sub Qagp_r |
( |
A As |
Double, |
|
|
B As |
Double, |
|
|
Npts As |
Long, |
|
|
Points() 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 |
|
) |
| |
有限区間の積分 (適応自動積分) (積分区間内に既知の特異点がある場合) (21点ガウス・クロンロッド則)
- 目的
- 本ルーチンは要求精度を満たす I = [a, b]におけるf(x)の積分値 を求める. 被積分関数の積分が困難になるような(例えば, 特異性, 不連続性を持つ)積分区間の区切り点をユーザーが指定することができる.
21点ガウス・クロンロッド則を使用し, 要求精度を満足するように適応自動積分を行う.
- 引数
-
| [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: 正常終了.
= -3: パラメータ Npts の誤り. (Npts < 0)
= -4: パラメータ Points() の誤り.
= 1: 部分区間数が最大数に達した.
= 2: 丸め誤差のため要求精度を満たすことができなかった.
= 3: 積分区間内での関数の挙動により積分不可能である.
= 4: 補外表の丸め誤差のためアルゴリズムが収束しなかった.
= 5: 発散する積分である, または, 収束が遅い積分である.
= 6: 指定された特異点が積分区間外にある. |
| [out] | XX | IRev = 1の場合, 関数値を求めるべき点を返す. |
| [in] | YY | IRev = 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 >= 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 に特異点がある. Sub Ex_Qagp_r()
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
Dim XX As Double, YY As Double, IRev As Long
A = 0: B = 3
Points(0) = 1: Points(1) = Sqr(2)
EpsRel = 0.00000001 '1.0e-8
IRev = 0
Do
Call Qagp_r(A, B, Npts, Points(), Result, Info, XX, YY, IRev, , Neval, , EpsRel)
If IRev = 1 Then YY = XX ^ 3 * Log(Abs((XX ^ 2 - 1) * (XX ^ 2 - 2)))
Loop While IRev <> 0
Debug.Print "S =", Result, "Neval =", Neval
Debug.Print "Info =", Info
End Sub
Sub Qagp_r(A As Double, B As Double, Npts As Long, Points() 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) 有限区間の積分 (適応自動積分) (積分区間内に既知の特異点がある場合) (21点ガウス・クロンロッド則)
- 実行結果
S = 52.7407483840768 Neval = 3843
Info = 0
|