首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制层与预测层

控制层与预测层
EN

Stack Overflow用户
提问于 2020-09-24 06:20:43
回答 1查看 3.3K关注 0票数 2

我已经回顾了模型预测控制的参考书目和Gekko编程结构,虽然我了解它的编程方式和它们的用途。例如,我想了解Gekko如何根据Seborg的相关来管理控制层和预测层之间的差异。我看不到代码上的差异。下面是MPC应用程序的例子。

代码语言:javascript
运行
复制
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()指令的反馈。

谢谢。

桑德拉·罗德里格斯

EN

回答 1

Stack Overflow用户

发布于 2020-09-24 12:54:36

控制视界是允许MV移动的时间范围的一部分。预测视界延伸超过控制视界,以预测最终的CV结果,但没有MV运动。这是一个遗留的概念,从工业模型预测控制器,需要计算一个短期移动计划,但也需要预测控制器,MVs和CVs将最终解决。

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

参数CTRL_HORCTRL_TIMEPRED_HORPRED_TIME是APMonitor的选项,但除非设置m.options.CSV_READ=0,否则不要更改Gekko解决方案。不建议关闭CSV文件读取,因为Gekko使用CSV数据文件来传递更改。

代码语言:javascript
运行
复制
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时间范围的首选方法。它可以是不均匀的,不只是一个控制和预测间隔。

代码语言:javascript
运行
复制
m.time = [0,1,2,3,4,6,8,10,15,25,35,50,80]

降低预测视界自由度

预测层位的目的是计算稳定状态,保持最后允许的MV从控制层位的移动常数。如果您需要在某个点之后不允许MV移动,那么m.Connection()可以将MV值链接到一起,以阻止在某个时间范围内的移动。

代码语言:javascript
运行
复制
# 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

下面是这个示例问题的完整代码。

代码语言:javascript
运行
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64040582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档