基于Scipy-ODR的高斯曲线拟合

2024-09-26 18:09:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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")

Tags: importasnppltsigmaresultsfiterr

热门问题