In [44]:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.stats import chi2
Pík ve tvaru Gaussiánu s konstantním pozadím
In [46]:
def gauss_peak(x,mu,sigma,A,bcg):
return A*1/(np.sqrt(2*np.pi)*sigma)*np.exp(-(x-mu)**2/(2*sigma**2))+bcg
Načtení dat
In [48]:
data=np.loadtxt('peak.txt')
x=data[:,0]
y=data[:,1]
ey=np.sqrt(y)
Fit nelinární metodou nejmenších čtverců pomocí procedury curve_fit
In [50]:
mu_init=7.2
sigma_init=1
A_init=500
bcg_init=10
pars,cov=curve_fit(gauss_peak,x,y,sigma=ey,p0=([mu_init,sigma_init,A_init,bcg_init]))
mu_fit=pars[0]
sigma_fit=pars[1]
A_fit=pars[2]
bcg_fit=pars[3]
print("nafitované parametry:")
print(f"mu = {mu_fit:8.4f} +/- {np.sqrt(cov[0,0]):5.4f}")
print(f"sigma = {sigma_fit:8.4f} +/- {np.sqrt(cov[1,1]):5.4f}")
print(f"A = {A_fit:8.1f} +/- {np.sqrt(cov[2,2]):5.1f}")
print(f"bcg = {bcg_fit:8.4f} +/- {np.sqrt(cov[3,3]):5.4f}")
nafitované parametry: mu = 7.4252 +/- 0.0007 sigma = 0.0687 +/- 0.0007 A = 141.2 +/- 1.5 bcg = 74.7381 +/- 1.3974
Nakreslení výsledků
In [52]:
plt.errorbar(x,y,ey,lw=0,elinewidth=1,marker='o',fillstyle='none', capsize=5,label='data')
plt.plot(x,gauss_peak(x,*pars),c='red',label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
$\chi^2$ test
In [54]:
chi2_exp=np.sum(((y-gauss_peak(x,mu_fit,sigma_fit,A_fit,bcg_fit))/ey)**2)
print(f"chi2 = {chi2_exp:6.2f}")
Ndf=np.size(y)-4
print(f"počet stupňů volnosti = {Ndf}")
P=1-chi2.cdf(chi2_exp,Ndf)
print(f"P hodnota: {P}")
print(f"redukované chi2 = {chi2_exp/Ndf:5.3f}")
chi2 = 82.68 počet stupňů volnosti = 77 P hodnota: 0.3083611395202297 redukované chi2 = 1.074
In [ ]: