我试着把高斯拟合到一个光谱中,y值是10^(-19)的数量级。曲线拟合给我的拟合结果很差,在我将整个数据乘以10^(-19)之前和之后。附件是我的代码,它是一组相当简单的数据,只是值很小。如果我想保持我的原始值,我如何得到一个合理的高斯拟合,给我正确的参数?在
#get fits data
aaa=pyfits.getdata('p1.cal.fits')
aaa=np.matrix(aaa)
nrow=np.shape(aaa)[0]
ncol=np.shape(aaa)[1]
ylo=79
yhi=90
xlo=0
xhi=1023
glo=430
ghi=470
#sum all the rows to get spectrum
ysum=[]
for x in range(xlo,xhi):
sum=np.sum(aaa[ylo:yhi,x])
ysum.append(sum)
wavelen_pix=range(xhi-xlo)
max=np.max(ysum)
print "maximum is at x=", np.where(ysum==max)
##fit gaussian
#fit only part of my data in the chosen range [glo:ghi]
x=wavelen_pix[glo:ghi]
y=ysum[glo:ghi]
def func(x, a, x0, sigma):
return a*np.exp(-(x-x0)**2/float((2*sigma**2)))
sig=np.std(ysum[500:1000]) #std of background noise
popt, pcov = curve_fit(func, x, sig)
print popt
#this gives me [1.,1.,1.], which is obviously wrong
gaus=func(x,popt[0],popt[1],popt[2])
aaa是一个153×1024的图像矩阵,部分如下所示:
^{pr2}$
您错误地调用了
curve_fit
,下面是用法默认情况下,p0被设置为一个1的列表[1,1,…],这可能就是为什么您得到的结果是,fit永远不会执行,因为您调用不正确。在
尝试从数据中估计振幅、中心和宽度,然后制作一个p0对象(详见下文)
^{pr2}$下面是一个简短的例子
现在我能猜出合适的参数了
猜测宽度是很棘手的,我首先会找到半最大值的位置(有两个,但您只需要找到一个,因为高斯是对称的):
现在评估这是从高斯中心(席)的距离:
现在你可以做出初步的猜测了
合身
非常接近
mygauss
。希望有帮助。在相关问题 更多 >
编程相关推荐