numpy 将高斯函数与一组x,y数据进行拟合

myss37ts  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(143)

首先,这是我设置的一个赋值,所以我只是在寻找指针,并且我被限制使用以下库:NumPy、SciPy和MatPlotLib。
我们已经得到了一个txt文件,其中包括用于共振实验的x和y数据,并且必须同时符合高斯和洛伦兹拟合。我目前正在研究高斯拟合度,并尝试遵循上一个问题中列出的代码作为我自己的代码的基础。(Gaussian fit for Python)

from numpy import *
from matplotlib import *
import matplotlib.pyplot as plt  ##Import Libraries
import pylab
from scipy.optimize import curve_fit

#################################### 

energy,intensity=numpy.loadtxt('resonance_data.txt',unpack=True)
print energy
print intensity  ##Load in text file and print the arrays

##################################### 

n = size(energy)
mean = 30.7
sigma = 10
intensity0 = 45

def gaus(energy,intensity0,energy0,sigma):
       return intensity0*exp(-(energy-energy0)**2/(sigma**2))

popt,pcov = curve_fit(gaus,energy,intensity,p0=[45,mean,sigma])

plt.plot(energy,intensity,'o')
plt.xlabel('Energy/eV')
plt.ylabel('Intensity')
plt.title('Plot of Intensity against Energy')  ##Plot raw data along with axis labels         and title
plt.plot(energy,gaus(energy,*popt))
plt.show()

它返回以下图表

如果我保留均值和西格玛的表达式,就像在发布的URL中一样,曲线拟合是一条水平线,所以我猜问题出在曲线拟合不收敛之类的地方。
我还是个初学者,所以任何提示都是有帮助的:)
谢谢
更新:我已经设法改进了高斯拟合度并使洛伦兹函数工作,甚至(我认为)设法计算出每种情况下的残差之和。
干杯,伙计们!
再次感谢,伙计们

nfeuvbwi

nfeuvbwi1#

看起来你的数据严重向左倾斜,为什么是高斯?不是Boltzmann,Log-Normal,还是其他什么?
其中很多已经在scipy.stats中实现了。有关洛伦兹和scipy.stats.normal高斯,请参见scipy.stats.cauchy。举个例子:

import scipy.stats as ss
A=ss.norm.rvs(0, 5, size=(100)) #Generate a random variable of 100 elements, with expected mean=0, std=5
ss.norm.fit_loc_scale(A) #fit both the mean and std
(-0.13053732553697531, 5.163322485150271) #your number will vary.

我认为你不需要intensity0参数,它就是1/sigma/srqt(2*pi),因为密度函数必须等于1。

相关问题