|
|
◆ optif0_r()
| void optif0_r |
( |
int |
n, |
|
|
double |
x[], |
|
|
double |
xpls[], |
|
|
double * |
fpls, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info, |
|
|
double |
xx[], |
|
|
double |
yy, |
|
|
int * |
irev |
|
) |
| |
多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ) (リバースコミュニケーション版)
- 目的
- optif0_rは非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.
必要な微分係数は有限差分近似で求められる. また, ヘッセ行列はセカント法(BFGS法)で求められる. 探索アルゴリズムとして直線探索が使われる.
optif0_rは標準パラメータを設定してoptif9_rを呼び出すのに相当し, 準ニュートン法(BFGS法)のルーチンとして動作する.
- 引数
-
| [in] | n | 問題の次数(パラメータ数). (n > 1) |
| [in] | x[] | 配列 x[lx] (lx >= n)
解ベクトルの初期推定値. |
| [out] | xpls[] | 配列 xpls[lxpls] (lxpls >= n)
求められた解ベクトル(局所的最小点). |
| [out] | fpls | xplsにおける関数値. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0の場合, サブコードをwork[0]に返す.
= 1: 傾きの収束判定条件を満たした.
= 2: ステップサイズの収束判定値を満たした. |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= n*(n + 10)) |
| [out] | info | = 0: 正常終了 (work[0]のサブコードを参照せよ)
= -1: 入力パラメータ n の誤り (n <= 1)
= -6: 入力パラメータ lwork の誤り (lwork < n*(n + 10))
= 1: 最後の更新において目的関数値が減少しなかった(局所的最小点にあるか, 非線形性が強すぎるか, steptlが大きすぎる)
= 2: 最大反復回数(200)を超えた
= 3: ステップサイズが続けて5回stepmxを超えた(関数形が際限なく傾斜しているか, stepmxが小さすぎる) |
| [out] | xx[] | 配列 xx[lxx] (lxx >= n)
irev = 1〜20: 再呼び出し時に関数値を与えるべき点を返す. |
| [in] | yy | irev = 1〜20: 再呼び出し時に関数値 f(xx[])を与えること. |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること.
= 1〜20: xx[]における関数値を求め yyに設定すること. yy以外の変数を変更してはならない. |
- 出典
- CMLIB
|