【问题标题】:A mutual constraint for multiple curve fit sessions多个曲线拟合会话的相互约束
【发布时间】:2021-01-19 12:57:35
【问题描述】:

我有N 二维数据序列(x,y) 我正在尝试适应逻辑函数模型y(x)=L/(1+a exp(b*(x-c)))。但是我想对a,b,c 施加限制。通常,如果我想限制它们的值,我会使用来自lmfit 的参数,它就可以完成工作。这次我希望a/b 的比率保持不变(误差为 0.01)。有什么方法可以拟合所有N 序列,从而使a_i/b_i 之间的比率差异最小化?

【问题讨论】:

  • 只需将a 替换为b * alpha * ( 1 + 0.01 * 2 / pi * arctan( delta ) ),其中alpha 是您想要的常量,delta 适合允许的错误。
  • 我已经尝试过这样的事情,但是计算机无法轻易找到这样的alpha
  • 嗯,使用ab 进行一次合适的健全性检查是否表明首先存在合理的alpha
  • 尝试了前 3 个序列。 alpha1=10^-4,alpha2=10^-8,alpha3=5 所以现在它们之间存在很大差异。 @mikuszefski
  • 嗯,看来模型不是真的有效。

标签: python python-3.x optimization scipy curve-fitting


【解决方案1】:

总是有一个示例代码来显示您正在尝试做的事情是很有帮助的。此外,尚不清楚您的意思是否是 a_i/b_i 对于所有 N 个数据集应该是相同的常数——让我们假设它应该是。 在这种情况下,定义如下参数可能就足够了:

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)

我不确定这是否正是您正在寻找的,但也许它会帮助您指明正确的方向。

【讨论】: