|
|
◆ lmdif_r()
| void lmdif_r |
( |
int |
m, |
|
|
int |
n, |
|
|
double |
x[], |
|
|
double |
fvec[], |
|
|
int |
ldfjac, |
|
|
double |
fjac[], |
|
|
double |
ftol, |
|
|
double |
xtol, |
|
|
double |
gtol, |
|
|
int |
maxfev, |
|
|
double |
epsfcn, |
|
|
double |
diag[], |
|
|
int |
mode, |
|
|
double |
factor, |
|
|
int |
nprint, |
|
|
int * |
nfev, |
|
|
int |
ipvt[], |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info, |
|
|
double |
xx[], |
|
|
double |
yy[], |
|
|
int * |
irev |
|
) |
| |
非線形最小二乗法 (レーベンバーグ・マルカート法) (ヤコビ行列計算不要) (リバースコミュニケーション版)
- 目的
- lmdif_rはm個のn変数非線形関数の二乗和の最小点をレーベンバーグ・マルカート法により求める.
min Σfi(x1, x2, ..., xn)^2 (ただし, Σは i = 1 〜 m)
irevに従って関数値をユーザーが与える必要がある. ヤコビ行列はルーチン内で有限差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.
- 引数
-
| [in] | m | 関数の数. (m > 0) |
| [in] | n | 変数の数. (0 < n <= m) |
| [in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 初期近似解.
[out] irev = 0: 求められた解ベクトル.
irev = 50, 51: 最新の近似解. |
| [out] | fvec[] | 配列 fvec[lfvec] (lfvec >= m)
irev = 0: 求められた解ベクトルx[]における関数値.
irev = 50, 51: 最新の近似解における関数値.
|
| [in] | ldfjac | 二次元配列fjac[][]の整合寸法. (ldfjac >= m) |
| [out] | fjac[][] | 配列 fjac[lfjac][ldfjac] (lfjac >= n)
上部の n x n 部分に, 対角要素の絶対値が昇順になるように並べ替えを行った上三角行列 R が入る.
P^T * (J^T * J)*P = R^T * R
ここで, P は並べ替えを表す置換行列, J は最終的に求められたヤコビ行列である. |
| [in] | ftol | 二乗和の相対誤差の許容値. 二乗和の減少の予測値と実際の値の両方がftolより小さくなったら終了する. (ftol >= 0) |
| [in] | xtol | 解の相対誤差の許容値. 続く2回の反復間の相対誤差がxtolより小さくなったら終了する. (xtol >= 0) |
| [in] | gtol | 関数ベクトルとヤコビ行列の列の直交性の許容値. fvec[]とヤコビ行列のすべての列の角度のcosの絶対値がgtolより小さくなったら終了する. (gtol >= 0) |
| [in] | maxfev | 関数評価回数(irev = 1 〜 3)の上限値. これを超えると終了する. (maxfev > 0) |
| [in] | epsfcn | 前進差分近似のステップ幅を決めるパラメータで, 目的関数計算の相対誤差程度に設定する. マシンイプシロンより小さい値が設定された場合, マシンイプシロン値とみなされる. |
| [in,out] | diag[] | 配列 diag[ldiag] (ldiag >= n)
[in] mode = 2の場合にスケーリング因子を入力する. (diag[i] > 0)
[out] mode = 1の場合に自動的に設定される. |
| [in] | mode | = 1: 変数のスケーリングを自動的に行う.
= 2: ユーザーがdiag[]に設定した値を使って変数のスケーリングを行う.
(他の値であれば mode = 1 とみなす.) |
| [in] | factor | 初期ステップの最大値を決める定数. ||diag×x||2×factorが0でない場合これを最大値とする. 0の場合factor自身の値を最大値とする. 通常, 0.1〜100の範囲で, 一般的には100とすればよい. (factor > 0) |
| [in] | nprint | > 0: 最初の反復, nprint回の反復ごと, 最終反復後に途中結果の出力のために irev = 50または51として戻る.
<= 0: 途中結果の出力のために戻らない. |
| [out] | nfev | 関数評価回数(irev = 1 〜 3). |
| [out] | ipvt[] | 配列 ipvt[lipvt] (lipvt >= n)
置換行列を定義するピボット情報. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0の場合, work[0]にサブコードを返す.
= 1: 二乗和の相対減少値およびその予想値の両方がftol以下になった.
= 2: 連続する2回の反復の相対誤差がxtol以下になった.
= 3: 上の2つ共満たした.
= 4: fvecとヤコビ行列のすべての列との角度のコサインの絶対値がgtol以下になった. |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= 4*n + m) |
| [out] | info | = 0: 正常終了 (サブコードをwork[0]に返す)
= -1: 入力パラメータ m の誤り (m < n)
= -2: 入力パラメータ n の誤り (n < 1)
= -5: 入力パラメータ ldfjac の誤り (ldfjac < m)
= -7: 入力パラメータ ftol の誤り (ftol < 0)
= -8: 入力パラメータ xtol の誤り (xtol < 0)
= -9: 入力パラメータ gtol の誤り (gtol < 0)
= -10: 入力パラメータ maxfev の誤り (maxfev <= 0)
= -12: 入力パラメータ diag の誤り (mode = 2のときにdiag[i] <= 0)
= -14: 入力パラメータ factor の誤り (factor <= 0)
= -19: 入力パラメータ lwork の誤り (lworkが小さすぎる)
= 1: 関数評価回数(irev = 1〜3)がmaxfevに達した
= 2: 残差二乗和が減少しなくなった (ftolが小さすぎる)
= 3: 解が改善されなくなった (xtolが小さすぎる)
= 4: fvecとヤコビ行列の列が計算機イプシロン内で直交した (gtolが小さすぎる) |
| [out] | xx[] | 配列 xx[lxx] (lxx >= n)
irev = 1〜3の場合, 関数値を求めるべき点を返す. |
| [in] | yy[] | 配列 yy[lyy] (lyy >= m)
irev = 1〜3の場合, 再呼び出し時に関数値 fi(xx[]) (i = 1〜m) を与えること. |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること.
= 1〜3: xx[]における関数値を求め yy[]に設定すること. yy[]以外の変数を変更してはならない.
= 50, 51: 途中結果(x[], fvec[]など)を出力する (nprint > 0 の場合). どの変数も変更してはならない. |
- 出典
- netlib/minpack
|