|
|
◆ Qaws_r()
| Sub Qaws_r |
( |
A As |
Double, |
|
|
B As |
Double, |
|
|
Alpha As |
Double, |
|
|
Beta As |
Double, |
|
|
Integr As |
Long, |
|
|
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) が積分区間の端に代数的/対数的な特異性を持つ. パラメータIntegrを参照せよ.
25点修正クレンショー・カーチス則および15点ガウス・クロンロッド則を使用し, 要求精度を満足するように適応自動積分を行う.
- 引数
-
| [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: 正常終了.
= -1: パラメータ A (または B) の誤り. (A >= B)
= -3: パラメータ Alpha の誤り. (Alpha <= -1)
= -4: パラメータ Beta の誤り. (Beta <= -1)
= -5: パラメータ Integr の誤り. (Integr < 1 or Integr > 4)
= 1: 部分区間数が最大数に達した.
= 2: 丸め誤差のため要求精度を満たすことができなかった.
= 3: 積分区間内での関数の挙動により積分不可能である. |
| [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 >= 2) (省略時 = 100)
(Limit < 2 であれば省略時の既定値とみなす) |
| [out] | Last | (省略可)
分割により作り出された部分区間数. |
- 出典
- SLATEC (QUADPACK)
- 使用例
- 次の定積分を求める.
∫ ln(x)/(1 + ln(x)^2)^2 dx [0, 1] (= 0.1892752)
Sub Ex_Qaws_r()
Dim A As Double, B As Double, Result As Double, Info As Long
Dim Alpha As Double, Beta As Double, Integr As Long
Dim XX As Double, YY As Double, IRev As Long
A = 0: B = 1
Alpha = 0: Beta = 0: Integr = 2
IRev = 0
Do
Call Qaws_r(A, B, Alpha, Beta, Integr, Result, Info, XX, YY, IRev)
If IRev = 1 Then
YY = 0
If XX > 0 Then YY = 1 / (1 + Log(XX) ^ 2) ^ 2
End If
Loop While IRev <> 0
Debug.Print "S =", Result
Debug.Print "Info =", Info
End Sub
- 実行結果
S = -0.189275187882035
Info = 0
|