为什么 scipy.optimize.minimize 不适用于约束和初始值 0
Why scipy.optimize.minimize does not work with a constraint and initial value 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])
)时,它成功找到了解决方案。这种行为的原因可能是什么?
约束需要是可微的,而你的第二个约束不是。如果您用 x[1]**2
而不是 abs(x[1])
表达约束,它应该有效。您还可以通过将约束拆分为两个单独的约束来消除 abs
,一个用于上限,一个用于下限。
我正在尝试优化一个包含两个变量的函数。我希望一个变量固定在 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])
)时,它成功找到了解决方案。这种行为的原因可能是什么?
约束需要是可微的,而你的第二个约束不是。如果您用 x[1]**2
而不是 abs(x[1])
表达约束,它应该有效。您还可以通过将约束拆分为两个单独的约束来消除 abs
,一个用于上限,一个用于下限。