constraints - scipy 优化 trust-constr 违反线性约束
问题描述
我正在尝试使用 scipy.optimize.minimize 和方法 trust-constr 来优化 8 个变量的函数。不幸的是,该功能太复杂,无法在此处完整发布;它涉及大约 1000 个术语,每个术语都涉及一个积分。但这里有一段我认为已经表明它不能按预期工作的摘录。
def objective(variables):
starts_neg=variables[0]
starts_neu=variables[1]
etc
return _____
(这是导致问题的两个变量)
定义了目标函数后,我需要定义约束。共有 12 个约束,涉及 8 个变量;但我只会展示那些涉及有问题的变量。
constraint_matrix=[[0 for j in range(8)] for i in range(12)]
constraint_matrix[0][0]=1
constraint_matrix[1][1]=1
constraint_matrix[2][0]=1
constraint_matrix[2][1]=1
etc
lower_bounds=[10**(-12) for i in range(12)]
upper_bounds=[1 for i in range(12)]
prob_constraints=LinearConstraint(constraint_matrix,lower_bounds,upper_bounds,keep_feasible=True)
我的意图是说 0 < starts_neg < 1, 0 < starts_neu < 1, 0 < start_neg + starts_neu < 1。下界从 0 更改为 10^-12 以避免 nan 错误,因为目标函数涉及采用变量的日志。
然后我给 scipy 一个初始估计 x0=[estimate,estimate,etc.]
最后,调用优化如下:
result=minimize(objective,x0,method='trust-constr',constraints=[prob_constraints],options={'xtol':10**(-9)}).x
不幸的是,这产生了一个 nan 错误。所以我尝试在目标函数中插入以下内容并再次运行:
if starts_neg<=0 or starts_neg>=1 or starts_neu<=0 or starts_neu>=1 or starts_neu+starts_neg>=1:
print(starts_neg,starts_neu)
这-0.02436406136453448 0.7588112085953852
在 nan 错误和回溯之前输出,这似乎是一个太大的约束违规,无法用舍入误差来解释。不,这不是最初的估计 x0;我也检查过。
很明显 scipy 违反了我的限制之一,尽管我的设置keep_feasible=True
。我是不是设置错了?抱歉,功能太长,无法完整包含。
解决方案
推荐阅读
- flutter - 文本表单字段内的文本被填充
- reactjs - DraggableFlatList onRef 使用 Typescript 获取错误类型
- javascript - 数据未与 v-select 中的 v-bind 绑定
- ubuntu-20.04 - 如何在 OpenConnect 中禁用拆分隧道
- jquery - 使用 laravel 8 连接两个表,没有 id
- javascript - 如何从 bash 中获取 js 文件的输出?
- javascript - 使用键模式读取 JSON 对象值
- node.js - 无法向客户端发送视频下载、错误、进度的响应
- java - 在显示 toString [Java] 的输出之前使用 do while 或 while 循环循环设置器
- c# - dbContext 不会更新