我已经回顾了模型预测控制的参考书目和Gekko编程结构,虽然我了解它的编程方式和它们的用途。例如,我想了解Gekko如何根据Seborg的相关来管理控制层和预测层之间的差异。我看不到代码上的差异。下面是MPC应用程序的例子。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
# Time Horizon [0,1,2,...,39,40]
m.time = np.linspace(0,40,41)
# MV = Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS=1; u.DCOST=0.1; u.DMAX=20
# CV = Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS=1; x.SP=45
# Define model
K = m.Param(value=0.8); tau = 15.0
m.Equation(tau*x.dt() == -x + K*u)
# Options and solve
m.options.CV_TYPE = 2
m.options.MV_TYPE = 0
m.options.NODES = 3
m.options.IMODE = 6
# Define Control and Prediction Horizon
m.options.CTRL_HOR = 10
m.options.CTRL_TIME = 1
m.options.PRED_HOR = 40
m.options.PRED_TIME = 2
m.solve(disp=False)
# Plot results
plt.figure()
plt.subplot(2,1,1)
plt.step(m.time,u.value,'b-',label='MV Move Plan')
plt.legend()
plt.ylabel('MV')
plt.subplot(2,1,2)
plt.plot([0,40],[45,45],'k-',label='Target Setpoint')
plt.plot(m.time,x.value,'r--',label='CV Response')
plt.ylabel('CV')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
我将感谢您对我应该如何考虑代码中使用的np.linspace()
指令的反馈。
谢谢。
桑德拉·罗德里格斯
发布于 2020-09-24 12:54:36
控制视界是允许MV移动的时间范围的一部分。预测视界延伸超过控制视界,以预测最终的CV结果,但没有MV运动。这是一个遗留的概念,从工业模型预测控制器,需要计算一个短期移动计划,但也需要预测控制器,MVs和CVs将最终解决。
选项1:使用Gekko选项定义时间域(不推荐)
参数CTRL_HOR
、CTRL_TIME
、PRED_HOR
和PRED_TIME
是APMonitor的选项,但除非设置m.options.CSV_READ=0
,否则不要更改Gekko解决方案。不建议关闭CSV文件读取,因为Gekko使用CSV数据文件来传递更改。
m.options.CSV_READ = 0
# Define Control and Prediction Horizon
m.options.CTRL_HOR = 10
m.options.CTRL_TIME = 1
m.options.PRED_HOR = 40
m.options.PRED_TIME = 1
m.time()
选项2:使用定义时间视域
使用m.time
是定义MPC时间范围的首选方法。它可以是不均匀的,不只是一个控制和预测间隔。
m.time = [0,1,2,3,4,6,8,10,15,25,35,50,80]
降低预测视界自由度
预测层位的目的是计算稳定状态,保持最后允许的MV从控制层位的移动常数。如果您需要在某个点之后不允许MV移动,那么m.Connection()
可以将MV值链接到一起,以阻止在某个时间范围内的移动。
# Create prediction horizon
for i in range(9,len(m.time)):
m.Connection(u,u,8,i) # connect end point node
m.Connection(u,u,8,i,1,2) # connect internal node
下面是这个示例问题的完整代码。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
# Time Horizon
m.time = [0,1,2,3,4,6,8,10,15,25,35,50,80]
# MV = Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS=1; u.DCOST=0.1; u.DMAX=20
# CV = Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS=1; x.SP=45
# Define model
K = m.Param(value=0.8); tau = 15.0
m.Equation(tau*x.dt() == -x + K*u)
# Options and solve
m.options.CV_TYPE = 2
m.options.MV_TYPE = 0
m.options.NODES = 3
m.options.IMODE = 6
# Create prediction horizon
for i in range(9,len(m.time)):
m.Connection(u,u,8,i) # connect end point node
m.Connection(u,u,8,i,1,2) # connect internal node
m.solve(disp=True)
# Plot results
plt.figure()
plt.subplot(2,1,1)
plt.step(m.time,u.value,'b-',label='MV Move Plan')
plt.plot(m.time[0:8],u.value[0:8],'o',color='orange',label='Control Horizon')
plt.plot(m.time[8:],u.value[8:],'x',color='purple',label='Prediction Horizon')
plt.legend()
plt.ylabel('MV')
plt.subplot(2,1,2)
plt.plot([0,80],[45,45],'k-',label='Target Setpoint')
plt.plot(m.time,x.value,'r.-',label='CV Response')
plt.ylabel('CV')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
https://stackoverflow.com/questions/64040582
复制相似问题