高斯拟合在Python中的实现

2024-06-16 13:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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


Tags: fromimportnumpytxtdataaspltmean
1条回答
网友
1楼 · 发布于 2024-06-16 13:16:06

你的方法有两个问题。一个与编程有关。gaussfit函数必须使用numpy数组。^{} functions can't provide this functionality, they work with scalars.因此fit函数应该如下所示

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

这就产生了正确的平均值/西格玛组合高斯曲线如下

enter image description here

现在我们来看一下文件中的值的分布:

enter image description here

这看起来甚至不像高斯曲线。难怪拟合函数不收敛。你知道吗

实际上还有第三个问题,你的平均值/西格玛的计算是错误的,但是由于你不能使你的数据符合高斯分布,我们现在可以忽略这个问题。你知道吗

相关问题 更多 >