首页 > 解决方案 > 为什么 scipy.optimize.minimize 不适用于约束和初始值 0

问题描述

我正在尝试优化两个变量的函数。我希望一个变量固定为 50,另一个变量在 -5 和 5 之间。我编写了以下代码:

x0 = np.array([50, 0.0])
res = minimize(error, x0, constraints=[
    {'type': "eq", "fun": lambda x: x[0] - 50},
    {'type': "ineq", "fun": lambda x: -abs(x[1]) + 5},
])

哪里minimize是函数scipy.optimize。第一个约束是x[0] == 50,第二个约束是-5 <= x[1] <= 5。我得到以下回复: message: 'Inequality constraints incompatible'。但是当我将第二个变量设置为不为零(例如x0 = np.array([50, 0.1]))时,它会成功找到解决方案。这种行为的原因是什么?

标签: pythonscipyscipy-optimize-minimize

解决方案


约束需要是可微的,而您的第二个约束不是。如果您用x[1]**2代替 来表达约束abs(x[1]),它应该可以工作。您还可以abs通过将约束拆分为两个单独的约束来消除 ,一个用于上限,一个用于下限。


推荐阅读