首页 > 解决方案 > 控制范围和预测范围

问题描述

我已经回顾了模型预测控制的参考书目和 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()代码中使用的指令的反馈。

谢谢你。

桑德拉·罗德里格斯

标签: controlsgekkompc

解决方案


控制范围是时间范围中允许 MV 移动的部分。预测范围超出控制范围以预测最终的 CV 结果,但没有 MV 移动。这是来自工业模型预测控制器的遗留概念,需要计算短期移动计划,但还需要预测控制器 MV 和 CV 最终将在何处稳定下来。

选项 1:使用 Gekko 选项定义时间范围(不推荐)

参数CTRL_HORCTRL_TIMEPRED_HORPRED_TIME是来自 APMonitor 的选项,但除非您设置 ,否则不会更改 Gekko 解决方案m.options.CSV_READ=0。不建议关闭 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,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()

推荐阅读