|
|
◆ mnf()
| void mnf |
( |
int |
n, |
|
|
double |
x[], |
|
|
void(*)(int, double *, int *, double *) |
calcf, |
|
|
double |
d[], |
|
|
void(*)(int, double *, int, int, int, double) |
itsum, |
|
|
double |
v[], |
|
|
int |
lv, |
|
|
int |
iv[], |
|
|
int |
liv, |
|
|
int * |
info |
|
) |
| |
多変数非線形関数の最小点 (信頼領域法) (微分係数不要)
- 目的
- mnfは非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点(xs1, xs2, ..., xsn) を求める.
目的関数の微分係数は, これを解析的に求めるユーザー定義サブルーチンを使わずに, 有限差分近似により求められる. ヘッセ行列はセカント法(BFGS法)により求められる. 探索アルゴリズムはダブルドッグレッグ信頼領域法を使用する.
配列v[]およびiv[]はパラメータおよび作業用領域である. mnfがiv[0] = 0として呼ばれた場合, これらの配列は計算開始前にデフォルト値に初期化される. 下のiv[0]に関する説明を参照のこと.
- 引数
-
| [in] | n | 問題の次数(パラメータ数). (n > 0) |
| [in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 解ベクトルの初期推定値.
[out] 求められた解ベクトル. |
| [in] | calcf | 目的関数 f(x1, x2, ..., xn) を求めるユーザー定義サブルーチンで, 次のように定義すること. void calcf(int n, double x[], int *nf, double *fval)
{
*fval = 与えられたnおよびx[]より求めた関数値
}
nfは呼び出しカウンタである. x[]が同じ場合, calcfに渡されるnfは同じ値を持つ. 与えられたx[]が計算可能範囲外の場合, nf = 0 に設定して戻ること. fvalとnf以外の変数を変更してはならない. |
| [in] | d[] | 配列 d[ld] (ld >= n) スケール係数. すべてのiについてd[i]*x[i]が同程度の大きさになるように設定する. (d[i] > 0) |
| [in] | itsum | 中間結果を出力するためのユーザー定義サブルーチンで, 次のように定義すること.
iv[18] = 1であれば反復ごとに呼び出される. void itsum(int n, double x[], int niter, int nf, int ng, double fval)
{
以下の情報を適当な形式で出力する.
n: 変数の数.
x[]: 解ベクトルの現在の近似値.
niter: 反復回数.
nf: calcfの呼び出し回数 (微分係数計算のための呼び出しを除く).
ng: calcfの呼び出し回数 (微分係数計算のための呼び出し回数).
fval: x[]における関数値.
}
引数の値を変更してはならない. |
| [in,out] | v[] | 配列 v[lv]
浮動小数パラメータおよび作業領域のための配列.
[in]
v[25] (tuner1): 誤収束の判定パラメータ. (0 <= tuner1 <= 0.5) (デフォルト = 0.1)
v[30] (atol): 関数値の目標絶対精度. (0 <= atol) (デフォルト = max(1e-20, eps^2), ただし, epsは計算機イプシロン)
v[31] (rtol): 関数値の目標相対精度. (eps <= rtol <= 0.1) (デフォルト = max(1e-10, eps^(2/3))
v[32] (xctol): x値の収束判定しきい値. (0 <= xctol <= 1) (デフォルト = eps^(1/2))
v[33] (xftol): 誤収束の判定しきい値. (0 <= xftol <= 1) (デフォルト = 100*eps)
v[34] (lmax0): スケーリングされた一番始めのステップ長の最大幅. (0 < lmax0) (デフォルト = 1)
v[35] (lmaxs), v[36] (sctol): 特異収束の判定パラメータ. (0 < lmaxs, 0 <= sctol <= 1)
ステップ長lmaxsにおいてsctol*abs(f)よりも関数値が減少しなくなった. (fは現在の反復の出発点における関数値)
v[37] (dinit): 非負の値を設定しておくとそれによりd[]の全要素を初期化する. (-10 <= dinit) (デフォルト = -1)
v[41] (eta0): calcfの計算精度. (真値 = 計算値*(1 + e)とすると abs(e) <= eta0) (eps <= eta0 <= 1) (デフォルト = 1000*eps)
v[42] (bias): ダブルドッグレッグ法で使用するパラメータ. (0 <= bias <= 1) (デフォルト = 0.8)
[out]
v[0] (dgnorm): diag(d)^(-1)*g の2ノルム. (g は勾配の最新値)
v[1] (dstnrm): diag(d)^(-1)*s の2ノルム. (s は現在のステップ長)
v[9] (f): 現在の関数値.
v[12] (f0): 現在の反復の出発点における関数値. |
| [in] | lv | 配列 v[]のサイズ. (lv >= 77 + n*(n + 17)/2) |
| [in,out] | iv[] | 配列 iv[liv]
整数パラメータおよび作業領域のための配列.
[in]
iv[0]: 0に設定して呼び出すと, 実行開始前にiv[]およびv[]の全てのパラメータをデフォルト値に初期化する.
12に設定して呼び出すと, iv[]およびv[]はユーザーにより設定済であると見なし初期化を行わない. サブルーチンivsetはiv[0]=12に設定するため, 最初にivsetを呼び出してiv[]およびv[]をデフォルト値に設定し, 次に必要なパラメータを非デフォルト値に変更し, それを使用して実行を開始することができる.
iv[16] (mxfcal): 関数評価回数の最大値. (デフォルト値 = 200)
iv[17] (mxiter): 反復回数の最大値. (デフォルト値 = 150)
iv[18] (outlev): 中間情報の出力を指定する. (デフォルト値 = 0)
!= 1: itsumを参照しない.
= 1: 反復ごとにitsumを呼び出す.
[out]
iv[0]: リターンコード.
= 3: x値の収束条件を満たした.
= 4: 関数値相対収束条件を満たした.
= 5: x値および関数値相対収束条件の両方を満たした.
= 6: 関数値絶対収束条件を満たした.
= 7: 特異収束. (近傍のヘッセ行列が特異になった)
= 8: 誤収束. (誤った点での収束と思われる. 目標精度が小さすぎる可能性がある)
= 9: 関数評価回数の最大値を超えた.
= 10: 反復回数の最大値を超えた.
= 11: stopxがtrueを返した. (外部割込み)
= 17: nを変更してリスタートが試みられた.
= 18: dが負の要素を持ちiv[dtype] < 0である.
= 19...43: v[iv[0]]が範囲外.
= 63: x[]の初期点においてf(x)を求めることができない.
= 64: assessに不正なパラメータが渡された.
= 65: x[]において微分係数を求めることができない.
= 67: ivsetの最初の引数が誤っている.
= 80: iv[0]の値が範囲外.
= 81: n <= 0.
iv[5] (nfcall): calcfの呼び出し回数(微分係数計算のための呼び出しを除く). mxfcalはnfcallの値に適用される.
iv[27] (g): v[]の中で現在の微分ベクトルが格納されている場所の開始点のインデックス(+ 1).
iv[29] (ngcall): 微分係数計算のためのcalcfの呼び出し回数. (calcfの総呼び出し回数は nfcall + ngcall)
iv[30] (niter): 反復回数.
iv[43] (lastiv): livの最小値.
iv[44] (lastv): lvの最小値. |
| [in] | liv | 配列 iv[]のサイズ. (liv >= 60) |
| [out] | info | = 0: 正常終了 (iv[0] = 3〜6)
= -1: 入力パラメータ n の誤り (n < 1) (iv[0] = 81)
= -4: 入力パラメータ d の誤り (iv[15] = 0で d[]に負の要素がある) (iv[0] = 18)
= -6: 入力パラメータ v[18]〜v[42] の誤り (範囲外の値) (iv[0] = 19〜43)
= -7: 入力パラメータ lv の誤り (lvが小さすぎる) (iv[0] = 81)
= -8: 入力パラメータ iv[0] の誤り (範囲外の値) (iv[0] = 80)
= -9: 入力パラメータ liv の誤り (livが小さすぎる) (iv[0] = 15)
= 7: 特異収束 (近傍のヘッセ行列が特異になった)
= 8: 誤収束 (誤った点での収束と思われる. 目標精度が小さすぎる可能性がある)
= 9: 関数評価回数の最大値を超えた
= 10: 反復回数の最大値を超えた
= 14: iv[]およびv[]の領域の割り付けを行った (iv[0]=13の呼び出し後に正常終了した)
= 17: nを変更して再スタートを行った
= 63: x[]の初期点において関数値を求めることができない
= 65: x[]において微分係数を求めることができない |
- 出典
- netlib/port
|