[英]How do I display solution in GEKKO GUI?
我想探索 GEKKO web GUI 的功能,以可视化结果,如https://www.researchgate.net/publication/326740143_GEKKO_optimization_suite中所述。
我已启用m.options.WEB=1
并使用m.solve(GUI=True)
解决。
如您的问题中的 plot 所示, Gekko
显示版本使用GUI=True
。 web 界面中仅显示FV
、 MV
、 SV
和CV
值。
The option WEB
is the APMonitor version of the web-interface that uses AJAX and Flash plots (deprecated, to be replaced in a future version) to display the web interface. 这可以保留为m.options.WEB=0
以使用 Gekko GUI。
下面是一个生成 Web 界面的示例。 flask
package 是 Web 界面的依赖项,第一次启动时需要刷新网页。 Select plot 上的变量显示或添加新的 plot。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
# Parameters
mass = 500
b = m.Param(value=50)
K = m.Param(value=0.8)
# Manipulated variable
p = m.MV(value=0, lb=0, ub=100)
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth out gas pedal movement
p.DMAX = 20 # slow down change of gas pedal
# Controlled Variable
v = m.CV(value=0)
v.STATUS = 1 # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
v.SP = 40 # set point
v.TR_INIT = 1 # set point trajectory
v.TAU = 5 # time constant of trajectory
# Process model
m.Equation(mass*v.dt() == -v*b + K*b*p)
m.options.IMODE = 6 # control
m.solve(disp=False,GUI=True)
调用m.solve(GUI=True)
会在每次调用时生成(或更新)Web 界面。 也可以使用 Matplotlib 显示 MPC 解决方案。
# get additional solution information
import json
with open(m.path+'//results.json') as f:
results = json.load(f)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,results['v1.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
还可以生成更复杂的 Matplotlib 图,以显示 MPC 解决方案的未来预测范围、移动范围估计或其他自定义功能。
我对不在 GUI 中的变量有类似的问题。 Flask 是最新的,版本 2.2.2...
我找到了让它们消失的方法想了解解决这个问题的方法,不需要所有对象都在全局 scope 中。
运行上面的示例,GUI 会显示变量及其结果。 但是当 init 被分成一个 function 调用(见下面的第一个代码块)并且在 python 中解决它之外的调用时,GUI 不起作用。 我还观察到我是否使用点符号(第二个代码块)将变量放在 model 下,这样我就可以传递 model 及其所有围绕示例 mu = m.MV() 而不是 u=m.MV( ) GUI 也停止显示变量。
从 function 传递 model
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
def init():
m = GEKKO()
m.time = np.linspace(0,20,41)
# Parameters
mass = 500
b = m.Param(value=50)
K = m.Param(value=0.8)
# Manipulated variable
p = m.MV(value=0, lb=0, ub=100)
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth out gas pedal movement
p.DMAX = 20 # slow down change of gas pedal
# Controlled Variable
v = m.CV(value=0)
v.STATUS = 1 # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
v.SP = 40 # set point
v.TR_INIT = 1 # set point trajectory
v.TAU = 5 # time constant of trajectory
# Process model
m.Equation(mass*v.dt() == -v*b + K*b*p)
m.options.IMODE = 6 # control
return m
m=init()
m.solve(disp=False,GUI=True)
使用点符号将变量分组为 model
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
# Parameters
mass = 500
b = m.Param(value=50)
K = m.Param(value=0.8)
# Manipulated variable
m.p = m.MV(value=0, lb=0, ub=100)
m.p.STATUS = 1 # allow optimizer to change
m.p.DCOST = 0.1 # smooth out gas pedal movement
m.p.DMAX = 20 # slow down change of gas pedal
# Controlled Variable
m.v = m.CV(value=0)
m.v.STATUS = 1 # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
m.v.SP = 40 # set point
m.v.TR_INIT = 1 # set point trajectory
m.v.TAU = 5 # time constant of trajectory
# Process model
m.Equation(mass*m.v.dt() == -m.v*b + K*b*m.p)
m.options.IMODE = 6 # control
m.solve(disp=False,GUI=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.