XLPack 7.0
XLPack 数値計算ライブラリ (Excel VBA) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ 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]FplsXplsにおける関数値.
[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