python - 如何使用 Python Gekko 修复 IPOPT 中的本地不可行性?
问题描述
我在 IPOPT (v3.12.10) 中遇到本地不可行错误。
Converged to a point of local infeasibility. Problem may be infeasible.
我还使用 APPT 求解器进行了尝试,m.options.SOLVER=1
并得到了类似的错误。
No feasible solution
这个问题有多个可行的解决方案,有两个方程和三个变量。这个问题的解决方案是平面与球体相交的地方。
from gekko import GEKKO
m = GEKKO()
x=m.Var(); y=m.Var(); z=m.Var()
m.Equations([x**2+y**2+z**2==1,x+z==y])
m.options.SOLVER = 3 # APOPT=1, IPOPT=3
m.solve(debug=0) # debug=0 doesn't stop when unsuccessful
print('Solution 1')
print(x.value[0],y.value[0],z.value[0])
当我添加一个目标函数来最大化z
时,IPOPT 会收敛到一个解决方案。
# add objective
m.Obj(-z) # maximize z
m.solve()
print('Solution 2')
print(x.value[0],y.value[0],z.value[0])
如何在不添加目标函数的情况下避免失败的解决方案?
解决方案
x=0
、y=0
和处的起点z=0
需要不同的初始猜测才能收敛到解。
x=m.Var(0.01); y=m.Var(); z=m.Var()
由于存在许多解,因此将使用不同的初始猜测值获得不同的解。您尝试的目标函数m.Obj(-z)
提高了收敛性,但也使解决方案独一无二。
GEKKO 中的所有解决方案选项都是基于梯度的非线性规划求解器,包括 APOPT、BPOPT、IPOPT 等。所有这些求解器产生的解只能保证为局部最小值或最大值。他们都使用Karush-Kuhn-Tucker 条件来确定何时找到最佳解决方案。通过从x=0
、y=0
和开始z=0
,满足第二个 KKT 条件(不可行下降)但不满足第一个条件(可行约束)。这会导致您在求解器报告局部不可行性时观察到的错误。该点也称为函数导数为零的静止点。
推荐阅读
- c# - 如何在 C# 代码后面调用 SQL 命令
- node.js - 发送多个子文档时,Mongoose 验证失败
- laravel - Laravel 5 从供应商处加载自定义包
- python - 在覆盖该引用之前删除对大型 Python 对象的引用有什么好处吗?
- php - 为什么列出 laravel 路线会引发护照错误
- javascript - forEach 不处理非空 API(无法读取属性 'forEach' )
- getstream-io - 如何通过 API 调用注册用户设备进行聊天推送?仅查看 CLI 上的文档
- excel - 将 IFERROR 与复杂的 COUNTIFS 一起使用
- aws-cdk - 有没有办法指定创建 vpc 时使用的可用区数量?
- r - 无法在 for 循环中正确返回对象名称