|
|
◆ 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
Function Dconst(I As Long, Optional Info As Long) As Double 基本定数
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点ガウス・クロンロッド則) (リバースコミュニケーション版)
- 実行結果
S = 0.690194223521571 S(true) = 0.690194223521572
Info = 0
|