XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ lmder()

void lmder ( void(*)(int, int, double *, double *, int, double *, int *)  fcn,
int  m,
int  n,
double  x[],
double  fvec[],
int  ldfjac,
double  fjac[],
double  ftol,
double  xtol,
double  gtol,
int  maxfev,
double  diag[],
int  mode,
double  factor,
int  nprint,
int *  nfev,
int *  njev,
int  ipvt[],
double  work[],
int  lwork,
int *  info 
)

非線形最小二乗法 (レーベンバーグ・マルカート法)

目的
lmderはm個のn変数非線形関数の二乗和の最小点をレーベンバーグ・マルカート法により求める.
min Σfi(x1, x2, ..., xn)^2 (ただし, Σは i = 1 〜 m)
関数値およびヤコビ行列を計算するユーザールーチンが必要である.
引数
[in]fcn関数fi(x)の値およびヤコビ行列を求めるユーザーサブルーチンで, 次のように定義すること.
void fcn(int m, int n, double x[], double fvec[], int ldfjac, double fjac[][ldfjac], int *iflag)
{
iflag = 1の場合:
与えられたx[]における関数値fi(x)を求めfvec[i-1]に設定する(i = 1〜m). それ以外の変数を変更してはならない.
iflag = 2の場合:
与えられたx[]におけるヤコビ行列(∂fi/∂xj)を求めfjac[]に設定する(i = 1〜m, j = 1〜n). それ以外の変数を変更してはならない.
iflag = 0の場合:
nprintを正の値に設定した場合, 途中結果の出力のためnprint回の反復ごとに呼び出される. 引数に渡された x[], fvec[] などの中間結果を出力する. 渡された変数を変更してはならない.
}
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]ftol二乗和の相対誤差の許容値. 二乗和の減少の予測値と実際の値の両方がftolより小さくなったら終了する. (ftol >= 0)
[in]xtol解の相対誤差の許容値. 続く2回の反復間の相対誤差がxtolより小さくなったら終了する. (xtol >= 0)
[in]gtol関数ベクトルとヤコビ行列の列の直交性の許容値. fvec[]とヤコビ行列のすべての列の角度のcosの絶対値がgtolより小さくなったら終了する. (gtol >= 0)
[in]maxfevfcnのiflag = 1または2とした呼び出し回数の上限値. これを超えると終了する. (maxfev > 0)
[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回の反復ごと, 最終反復後に途中結果の出力のために iflag = 0としてfcnを呼び出す.
<= 0: 途中結果の出力のためのfcnの呼び出しを行わない.
[out]nfev関数評価回数 (iflag = 1 としたfcnの呼び出し回数).
[out]njevヤコビ行列の評価回数 (iflag = 2としたfcnの呼び出し回数).
[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 >= 5*n + 2*m)
[out]info= 0: 正常終了 (サブコードをwork[0]に返す)
= -2: 入力パラメータ m の誤り (m < n)
= -3: 入力パラメータ n の誤り (n <= 0)
= -6: 入力パラメータ ldfjac の誤り (ldfjac < m)
= -8: 入力パラメータ ftol の誤り (ftol < 0)
= -9: 入力パラメータ xtol の誤り (xtol < 0)
= -10: 入力パラメータ gtol の誤り (gtol < 0)
= -11: 入力パラメータ maxfev の誤り (maxfev <= 0)
= -12: 入力パラメータ diag の誤り (mode = 2のときにdiag[i] <= 0)
= -14: 入力パラメータ factor の誤り (factor <= 0)
= -20: 入力パラメータ lwork の誤り (lworkが小さすぎる)
= 1: 関数呼び出し(iflag=1)回数がmaxfevに達した
= 2: 残差二乗和が減少しなくなった (ftolが小さすぎる)
= 3: 解が改善されなくなった (xtolが小さすぎる)
= 4: Fvecとヤコビ行列の列が計算機イプシロン内で直交した (gtolが小さすぎる)
= 5: ユーザーによる強制終了 (iflag < 0でfcnから戻った)
出典
netlib/minpack