如何检查我的 Gekko 模型解决方案中的约束方程满足的程度如何?

问题描述 投票:0回答:1

你好,我正在使用 Python Gekko 来解决最小化问题。目前,我对 Gekko 模型的解决方案不满意,希望通过迭代选择不同的起始值来改进解决方案。因此,我想检查每次迭代后我的 Gekko 模型中的方程/约束的满足程度如何。是否有任何解决方案变量可以测量该值?是否可以编写一个通用实用程序函数,迭代存储在

docs
中提到的 ._equation 变量中的所有方程,并打印出违反约束的程度?例如,我有方程“a+b==1”,解为“a=1.001”和“b=0”,那么“0.001”就违反了我的约束。为了打印每个 Gekko 变量的解决方案结果,我编写了一个小通用函数,它将 Gekko 模型作为输入,迭代存储在“._variables”变量中的所有变量,并打印出变量的名称与数值。

我已经尝试迭代方程并将其打印出来:

for e in m._equations:
    print(e)

它打印出方程以及方程内的变量名称。例如:

(((2)*(phi_h))+phi_h2)<6.283185307179586

但是,我想要的有点像将所有变量名称替换为其当前值。

python optimization gekko
1个回答
0
投票

有一个内置报告提供有关方程残差的详细信息。对于以下示例应用程序,设置

remote=False
并使用
m.open_folder()
打开运行目录以查找报告
rto_4_eqn.txt

from gekko import GEKKO

m = GEKKO(remote=False)
x = m.Var(value=0,name='x')
y = m.Var(value=1,name='y')
m.Equations([x + 2*y==1, x**2+y**2==1])
m.options.DIAGLEVEL=2
m.solve(disp=False)
print([x.value[0],y.value[0]])
m.open_folder()

如果求解器未找到解,则会生成一个

infeasibilities.txt
文件。您可以通过将方程更改为
x + 2*y==10
来测试这一点,其中直线和圆之间没有交点(解)。设置
debug=0
以避免在找不到解决方案时引发异常:

from gekko import GEKKO

m = GEKKO(remote=False)
x = m.Var(value=0,name='x')
y = m.Var(value=1,name='y')
m.Equations([x + 2*y==1, x**2+y**2==1])
m.options.DIAGLEVEL=2
m.solve(disp=True,debug=0)
m.open_folder()

如果您想在

remote=True
时也有此报告,或者不想每次都打开运行目录,请使用附加代码自动显示方程报告的正确文件,无论求解是否成功。文件名随
IMODE
值变化。

from gekko import GEKKO
import os

m = GEKKO(remote=False)
x = m.Var(value=0,name='x')
y = m.Var(value=1,name='y')
m.Equations([x + 2*y==10, x**2+y**2==1])
m.options.DIAGLEVEL=2
m.solve(disp=False,debug=0)
print([x.value[0],y.value[0]])
#m.open_folder()

if m.options.APPSTATUS==1:
    print('Successful')
    im = m.options.IMODE
    if im==1:
        file = 'ss_4_eqn.txt'
    elif im==2:
        file = 'mpu_4_eqn.txt'
    elif im==3:
        file = 'rto_4_eqn.txt'
    elif im==4:
        file = 'sim_4_eqn.txt'
    elif (im==5) or (im==8):
        file = 'est_4_eqn.txt'
    elif (im==6) or (im==9):
        file = 'ctl_4_eqn.txt'
    elif im==7:
        file = 'sqs_4_eqn.txt'
else:
    print('Not successful')
    file = 'infeasibilities.txt'

if m._remote:
    from gekko.apm import get_file
    # remote solve - get file
    f = get_file(m._server,m._model_name,file)
    f = f.decode().replace('\r','')
    with open(file, 'w') as fl:
        fl.write(str(f))
        print(f)
else:
    # local solution - get file from run folder
    with open(os.path.join(m._path,file), 'r') as fl:
        print(fl.read())

有关

infeasibilities.txt
文件的更多信息,请访问 如何从 gekko 中检索“infeasibilities.txt”

样本报告

infeasibilities.txt
不可行问题

[0.5, 1.0]
Not successful
************************************************
***** POSSIBLE INFEASBILE EQUATIONS ************
************************************************
____________________________________________________________________________
EQ Number   Lower        Residual     Upper        Infeas.     Name
         1   0.0000E+00  -7.5000E+00   0.0000E+00   7.5000E+00  ss.Eqn(1): 0 = (x+((2)*(y)))-(10)
 Variable   Lower        Value        Upper        $Value      Name
         1  -1.2346E+20   5.0000E-01   1.2346E+20   0.0000E+00  ss.x
         2  -1.2346E+20   1.0000E+00   1.2346E+20   0.0000E+00  ss.y
____________________________________________________________________________
EQ Number   Lower        Residual     Upper        Infeas.     Name
         2   0.0000E+00   2.5000E-01   0.0000E+00  -2.5000E-01  ss.Eqn(2): 0 = (((x)^(2))+((y)^(2)))-(1)
 Variable   Lower        Value        Upper        $Value      Name
         1  -1.2346E+20   5.0000E-01   1.2346E+20   0.0000E+00  ss.x
         2  -1.2346E+20   1.0000E+00   1.2346E+20   0.0000E+00  ss.y
************************************************
****** 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  -7.5000E+00  -7.5000E+00   1.0000E+00  ss.Eqn(1): 0 = (x+((2)*(y)))-(10)
         2          2    1          1   2.5000E-01   2.5000E-01   1.0000E+00  ss.Eqn(2): 0 = (((x)^(2))+((y)^(2)))-(1)
************************************************
************ INACTIVE EQUATIONS ****************
************************************************
Number     Unscaled Res    Scaled Res   Scaling      Name

样本报告

rto_4_eqn.txt
以及成功的解决方案

[-0.60000000466, 0.80000000233]
Successful
************************************************
***** POSSIBLE INFEASBILE EQUATIONS ************
************************************************
************************************************
****** 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   0.0000E+00   0.0000E+00   1.0000E+00  ss.Eqn(1): 0 = (x+((2)*(y)))-(1)
         2          2    1          1   9.3234E-09   9.3234E-09   1.0000E+00  ss.Eqn(2): 0 = (((x)^(2))+((y)^(2)))-(1)
************************************************
************ INACTIVE EQUATIONS ****************
************************************************
Number     Unscaled Res    Scaled Res   Scaling      Name
© www.soinside.com 2019 - 2024. All rights reserved.