|
|
◆ optif9_r()
| void optif9_r |
( |
int |
n, |
|
|
double |
x[], |
|
|
double |
typsiz[], |
|
|
double |
fscale, |
|
|
int |
method, |
|
|
int |
iexp, |
|
|
int |
ndigit, |
|
|
int |
maxiter, |
|
|
int |
iagflg, |
|
|
int |
iahflg, |
|
|
double |
dlt, |
|
|
double |
gradtl, |
|
|
double |
stepmx, |
|
|
double |
steptl, |
|
|
int |
iresult, |
|
|
double |
xpls[], |
|
|
double * |
fpls, |
|
|
double |
gpls[], |
|
|
int * |
iter, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info, |
|
|
double |
xx[], |
|
|
double * |
yy, |
|
|
double |
yyp[], |
|
|
int |
ldyyp2, |
|
|
double |
yyp2[], |
|
|
int * |
irev |
|
) |
| |
多変数非線形関数の最小点 (準ニュートン法, 信頼領域法) (リバースコミュニケーション版)
- 目的
- optif9_rは非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.
ユーザーは微分係数および/またはヘッセ行列を解析的に求め与えることができる. 微分係数が与えられない場合, 1次有限差分近似を使用して求められる. また, ヘッセ行列が与えられない場合, セカント法(BFGS法)あるいは2次有限差分近似を使用して求められる.
探索アルゴリズムは, 直線探索, Dogleg信頼領域法およびHookstep信頼領域法の3種類を使うことができる.
ヘッセ行列のユーザー定義サブルーチンを与えず, デフォルトパラメータを使用した場合, 準ニュートン法 (BFGS法)のルーチンとして動作する.
- 引数
-
| [in] | n | 問題の次数(パラメータ数). (n > 1) |
| [in] | x[] | 配列 x[lx] (lx >= n)
解ベクトルの初期推定値. |
| [in] | typsiz[] | 配列 typsiz[ltypsiz] (ltypsiz >= n)
x[]の各要素のおおよその大きさ. この値はスケーリングに使用される. 例えば, x[0] = -0.001 であれば typsiz[0] = 0.001 とする.
(ただし, 0であれば1を, 負の値であれば絶対値を使う) |
| [in] | fscale | 目的関数値の最小点での推定値. 例えば, f(xpls) = 0.0001 であれば fscale = 0.0001を与える.
(ただし, 0であれば1を, 負の値であれば絶対値を使う) |
| [in] | method | 探索アルゴリズムの選択.
= 1: 直線探索.
= 2: Dogleg信頼領域法.
= 3: More-Hebdonのhookstep信頼領域法.
(他の値であれば1とみなす) |
| [in] | iexp | fcnの実行時間.
= 0: 普通.
= 1: 時間がかかる.
(他の値であれば1とみなす)
ヘッセ行列の更新は, d2fcnが与えられていればそれを使う. そうでなければ iexp = 1の場合, セカント法(BFGS法)により行い, iexp = 0 の場合, 2次有限差分により行う. |
| [in] | ndigit | fcnの計算精度(十進桁数). (ndigit > 0)
(ndigit <= 0 の場合, 最大精度とみなす) |
| [in] | maxiter | 最大反復回数. (maxiter > 0)
(maxiter <= 0 の場合, 省略時の既定値(200)とみなす) |
| [in] | iagflg | ユーザーが解析的微分係数値を与える(irev = 30〜34で戻る)かどうか制御する.
= 0: 解析的微分係数値を与えない.
= 1: 解析的微分係数値を与える.
= 2: 解析的微分係数値を与える(値のチェックを行わない).
(他の値であれば0とみなす) |
| [in] | iahflg | ユーザーが解析的ヘッセ行列値を与える(irev = 35〜37で戻る)かどうか制御する.
= 0: 解析的ヘッセ行列値を与えない.
= 1: 解析的ヘッセ行列値を与える.
= 2: 解析的ヘッセ行列値を与える(値のチェックを行わない).
(他の値であれば0とみなす) |
| [in] | dlt | 信頼領域法を使う場合の信頼領域半径の初期値. -1が与えられた場合にはスケーリングされた勾配の長さを使う.
(dlt <= 0 の場合, -1 とみなす. dlt > stepmxの場合, stepmx とみなす) |
| [in] | gradtl | 勾配の収束判定値. (gradtl >= 0)
(gradtl < 0 の場合, 1.0e-5とみなす) |
| [in] | stepmx | ステップサイズの最大値. (省略時 = max(||X||2*1000, 1000))
(stepmx <= 0 の場合, max(||X||2*1000, 1000)とみなす) |
| [in] | steptl | ステップサイズの収束判定値(連続する反復における相対値). 通常, 1.0e-3〜1.0e-7とする (steptl >= 0)
(steptl < 0 の場合, 1.0e-5とみなす) |
| [in] | iresult | 中間結果の出力のためにirev = 50〜52で戻るかどうか制御する.
= 0: irev = 50〜52で戻らない.
= 1: irev = 50〜52で戻る.
(他の値であれば0とみなす) |
| [out] | xpls[] | 配列 xpls[lxpls] (lxpls >= n)
求められた解ベクトル(局所的最小点). |
| [out] | fpls | xplsにおける関数値. |
| [out] | gpls[] | 配列 gpls[lgpls] (lgpls >= n)
xplsにおける微分係数値. |
| [out] | iter | 収束までに要した反復回数. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0の場合, サブコードをwork[0]に返す.
= 1: 傾きの収束判定条件を満たした
= 2: ステップサイズの収束判定値を満たした |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= 9*n) |
| [out] | info | = 0: 正常終了 (work[0]のサブコードを参照せよ)
= -1: 入力パラメータ n の誤り (n <= 1)
= -20: 入力パラメータ ldh の誤り (ldh < n)
= -23: 入力パラメータ lwork の誤り (lwork < 9*n)
= 1: 最後の更新において目的関数値が減少しなかった(局所的最小点にあるか, 非線形性が強すぎるか, steptlが大きすぎる)
= 2: 最大反復回数を超えた
= 3: ステップサイズが続けて5回stepmxを超えた(関数形が際限なく傾斜しているか, stepmxが小さすぎる)
= 4: 微分係数計算ルーチン d1fcn の結果が正しくない可能性がある
= 5: ヘッセ行列計算ルーチン d2fcn の結果が正しくない可能性がある |
| [out] | xx[] | 配列 xx[lxx] (lxx >= n)
irev = 1〜20, 30〜34, 35〜37: 再呼び出し時に, 関数値, 微分係数値, または, ヘッセ行列を与えるべき点を返す.
irev = 50〜52: 中間結果の出力のため現在の解ベクトルxを返す. |
| [in,out] | yy | [in] irev = 1〜20: 再呼び出し時に関数値 f(xx[])を与えること.
[out] irev = 50〜52: 中間結果の出力のため現在のxにおける関数値を返す. |
| [in,out] | yyp[] | 配列 yyp[lyyp] (lyyp >= n)
[in] irev = 30〜34: 再呼び出し時にxx[]における微分係数値を与えること.
[out] irev = 50〜52: 中間結果の出力のため現在のxにおける微分係数値を返す. |
| [in] | ldyyp2 | 配列yyp2[][]の整合寸法. (ldyyp2 >= n) |
| [in,out] | yyp2[][] | 配列 yyp2[lyyp2][ldyyp2] (lyyp2 >= n)
[in] irev = 35〜37: 再呼び出し時にヘッセ行列を与えること.
[out] irev = 50〜52: 中間結果の出力のため現在のxにおけるヘッセ行列を返す. なお, ヘッセ行列の計算のための作業領域として使用される. |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること.
= 1〜20: xx[]における関数値を求め yyに設定すること. yy以外の変数を変更してはならない.
= 30〜34: x[]における微分係数値を求め yyp[]に設定すること. yyp[]以外の変数を変更してはならない.
= 35〜37: x[]におけるヘッセ行列を求め yyp2[][]に設定すること. yyp2[][]以外の変数を変更してはならない.
= 50〜52: 途中結果(xx[], yy, yyp[], yyp2[][], iter)を適宜出力する. (iresult = 1 の場合)
irev = 50: 初期値を出力するための初回呼び出し.
irev = 51: 中間結果を出力するための反復中の呼び出し.
irev = 52: 最終結果を出力するための最終呼び出し.
どの変数も変更してはならない. |
- 出典
- CMLIB
|