【发布时间】:2020-05-19 18:28:13
【问题描述】:
我想建模一个相对复杂的情节。该模型由已通过实验测量的两个“相”/组分组成,但是这些组分的比例是未知的。数据显示在图像中:橙色和绿色曲线的某种组合构成了蓝色曲线。
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'
我不确定这个问题是否最好描述为反卷积或函数的拟合函数。任何帮助,将不胜感激。
【问题讨论】:
-
我说对了吗...
z1和z2是缩放函数吗?所以你需要在整个数据范围内获取值?在这种情况下,您不需要A并且您的系统仍然完全未确定。如果您可以假设一定的平滑度,您可以尝试使用 n 阶多项式或样条曲线。 -
是的,没错。 z1 和 z2 是缩放函数。
标签: python data-fitting minimization lmfit deconvolution