|
|
◆ Subplex()
| Sub Subplex |
( |
N As |
Long, |
|
|
X() As |
Double, |
|
|
F As |
LongPtr, |
|
|
Tol As |
Double, |
|
|
Info As |
Long, |
|
|
Optional NFcall As |
Long, |
|
|
Optional Fval As |
Double, |
|
|
Optional Nsmin As |
Long = 0, |
|
|
Optional Nsmax As |
Long = 0, |
|
|
Optional MaxFcall As |
Long = 1000, |
|
|
Optional NFstop As |
Long = 0, |
|
|
Optional Fstop As |
Double, |
|
|
Optional Minf As |
Long = 0, |
|
|
Optional Alpha As |
Double = 1, |
|
|
Optional Beta As |
Double = 0.5, |
|
|
Optional Gamma As |
Double = 2, |
|
|
Optional Delta As |
Double = 0.5, |
|
|
Optional Psi As |
Double = 0.25, |
|
|
Optional Omega As |
Double = 0.1, |
|
|
Optional Irepl As |
Long = 0, |
|
|
Optional Ifxsw As |
Long = 1, |
|
|
Optional Bonus As |
Double = 1 |
|
) |
| |
多変数非線形関数の最小点 (部分空間探索シンプレックス法)
- 目的
- 本ルーチンは非線形関数 f(x1, x2, ..., xn) (一般多変数実数関数) の局所的最小点(xs1, xs2, ..., xsn) を求める.
Nelder-Meadのシンプレックス法を使用する. 直接探索法であるため微分係数を計算する必要がなく, 関数の滑らかさも仮定しない. しかし, 一般的には準ニュートン法や信頼領域法よりも収束が遅いとされる.
シンプレックス法は変数の数が多くなると効率が落ちることがあるため, 本ルーチンでは部分空間ごとにシンプレックス法を適用して探索することによりこの欠点を補う. 探索空間の指定を全空間に設定するとオリジナルのシンプレックス法(リスタート付き)として動作する.
- 引数
-
| [in] | N | 問題の次数(パラメータ数). (N > 1) |
| [in,out] | X() | 配列 X(LX - 1) (LX >= N)
[in] 解ベクトルの初期推定値.
[out] 求められた解ベクトル. |
| [in] | F | 目的関数 f(x1, x2, ..., xn) を求めるユーザー定義サブルーチンで, 次のように定義すること. Sub F(N As Long, X() As Double, Fval As Double)
与えられたNおよびX()から関数値を求めFvalに設定する. それ以外の変数を変更してはならない.
End Sub
|
| [in] | Tol | X()の相対誤差の目標値. (Tol >= 0) (Tol < 0 であれば Tol = 0 とみなす)
|
| [out] | Info | = 0: 正常終了.
= -1: パラメータ N の誤り. (N < 1)
= -9: パラメータ Nsmin または Nsmax の誤り. (Nsmin > Nsmax または N < ((N - 1)/Nsmax + 1)*Nsmin)
= 1: 関数Fの呼び出し回数の最大値(MaxFcall)を超えた.
= 2: 計算精度の限界に達した.
= 3: Fstopに達した. (NFstopを参照) |
| [out] | NFcall | (省略可)
関数Fの呼び出し回数. |
| [out] | Fval | (省略可)
求められた解ベクトルXにおける関数値. |
| [in] | Nsmin | (省略可)
|
| [in] | Nsmax | (省略可)
NsminとNsmaxは部分空間の次元数の範囲の下限および上限を表す. (1 <= Nsmin <= Nsmax <= N)
(省略時: Nsmin = Min(2, N), Nsmax = Min(5, N))
(Nsmin < 1 または Nsmin > N であれば Nsminは省略時の既定値とみなす)
(Nsmax < 1 または Nsmax > N であれば Namaxは省略時の既定値とみなす)
Nsmin = Nsmax = N であればNelder-Meadのシンプレックス法に一致する. |
| [in] | MaxFcall | (省略可)
関数Fの呼び出し回数の最大値. (省略時 = 1000) (MaxFcall <= 0 であれば省略時の既定値とみなす) |
| [in] | NFstop | (省略可)
反復中に f(x)の値をチェックするかどうかを指定する. (省略時 = 0)
= 0: チェックを行わない.
= 1: f(x)が Fstopに達していれば Info = 3 で戻る.
>= 2: f(x)が Fstopに達し, その時点の解ベクトルにおける関数評価回数が NFstopを超えていれば Info = 3 で戻る. (Irepl > 0 の場合にのみ有効) |
| [in] | Fstop | (省略可)
NFstopを参照. |
| [in] | Minf | (省略可)
最小化を行うか, 最大化を行うかを指定する. (省略時: 0)
= 0: 最小化を行う.
<> 0: 最大化を行う. |
| [in] | Alpha | (省略可)
|
| [in] | Beta | (省略可)
|
| [in] | Gamma | (省略可)
|
| [in] | Delta | (省略可)
Alpha, Beta, Gamma および Deltaは, Nelder-Meadのシンプレックス法のパラメータである. (Alpha > 0, 0 < Beta < 1, Gamma > 1, 0 < Delta < 1)
(省略時: Alpha = 1, Beta = 0.5, Gamma = 2, Delta = 0.5)
Alphaは折り返し, Betaは縮小, Gammaは拡大, Deltaは収縮パラメータである.
(各パラメータが上記範囲外であれば省略時の既定値とみなす) |
| [in] | Psi | (省略可)
|
| [in] | Omega | (省略可)
PsiおよびOmegaは, 部分空間探索のパラメータである. (0 < Psi < 1, 0 < Omega < 1)
(省略時: Psi = 0.25, Omega = 0.1)
Psiはシンプレックスの縮小, Omegaはステップ幅の縮小パラメータである.
(各パラメータが上記範囲外であれば省略時の既定値とみなす) |
| [in] | Irepl | (省略可)
反復測定(measurement replication)を行うかどうかを指定する. (省略時 = 0)
目的関数にノイズが多い場合に複数回の評価を行い, 平均, 最大あるいは最小値を採用することができる.
= 0: 反復測定を行わない.
= 1: Subplexが反復測定を行う.
= 2: ユーザーが反復測定を行う.
(上記以外の値であれば省略時の既定値とみなす) |
| [in] | Ifxsw | (省略可)
反復測定に使用する値を指定する. (省略時 = 1)
= 1: 平均値.
= 2: 最大値.
= 3: 最小値.
(上記以外の値であれば省略時の既定値とみなす) |
| [in] | Bonus | (省略可)
加算係数を指定する. (Bonus >= 0, 通常 0 か 1 とする) (省略時 = 1)
反復測定により採用した点に加算を行うことにより, ノイズにより良く見えるる他の点で置き換えられることを防ぐ.
= 0: 加算を行わない.
= 1: 加算を行う.
(上記範囲外であれば省略時の既定値とみなす) |
- 出典
- netlib/opt
- 使用例
- 次の関数の最小点を求める(ローゼンブロック関数).
f(x1, x2) = 100(x2 - x1^2)^2 + (1 - x1)^2
初期値は, (x1, x2) = (-1.2, 1) とする. Sub FSubplex(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_Subplex()
Const N = 2
Dim X(N - 1) As Double, Tol As Double, Info As Long
X(0) = -1.2: X(1) = 1
Tol = 0.0000000001 '1.0e-10
Call Subplex(N, X(), AddressOf FSubplex, Tol, Info)
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Subplex(N As Long, X() As Double, F As LongPtr, Tol As Double, Info As Long, Optional NFcall As Long, Optional Fval As Double, Optional Nsmin As Long=0, Optional Nsmax As Long=0, Optional MaxFcall As Long=1000, Optional NFstop As Long=0, Optional Fstop As Double, Optional Minf As Long=0, Optional Alpha As Double=1, Optional Beta As Double=0.5, Optional Gamma As Double=2, Optional Delta As Double=0.5, Optional Psi As Double=0.25, Optional Omega As Double=0.1, Optional Irepl As Long=0, Optional Ifxsw As Long=1, Optional Bonus As Double=1) 多変数非線形関数の最小点 (部分空間探索シンプレックス法)
- 実行結果
X1, X2 = 1.0000000000349 1.00000000007952
Info = 0
|