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

为何Scipy.optimize不等式约束中不能使用if语句?

Scipy.optimize约束函数错误导致无穷大结果的原因

我们用Scipy.optimize求解最大化xy、约束x²+y²≤200的优化问题时,正确代码能得到最优值100,但修改约束函数为阶跃形式后,会得到无穷大的结果,原因如下:

核心规则:Scipy不等式约束的要求

Scipy的minimize函数中,类型为'ineq'的不等式约束,要求约束函数的返回值≥0时,约束才被判定为满足。更关键的是,默认的优化算法(如SLSQP)依赖连续可导的约束函数,需要通过返回值的变化感知当前点与约束边界的距离,以此调整搜索方向和步长。

错误约束函数的问题

错误的约束函数代码:

def constraint(var_tmp):
    x, y = var_tmp
    if x ** 2 + y ** 2 <= 200:
        return 1
    return -1
  • 这个函数是阶跃式的离散函数:只要当前点在约束范围内,就固定返回1;超出范围则返回-1。它无法提供任何关于“当前点离约束边界有多近”的信息。
  • 当算法在约束范围内搜索时,约束函数一直返回1,算法会认为可以持续向增大xy的方向(即x、y不断增大)迭代,没有任何信号提醒它即将触碰约束边界。最终x和y会趋向无穷大,导致xy也趋向无穷大。

正确约束函数的合理性

正确的约束函数return 200 - (x ** 2 + y ** 2):

  • 它是连续可导的:返回值的大小直接反映当前点到约束边界的距离——返回值越大,离边界越远;返回值趋近于0时,说明接近边界。
  • 算法可以通过这个返回值的变化,精准调整搜索步长,不会越过约束边界,最终找到在约束范围内的最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:56:15