Мне не ясно, какие кривые показывает другая программа.Это выглядит так, как будто вы просто рисуете линию через точки
(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
из ModelResult
.См. https://lmfit.github.io/lmfit-py/model.html#calculating-uncertainties-in-the-model-function Простое использование:
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
методу fit
:
result = mod.fit(y, params, x=x, weights=1.0/np.array(yerror))
(примечание: данные и неопределенности должны быть массивами, а несписки).Я думаю, что для ваших данных (где неопределенности схожи по размеру) это не будет иметь большого значения для наилучших значений и неопределенностей, но будет иметь значение в статистике, такой как хи-квадрат.
Наконец, для простой линейной модели (то есть модели, которая является линейной по параметрам, как эта), вам не нужно использовать итеративный подход, такой как lmfit.Model
, но вы могли бы использоватьметоды линейной регрессии.