我正在使用 lmfit python 包https://lmfit.github.io/lmfit-py/在某些参数的某些允许变化范围内将数据拟合到指定的非线性函数(这主要是我发现 lmfit 有吸引力的原因)。
通常,lmfit 的两行重要代码是:
def fcn2min(params, x_data, y_data):
result = minimize(fcn2min, params, args=(x_data, y_data))
我的应用程序是对 36 个数据图执行全局拟合。问题是一些参数没有被拟合(vary=None),是已知的数量,并且在所有 36 个图表中都不同,但在它们自己的图表中保持不变。目前,我正在尝试实现以下语法,以便将这些已知参数与其关联的 x_data 和 y_data 点一起传递。
def fcn2min(params, x_data, y_data, known_params):
result = minimize(fcn2min, params, args=(x_data, y_data, known_params))
这里 x_data、y_data 和 known_params 是长度相同的数组。x_data 和 y_data 由所有 36 个图的单个数组组成,并且 known_params 是一个三列数组,其中包含在每个图中固定的那些参数的重复条目。
目前程序运行速度很慢(直到执行完成 30 分钟)。同样,目前所有图的拟合曲线都是相同的,而我希望它用已知参数拟合每个局部图并仅拟合全局参数。
我想问一下我这样做是否正确?我明白为什么 minimize() 需要引用要拟合的 y_data,但为什么 fcn2min() 需要 y_data 作为输入?我的拟合程序是否会混淆它是否拟合 y_data 或 known_params 数组?有没有更好的方法通过 lmfit 做到这一点,或者我应该寻找另一个数字包?