|
|
◆ Optif0()
| Sub Optif0 |
( |
N As |
Long, |
|
|
X() As |
Double, |
|
|
F As |
LongPtr, |
|
|
Xpls() As |
Double, |
|
|
Fpls As |
Double, |
|
|
Info As |
Long |
|
) |
| |
多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ)
- 目的
- 本ルーチンは非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.
必要な微分係数は有限差分近似で求められる. また, ヘッセ行列はセカント法(BFGS法)で求められる. 探索アルゴリズムとして直線探索が使われる.
Optif0は, 標準パラメータを設定してOptif9を呼び出すのと同等で, 準ニュートン法(BFGS法)のルーチンとして動作する.
- 引数
-
| [in] | N | 問題の次数(パラメータ数). (N > 1) |
| [in] | X() | 配列 X(LX - 1) (LX >= N)
解ベクトルの初期推定値. |
| [in] | F | 目的関数 f(x1, x2, ..., xn) を求めるユーザー定義サブルーチンで, 次のように定義すること. Sub F(N As Long, X() As Double, Fval As Double)
与えられたNおよびX()から関数値を求めFvalに設定する. それ以外の変数を変更してはならない.
End Sub
|
| [out] | Xpls() | 配列 Xpls(LXpls - 1) (LXpls >= N)
求められた解ベクトル(局所的最小点). |
| [out] | Fpls | Xplsにおける関数値. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ N の誤り. (N <= 1)
= -2: パラメータ X() の誤り.
= -4: パラメータ Xpls() の誤り.
= 1: 最後の更新において目的関数値が減少しなかった. (局所的最小点にあるか, 非線形性が強すぎるか, Steptlが大きすぎる)
= 2: 最大反復回数(200)を超えた.
= 3: ステップサイズが続けて5回Stepmxを超えた. (関数形が際限なく傾斜しているか, Stepmxが小さすぎる) |
- 出典
- CMLIB
- 使用例
- 次の関数の最小点を求める(ローゼンブロック関数).
f(x1, x2) = 100(x2 - x1^2)^2 + (1 - x1)^2
初期値は, (x1, x2) = (-1.2, 1) とする. Sub FOptif(N As Long, X() As Double, F As Double)
F = 100 * (X(1) - X(0) ^ 2) ^ 2 + (1 - X(0)) ^ 2
End Sub
Sub Ex_Optif0()
Const N As Long = 2
Dim X(N - 1) As Double, Xp(N - 1) As Double, Fp As Double
Dim Info As Long
X(0) = -1.2: X(1) = 1
Call Optif0(N, X(), AddressOf FOptif, Xp(), Fp, Info)
Debug.Print "X1, X2 =", Xp(0), Xp(1)
Debug.Print "Info =", Info
End Sub
Sub Optif0(N As Long, X() As Double, F As LongPtr, Xpls() As Double, Fpls As Double, Info As Long) 多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ)
- 実行結果
X1, X2 = 0.999990556479338 0.999981114653297
Info = 0
|