以下内容与此问题相关: 使用 GEKKO 的预测控制模型
我正在尝试应用 MPC 将房间的温度保持在定义的范围内,但即使输出存在分歧,GEKKO 也会给我空命令。我运行上一个问题中的更正代码:
# Import library
import numpy as np
import pandas as pd
import time
from gekko import GEKKO
from numpy import array
K = array([[ 0.93705481, -12.24012156]])
p = {'a': array([[ 1.08945247],
[-0.00242145],
[-0.00245978],
[-0.00272713],
[-0.00295845],
[-0.00319119],
[-0.00343511],
[-0.00366243],
[-0.00394247],
[-0.06665054]]),
'b': array([[[-0.05160235, -0.01039767],
[ 0.00173511, -0.01552485],
[ 0.00174602, -0.01179519],
[ 0.00180031, -0.01052658],
[ 0.00186416, -0.00822121],
[ 0.00193947, -0.00570905],
[ 0.00202877, -0.00344507],
[ 0.00211395, -0.00146947],
[ 0.00223514, 0.00021945],
[ 0.03800987, 0.04243736]]]),
'c': array([0.0265903])}
# i have used only 200 mes of T_externel
T_externel = np.linspace(9.51,9.78,200)
m = GEKKO(remote=False)
m.y = m.Array(m.CV,1)
m.u = m.Array(m.MV,2)
m.arx(p,m.y,m.u)
# rename CVs
m.T = m.y[0]
# rename MVs
m.beta = m.u[1]
# distrubance
m.d = m.u[0]
# distrubance and parametres
m.d = m.Param(T_externel[0])
# lower,heigh bound for MV
TL = m.Param(value = 16)
TH = m.Param(value = 18)
# steady state initialization
m.options.IMODE = 1
m.solve(disp=False)
# set up MPC
m.d.value = T_externel
m.options.IMODE = 6 # MPC
m.options.CV_TYPE = 2 # the objective is an l2-norm (squared error)
m.options.NODES = 2 # Collocation nodes
m.options.SOLVER = 1 # APOPT
m.time = np.arange(0,len(T_externel)*300,300) # step time = 300s
# Manipulated variables
m.beta.STATUS = 1 # calculated by the optimizer
m.beta.FSTATUS = 1 # use measured value
m.beta.DMAX = 1.0 # Delta MV maximum step per horizon interval
m.beta.DCOST = 0.0 # Delta cost penalty for MV movement
m.beta.UPPER = 1.0 # Lower bound
m.beta.LOWER = 0.0
m.beta.MEAS = 0 # set u=0
# Controlled variables
m.T.STATUS = 1 # drive to set point
m.T.FSTATUS = 1 # receive measurement
m.T.SP = 17 # set point
TL.value = np.ones(len(T_externel))*16
TH.value = np.ones(len(T_externel))*18
m.T.value = 17 # Temprature starts at 17
for i in range(len(T_externel)):
m.solve(disp = False)
if m.options.APPSTATUS == 1:
# Retrieve new values
beta = m.beta.NEWVAL
else:
# Solution failed
beta = 0.0
import matplotlib.pyplot as plt
# Plot the results
plt.figure(figsize=(12,6))
plt.subplot(2,1,1)
plt.plot(m.time,m.T.value,'r-',label=r'$T_{int}$')
plt.plot(m.time,TL.value,'k--',label='Lower Bound')
plt.plot(m.time,TH.value,'k--',label='Upper Bound')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.subplot(2,1,2)
plt.plot(m.time,m.beta.value,'b--',label=r'$\beta$')
plt.ylabel('optimal control')
plt.xlabel('Time (sec)')
plt.legend()
plt.show()
GEKKO 获得的输出和最佳控制是:
我需要将房间的温度保持在定义的范围内。
GEKKO 没有针对的 MPC 问题提供最佳命令的原因是的模型预测,即控制输入对控制输出没有影响。换句话说,的系统在当前模型中不可控。
以下是该问题更详细的分解,以及一些可能的解决方案:
- 模型结构: 的模型基于 ARX 结构,该结构依赖于先前的输入、输出和扰动来预测未来的输出。但是,的模型参数(矩阵 K 和字典 p 中的值)可能没有准确地捕捉到系统动力学。因此,即使模型预测温度违反约束,它也可能没有找到有效的控制动作来将温度保持在期望范围内。
可能的解决方案: * 系统识别: 使用真实世界数据仔细确定的 ARX 模型参数。这将涉及收集输入-输出数据并使用系统识别技术来估计模型参数。 * 替代模型结构: 如果怀疑 ARX 模型无法充分描述系统,请考虑使用其他模型结构,例如状态空间或传递函数模型。
-
扰动:
外部温度 (
T_externel
) 被视为扰动。如果扰动的影响远大于控制输入 (beta
) 的影响,则控制器可能无法有效地调节温度。
可能的解决方案: * 增强控制权限: 如果可能,请增加控制输入的范围,使其对系统产生更大的影响。 * 级联控制: 实施级联控制方案,其中一个控制器管理外部温度的影响,而另一个控制器则关注于基于预处理温度的房间温度调节。
-
调优参数:
MPC 的性能受预测范围、控制范围和各种惩罚参数(例如
DMAX
、DCOST
)的影响。选择不当的调优参数会导致控制性能不佳。
可能的解决方案:
*
调整预测范围:
根据系统的动态特性和扰动来调整预测范围。
*
调整惩罚参数:
调整
DMAX
和
DCOST
等惩罚参数,以平衡控制性能与控制工作量。
- 初始条件: MPC 问题的初始条件(例如初始温度和控制输入值)会影响控制器的行为。
可能的解决方案: * 验证初始条件: 确保初始条件准确反映系统的实际初始状态。
要解决的问题,请尝试以下步骤:
- 验证模型: 在实施 MPC 之前,通过模拟不同的输入场景并将其与实际系统行为进行比较来彻底验证的 ARX 模型。
-
系统可控性:
分析系统以确保所选控制输入 (
beta
) 实际上能够以所需方式影响房间温度。 - 迭代调优: 系统地调整 MPC 参数,同时仔细监控系统响应以找到最佳设置。
通过解决这些问题,可以提高 MPC 控制器的性能,并有效地将房间温度保持在期望范围内。请记住,MPC 的成功实施很大程度上取决于准确的系统模型和对控制问题的透彻理解。
标签:python,gekko,mpc From: 78809821