我有一个要建模的相对复杂的图。该模型由两个“阶段” /组成部分组成,这些“阶段” /组成部分已通过实验进行了测量,但是这些组成部分的比例未知。数据显示在图像中:橙色和绿色曲线的某种组合组成了蓝色曲线。
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'
我不确定是否最好将这个问题描述为反卷积或合适的函数。任何帮助,将不胜感激。
您声称您的目标函数是:
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
这里有很多问题:
'data = total_scatter_expt'表示data
的默认值将是函数definition时(例如处理此代码的文本时)total_scatter_expt
的值。不要那样做无论如何,total_scatter_expt
未定义。这不能是您实际运行的代码。
然后将Data
设置为total_scatter_expt
。同样,这不是有效的代码。
您同时将Data
和Model
都大写,然后返回model-data
。 Python区分大小写,因此您的代码无效。
您访问未定义的A
,z1
,y1
,z2
,y2
和D
,并且从不使用pars
或x
。同样,您的代码无效。
几乎可以肯定,您想从A
中提取参数D
,pars
等的值,但是您不必这样做。也许尝试
pvals = pars.valuesdict()
model = pvals['A'] * (pvals['z1'] ....
可能是指x
包含y1
和/或y2
。
以后,提供实际显示您实际遇到的问题的代码。不要为收到的错误消息而撒谎:使用您发布的实际代码显示实际收到的消息。