0

如果我将拟合函数定义为:

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 模块的方法。

你有什么建议吗?

谢谢!

4

1 回答 1

1

为了清楚起见,您func()实际上并不是为 scipy optimize 或 lmfit 编写拟合函数的方式。您为您的问题提供的背景非常少,这限制了可以提供多少帮助。

但是,对于约束参数值,关键是要认识到实际上存在三个可变参数和一个参数,其值是从其他参数导出的,例如a1a2a3vary 并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等的值设置界限。

于 2017-11-29T03:06:33.990 回答