controls - 控制范围和预测范围
问题描述
我已经回顾了模型预测控制的参考书目和 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()
代码中使用的指令的反馈。
谢谢你。
桑德拉·罗德里格斯
解决方案
控制范围是时间范围中允许 MV 移动的部分。预测范围超出控制范围以预测最终的 CV 结果,但没有 MV 移动。这是来自工业模型预测控制器的遗留概念,需要计算短期移动计划,但还需要预测控制器 MV 和 CV 最终将在何处稳定下来。
选项 1:使用 Gekko 选项定义时间范围(不推荐)
参数CTRL_HOR
、CTRL_TIME
、PRED_HOR
和PRED_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()
推荐阅读
- java - java.lang.NoClassDefFoundError: io/grpc/netty/shaded/io/netty/util/concurrent/DefaultPromise$1 在使用 DialogFlow Java 客户端
- javascript - 检查 SerializedArray 中是否存在键
- excel-formula - Excel 公式:SUM 与 ROW 的正确语法?
- scala - 如何向函数提取摘要添加类型检查
- video - FFmpeg 屏幕混合模式将图像变为粉红色
- javascript - 函数内部的for循环以查找匹配的值javascript
- android - 使用改造和 rxJava 重复 api 调用
- c++ - 如何验证 do...while 循环中的输入,然后在必要时重新提问?
- pandas - Pandas - 根据多个条件将值分配给空列
- python - 无法创建 cudnn 句柄:CUDNN_STATUS_ALLOC_FAILED 但设置内存增长为真