你好,我正在使用 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
但是,我想要的有点像将所有变量名称替换为其当前值。
有一个内置报告提供有关方程残差的详细信息。对于以下示例应用程序,设置
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