Я пытаюсь подогнать гауссиан к набору точек данных, которые, кажется, следуют гауссовскому распределению. Я уже проверил много возможных способов сделать это, но я действительно не понимаю большинство из них. Тем не менее, я нашел одно решение, которое, кажется, работает, но фактическая подгонка, которую я получаю, не намного больше похожа на гауссову, чем мои точки данных.
Вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from scipy import asarray as ar, exp, sqrt
from scipy.optimize import curve_fit
angles = [-8, -6, -4, -2, 0, 2, 4, 6, 8]
data = [99, 610, 1271, 1804, 1823, 1346, 635, 125, 24]
angles = ar(angles)
data = ar(data)
n = len(x)
mean = sum(data*angles)/n
sigma = sqrt(sum(data*(angles-mean)**2)/n)
def gaus(x,a,mu,sigma):
return a*exp(-(x-mu)**2/(2*sigma**2))
popt,pcov = curve_fit(gaus,angles,data,p0=[0.18,mean,sigma])
fig = plt.figure()
plt.plot(angles, data, "ob", label = "Measured")
plt.plot(angles,gaus(angles,*popt),'r',label='Fit')
plt.xlim(-10, 10)
plt.ylim(0, 2000)
plt.xticks(angles)
plt.title("$^{137}$Cs Zero Point")
plt.xlabel("Angle [$^\circ$]")
plt.ylabel("662 keV-Photon Count")
plt.grid()
plt.legend()
plt.show()
Это вывод, который он генерирует:
Как видите, подгонка не описывает красивую и симметричную «настоящую» гауссову функцию. Есть ли способ получить «лучший» гауссиан или это настолько хорошо, насколько это возможно?
Большое спасибо!
n = len(x)
был, может быть,n = len(data)
? - person Luis   schedule 03.02.2017