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()
No description has been provided for this image

$\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 [ ]: