向 scipy.optimize.curve_fit 添加约束?

2024-01-06

我可以选择向 sio.curve_fit 添加边界。有没有办法扩展涉及参数函数的边界功能?换句话说,假设我有一个带有两个或多个未知常数的任意函数。然后我们还可以说我知道所有这些常量的总和小于 10。有没有办法可以实现最后一个约束?

import numpy as np
import scipy.optimize as sio
def f(x, a, b, c):
    return a*x**2 + b*x + c

x = np.linspace(0, 100, 101)
y = 2*x**2 + 3*x + 4

popt, pcov = sio.curve_fit(f, x, y, \
     bounds = [(0, 0, 0), (10 - b - c, 10 - a - c, 10 - a - b)]) # a + b + c < 10

现在,这显然会出错,但我认为这有助于理解这一点。有没有办法可以将涉及参数的约束函数合并到曲线拟合中?

Thanks!


使用 lmfit,您可以定义 4 个参数(a, b, c, and delta). a and b可以自由变化。delta允许变化,但最大值为 10 来表示不等式。c将被限制为delta-a-b(所以,仍然有3个变量:c会有所不同,但并不独立于其他)。如果需要,您还可以对值设置界限a, b, and c。如果不进行测试,您的代码将大约为:

import numpy as np
from lmfit import Model, Parameters

def f(x, a, b, c):
    return a*x**2 + b*x + c

x = np.linspace(0, 100.0, 101)
y = 2*x**2 + 3*x + 4.0

fmodel = Model(f)
params = Parameters()
params.add('a', value=1, vary=True)
params.add('b', value=4, vary=True)
params.add('delta', value=5, vary=True, max=10)
params.add('c', expr = 'delta - a - b')

result = fmodel.fit(y, params, x=x)
print(result.fit_report())

请注意,如果您实际上遇到约束表达式或边界决定参数值的情况,则可能无法估计不确定性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 scipy.optimize.curve_fit 添加约束? 的相关文章

随机推荐