首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用lmfit进行拟合时,如何指定Y变量的误差?

用lmfit进行拟合时,如何指定Y变量的误差?
EN

Stack Overflow用户
提问于 2019-02-24 01:02:28
回答 2查看 1.3K关注 0票数 1

我几乎是Python的新手,我正在尝试用lmfit拟合大学里的数据。Y变量的变量误差为3%。如何将该误差添加到拟合过程中?我改变了scipy的曲线拟合,在scipy中,这样做真的很容易,只需创建一个带有误差值的数组,并通过添加文本"sigma =code array“指定拟合时的误差。这是我当前的代码:

代码语言:javascript
运行
复制
from lmfit import Minimizer, Parameters, report_fit
import matplotlib.pyplot as plt
w1, V1, phi1, scal1 = np.loadtxt("./FiltroPasaBajo_1.txt", delimiter = "\t", unpack = True)

t = w1
eV= V1*0.03 + 0.01

def funcion(parametros, x, y):
    R = parametros['R'].value
    C = parametros['C'].value

    modelo = 4/((1+(x**2)*(R**2)*(C**2))**1/2)
    return modelo - y
parametros = Parameters()
parametros.add('R', value = 1000, min= 900, max = 1100)
parametros.add('C', value = 1E-6, min = 1E-7, max = 1E-5)

fit = Minimizer(funcion, parametros, fcn_args=(t,V1))
resultado = fit.minimize()


final = V1 + resultado.residual
report_fit(resultado)

try:
    plt.plot(t, V1, 'k+')
    plt.plot(t, final, 'r')
    plt.show()
except ImportError:
    pass

V1是我测量的值,eV是误差数组。T是x坐标。谢谢您抽时间见我

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-25 03:03:38

minimize()函数在最小二乘意义上最小化一个数组,通过调整变量参数来最小化目标函数返回的resid数组的(resid**2).sum()。它真的不知道你数据中的任何不确定性,甚至不知道你的数据。要使用拟合中的不确定性,您需要像传入tV1一样传入数组eV,然后在计算要最小化的数组时使用它。

人们通常希望最小化Sum[ (data-model)^2/epsilon^2 ],其中epsilon是数据(您的eV)中的不确定性,因此应将残差数组从data-model更改为(data-model)/epsilon。为了你的健康,你会希望

代码语言:javascript
运行
复制
def funcion(parametros, x, y, eps):
    R = parametros['R'].value
    C = parametros['C'].value

    modelo = 4/((1+(x**2)*(R**2)*(C**2))**1/2)
    return (modelo - y)/eps

然后将此代码与

代码语言:javascript
运行
复制
fit = Minimizer(funcion, parametros, fcn_args=(t, V1, eV))
resultado = fit.minimize()
...

如果使用lmfit.Model接口(设计用于曲线拟合),那么可以传入乘以data -modelweights数组,因此应该是1.0 / eV来表示不确定因素的权重(与上面的minimize相同)。然后,使用lmfit.Model接口并提供不确定性将如下所示:

代码语言:javascript
运行
复制
from lmfit import Model
# model function, to model the data
def func(t, r, c):
    return 4/((1+(t**2)*(r**2)*(c**2))**1/2)

model  = Model(func)
parametros = model.make_params(r=1000, c=1.e-6)

parametros['r'].set(min=900, max=1100)
parametros['c'].set(min=1.e-7, max=1.e-5)

resultado = model.fit(V1, parametros, t=t, weights=1.0/eV)

print(resultado.fit_report())

plt.errorbar(t, V1, eV, 'k+', label='data')
plt.plot(t, resultado.best_fit, 'r', label='fit')
plt.legend()
plt.show()

希望这能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2019-02-24 02:26:42

我认为您不能在fit.minimize()中直接提供sigma。

但是,我看到fit.minimize()使用的是scipy的leastsq方法(默认情况下),该方法与scipy的curve_fit使用的方法相同。

如果你看一下scipy's curve_fit source,它确实遵循sigma (对于一维情况)。

代码语言:javascript
运行
复制
 transform = 1.0 / sigma
 jac = _wrap_jac(jac, xdata, transform)
 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)

由于fit.minimize()允许您传递kwargs (Dfun),因此您可以像在scipy curve_fit中那样传递jac。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54843932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档