|
|
◆ subplex()
| void subplex |
( |
int |
n, |
|
|
double |
x[], |
|
|
void(*)(int, double *, double *) |
f, |
|
|
double |
tol, |
|
|
int |
maxeval, |
|
|
double |
scale[], |
|
|
double * |
fx, |
|
|
int * |
neval, |
|
|
int |
nsmin, |
|
|
int |
nsmax, |
|
|
int |
icont, |
|
|
int |
nfstop, |
|
|
double |
fstop, |
|
|
int |
minf, |
|
|
double |
alpha, |
|
|
double |
beta, |
|
|
double |
gamma, |
|
|
double |
delta, |
|
|
double |
psi, |
|
|
double |
omega, |
|
|
int |
irepl, |
|
|
int |
ifxsw, |
|
|
double |
bonus, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int |
iwork[], |
|
|
int |
liwork, |
|
|
int * |
info |
|
) |
| |
多変数非線形関数の最小点 (部分空間探索シンプレックス法)
- 目的
- subplexは非線形関数 f(x1, x2, ..., xn) (一般多変数実数関数) の局所的最小点(xs1, xs2, ..., xsn) を求める.
Nelder-Meadのシンプレックス法を使用する. 直接探索法であるため微分係数を計算する必要がなく, 関数の滑らかさも仮定しない. しかし, 一般的には準ニュートン法や信頼領域法よりも収束が遅いとされる.
シンプレックス法は特に変数の数が多くなると効率が落ちることがあるため, 本ルーチンでは部分空間ごとにシンプレックス法を適用して探索することによりこの欠点を補う. 探索空間の指定を全空間に設定するとオリジナルのシンプレックス法(リスタート付き)として動作する.
- 引数
-
| [in] | n | 問題の次数(パラメータ数). (n >= 1) |
| [in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 解ベクトルの初期推定値.
[out] 求められた解ベクトル. |
| [in] | f | 目的関数 f(x1, x2, ..., xn) を求めるユーザー定義サブルーチンで, 次のように定義すること. void f(int n, double x[], double *fval)
{
*fval = 与えられたnおよびx[]から求めた関数値
}
fval以外の変数を変更してはならない. |
| [in] | tol | x[]の相対誤差の目標値. (tol >= 0)
(tol < 0 であれば tol = 0 とみなす) |
| [in] | maxeval | 関数fの呼び出し回数の最大値. (maxeval > 0)
(maxeval <= 0 であれば既定値(1000)とみなす) |
| [in] | scale[] | 配列 scale[lscale] (lscale >= 1 (scale[0] < 0)、lscale >= n (scale[0] > 0))
対応するx[]の要素のスケールおよび初期ステップサイズ. (scale[i] != 0)
scale[0] < 0 であればすべての要素について abs(scale[0]) が適用され, scale[1], ..., scale[n-1] は参照されない. |
| [out] | fx | 求められた解ベクトルx[]における関数値. |
| [out] | neval | 関数fの呼び出し回数. |
| [in] | nsmin | 部分空間の次元数の範囲の下限. (1 <= nsmin <= nsmax <= n)
nsmin = nsmax = n であれば Nelder-Meadのシンプレックス法に一致する.
(nsmin < 1 または nsmin > n であれば nsminは既定値(min(2,n))とみなす) |
| [in] | nsmax | 部分空間の次元数の範囲の上限. (1 <= nsmin <= nsmax <= n)
(nsmax < 1 または nsmax > n であれば namaxは既定値(min(5,n))とみなす) |
| [in] | icont | subplexはtolあるいはmaxevalを新しい値に変更して前回呼び出しから再開することができる. icontにより新規呼び出しか再開かを指定する.
= 0: 新規呼び出し.
!= 0: 前回呼び出しからの再開. (tolおよびmaxeval以外を変更してはならない) |
| [in] | nfstop | 反復中に f(x)の値をチェックするかどうかを指定する.
= 0: チェックを行わない.
= 1: f(x)が fstopに達していれば info = 3 で戻る.
>= 2: f(x)が fstopに達し, その時点の解ベクトルにおける関数評価回数がnfstopを超えていれば info = 3 で戻る (irepl > 0 の場合にのみ有効). |
| [in] | fstop | nfstopを参照. |
| [in] | minf | 最小化を行うか, 最大化を行うかを指定する.
= 0: 最小化を行う.
!= 0: 最大化を行う. |
| [in] | alpha | Nelder-Meadのシンプレックス法のパラメータ. (alpha > 0)
alphaは折り返し係数である.
(パラメータが上記範囲外であれば既定値(1)とみなす) |
| [in] | beta | Nelder-Meadのシンプレックス法のパラメータ. (0 < beta < 1) betaは縮小係数である. (パラメータが上記範囲外であれば既定値(0.5)とみなす) |
| [in] | gamma | Nelder-Meadのシンプレックス法のパラメータ. (gamma > 1)
gammaは拡大係数である.
(パラメータが上記範囲外であれば既定値(2)とみなす) |
| [in] | delta | Nelder-Meadのシンプレックス法のパラメータ. (0 < delta < 1)
deltaは収縮係数である.
(パラメータが上記範囲外であれば既定値(0.5)とみなす) |
| [in] | psi | 部分空間探索のパラメータ. (0 < psi < 1)
psiはシンプレックスの縮小係数である.
(パラメータが上記範囲外であれば既定値(0.25)とみなす) |
| [in] | omega | 部分空間探索のパラメータ. (0 < omega < 1)
omegaはステップ幅の縮小係数である.
(パラメータが上記範囲外であれば既定値(0.1)とみなす) |
| [in] | irepl | 反復測定(measurement replication)を行うかどうかを指定する.
目的関数にノイズが多い場合に, 複数回の評価を行い平均、最大あるいは最小値を採用することができる.
= 0: 反復測定を行わない.
= 1: subplexが反復測定を行う.
= 2: ユーザーが反復測定を行う.
(上記以外の値であれば既定値(0)とみなす) |
| [in] | ifxsw | 反復測定に使用する値を指定する.
= 1: 平均値.
= 2: 最大値.
= 3: 最小値.
(上記以外の値であれば既定値(1)とみなす) |
| [in] | bonus | 加算係数を指定する. (bonus >= 0, 通常 0 か 1 とする)
反復測定により採用した点に加算を行うことにより, ノイズにより良く見える他の点で置き換えられることを防ぐ.
= 0: 加算を行わない.
= 1: 加算を行う.
(上記範囲外であれば既定値(1)とみなす) |
| [out] | work[] | 配列 work[lwork]
作業領域. |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= 2*n + nsmax*(nsmax+4) + 1) |
| [out] | iwork[] | 配列 iwork[liwork]
作業領域. |
| [in] | liwork | 配列 iwork[]のサイズ. (liwork >= n + n/nsmin) |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ n の誤り (n < 1)
= -6: 入力パラメータ scale[] の誤り (scale[i] = 0)
= -10: 入力パラメータ nsminまたはnsmax の誤り (nsmin > nsmax)
= -10: 入力パラメータ nsminまたはnsmax の誤り (n < ((n - 1)/nsmax + 1)*nsmin)
= -25: 入力パラメータ lwork の誤り (lwork < 2*n + nsmax*(nsmax+4) + 1)
= -27: 入力パラメータ liwork の誤り (liwork < n + n/nsmin)
= 1: 関数fの呼び出し回数の最大値(maxeval)を超えた
= 2: 計算精度の限界に達した
= 3: fstopに達した (nfstopを参照) |
- 出典
- netlib/opt
|