我正在尝试计算两种形式的指数对某些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]
但第二个给出的值显然是错误的popt2
:
[ -1.26136676e+02 -8.13233297e-01 -6.66772692e+01 3.63133641e-02]
这是同一第二个功能的 zunzun.com 值(此处为 PDF):
a = 6.2426224704624871E-15
b = 1.5217697532005228E+00
c = 2.0660424037614489E-01
d = 2.1570805929514186E-02
我尝试按照此处推荐的方式制作列表数组使用 python (scipy) 曲线拟合的奇怪结果,但这并没有帮助。我在这里做错了什么?
添加 1
我猜这个问题与我提供函数时缺少初始值有关(如此处所述:高斯拟合与 python 中的 scipy.optimize.curve_fit 结果错误)
如果我像这样将第一个指数的估计值提供给第二个指数(使新参数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]
所以现在问题变成了:如何自动为我的第二个函数提供更合理的参数?