XLPack 7.0
Python API リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ lmdif1()

def lmdif1 ( ,
,
,
,
fvec  ,
tol  = 1.0e-10 
)

非線形最小二乗法 (レーベンバーグ・マルカート法) (ヤコビ行列計算不要) (シンプルドライバ)

目的
lmdif1はm個のn変数非線形関数の二乗和の最小点をレーベンバーグ・マルカート法により求める.
min Σfi(x1, x2, ..., xn)^2 (ただし, Σは i = 1 〜 m)
関数値を計算するユーザールーチンが必要である. ヤコビ行列はルーチン内で有限差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.

lmdif1は, ftol = tol, xtol = tol, gtol = 0, maxfev = 100*(n+1), epsfcn = 0, mode = 1, factor = 100, nprint = 0 としてlmdifを呼び出すのに相当する.
戻り値
info (int)
= 0: 正常終了
= -1: 入力パラメータ f の誤り
= -2: 入力パラメータ m の誤り (m < n)
= -3: 入力パラメータ n の誤り (n < 1)
= -4: 入力パラメータ x の誤り
= -5: 入力パラメータ fvec の誤り
= -6: 入力パラメータ tol の誤り (tol < 0)
= 1: 関数呼び出し(iflag = 1または2)回数がmaxfevに達した
= 2: 残差二乗和が減少しなくなった (tolが小さすぎる)
= 3: 解が改善されなくなった (tolが小さすぎる)
= 4: fvecとヤコビ行列の列が計算機イプシロン内で直交した (gtolが小さすぎる)
引数
[in]f関数fi(x)の値を求めるユーザーサブルーチンで, 次のように定義すること. _CODE def f(m, n, x, fvec, iflag): if iflag == 1 or iflag == 2: fvec[0] = 関数値 f1(x[0], x[1], ..., x[n-1]) fvec[1] = 関数値 f2(x[0], x[1], ..., x[n-1]) ... fvec[m-1] = 関数値 fn(x[0], x[1], ..., x[n-1]) _ENDCODE iflag = 1あるいは2のときに関数値fi(x)を計算してfvecに設定する.
[in]m関数の数. (m > 0)
[in]n変数の数. (0 < n <= m)
[in,out]xNumpy ndarray (1次元配列, float, 長さn)
[in] 初期近似解.
[out] 求められた解ベクトル.
[out]fvecNumpy ndarray (1次元配列, float, 長さm)
求められた解ベクトルxにおける関数値.
[in]tol(省略可)
二乗和および解の相対誤差の許容値. (tol >= 0) (省略時 = 1.0e-10)
出典
netlib/minpack
使用例
次のデータをモデル関数 f(x) = c1*(1 - exp(-c2*x)) で近似する. 2つのパラメータc1, c2は非線形最小二乗法により定める.
f(x) x
10.07 77.6
29.61 239.9
50.76 434.8
81.78 760.0
初期値は, c1 = 500, c2 = 0.0001 とする.
def f(m, n, x, fvec, iflag):
if iflag == 1 or iflag == 2:
xdata = np.array([77.6, 239.9, 434.8, 760.0])
ydata = np.array([10.07, 29.61, 50.76, 81.78])
for i in range(m):
fvec[i] = ydata[i] - x[0]*(1 - exp(-xdata[i]*x[1]))
def TestLmdif1():
m = 4
n = 2
x = np.array([500.0, 0.0001])
fvec = np.empty(m)
info = lmdif1(f, m, n, x, fvec)
print(x)
print(fvec)
print(info)
def lmdif1(f, m, n, x, fvec, tol=1.0e-10)
非線形最小二乗法 (レーベンバーグ・マルカート法) (ヤコビ行列計算不要) (シンプルドライバ)
実行結果
>>> TestLmdif1()
[2.41084895e+02 5.44942237e-04]
[ 0.08766976 0.06582092 -0.09976828 0.02757617]
0