首页 > 解决方案 > 如何使用 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])

如何在不添加目标函数的情况下避免失败的解决方案?

标签: pythonmathematical-optimizationipoptgekko

解决方案


x=0y=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=0y=0和开始z=0,满足第二个 KKT 条件(不可行下降)但不满足第一个条件(可行约束)。这会导致您在求解器报告局部不可行性时观察到的错误。该点也称为函数导数为零的静止点。


推荐阅读