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

◆ Subplex_r()

Sub Subplex_r ( N As  Long,
X() As  Double,
Tol As  Double,
Info As  Long,
YY As  Double,
IRev 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のシンプレックス法を使用する. 直接探索法であるため微分係数を計算する必要がなく, 関数の滑らかさも仮定しない. しかし, 一般的には準ニュートン法や信頼領域法よりも収束が遅いとされる.

シンプレックス法は変数の数が多くなると効率が落ちることがあるため, 本ルーチンでは部分空間ごとにシンプレックス法を適用して探索することによりこの欠点を補う. 探索空間の指定を全空間に設定するとオリジナルのシンプレックス法(リスタート付き)として動作する.

Subplex_rはSubplexのリバースコミュニケーション版である.
引数
[in]N問題の次数(パラメータ数). (N > 1)
[in,out]X()配列 X(LX - 1) (LX >= N)
[in] 解ベクトルの初期推定値.
[out] IRev = 0: 求められた解ベクトル.
  IRev = 1: 関数値を求める点.
[in]TolX()の相対誤差の目標値. (Tol >= 0)
(Tol < 0 であれば Tol = 0 とみなす)
[out]Info= 0: 正常終了.
= -1: パラメータ N の誤り. (N < 1)
= 1: 関数Fの呼び出し回数の最大値(MaxFcall)を超えた.
= 2: 計算精度の限界に達した.
= 3: Fstopに達した. (NFstopを参照)
[in]YYIRev = 1の場合, 再呼び出し時にX()における関数値を与えること.
[in,out]IRevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックすること.
= 1: X()における関数値を求め YYに設定すること. YY以外の変数を変更してはならない.
[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 Ex_Subplex_r()
Const N = 2
Dim X(N - 1) As Double, Tol As Double, Info As Long
Dim XX(N - 1) As Double, YY As Double, IRev As Long
X(0) = -1.2: X(1) = 1
Tol = 0.0000000001 '1.0e-10
IRev = 0
Do
Call Subplex_r(N, X(), Tol, Info, YY, IRev)
If IRev = 1 Then
YY = 100 * (X(1) - X(0) ^ 2) ^ 2 + (1 - X(0)) ^ 2
End If
Loop While IRev <> 0
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Subplex_r(N As Long, X() As Double, Tol As Double, Info As Long, YY As Double, IRev 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