使用lmfit构建简单最小化问题遇报错,请求协助排查
问题原因与解决方案
你的代码核心问题是目标函数不符合lmfit的要求:lmfit的minimize函数要求目标函数的第一个参数必须是lmfit.Parameters对象,而非单独的拟合变量。你当前的目标函数把B作为第一个参数,导致lmfit在调用时误将关键字参数中的C当作参数对象传递,触发了'3.0' is not a Parameters object的错误。
修改后的代码
import lmfit class test_class: def __init__(self, A=None): self.A = A def my_obj_fn(params, C=1.0, the_class=None): # 从Parameters对象中提取B的值 B = params['B'].value D = abs(B + C + the_class.A) return D if __name__ == '__main__': awesome_class_instance = test_class(A=2.0) C_val = 3.0 my_params = lmfit.Parameters() my_params.add('B', 7.0, min=-10.0, max=12.0) key_word_args = {'C': C_val, 'the_class': awesome_class_instance, } result = lmfit.minimize( fcn=my_obj_fn, params=my_params, kws=key_word_args, method='differential_evolution' ) print(result)
说明
- 调整目标函数结构:将
params作为第一个参数,从其中提取需要优化的变量B - 其余关键字参数保持不变,
lmfit.minimize会自动将params传递给目标函数,再传入kws中的参数
运行修改后的代码,B会收敛到-5.0(此时B + C + the_class.A = -5 +3 +2=0,目标函数值为0,达到最小值)。
内容的提问来源于stack exchange,提问作者P227
相关产品推荐
相关产品推荐

