いくつかのデータに対する指数関数の 2 つの形式の最適な適合を計算しようとしていx, y
ます (データ ファイルはここからダウンロードできます) 。
コードは次のとおりです。
from scipy.optimize import curve_fit
import numpy as np
# Get x,y data
data = np.loadtxt('data.txt', unpack=True)
xdata, ydata = data[0], data[1]
# Define first exponential function
def func(x, a, b, c):
return a * np.exp(b * x) + c
# Get parameters estimate
popt, pcov = curve_fit(func, xdata, ydata)
print popt
# Define second exponential function (one more parameter)
def func2(x, a, b, c, d):
return a * np.exp(b * x + c) + d
# Get parameters estimate
popt2, pcov2 = curve_fit(func2, xdata, ydata)
print popt2
最初の指数関数は、zunzun.com ( PDF はこちら) とまったく同じ値を示しpopt
ます。
[ 7.67760545e-15 1.52175476e+00 2.15705939e-02]
しかし、2 番目の値は に対して明らかに間違っていpopt2
ます。
[ -1.26136676e+02 -8.13233297e-01 -6.66772692e+01 3.63133641e-02]
これは、同じ 2 番目の関数に対するzunzun.com の値 ( PDF はこちら) です。
a = 6.2426224704624871E-15
b = 1.5217697532005228E+00
c = 2.0660424037614489E-01
d = 2.1570805929514186E-02
ここで推奨されているようにリスト配列を作成しようとしましたpython's (scipy) カーブフィッティングで奇妙な結果ですが、それは役に立ちませんでした。ここで何が間違っていますか?
1を追加
問題は、関数に供給している初期値の欠如に関係していると推測しています(ここで説明されているように:ガウスフィット with scipy.optimize.curve_fit in python with wrong results )
最初の指数関数から 2 番目の指数関数に推定値を与えると (新しいパラメーターd
を最初はゼロにする):
popt2, pcov2 = curve_fit(func2, xdata, ydata, p0 = [popt[0], popt[1], popt[2], 0])
zunzun.com と比較すると、非常に合理的な結果が得られますが、それでも間違っています。
[ 1.22560853e-14 1.52176160e+00 -4.67859961e-01 2.15706930e-02]
では、質問は次のように変わります: 2 番目の関数により適切なパラメーターを自動的に与えるにはどうすればよいでしょうか?