|
|
◆ _n2pb_r()
| void _n2pb_r |
( |
int |
m, |
|
|
int |
md, |
|
|
int |
n, |
|
|
double |
x[], |
|
|
double |
b[][2], |
|
|
double |
v[], |
|
|
int |
lv, |
|
|
int |
iv[], |
|
|
int |
liv, |
|
|
int * |
info, |
|
|
int * |
m1, |
|
|
int * |
m2, |
|
|
double |
yy[], |
|
|
int |
ldyyp, |
|
|
double |
yyp[], |
|
|
int * |
irev |
|
) |
| |
非線形最小二乗法 (適応アルゴリズム) (単純制約付き) (省メモリ版) (リバースコミュニケーション版)
- 目的
- n2pb_rは, ガウス・ニュートン法, レーベンバーグ・マルカート法などを組み合わせ拡張した適応アルゴリズムにより, 単純制約条件 bl[i] <= x[i] <= bu[i] (1 <= i <= n) の下で, m個のn変数非線形関数の二乗和の最小点を求める.
min Σfi(x1, x2, ..., xn)^2 (ただし, Σは i = 1 〜 m)
irevに従って関数値およびヤコビ行列をユーザーが与える必要がある. 関数値およびヤコビ行列の計算は, 1回で行わずに複数回に分けて部分ごとに行うことができる.
n2pb_rはn2pbのリバースコミュニケーション版である.
- 引数
-
| [in] | m | データ数. (m > 0) |
| [in] | md | 1回の関数評価により計算できる関数値の最大数. (0 < md <= m) |
| [in] | n | パラメータ数. (0 < n <= m) |
| [in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 初期近似解.
[out] irev = 0: 求められた解ベクトル.
irev = 1: 関数値(残差)を求める点.
irev = 30, 31: ヤコビ行列を求める点.
irev = 50: 最新の近似解. |
| [in] | b[][] | 配列 b[lb][2] (lb >= n)
解 x の境界制約条件.
b[i][0] <= x[i] <= b[i][1] (i = 0 〜 n-1) |
| [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 = 1, sctol = max(1e-10, eps^(2/3))).
ステップ長lmaxsにおける関数値の減少の推定値がsctol*abs(f)より小さければ info = 7 で戻る (fは現在の反復の出発点における関数値).
v[37] (dinit): 非負の値を設定しておくとそれによりd[]の全要素を初期化する (-10 <= dinit) (デフォルト値 = 0)
v[38] (dtol): 自動スケーリングのしきい値 (0 =< dtol) (デフォルト値 = 1.0e-6)
v[39] (d0): 自動スケーリングの初期値 (0 =< d0) (デフォルト値 = 1)
v[40] (dfac): 自動スケーリングの係数 (0 <= dfac <= 1) (デフォルト値 = 0.6)
自動スケーリングではd[i]をスケール係数として, すべてのiについてd[i]*x[i]が同程度の大きさになるように反復ごとにd[i]を調整する.
まず, d1[i] = max(||Ji||, dfac*d[i])とする(||Ji||はヤコビ行列の第i列の2-ノルム). 次に, 以下のようにd[i]を調整する.
d1[i] >= dtolの場合: d[i] = d1[i]
d1[i] < dtolの場合: d[i] = d0
[out]
v[0] (dgnorm): diag(d)^(-1)*g の2ノルム (g は勾配の最新値)
v[1] (dstnrm): diag(d)^(-1)*s の2ノルム (s は現在のステップ長)
v[9] (f): 現在の関数値 (二乗和の1/2)
v[12] (f0): 現在の反復の出発点における関数値 |
| [in] | lv | 配列 v[]のサイズ (lv >= 105 + n*(2*n + 22) + m) |
| [in,out] | iv[] | 配列 iv[liv]
整数パラメータおよび作業領域のための配列.
[in]
iv[0]: 0に設定して呼び出すと, 実行開始前にiv[]およびv[]の全てのパラメータをデフォルト値に初期化する.
12に設定して呼び出すと, iv[]およびv[]はユーザーにより設定済であると見なし初期化を行わない. サブルーチンivsetはiv[0]=12に設定するため, 最初にivsetを呼び出してiv[]およびv[]をデフォルト値に設定し, 次に必要なパラメータを非デフォルト値に変更し, それを使用して実行を開始することができる.
iv[15] (dtype): 自動スケーリングの設定 (Dtype = 0, 1 または 2) (デフォルト値 = 1)
= 0: 自動スケーリングを行わない (スケール係数 = 1)
= 1: 反復ごとに自動スケーリングを行う
= 2: 1回目の反復のみ自動スケーリングを行い, その後スケール係数を変更しない
iv[16] (mxfcal): 関数評価回数の最大値 (デフォルト値 = 200)
iv[17] (mxiter): 反復回数の最大値 (デフォルト値 = 150)
iv[18] (outlev): 中間情報の出力を指定する (デフォルト値 = 0)
!= 1: irev=50で戻らない
= 1: 中間情報の出力のために反復ごとにirev=50で戻る
iv[24] (inits): 非線形最小二乗ルーチンはヘッセ行列の一部の近似Sをセカント更新により求める. 通常, S行列の初期値は0としてよいが, 時に他の値に設定すると有効なことがある. (デフォルト値 = 0)
= 0: S行列を0に初期化する
= 3: sの初期値を関数値の差分により推定する
= 4: sの初期値を微分値の差分により推定する
[out]
iv[0]: リターンコード
= 3: x値収束条件を満たした
= 4: 関数値相対収束条件を満たした
= 5: x値および関数値相対収束条件の両方を満たした
= 6: 関数値絶対収束条件を満たした
= 7: 近傍のHessian行列が特異になった
= 8: 誤った点での収束と思われる(目標精度が小さすぎる可能性がある)
= 9: 関数評価回数の最大値を超えた
= 10: 反復回数の最大値を超えた
= 11: stopxがtrueを返した(外部割込み)
= 12: iv[]とv[]の割り当てと初期化を行った
= 13: xの初期値において関数値を計算できなかった
= 14: 不正なパラメータ
= 15: livが小さすぎる
= 16: lvが小さすぎる
= 17: mまたはnを変更してリスタートが試みられた
= 18: iv[24]の値が範囲が
= 19...45: v[iv[0]]の値が範囲外
= 50: iv[0]の値が範囲外
= 87...(86+m): jtol[iv[0]-86]が正でない
iv[5] (nfcall): 関数評価回数(irev=1で戻った回数)
iv[29] (ngcall): Jacobian評価回数(irev=30または31で戻った回数)
iv[30] (niter): 反復回数
iv[43] (lastiv): livの最小値
iv[44] (lastv): lvの最小値
iv[60] (r): v[iv[60]-1]から始まる領域に残差ベクトルrを格納した |
| [in] | liv | 配列 iv[]のサイズ (liv >= 82 + 4*n) |
| [out] | info | = 0: 正常終了 (iv[0] = 3〜6)
= -1: 入力パラメータ m の誤り (m < 1) (iv[0] = 66)
= -2: 入力パラメータ nd の誤り (nd < 1) (iv[0] = 66)
= -3: 入力パラメータ n の誤り (n < 1) (iv[0] = 66)
= -8: 入力パラメータ v[18]〜v[49] の誤り (範囲外の値) (iv[0] = 19〜50)
= -9: 入力パラメータ lv の誤り (lvが小さすぎる) (iv[0] = 16)
= -10: 入力パラメータ iv[0] の誤り (範囲外の値) (iv[0] = 80)
= -11: 入力パラメータ liv の誤り (livが小さすぎる) (iv[0] = 15)
= 7: 特異収束 (近傍のHessian行列が特異になった)
= 8: 誤収束 (誤った点での収束と思われる。目標精度が小さすぎる可能性がある)
= 9: 関数評価回数の最大値を超えた
= 10: 反復回数の最大値を超えた
= 14: iv[]およびv[]の領域の割り付けを行った (iv[0]=13の呼び出し後に正常終了した)
= 17: mまたはnを変更して再スタートを行った
= 63: x[]の初期点において関数値を求めることができない
= 65: x[]において微分係数を求めることができない |
| [out] | m1 | irev = 1, 30あるいは31で戻ったとき, 設定すべき最初の関数値あるいはヤコビ行列の最初の行のインデックス番号. (1 <= m1 <= m) |
| [out] | m2 | irev = 1, 30あるいは31で戻ったとき, 設定すべき最後の関数値あるいはヤコビ行列の最後の行のインデックス番号. (m2 = min(m, m1+md-1)) |
| [in] | yy[] | 配列 yy[lyy] (lyy >= md)
irev = 1の場合, 再呼び出し時にx[]におけるi+m1-1番目の関数値をyy[i-1]に与えること (i = 1〜m2-m1+1). |
| [in] | ldyyp | 二次元配列yyp[][]の整合寸法. (ldyyp >= md) |
| [in] | yyp[][] | 配列 yyp[lyyp][ldyyp] (lyyp >= n)
irev = 30, 31の場合, 再呼び出し時にx[]におけるヤコビ行列の第i+m1-1行をyyp[*][i-1]に与えること (i = 1〜m2-m1+1). |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること.
= 1: x[]におけるi+n1-1番目の関数値を求めyy[i-1]に設定すること(i=1〜n2-n1+1). yy[]以外の変数を変更してはならない.
= 30, 31: x[]におけるヤコビ行列を求めその第i+n1-1行をyyp[*][i-1]に設定すること (i=1〜n2-n1+1). yyp[][]以外の変数を変更してはならない.
= 50: iv[18]=1であれば反復ごとにirev=50で戻る. 途中結果(x[], iv[30], iv[5], iv[29], v[9]など)を必要に応じて出力する. どの変数も変更してはならない. |
- 出典
- netlib/port
|