如何获取lmfit.minimize迭代过程中目标函数的数值数组?
获取lmfit.minimize迭代过程中的目标函数数值数组
你可以通过自定义迭代回调函数来收集每次迭代的目标函数值,具体步骤如下:
- 初始化一个空列表,用于存储迭代过程中的目标函数数值
- 定义回调函数,每次迭代完成后计算当前的目标函数值(残差平方和)并存入列表
- 在调用
lmfit.minimize时,将回调函数传入callback参数
代码示例
import lmfit import numpy as np import matplotlib.pyplot as plt # 自定义目标函数(返回残差,lmfit自动计算平方和作为目标值) def objective(params, x, data): y = params['a'] * np.exp(-params['b'] * x) + params['c'] return y - data # 用于存储目标函数值的列表 fit_history = [] # 迭代回调函数:每次迭代后收集目标函数值 def iter_callback(params, iter_num, resid, *args, **kwargs): # 计算当前残差平方和(即目标函数值) chi_sq = np.sum(resid ** 2) fit_history.append(chi_sq) return True # 返回True表示继续迭代 # 模拟实验数据 x = np.linspace(0, 10, 100) true_a, true_b, true_c = 5, 0.3, 1 data = true_a * np.exp(-true_b * x) + true_c + np.random.normal(0, 0.2, len(x)) # 初始化拟合参数 params = lmfit.Parameters() params.add('a', value=4) params.add('b', value=0.2) params.add('c', value=0.5) # 执行拟合并传入回调函数 result = lmfit.minimize(objective, params, args=(x, data), callback=iter_callback) # 输出迭代过程的目标函数值数组 print("迭代目标函数值序列:", fit_history) # 绘制目标函数变化曲线 plt.plot(fit_history, marker='o', linestyle='-', color='#1f77b4') plt.xlabel('迭代次数') plt.ylabel('残差平方和(目标函数值)') plt.title('拟合迭代中目标函数的变化趋势') plt.grid(alpha=0.3) plt.show()
补充说明
- 回调函数的
resid参数是当前迭代的残差数组,对其求平方和即可得到目标函数的数值 - 如果你使用的是lmfit较新版本,拟合结果
result的history属性可能包含迭代过程的元数据,但自定义回调的方式更灵活,能精准控制收集的内容 - 收集到的
fit_history列表可以直接用于后续分析或绘图,完全满足你保存数值数组的需求
内容的提问来源于stack exchange,提问作者kahnbiraj
相关产品推荐
相关产品推荐

