You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SciPy Minimize的L-BFGS-B方法求解函数驻点出现异常结果问题

问题原因分析

1. 初始点(0, 0.1)返回接近0的非精确结果

L-BFGS-B是数值迭代优化算法,默认设置下的收敛阈值(ftol、gtol参数)允许结果存在1e-8量级的数值误差,你得到的(-4.9999383996738455e-09, 8.936905459196604e-08)已经在数值精度上等价于(0,0),属于正常现象。如果需要更高精度,可以手动调低minimize的公差参数,例如:

res = minimize(V, x0, method='L-BFGS-B', tol=1e-12)

2. 初始点(0, 1.01)触发溢出且结果异常

该问题核心有两个原因:

  • (0,1)是鞍点不是极小值点:你当前设置a=0、g=0,简化后的目标函数为:
    V(x,y) = 1/6*(3*x[0]**2 + 3*x[1]**2 + 6*x[0]**2*x[1] - 2*x[1]**3)
    
    对其求海森矩阵验证可知,(0,1)点的海森矩阵特征值一正一负,属于鞍点,不是局部极小值点。而scipy.optimize.minimize的定位是寻找局部极小值,不会收敛到鞍点。
  • 目标函数无下界:简化后的V函数的y最高次项为-1/3 * x[1]**3,系数为负,当y不断增大时,V会无限减小。初始点(0,1.01)处的y方向负梯度指向y增大的方向,优化过程会让y持续变大,最终超出浮点数范围触发溢出警告,得到异常结果。

修复建议

  • 如果需要求解所有驻点(包含鞍点、极大值点),不要用minimize,可以改用scipy.optimize.root求解偏导等于0的方程组。
  • 继续使用L-BFGS-B的话,可以给变量加合理的边界约束,防止优化过程中变量跑飞,例如限制x、y的范围在[-2, 2]:
    res = minimize(V, x0, method='L-BFGS-B', bounds=[(-2,2), (-2,2)])
    
  • 若后续调整a、g为非零值,函数中存在6次幂项,也需要加边界约束避免数值溢出。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:45:03