Python Scipy SLSQP求解器可变自变量目标函数定义与结果差异问题
结果差异原因分析
- 浮点数累加顺序带来的数值精度误差
浮点数本身是近似存储的,加法运算不满足严格的交换律,不同求和顺序会带来1e-12~1e-15量级的目标函数值差异,这属于计算机浮点数运算的固有特性,不是代码逻辑错误。 - 优化算法对数值扰动敏感
你使用的trust-constr是基于梯度的约束优化算法,在没有显式传入梯度函数时,scipy会默认用有限差分法计算数值梯度,目标函数的微小数值误差会被放大为梯度的偏差,进而导致迭代路径出现差异。
另外你的目标函数中包含abs绝对值函数,在导数不连续的拐点附近,数值梯度的计算误差会进一步扩大。 - 迭代未完全收敛
你设置的maxiter=80迭代次数上限较低,三次优化大概率都没有收敛到全局最优点,只是停止在了附近的局部最优点/迭代终止阈值点,微小的迭代路径差异就会直接体现在最终输出的参数上。
验证与修复建议
- 先验证三个函数逻辑等价:随机生成多组输入x传入三个目标函数,输出的差值应该在1e-12以内,即可确认逻辑没有问题,差异完全来自数值误差。
- 调大迭代次数、收紧收敛阈值:将
maxiter调整到1000以上,xtol、gtol调小到1e-8,观察三次输出结果是否趋近一致。 - 优化通用目标函数的实现:将生成器求和改为numpy向量化运算,统一计算逻辑,避免不同求和路径带来的数值误差,也能提升运算速度。
内容的提问来源于stack exchange,提问作者Jian ZUO
相关产品推荐
相关产品推荐

