多个曲线拟合会话的相互约束

问题描述

我有N个2D数据序列(x,y),我正在尝试将其纳入逻辑函数y(x)=L/(1+a exp(b*(x-c)))的模型中。但是,我想对a,b,c施加约束。通常,如果我想限制它们的值,可以使用lmfit中的参数来完成。这次我希望a/b的比率是恒定的(误差为0.01)。是否有任何方法可以拟合所有N序列,从而使比率a_i/b_i间的差异最小化?

解决方法

使用示例代码显示您正在尝试做的事情总是有帮助的。另外,尚不清楚对于所有N个数据集,a_i/b_i是否应为相同的常数-假设它应该为常数。 在这种情况下,定义这样的参数可能就足够了:

import numpy as np
from lmfit import Parameters,Model

def logistic(x,amp,a,b,c):
    return amp / (1 + a*np.exp(b*(x-c)))
 
params = Parameters()
params.add('b2a_scale' value=1,vary=True) # ?
N = 5
model = Model(logistic,prefix='p1_')

for i in range(1,N+1):
    params.add('p%d_amp' % i,value=1,min=0)
    params.add('p%d_c' % i,value=1)
    params.add('p%d_b' % i,value=5)
    params.add('p%d_a' % i,expr='p%d_b * b2a_scale' % i)
    if model > 1:
        model += Model(logistic,prefix='p%d_' % i)

我不确定这是否正是您要寻找的东西,但也许会有助于指出正确的方向。