拟合高斯

时间:2018-08-16 08:23:55

标签: python numpy

尝试使用高斯拟合文本文件中的数据时遇到一些问题。这是我的代码,其中cal1_p1是包含54个值的数组。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np  
from scipy.optimize import curve_fit

cal1=np.loadtxt("C:/Users/Luca/Desktop/G3/X_rays/cal1_5min_Am.txt")
cal1_p1=[0 for a in range(854,908)]
for i in range(0,54):
      cal1_p1[i]=cal1[i+854]   
# cal1_p1 takes the following values: 

[5.0,6.0,5.0,11.0,4.0,9.0,14.0,13.0,13.0,14.0,12.0,13.0,16.0,20.0,15.0,23.0,23.0,33.0,43.0,46.0,41.0,40.0,49.0, 57.0,62.0,61.0,53.0,65.0,64.0,42.0,72.0,55.0,47.0,43.0,38.0,46.0,37.0,39.0,27.0,18.0,20.0,20.0,18.0,10.0,11.0,8.0,10.0,6.0, 8.0,8.0,6.0,10.0,6.0,4.0]

x=np.arange(854,908)

def gauss(x,sigma,m):
    return np.exp(-(x-m)**2/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))
from scipy.optimize import curve_fit
popt,pcov=curve_fit(gauss,x,cal1_p1,p0=[10,880])

plt.xlabel("Channel")
plt.ylabel("Counts")
axes=plt.gca()
axes.set_xlim([854,907])
axes.set_ylim([0,75])
plt.plot(x,cal1_p1,"k")     
plt.plot(x,gauss(x,*popt),'b', label='fit')

问题在于所产生的高斯确实受到挤压,即它具有非常低的方差。即使我尝试修改初始值p_0,结果也不会改变。可能是什么问题呢?感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:1)

问题在于高斯已归一化,而您的数据却未归一化。您还需要调整振幅。通过在函数中添加额外的参数a,可以轻松解决该问题:

x = np.arange(854, 908)

def gauss(x, sigma, m, a):
    return a * np.exp(-(x-m)**2/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))

popt, pcov = curve_fit(gauss, x, cal1_p1, p0=[10, 880, 1])
print(popt)
plt.xlabel("Channel")
plt.ylabel("Counts")
axes=plt.gca()
axes.set_xlim([854, 907])
axes.set_ylim([0, 75])
plt.plot(x, cal1_p1, "k")  
plt.plot(x, gauss(x,*popt), 'b', label='fit')

虽然我给1作为a的起始参数,但您会发现拟合值实际上是:

[   9.55438603  880.88681556 1398.66618699]

但是这里的振幅值可能会被忽略,因为我假设您只对相对强度感兴趣,可以用计数来衡量。

相关问题