我是python的新手。我试图将高斯函数拟合到我的python图中。我在这里附上了代码。任何更正都将不胜感激!
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
import random
from numpy import genfromtxt
data= genfromtxt ('PVC_Cs137.txt')
plt.xlim(0,2500)
plt.ylim(0,30000)
plt.xlabel("Channel number")
plt.ylabel("Counts")
x = data[:,0]
y = data[:,1]
n = len(x)
mean = sum(x*y)/n
sigma = sum(y*(x-mean)**2)/n
def gaus(x,a,x0,sigma):
return a*exp(-(x-x0)**2/(2*sigma**2))
popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma])
plt.plot(x,gaus(x,*popt))
plt.show()
这是我文件的链接: https://www.dropbox.com/s/hrqjr2jgfsjs55x/PVC_Cs137.txt?dl=0
答案 0 :(得分:1)
您的方法存在两个问题。一个与编程有关。 gauss
拟合函数必须使用numpy
数组。 math
functions can't provide this functionality, they work with scalars.因此,您的拟合函数应如下所示
def gauss(x, a, x0, sigma):
return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
这产生了正确的均值/西格玛组合,像这样的高斯曲线
现在我们来看一下你文件中值的分布:
这甚至看起来都不像高斯曲线。难怪拟合函数不会收敛。
实际上存在第三个问题,你对均值/西格玛的计算是错误的,但由于你无法将数据拟合为高斯分布,我们现在可以忽略这个问题。