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

scipy.optimize.minimize初始值影响收敛,如何确保正实数域迭代?

优化问题疑问:SLSQP算法初始值对迭代终止的影响

目标函数(需最小化)

def b(x):  
    return -(2*x[0]**2-10*x[0] + x[1]**2 - 2*x[1] + 2*x[2]**2 - 3*x[2])/1000

约束条件

J = 14000
cons = ({'type': 'ineq', 'fun': lambda x: J -(2*x[0] + 5*x[1] + 3*x[2])},
       {'type':'ineq', 'fun': lambda x: 0.4*(x[0]+x[1]+x[2]) - x[0]},
    {'type':'ineq', 'fun': lambda x: 0.4*(x[0]+x[1]+x[2]) - x[1]},
    {'type':'ineq', 'fun': lambda x: 0.4*(x[0]+x[1]+x[2]) - x[2]})

变量边界

x_bounds = (0.0 , None)
y_bounds = (0.0 , None)
z_bounds = (0.0, None)
bnds = [x_bounds, y_bounds, z_bounds]

问题场景

使用scipy.optimize.minimize的SLSQP算法时,初始值设为[0.1, 0.1, 0.1](注:原提问中[0.1]应为三维变量的简写)时,结果不符合预期;初始值设为[1.5, 1.5, 1.5]时,结果与最大化收益函数的目标一致。

疑问:当初始值为0.1时,算法是否在目标函数值接近0时就终止迭代,而非继续迭代至负实数域?


解答

首先拆解目标函数:展开后为 b(x) = (-2x₀² +10x₀ -x₁² +2x₁ -2x₂² +3x₂)/1000,最小化该函数等价于最大化原收益函数(仅差负号与缩放系数)。

针对初始值[0.1,0.1,0.1]的情况:

  1. 初始点函数值:代入计算后约为0.00145,确实接近0。
  2. 梯度与收敛逻辑:SLSQP是梯度驱动的算法,会沿负梯度方向寻找最小值。在初始点处,目标函数的梯度分量均为正,说明变量增大时函数值会减小(符合最小化方向)。但算法默认的收敛阈值(如ftol=1e-06,即函数值变化容忍度)可能触发终止:如果初始点附近函数值变化极为缓慢,数值计算中会误认为已收敛到驻点。
  3. 约束与局部驻点:初始点满足所有约束,但由于目标函数是凹函数,其最小值应出现在可行域的边界上。当初始值过小时,算法可能在可行域内部陷入一个数值意义上的驻点(因精度限制误判为收敛),未能推进到能让函数值进入负域的边界点;而初始值设为1.5时,算法更易抵达可行域边界,找到全局最小值。

总结:并非算法刻意在函数值接近0时终止,而是初始点过小导致算法在局部区域满足了收敛条件,提前停止迭代,未走到能使函数值进入负域的可行位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:32:08