1

我有一些 x 数据和 y 数据 --> 仅作为示例

x_data = [5, 6, 6.2, 6.3, 6.7]
y_data = [5.2, 6.8, 8.2, , 8.9] 

现在我想拟合一个非线性函数

def func(x, a):
     return 0.2* a**2 * x**2

与 scipy。为此我使用

prams, params_cov = optimize.curve_fit(func, x_data, y_data)

但我也有 x 和 y 数据的误差线。所以我不想只适合一条线,而是一个带有fillbetween的错误带。

x_err = [0.2, 0.1, 0.4, 0.5]
y_err = [0.1, 0.2, 0.6, 0.03]

但为此,我需要关于误差线的置信区间。有人知道如何计算它们吗?或者如何拟合关于误差线的函数并从中获得拟合错误?

此致

4

1 回答 1

0

使用 Monte Carlo 之类的拟合参数估计来考虑您的错误将如下所示:

import numpy as np
from scipy.optimize import curve_fit

def myfunc(x, a):
     return 0.2* a**2 * x**2

x_data = np.array([5, 6.2, 6.3, 6.7])
y_data = np.array([5.2, 6.8, 8.2, 8.9])
x_err = np.array([0.2, 0.1, 0.4, 0.5])
y_err = np.array([0.1, 0.2, 0.6, 0.03])

trials = 1000
my_guess = (2)

fit_params = np.zeros((1,trials))

for i in range(trials):
    x_sim = x_data + np.random.normal(scale=x_err)
    y_sim = y_data + np.random.normal(scale=y_err)

    params, params_cov = curve_fit(myfunc, x_sim, y_sim, my_guess)

    fit_params[0,i] = params

mu = np.mean(fit_params)
ci = np.std(fit_params) * 1.96 / np.sqrt(np.size(x_data))
print ("Mean a = {:.3f} +/- {:.3f} (95% CI)".format(mu, ci))

产量:Mean a = 0.987 +/- 0.031 (95% CI)

注意:这假设您的错误是根据正态分布分布的。

更常见的是,考虑到拟合参数的自由度和方差,使用 t 检验,可以按如下方式计算:

dof = np.size(x_data) - 1 # degrees of freedom:
# calculate student-t value
a = 0.05 #(1-0.95, 95% CI)
tval = t.ppf(1.0-a/2, dof)

params, params_cov = curve_fit(myfunc, x_data, y_data, 1)

ci = tval*np.sqrt(params_cov)[0]
print ("Mean a = {:.3f} +/- {:.3f} (95% CI)".format(params.item(), ci.item()))

产量:Mean a = 0.990 +/- 0.056 (95% CI)

于 2020-02-26T11:11:01.140 回答