使用以下拟合程序,我想将二阶多项式拟合到我的数据点。我的观察结果中有x,y和y_error点。
def fit(x,y,yerr):
popt, pcov = curve_fit(func2,x,y,p0=[-0.6,5,-12],sigma=yerr,absolute_sigma=False)
chi=np.sum( ((func2(x, *popt) - y) / yerr)**2)
redchi=(chi-1)/len(y)
a=len(y)
print "chi= " + str(chi) + " for " + str(a) + " dof" + " redchi= " +str(redchi)
return popt,pcov,redchi,len(y)
def func(x,a,b,c):
return (a*(x**2)+b*x+c)
popt,pcov,chi,lenny=fit(x,y,yerr)
plt.plot(x,func2(x,*popt),c=c,linewidth=2)
所以我只是使用最小二乘法来拟合这个函数。返回的值是最佳拟合的a,b,c
参数(popt
)和拟合中的协方差矩阵(pcov
)。
我离开了参数的标准误差是来自covarance矩阵的对角线的平方根:a_err=np.sqrt(np.diag(pcov))[0]
为a=popt[0].
然而,参数似乎不是独立的,并且协方差矩阵具有对角线之外的值。因此(我认为)这会导致参数标准误差非常大。
从我的拟合中,我获得的参数是:
a=1.22731117 +/- 0.22210121
b=-11.31232672 +/- 2.01192621
c=43.6603686 +/- 4.53383215
参数的误差非常大!一旦通过多项式函数传播,误差就很大,并且根本不代表拟合的误差。下面是拟合值,拟合的误差区域是阴影(忽略石灰绿点),红点和误差是我观察到的数据,粗红线是拟合线,阴影橙色区域是1西格玛误差区域。
Fitted data, including error region.
当然,拟合的真正误差应该是残差yfit-ydata等。有人可以帮忙吗?在这种情况下,我不确定如何计算拟合的误差。提前谢谢。