为何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
相关产品推荐
相关产品推荐

