Ich versuche, einen Gaussian an eine Reihe von Datenpunkten anzupassen, die einer Gaußverteilung zu folgen scheinen. Ich habe bereits eine Menge Möglichkeiten dafür überprüft, aber die meisten von ihnen verstehe ich nicht wirklich. Ich fand jedoch eine Lösung, die zu funktionieren scheint, aber die tatsächliche Anpassung, die ich erhalte, sieht nicht viel mehr nach einem Gaussian aus als meine Datenpunkte.Ein besseres Gaussian zu den Datenpunkten anbringen?
Hier ist mein Code:
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()
Dies ist die Ausgabe, die es erzeugt:
Wie Sie sehen können, ist der Sitz eine schöne und symmetrische „echte“ nicht beschreiben Gaußsche . Gibt es eine Möglichkeit, einen "besseren" Gaussian zu bekommen oder ist das so gut wie es geht?
Vielen Dank!
'n = len (x)' war vielleicht 'n = len (Daten)'? – Luis