|
◆ hybrd()
void hybrd |
( |
void(*)(int, double *, double *, int *) |
fcn, |
|
|
int |
n, |
|
|
double |
x[], |
|
|
double |
fvec[], |
|
|
double |
xtol, |
|
|
int |
maxfev, |
|
|
int |
ml, |
|
|
int |
mu, |
|
|
double |
epsfcn, |
|
|
double |
diag[], |
|
|
int |
mode, |
|
|
double |
factor, |
|
|
int |
nprint, |
|
|
int * |
nfev, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要)
- 目的
- hybrdはn本のn変数非線形方程式よりなる連立方程式
fi(x1, x2, ..., xn) = 0 (i = 1 〜 n)
の解をパウエルのハイブリッド法により求める.
関数値を計算するユーザールーチンが必要である. ヤコビ行列はルーチン内で前進差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.
- 引数
-
[in] | fcn | 関数fi(x)の値を求めるユーザーサブルーチンで, 次のように定義すること. void fcn(int n, double x[], double fvec[], int *iflag)
{
iflag = 1 あるいは iflag = 2 の場合:
与えられたx[]から関数値fi(x)を求めfvec[i]に設定する(i = 0〜n-1). それ以外の変数を変更してはならない.
iflag = 0の場合:
nprintを正の値に設定した場合, 途中結果の出力のためnprint回の反復ごとに呼び出される. 引数に渡された x[], fvec[] などの中間結果を適宜出力する. 渡された変数を変更してはならない.
}
iflagの値は実行を強制終了させたい場合以外は変更してはならない. 実行を終了させたい場合には負の値に設定して戻る. |
[in] | n | 未知数および方程式の数. (n > 0) |
[in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 初期近似解.
[out] 求められた解ベクトル. |
[out] | fvec[] | 配列 fvec[lfvec] (lfvec >= n)
求められた解ベクトルx[]における関数値. |
[in] | xtol | 目標精度. 続く2回の反復間の相対誤差がxtolより小さくなったら終了する. (xtol >= 0) |
[in] | maxfev | fcnのiflag = 1または2とした呼び出し回数の上限値. これを超えると終了する. (maxfev > 0) |
[in] | ml | ヤコビ行列が帯行列の場合, 下帯幅を設定する(ml >= 0). 帯行列でない場合, n - 1 以上を設定する. |
[in] | mu | ヤコビ行列が帯行列の場合, 上帯幅を設定する(mu >= 0). 帯行列でない場合, n - 1 以上を設定する. |
[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回の反復ごと, 最終反復後に途中結果の出力のために iflag = 0としてfcnを呼び出す.
<= 0: 途中結果の出力のための呼び出しを行わない. |
[out] | nfev | 関数評価回数 (iflag = 1 または 2としたfcnの呼び出し回数). |
[out] | work[] | 配列 work[lwork]
作業領域. |
[in] | lwork | 配列 work[]のサイズ. (lwork >= n*(3*n + 15)/2) |
[out] | info | = 0: 正常終了 (連続した反復間の相対誤差がxtol以下になった)
= -2: 入力パラメータ n の誤り (n < 1)
= -5: 入力パラメータ xtol の誤り (xtol < 0)
= -6: 入力パラメータ maxfev の誤り (maxfev <= 0)
= -7: 入力パラメータ ml の誤り (ml < 0)
= -8: 入力パラメータ mu の誤り (mu < 0)
= -10: 入力パラメータ diag の誤り (mode = 2のときにdiag[i] <= 0)
= -12: 入力パラメータ fator の誤り (factor <= 0)
= -16: 入力パラメータ lwork の誤り (lworkが小さすぎる)
= 1: iflag = 1または2によるfcnの呼び出し回数がmaxfevに達した
= 2: xtolが小さすぎる. 解xを改善することができなくなった
= 3: 直近5回のヤコビ行列の評価において解が改善されなかった
= 4: 直近10回の反復において解が改善されなかった
= 5: ユーザーによる強制終了 (iflag < 0でfcnから戻った) |
- 出典
- netlib/minpack
|