|
|
◆ Qawf_r()
| Sub Qawf_r |
( |
A As |
Double, |
|
|
Omega 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 Limlst As |
Long = -1, |
|
|
Optional Lst As |
Long, |
|
|
Optional Limit As |
Long = -1, |
|
|
Optional Maxp1 As |
Long = -1 |
|
) |
| |
半無限区間の積分 (フーリエ型積分) (適応自動積分) (25点クレンショー・カーチス公式および15点ガウス・クロンロッド則) (リバースコミュニケーション版)
- 目的
- 本ルーチンは要求精度を満たすフーリエ型積分 I = ∫ f(x)*w(x) dx [a, +∞] を求める. ただし, 重み関数 w(x) = cos(ω*x) または sin(ω*x) である.
積分区間を小区間に分割し, 与えられた要求精度を満足するまで各小区間をQawoにより適応自動積分し積算する. 25点修正クレンショー・カーチス則および15点ガウス・クロンロッド則が使用される.
- 引数
-
| [in] | A | 積分区間の下限 a. |
| [in] | Omega | 重み関数のパラメータ ω. |
| [in] | Integr | 重み関数を指定する.
= 1: w(x) = cos(ω*x)
= 2: w(x) = sin(ω*x) |
| [out] | Result | 求められた積分値. |
| [out] | Info | = 0: 正常終了.
= -3: パラメータ Integr の誤り. (Integr <> 1 かつ Integr <> 2)
= -8: パラメータ IRev の誤り.
= 1: 小区間Ckの数が最大値に達した.
= 4: 収束の加速のための補外表が要求精度内に収まらなかった.
= 7: 1つ以上の小区間において積分を求められなかった. |
| [out] | XX | IRev = 1の場合, 関数値を求めるべき点を返す. |
| [in] | YY | IRev = 1の場合, 再呼び出し時に関数値f(XX)を与えること. |
| [in,out] | IRev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いIRevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックせよ.
= 1: XXにおける関数値を求めYYに設定する. YY以外の変数を変更してはならない. |
| [out] | AbsErr | (省略可)
絶対誤差の推定値. 真の誤差に等しいかそれより大きい. |
| [out] | Neval | (省略可)
被積分関数の評価回数. |
| [in] | EpsAbs | (省略可)
要求絶対誤差. (EpsAbs > 0) (省略時 = 1.0e-12)
(EpsAbs <= 0 であれば省略時の既定値とみなす) |
| [in] | Limlst | (省略可)
小区間の数の最大値. (Limlst >= 3) (省略時 = 50)
(Limlst < 3 であれば省略時の既定値とみなす) |
| [out] | Lst | (省略可)
実際に必要とした小区間の数. |
| [in] | Limit | (省略可)
各小区間をQawoで積分する際に使用する部分区間数の最大値. (Limit >= 1) (省略時 = 100)
(Limit < 1 であれば省略時の既定値とみなす) |
| [in] | Maxp1 | (省略可)
チェビシェフモーメント数の上限 (Maxp1 >= 1) (省略時 = 21)
(Maxp1 < 1 であれば省略時の既定値とみなす) |
- 出典
- SLATEC (QUADPACK)
- 使用例
- 次の定積分を求める.
∫ exp(-x^2)cos(x) dx [0, +∞] (= exp(-1/4)*1/2*√π)
Sub Ex_Qawf_r()
Dim A As Double, Omega As Double, Integr As Long, Result As Double, Info As Long
Dim XX As Double, YY As Double, IRev As Long
A = 0
Omega = 1
Integr = 1
IRev = 0
Do
Call Qawf_r(A, Omega, Integr, Result, Info, XX, YY, IRev)
If IRev = 1 Then YY = Exp(-XX ^ 2)
Loop While IRev <> 0
Debug.Print "S =", Result, "S(true) =", Exp(-1 / 4) * Dconst(17) / 2
Debug.Print "Info =", Info
End Sub
- 実行結果
S = 0.690194223521571 S(true) = 0.690194223521572
Info = 0
|