Pet*_*ter 6 python numpy curve-fitting scipy
我可以选择为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
Run Code Online (Sandbox Code Playgroud)
现在,这显然会出错,但我认为有助于明确这一点.有没有办法可以将参数的约束函数合并到曲线拟合中?
谢谢!
随着lmfit,你需要定义4个参数(a,b,c和delta)。a并且b可以自由变化。 delta允许变化,但最大值为 10 来表示不等式。c将被限制为delta-a-b(因此,仍然有 3 个变量:c会有所不同,但不会独立于其他变量)。如果需要的话,你也可以把对值范围a,b和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())
Run Code Online (Sandbox Code Playgroud)
请注意,如果您确实遇到了约束表达式或界限决定参数值的情况,则可能无法估计不确定性。
| 归档时间: |
|
| 查看次数: |
1902 次 |
| 最近记录: |