我尝试使用scipy.optimize
函数curve_fit
来设置包含误差线的一组点。
我用来读取输入的文件类似于
y x dy_1 dy_2
0.64 45.1 6.65E-004 1.20E-002
0.72 38.3 1.81E-004 3.93E-002
0.62 46.3 1.20E-004 6.65E-002
0.71 39.1 3.93E-004 6.65E-002
0.76 33.2 6.65E-004 1.81E-002
0.69 39.4 5.86E-003 0.58
0.76 33.5 6.65E-004 6.65E-002
0.79 28.5 1.27E-002 1.27
其中dy_1和dy_2是y的两个不同的不确定性。 用于拟合数据的代码类似于
#!/usr/bin/env python
import numpy as np
from scipy.optimize import curve_fit
from scipy import stats
import inspect
## READ INPUT ##
array_fit=np.loadtxt(file.dat)
xdata=array_fit[1]
ydata=array_fit[0]
delta_y=array_fit[2] #or [3]
## FIT ##
print 'Fit with f(x)=ax+b'
def fit(x,a,b):
return a*x+b
popt,pcov=curve_fit(fit,xdata,ydata,p0=(0.0,0.0),sigma=delta_y)
a=popt[0]; err_a=np.sqrt(pcov[0,0])
b=popt[1]; err_b=np.sqrt(pcov[1,1])
perr = np.sqrt(np.diag(pcov))
print 'a=',a,"+/-",err_a,' (',abs(err_a/a*100.0),'% )'
print 'b=',b,"+/-",err_b,' (',abs(err_b/b*100.0),'% )'
不包括误差线的输出读取
a= -0.00964422694853 +/- 0.000497582672356 ( 5.15938369153 % )
b= 1.07794220116 +/- 0.0190839336114 ( 1.77040416368 % )
我预计使用微小误差条的偏差非常小。 我的问题不仅在于输出之间的差异很大,而且无论我使用微小的误差条还是大误差条我都得到相同的输出:
a= -0.0115247039688 +/- 0.000341896188408 ( 2.96663748877 % )
b= 1.15636325135 +/- 0.0148255830134 ( 1.28208700823 % )
似乎我的程序对错误的维度不敏感。这是正常的吗?我犯了一些错误吗?
我在
中提出了一个非常相似的问题Wrong fit with error bars in Gnuplot
使用gnuplot,我得到了相同的结果和相同的问题。还展示了一些情节。