我的曲线拟合问题是什么?
我已经写了一些代码来根据高斯分布拟合我的数据。但是,在代码开头定义的a,b,c值有误。你能给我一些建议来解决这个问题吗?
from numpy import *
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a*exp(-(x-b)**2/(2*c**2))
file = loadtxt("angdist1.xvg", skiprows = 18, dtype = float)
x = []
y = []
for i in range(shape(file)[0]):
x.append(file[i,0])
y.append(file[i,1])
popt, pcov = curve_fit(func, x, y)
plt.plot(x, func(x, *popt), color = 'red', linewidth=2)
plt.legend(['Original','fitting'], loc=0)
plt.show()
答案 0 :(得分:1)
您没有为变量a
,b
和c
提供初始猜测。 scipy.optimize.curve_fit()
会做出无可辩驳的选择,假设您想要a=b=c=1
的初始值。根据您的数据,可能相差太远,以至于根本无法使该方法找到任何解决方案。
解决方案是为关闭的变量提供初始值。他们不一定是完美的。例如,
ainit = y.sum() # amplitude is within 10x of integral
binit = x.mean() # centroid is near mean x value
cinit = x.std() # standard deviation is near range of data
popt, pcov = curve_fit(func, x, y, [ainit, binit, cinit])
可能会给您带来更好的结果。