如果我将拟合函数定义为:
def func(a1,a2,a3,a4):
return a1*y1+a2*y2+a3*y3+a4*y4
当我适合时,我想绑定我的参数:
a1**2+a2**2+a3**2+a4**2=1
我找不到使用 scipy.optimize 或 lmfit 模块的方法。
你有什么建议吗?
谢谢!
如果我将拟合函数定义为:
def func(a1,a2,a3,a4):
return a1*y1+a2*y2+a3*y3+a4*y4
当我适合时,我想绑定我的参数:
a1**2+a2**2+a3**2+a4**2=1
我找不到使用 scipy.optimize 或 lmfit 模块的方法。
你有什么建议吗?
谢谢!
为了清楚起见,您func()
实际上并不是为 scipy optimize 或 lmfit 编写拟合函数的方式。您为您的问题提供的背景非常少,这限制了可以提供多少帮助。
但是,对于约束参数值,关键是要认识到实际上存在三个可变参数和一个参数,其值是从其他参数导出的,例如a1
、a2
和a3
vary 并a4
定义为
a4 = sqrt(1 - a1**2 - a2**2 - a3**2)
这可以使用 lmfit 轻松完成(有关更多详细信息,请参阅文档和示例):
from lmfit import Model, Parameters
def func(y1, y2, y3, y4, a1, a2, a3, a4):
return y1*a1**2 + y2*a2**2 + y3*a3**2 + y4*a4**2
model = Model(func, independent_vars=['y1', 'y2', 'y3', 'y4'])
params = Parameters()
params.add('a1', value=0.5, vary=True)
params.add('a2', value=0.5, vary=True)
params.add('a3', value=0.5, vary=True)
params.add('a4', expr='sqrt(1 - (a1**2 + a2**2 + a3**2))')
result = model.fit(params, ydata, y1=y1, y2=y2, y3=y3, y4=y4)
当然,您可能需要注意(a1**2 + a2**2 + a3**2)
超过 1.0。例如,您可以对 parametersa1
等的值设置界限。