|
|
◆ lmstr1()
| void lmstr1 |
( |
void(*)(int, int, double *, double *, double *, int *) |
fcn, |
|
|
int |
m, |
|
|
int |
n, |
|
|
double |
x[], |
|
|
double |
fvec[], |
|
|
int |
ldfjac, |
|
|
double |
fjac[], |
|
|
double |
tol, |
|
|
int |
ipvt[], |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
非線形最小二乗法 (レーベンバーグ・マルカート法) (省メモリ版) (シンプルドライバ)
- 目的
- lmstr1はm個のn変数非線形関数の二乗和の最小点をレーベンバーグ・マルカート法により求める.
min Σfi(x1, x2, ..., xn)^2 (ただし, Σは i = 1 〜 m)
関数値およびヤコビ行列を計算するユーザールーチンが必要である. ヤコビ行列は行ごとに計算する.
lmstr1は, ftol = tol, xtol = tol, gtol = 0, maxfev = 100*(n+1), mode = 1, factor = 100, nprint = 0 としてlmstrを呼び出すのに相当する.
- 引数
-
| [in] | fcn | 関数fi(x)の値およびヤコビ行列を求めるユーザーサブルーチンで, 次のように定義すること. void fcn(int m, int n, double x[], double fvec[], double fjrow[], int *iflag)
{
iflag = 1の場合:
与えられたx[]における関数値fi(x)を求めfvec[i-1]に設定する(i = 1〜m). それ以外の変数を変更してはならない.
iflag = i (2 <= i <= m+1) の場合:
与えられたx[]におけるヤコビ行列の第(i-1)行(∂f(i-1)/∂xj)を求めfjrow[j-1]に設定する(j = 1〜n). それ以外の変数を変更してはならない.
}
iflagの値は実行を強制終了させたい場合以外は変更してはならない. 実行を終了させたい場合には負の値に設定して戻る. |
| [in] | m | 関数の数. (m > 0) |
| [in] | n | 変数の数. (0 < n <= m) |
| [in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 初期近似解.
[out] 求められた解ベクトル. |
| [out] | fvec[] | 配列 fvec[lfvec] (lfvec >= m)
求められた解ベクトルx[]における関数値. |
| [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] | tol | 二乗和および解の相対誤差の許容値. (tol >= 0) |
| [out] | ipvt[] | 配列 ipvt[lipvt] (lipvt >= n)
置換行列を定義するピボット情報. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0の場合, work[0]にサブコードを返す.
= 1: 二乗和の相対減少値およびその予測値の両方がftol以下になった.
= 2: 連続する2回の反復の相対誤差がxtol以下になった.
= 3: 上の2つ共満たした. |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= 6*n + 2*m) |
| [out] | info | = 0: 正常終了 (サブコードをwork[0]に返す)
= -2: 入力パラメータ m の誤り (m < n)
= -3: 入力パラメータ n の誤り (n <= 0)
= -6: 入力パラメータ ldfjac の誤り (ldfjac < m)
= -8: 入力パラメータ tol の誤り (tol < 0)
= -11: 入力パラメータ lwork の誤り (lworkが小さすぎる)
= 1: 関数呼び出し(iflag=1)回数がmaxfevに達した
= 2: 残差二乗和が減少しなくなった (ftolが小さすぎる)
= 3: 解が改善されなくなった (xtolが小さすぎる)
= 4: Fvecとヤコビ行列の列が計算機イプシロン内で直交した (gtolが小さすぎる)
= 5: ユーザーによる強制終了 (iflag < 0でfcnから戻った) |
- 出典
- netlib/minpack
|