|
|
◆ Dfmin_r()
| Sub Dfmin_r |
( |
A As |
Double, |
|
|
B As |
Double, |
|
|
Tol As |
Double, |
|
|
XX As |
Double, |
|
|
YY As |
Double, |
|
|
IRev As |
Long |
|
) |
| |
1変数非線形関数の最小点 (リバースコミュニケーション版)
- 目的
- 本ルーチンは与えられた値AとBの間にある関数f(x)の最小点を求める.
黄金分割探索と逐次放物線補間を組み合わせた方法が使われる. フィボナッチ探索よりも収束がひどく遅くなることはない. 関数fの二次微分が連続で(AでもBでもない)最小点において正であれば超1次収束し, その次数は通常1.324・・・になる.
関数fの値は eps*abs(Dfmin)+(Tol/3) よりも近い2点において計算されることはない. ここで, epsは計算機イプシロンの平方根である. fが単峰形の関数で, 少なくても eps*abs(x)+(Tol/3) 離れた点におけるfの計算値が常に単峰形であれば, 区間[A, B]におけるfの大域的最小点の座標が誤差 3*eps*abs(Dfmin)+Tol 以下で求められる. fが単峰形でない場合, 局所的(おそらく大域的でない)最小点が同様の精度で求められる.
- 引数
-
| [in] | A | 探索範囲の下端. |
| [in] | B | 探索範囲の上端. |
| [in] | Tol | 要求精度(解の誤差範囲幅の要求値). (Tol >= 0) |
| [out] | XX | IRev = 0: 区間[A, B]においてf(x)が最小になる点のx座標.
IRev = 1: 関数値を求めるべき点. |
| [in] | YY | IRev = 1: 再呼び出し時に関数値f(XX)を与えること. |
| [in,out] | IRev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了.
= 1: XXにおける関数値f(XX)をYYに設定すること. YY以外の変数を変更してはならない. |
- 出典
- D. Kahaner, C. Moler, S. Nash, "Numerical Methods and Software", Prentice-Hall (1989)
- 使用例
- 次の関数の区間[0, 2]における最小点を求める.
Function FDfmin(X As Double) As Double
FDfmin = X ^ 3 - 2 * X - 5
End Function
Sub Ex_Dfmin_r()
Dim A As Double, B As Double, Tol As Double
Dim XX As Double, YY As Double, IRev As Long
A = 0: B = 2
Tol = 0.0000000001 '1.0e-10
IRev = 0
Do
Call Dfmin_r(A, B, Tol, XX, YY, IRev)
If IRev <> 0 Then YY = FDfmin(XX)
Loop While IRev <> 0
Debug.Print "X =", XX
End Sub
Sub Dfmin_r(A As Double, B As Double, Tol As Double, XX As Double, YY As Double, IRev As Long) 1変数非線形関数の最小点 (リバースコミュニケーション版)
- 実行結果
-
|