我的代码:
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model
def bestfit(x, m, c):
return m * x + c
x = [2.8672E-02, 2.2199E-02, 1.8180E-02, 1.5410E-02, 1.3325E-02]
y = [8.64622E-03, 7.07473E-03, 6.13109E-03, 5.46607E-03, 4.90341E-03]
xerror =[8.2209E-07, 4.9280E-07, 3.3052E-07, 2.3748E-07, 1.7756E-07]
yerror = [1.62083E-04, 1.45726E-04, 1.38127E-04, 1.26587E-04, 1.22042E-04]
mod = Model(bestfit)
params = mod.make_params(m = 0.2421, c = 0.0017)
result = mod.fit(y, params, x = x)
print(result.fit_report())
print(1 - result.residual.var() / np.var(y))
matplotlib.rcParams['font.serif'] = "Times New Roman"
matplotlib.rcParams['font.family'] = "serif"
plt.plot(x, y, 'bo', markersize = 1.5)
plt.plot(x, result.best_fit, color = 'red', linewidth = 0.5)
plt.xlabel(r'Inverse Mass $g^{-1}$')
plt.ylabel('Damping Coefficient $s^{-1}$')
plt.errorbar(x, y, xerror, yerror)
plt.show()
我希望创建最小和最大梯度线以及它们的等式:
我能够在Excel中完成此操作,但这需要手动输入4个极限数据点。
我如何自动执行此操作?
答案 0 :(得分:1)
我不清楚其他程序显示的曲线是什么。看起来好像只是在点上画一条线
(x[0], y[0]-yerror[0]), (x[-1], y[-1]+yerror[-1])
(x[0], y[0]+yerror[0]), (x[-1], y[-1]-yerror[-1])
使用matplotlib进行绘制应该很容易。但这对我来说似乎并不特别有意义。
另一方面,如果您想在绘图中包括某种拟合结果不确定性的度量,则有两种选择。首先,您可以使用从best_fit值中获取的参数值以及这些值的不确定性来评估模型。例如,您可以这样做(一旦拥有result
):
pars = result.params
curve1 = bestfit(x, pars['m'].value+pars['m'].stderr, pars['c'].value)
curve2 = bestfit(x, pars['m'].value-pars['m'].stderr, pars['c'].value)
curve3 = bestfit(x, pars['m'].value, pars['c'].value+pars['c'].stderr)
curve4 = bestfit(x, pars['m'].value, pars['c'].value-pars['c'].stderr)
curve5 = bestfit(x, pars['m'].value+pars['m'].stderr, pars['c'].value+pars['c'].stderr)
curve6 = bestfit(x, pars['m'].value+pars['m'].stderr, pars['c'].value-pars['c'].stderr)
curve7 = bestfit(x, pars['m'].value-pars['m'].stderr, pars['c'].value+pars['c'].stderr)
curve8 = bestfit(x, pars['m'].value-pars['m'].stderr, pars['c'].value-pars['c'].stderr)
,然后绘制其中一些。
要制作的更简单且可能更有用的图将是使用eval_uncertainties
的{{1}}方法。看到
https://lmfit.github.io/lmfit-py/model.html#calculating-uncertainties-in-the-model-function一个简单的用法是:
ModelResult
此外,由于您在dely = result.eval_uncertainty()
plt.fill_between(x, result.best_fit-dely, result.best_fit+dely, color="#ABABAB")
中存在不确定性,因此可以根据自己的需要使用这些不确定性。为此,您需要将y
作为lmfit.Model
传递给1.0/yerror
方法:
weight
(注意:数据和不确定性实际上应该是numpy数组,而不是列表)。我认为对于您的数据(不确定性在大小上相似),它与最佳拟合值和不确定性不会有多大区别,但在报告的统计数据(如卡方)中却有区别。
最后,对于一个简单的线性模型(即,参数线性的模型,就像这样的模型),您实际上并不需要使用像fit
这样的迭代方法,而是可以使用线性方法。回归方法。