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

◆ Optif0_r()

Sub Optif0_r ( N As  Long,
X() As  Double,
Xpls() As  Double,
Fpls As  Double,
Info As  Long,
XX() As  Double,
YY As  Double,
IRev As  Long 
)

多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ) (リバースコミュニケーション版)

目的
本ルーチンは非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.

必要な微分係数は有限差分近似で求められる. また, ヘッセ行列はセカント法(BFGS法)で求められる. 探索アルゴリズムとして直線探索が使われる.

Optif0_rは, 標準パラメータを設定してOptif9_rを呼び出すのと同等で, 準ニュートン法(BFGS法)のルーチンとして動作する.

Optif0_rはOptif0のリバースコミュニケーション版である.
引数
[in]N問題の次数(パラメータ数). (N > 1)
[in]X()配列 X(LX - 1) (LX >= N)
解ベクトルの初期推定値.
[out]Xpls()配列 Xpls(LXpls - 1) (LXpls >= N)
求められた解ベクトル(局所的最小点).
[out]FplsXplsにおける関数値.
[out]Info= 0: 正常終了.
= -1: パラメータ N の誤り. (N <= 1)
= -2: パラメータ X() の誤り.
= -3: パラメータ Xpls() の誤り.
= -6: パラメータ XX() の誤り.
= -8: パラメータ IRev の誤り.
= 1: 最後の更新において目的関数値が減少しなかった. (局所的最小点にあるか, 非線形性が強すぎるか, Steptlが大きすぎる)
= 2: 最大反復回数(200)を超えた.
= 3: ステップサイズが続けて5回Stepmxを超えた. (関数形が際限なく傾斜しているか, Stepmxが小さすぎる)
[out]XX()配列 XX(LXX - 1) (LXX >= N)
IRev = 1の場合, 関数値, 微分係数値またはヘッセ行列を求めるべき点を返す.
[in]YYIRev = 1の場合, 再呼び出し時に関数値を与えること.
[in,out]IRevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックすること.
= 1: XX()における関数値を求めYYに設定すること. YY以外の変数を変更してはならない.
出典
CMLIB
使用例
次の関数の最小点を求める(ローゼンブロック関数).
f(x1, x2) = 100(x2 - x1^2)^2 + (1 - x1)^2
初期値は, (x1, x2) = (-1.2, 1) とする.
Sub Ex_Optif0_r()
Const N = 2
Dim X(N - 1) As Double, Xp(N - 1) As Double, Fp As Double
Dim Info As Long
Dim XX(N - 1) As Double, YY As Double, IRev As Long
X(0) = -1.2: X(1) = 1
IRev = 0
Do
Call Optif0_r(N, X(), Xp(), Fp, Info, XX(), YY, IRev)
If IRev = 1 Then
YY = 100 * (XX(1) - XX(0) ^ 2) ^ 2 + (1 - XX(0)) ^ 2
End If
Loop While IRev <> 0
Debug.Print "X1, X2 =", Xp(0), Xp(1)
Debug.Print "Info =", Info
End Sub
Sub Optif0_r(N As Long, X() As Double, Xpls() As Double, Fpls As Double, Info As Long, XX() As Double, YY As Double, IRev As Long)
多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ) (リバースコミュニケーション版)
実行結果
X1, X2 = 0.999990556479338 0.999981114653297
Info = 0