使用lmfit最小化或科学优化计算两条曲线的缩放常数

问题描述 投票:1回答:1

我有一个要建模的相对复杂的图。该模型由两个“阶段” /组成部分组成,这些“阶段” /组成部分已通过实验进行了测量,但是这些组成部分的比例未知。数据显示在图像中:橙色和绿色曲线的某种组合组成了蓝色曲线。

Complex curve and two components

模型定义为:

    Model = A * (z1 * 0.3 * y1 + z2 * 0.7 * y2) + D

其中A是总缩放比例,z1和z2是y1和y2的单独缩放比例。 D是偏移量。

我试图通过定义拟合参数和残差来使用lmfit最小化函数,如下所示:

import lmfit
from lmfit import Minimizer, Parameters, report_fit

fit_params = Parameters()
fit_params.add('A', value=1.00, min=0, max=1)
fit_params.add('z1', value=1, min=0, max=1)
fit_params.add('z2', value=1, min=0, max=1)
fit_params.add('D', value=0.00, min=-5, max=5)

def residual(pars, x, data = total_scatter_expt):
   Data = total_scatter_expt
   Model = A * (z1 * 0.3 * y1 + z2 * 0.7 * y2) + D
   return model - data

因为y1和y2也是函数,所以我不清楚我的x在残差线或最小化线中是什么。为此,我在图片中使用了x值。

out = minimize(residual, fit_params, args=(x,))     
print(fit_report(out))

这导致了错误

TypeError: can't multiply sequence by non-int of type 'float'

我不确定是否最好将这个问题描述为反卷积或合适的函数。任何帮助,将不胜感激。

python data-fitting minimization lmfit deconvolution
1个回答
0
投票

您声称您的目标函数是:

def residual(pars, x, data = total_scatter_expt):
   Data = total_scatter_expt
   Model = A * (z1 * 0.3 * y1 + z2 * 0.7 * y2) + D
   return model - data

这里有很多问题:

  1. 'data = total_scatter_expt'表示data的默认值将是函数definition时(例如处理此代码的文本时)total_scatter_expt的值。不要那样做无论如何,total_scatter_expt未定义。这不能是您实际运行的代码。

  2. 然后将Data设置为total_scatter_expt。同样,这不是有效的代码。

  3. 您同时将DataModel都大写,然后返回model-data。 Python区分大小写,因此您的代码无效。

  4. 您访问未定义的Az1y1z2y2D,并且从不使用parsx。同样,您的代码无效。

几乎可以肯定,您想从A中提取参数Dpars等的值,但是您不必这样做。也许尝试

   pvals = pars.valuesdict()
   model = pvals['A'] * (pvals['z1'] ....

可能是指x包含y1和/或y2

以后,提供实际显示您实际遇到的问题的代码。不要为收到的错误消息而撒谎:使用您发布的实际代码显示实际收到的消息。

© www.soinside.com 2019 - 2024. All rights reserved.