我有一个小的谱峰值,并且我正在试图拟合一个高斯函数。我在网上搜索了一个例子,并将代码与我所做的代码混合在一起。将高斯函数拟合到测量的峰值
wveleng=[ 639.188 639.454 639.719 639.985 640.25 640.516 640.781 641.046
641.312 641.577]
counts=[ 778. 1613.8 12977.4 32990. 33165.2 13171. 2067.2 900.8
788.8 747.8]
我的第一个代码如下
def gaus(x,a,mu,sigma):
return a*exp(-(x-mu)**2/(2*sigma**2))
a=ydata.max()
x0=ydata.mean()
sigm=ydata.std()
mean = sum(ydata*xdata)/len(ydata)
sigma = np.sqrt(sum(ydata*(xdata-mean)**2)/len(ydata))
#print(ydata.max())
popt, pcov = curve_fit(Gauss, xdata,ydata,maxfev=991,p0=[a,x0,sigm])
#gmodel = Model(Gauss)
#result = gmodel.fit(ydata, x=xdata, a=ydata.max(),x0=ydata.mean(),sigm=ydata.std())
print(popt)
#plt.scatter(xdata,ydata,label='data points')
#plt.plot(xdata, result.best_fit, 'r-')
#popt, pcov = curve_fit(gauss, xdata, ydata,p0=[ydata.max(), ydata.mean(), ydata.std()])
xx = np.linspace(639,642, 10)
plt.plot(xx, gauss(xdata, *popt), 'r-', label='fit')
与情节,我得到以下。
我认为这与最初的猜测参数
我觉得这更紧凑,更适合更好地为我的第二代码做。
def gauss(x, a, x0, sigma):
return a * np.exp(-(x - x0) ** 2/(2 * sigma ** 2))
ydata = np.array([778.,1613.8,12977.4,32990.,33165.2,13171.,2067.2,900.8,788.8,747.8])
xx = np.arange(639,642, 100)
xdata=np.array([639.188,639.454,639.719,639.985,640.250,640.516,640.781,641.046,641.312,641.577])
#plt.plot(xdata, ydata, 'bo', label='data')
def Gauss(x, a, x0, sigm):
return a * np.exp(-(x - x0)**2/(2 * sigm**2))
gmodel = Model(Gauss)
result = gmodel.fit(ydata, x=xdata, a=ydata.max(),x0=ydata.mean(),sigm=ydata.std())
plt.scatter(xdata,ydata,label='data points')
plt.plot(xdata, result.best_fit, 'r-')
我得到和第一种方法完全相同的结果。有没有一种方法比数据本身更适合多点
您需要包括完整的错误信息,所以我们可以看到哪些功能引发错误。这个错误意味着其中一个函数需要一个'iterable'(作为一个列表或一个numpy数组)的参数,并且它接收到一个单一的'float'数字。 – Eskapp
我不知道你可能会做错什么。这看起来似乎是一个漫长的过程。你可能想看看https://stackoverflow.com/a/42029398/131187。 –
@BillBell日Thnx因为我看了看其他的问题..这将有助于一个战利品 – kevin