|
|
◆ 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] | Fpls | Xplsにおける関数値. |
| [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] | YY | IRev = 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
|