如何从 gekko 检索“infeasibilities.txt”

Jun*_*ark 7 python debugging gekko

我收到来自 GEKKO 模拟的不可行错误消息。我想检索“infeasibilities.txt”文件来调试算法。

请告诉我在哪里可以找到该文件。

R1 = m.Intermediate(3/r0/W*((A3*(A2+B2+B3+F)+(A2+B2)*(B3+F))*(cg0[0]-ceq1) \
                     -(A3*(B2+B3+F)+B2*(B3+F))*(cg0[0]-ceq2) \
                     -A2*(B3+F)*(cg0[0]-ceq3)))
R2 = m.Intermediate(3/r0/W*(-(B2*(A3+B3+F)+A3*(B3+F))*(cg0[0]-ceq1) \
                     +((A1+B1+B2)*(A3+B3+F)+A3*(B3+F))*(cg0[0]-ceq2) \
                     -(A1+B1)*(B3+F)*(cg0[0]-ceq3)))
R3 = m.Intermediate(3/r0/W*(-A2*(B3+F)*(cg0[0]-ceq1) \
                    -(A1+B1)*(B3+F)*(cg0[0]-ceq2) \
                    +((A1+B1)*(A2+B2+B3+F)+A2*(B2+B1+F))*(cg0[0]-ceq3)))

m.Equation(cH.dt() == nus[0].dot([R1, R2, R3]))
m.Equation(cM.dt() == nus[1].dot([R1, R2, R3]))
m.Equation(cW.dt() == nus[2].dot([R1, R2, R3]))
m.Equation(cF.dt() == nus[3].dot([R1, R2, R3]))

m.options.IMODE = 4
m.options.SOLVER = 3
m.options.nodes = 2

Run Code Online (Sandbox Code Playgroud)

创建文件:infeasibilities.txt

使用命令 apm_get(server,app,'infeasibilities.txt') 检索文件

错误:未找到解决方案

Joh*_*ren 10

有两种方法可以访问该文件。第一种方法是切换到remote=False本地求解并在计算机上生成 infeasibilities.txt 文件。第二种方法是从远程目录检索文件。第一种方法是编码方面最简单的解决方案(只需更改选项并打开运行文件夹)。第二种方法最方便,因为它使该文件在您的运行目录中可用。我在下面提供的示例故意对方程x+y=1和不可行x+y=0

方法 1 - 当remote=False 时打开运行文件夹

from gekko import GEKKO
m = GEKKO(remote=False) # remote=False to produce local folder with results          
x = m.Var()    
y = m.Var()
m.Equations([x+y==1, x+y==0])  # no solution
m.open_folder() # open folder if remote=False to see infeasibilities.txt
m.solve(disp=True)    # solve
Run Code Online (Sandbox Code Playgroud)

方法 2 - 当remote=True时检索infeasibilities.txt文件

from gekko import GEKKO
m = GEKKO(remote=True)          
x = m.Var()    
y = m.Var()
m.Equations([x+y==1, x+y==0])  # no solution
try:
    m.solve(disp=True)    # solve
except:
    print('Not successful')
    from gekko.apm import get_file
    print(m._server)
    print(m._model_name)
    f = get_file(m._server,m._model_name,'infeasibilities.txt')
    f = f.decode().replace('\r','')
    with open('infeasibilities.txt', 'w') as fl:
        fl.write(str(f))
Run Code Online (Sandbox Code Playgroud)

infeasibilities.txt 文件有点难以阅读,但它确实尝试识别导致解决方案失败的方程。这是这个问题的例子。

************************************************
***** POSSIBLE INFEASBILE EQUATIONS ************
************************************************
____________________________________________________________________________
EQ Number   Lower        Residual     Upper        Infeas.     Name
         1   0.0000E+00  -9.4140E-01   0.0000E+00   9.4140E-01  ss.Eqn(1): 0 = (v1+v2)-(1)
 Variable   Lower        Value        Upper        $Value      Name
         1  -1.2346E+20   2.9300E-02   1.2346E+20   0.0000E+00  ss.v1
         2  -1.2346E+20   2.9300E-02   1.2346E+20   0.0000E+00  ss.v2
____________________________________________________________________________
EQ Number   Lower        Residual     Upper        Infeas.     Name
         2   0.0000E+00   5.8600E-02   0.0000E+00  -5.8600E-02  ss.Eqn(2): 0 = (v1+v2)-(0)
 Variable   Lower        Value        Upper        $Value      Name
         1  -1.2346E+20   2.9300E-02   1.2346E+20   0.0000E+00  ss.v1
         2  -1.2346E+20   2.9300E-02   1.2346E+20   0.0000E+00  ss.v2
************************************************
****** ACTIVE OBJECTIVE EQUATIONS **************
************************************************
Number           ID  Node    Horizon  Unscaled Res  Scaled Res   Scaling     Name
************************************************
************* ACTIVE EQUATIONS *****************
************************************************
Number           ID  Node    Horizon  Unscaled Res  Scaled Res   Scaling     Name
         1          1    1          1  -9.4140E-01  -9.4140E-01   1.0000E+00  ss.Eqn(1): 0 = (v1+v2)-(1)
         2          2    1          1   5.8600E-02   5.8600E-02   1.0000E+00  ss.Eqn(2): 0 = (v1+v2)-(0)
************************************************
************ INACTIVE EQUATIONS ****************
************************************************
Number     Unscaled Res    Scaled Res   Scaling      Name
Run Code Online (Sandbox Code Playgroud)

如果您使用x = m.Var(name='x')命名变量,那么该文件将变得更具描述性。这两个方程都被认为可能不可行。

  • 尝试在解决命令之前使用命令“m.open_folder()”来查看运行目录。如果“m=GEKKO(remote=False)”,则“infeasibilities.txt”文件将显示在运行目录中。当您使用 APM Python 或 APM Matlab 时,另一个命令来自 APM。Gekko 是 APMonitor (APM) 的较新界面。 (2认同)