Я использовал scipy.optimise.curve_fit в следующем коде для успешного выполнения нелинейного подбора гауссовской функции для измеренных данных и извлечения параметров:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.stats.distributions import t
xdata = np.genfromtxt("Cs-137 peak.tsv", skip_header = 2, usecols = (0))
ydata = np.genfromtxt("Cs-137 peak.tsv", skip_header = 2, usecols = (1))
##This is the function we want to fit our data
def func(xdata, H0, sigma, A):
return (A/(sigma*np.sqrt(2*np.pi)))*np.exp((-(xdata-H0)**2)/(2*sigma**2))
initial_guess = [243, 13, 65000]
pars, pcov = curve_fit(func, xdata, ydata, p0 = initial_guess)
alpha = 0.32 #68% confidence interval = 100*(1-alpha)
n = len(xdata)
p = len(pars)
dof = max(0, n-p)
#student-t value for the dof and confidence level
tval = t.ppf(1.0-alpha/2.,dof)
for i, p,var in zip(range(n), pars, np.diag(pcov)):
sigma1 = var**0.5
print (p, "+-", sigma1*tval)
plt.plot(xdata, ydata, 'bo')
xfit = np.linspace(200,300)
yfit = func(xfit, pars[0], pars[1], pars[2])
plt.plot(xfit, yfit)
plt.legend(['data', 'fit'], loc = 'best')
plt.show()
Теперь я хочу найти способ расчета хи-квадрат на градус свободы для этой подгонки, но я не знаю, как это сделать.