我正在尝试使用matplotlib和高斯拟合绘制Python中的简单曲线,该拟合具有x和y误差。最佳拟合曲线应考虑这两个误差。我还构建了一种忽略基线的方法,并将数据隔离到某个x范围。我的主要问题是,我无法使Scipy ODR正常工作。它报告的参数数量错误(请参见代码注释中的)。我知道lingress线是不正确的,因为这是从一条直线fir ODR中提取的,但不确定放在那里的是什么。任何帮助都将不胜感激。我将在下面粘贴完整的Python代码,看看是否可以上传数据文件。一旦参数问题解决,我可能会有其他问题!谢谢
这是数据文件,如果它工作-CSV DATA FILE ON DROPBOX
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import odr
from scipy.stats import linregress
# These two lines enable formatted printing of Pandas DataFrames
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
def GaussModelConstant(x, a, x0, sigma, const):
y_gauss = a*np.exp(-(x-x0)**2/(2*sigma**2)) + const
return y_gauss
# change the filename below as required
results = pd.read_csv('result-calibration.csv', skip_blank_lines=True, skipinitialspace = True)
results.head()
x = results['Channel'][260:280]
y = results['Counts'][260:280]
results['Counts_Error'] = np.sqrt((results['Counts']))
xerror = 0.5
yerror = results['Counts_Error'][260:280]
model = odr.Model(GaussModelConstant)
rdata = odr.RealData(x, y, sx = xerror, sy = yerror)
# This line doesnt seem right I have tried replacing with the one below which I need to add somewhere?
#p0 = [1400, 270, 10, 200]
init_guess = linregress(x, y)[0:2]
# Get error when I run - TypeError: GaussModelConstant() missing 3 required positional arguments: 'x0', 'sigma', and 'const'
odr = odr.ODR(rdata, model, beta0 = init_guess)
result_outputs = odr.run()
popt = result_outputs.beta
perr = np.sqrt(np.diag(result_outputs.cov_beta))
a_fit = popt[0]
x0_fit = popt[1]
sigma_fit = popt[2]
const_fit = popt[3]
perr = np.sqrt(np.diag(pcov))
a_err = perr[0]
x0_err = perr[1]
sigma_err = perr[2]
const_err = perr[3]
print('fit parameters with error estimates')
print('***************************************************')
print(f'A = {a_fit: .3g} +/- {a_err: .3g}')
print(f'x0 = {x0_fit: .3g} +/- {x0_err: .3g}')
print(f'sigma = {sigma_fit: .3g} +/- {sigma_err: .3g}')
print(f'Constant \'base\' offset = {const_fit: .3g} +/- {const_err: .3g}')
print('***************************************************')
plt.figure(figsize=(15, 15))
plt.errorbar(x, y, yerr = yerror, xerr = xerror, fmt = 'o', ecolor = 'k', label = 'Errors')
plt.plot(x, GaussModelConstant(x, *popt), color = "red")
目前没有回答
相关问题 更多 >
编程相关推荐