python - 为什么 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])
)时,它会成功找到解决方案。这种行为的原因是什么?
解决方案
约束需要是可微的,而您的第二个约束不是。如果您用x[1]**2
代替 来表达约束abs(x[1])
,它应该可以工作。您还可以abs
通过将约束拆分为两个单独的约束来消除 ,一个用于上限,一个用于下限。
推荐阅读
- java - 尝试在本地运行/调试 Java AWS Lambda 函数时出现 AWS 框架代码中的异常
- python - 聚类算法:R 中的 HDBSCAN 与 Python 中的 HDBSCAN?
- angularjs - 使用 Firebase 数据填充 AngularJS 中的 Material Design 数据表
- python - 从excel文件中纠正拼写错误的产品名称的算法
- ruby-on-rails - Rails ActiveRecord - 如果记录在不同的表中,则排除结果
- r - 警告消息:在 1:5:length(N) 中:数值表达式有 5 个元素:仅使用第一个元素
- c# - SQL Server / C#如何找到与多边形相交的线串的日期时间
- selenium - Selenium 启动旧的 chromedriver 版本
- java - Spring Boot:如何在身份验证之前运行 Bean 验证?
- java - 给定代码片段的大 O 表示法