|
|
◆ Dfzero()
| Sub Dfzero |
( |
F As |
LongPtr, |
|
|
B As |
Double, |
|
|
C As |
Double, |
|
|
R As |
Double, |
|
|
Re As |
Double, |
|
|
Ae As |
Double, |
|
|
Info As |
Long |
|
) |
| |
非線形方程式
- 目的
- 本ルーチンは与えられた値BとCの間にある f(x) = 0 の解を求める. 探索範囲[B, C]を要求精度まで(abs(B - C) <= 2*(Re*abs(B) + Ae)となるまで)縮小していくことにより解を求める.
本ルーチンは主としてf(B)とf(C)が反対の符号を持つ問題用に設計されている. 二分法とセカント法を有効に組み合わせた方法が使われている.
- 引数
-
| [in] | F | 方程式 f(x) = 0 の関数f(x)を求めるユーザー関数で, 次のように定義すること.
Function F(X As Double) As Double
F = f(X)の関数値
End Function
Xを変更しないこと. |
| [in,out] | B | [in] 探索範囲の下端.
[out] 最終探索範囲の下端 (求められた解). |
| [in,out] | C | [in] 探索範囲の上端.
[out] 最終探索範囲の上端. |
| [in] | R | 収束を速めるためにゼロ点の推定値を与える. もし, よい推定値が不明ならばRにはBまたはCの値を設定するとよい. |
| [in] | Re | 収束判定に使用する相対誤差. 要求値が小さすぎる場合, 計算機イプシロンの数倍程度に設定される. |
| [in] | Ae | 収束判定に使用する絶対誤差. 探索範囲[B, C]が0を含む場合, 0以外の数値を与えなければならない. |
| [out] | Info | = 0: 正常終了.
= 1: f(x) = 0 であるが, 解の区間幅が要求精度に達していない可能性がある.
= 2: Bがf(x)の特異点の近傍にある可能性がある.
= 3: 探索範囲内でf(x)の符号が変わらなかった.
= 4: 関数評価回数が上限(500)を超えた. |
- 出典
- D. Kahaner, C. Moler, S. Nash, "Numerical Methods and Software", Prentice-Hall (1989)
- 使用例
- 次の方程式の区間[1, 3]における解を求める.
Function FDfzero(X As Double) As Double
FDfzero = X ^ 3 - 2 * X - 5
End Function
Sub Ex_Dfzero()
Dim B As Double, C As Double, R As Double, Re As Double, Ae As Double
Dim Info As Long
B = 1: C = 3: R = B
Re = 0: Ae = 0
Call Dfzero(AddressOf FDfzero, B, C, R, Re, Ae, Info)
Debug.Print "X =", B
Debug.Print "Info =", Info
End Sub
Sub Dfzero(F As LongPtr, B As Double, C As Double, R As Double, Re As Double, Ae As Double, Info As Long) 非線形方程式
- 実行結果
X = 2.09455148154233
Info = 0
|