问题描述
我已经审查了用于模型预测控制的书目和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)
plt.step(m.time,u.value,'b-',label='MV Move Plan')
plt.legend()
plt.ylabel('MV')
plt.subplot(2,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()
指令的反馈,我们将不胜感激。
谢谢。
SandraRodríguez
解决方法
控制范围是允许MV移动的时间范围的一部分。预测范围超出控制范围以预测最终的CV结果,但没有MV移动。这是工业模型预测性控制器的一个遗留概念,它需要计算短期移动计划,但还需要预测控制器的MV和CV最终将在哪里沉降。
选项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
选项2:使用m.time()
定义时间范围
使用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,i) # connect end point node
m.Connection(u,i,2) # connect internal node
这是此示例问题的完整代码。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
# Time Horizon
m.time = [0,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,2) # connect internal node
m.solve(disp=True)
# Plot results
plt.figure()
plt.subplot(2,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,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()