首页 > 编程问答 >即使输出与参考不匹配,为什么 GEKKO 不提供最佳命令?

即使输出与参考不匹配,为什么 GEKKO 不提供最佳命令?

时间:2024-07-31 16:04:06浏览次数:14  
标签:python gekko mpc

以下内容与此问题相关: 使用 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 获得的输出和最佳控制是:

Output 1

Optimal control

Profile of T_externel

我需要将房间的温度保持在定义的范围内。


GEKKO 没有针对的 MPC 问题提供最佳命令的原因是的模型预测,即控制输入对控制输出没有影响。换句话说,的系统在当前模型中不可控。

以下是该问题更详细的分解,以及一些可能的解决方案:

  1. 模型结构: 的模型基于 ARX 结构,该结构依赖于先前的输入、输出和扰动来预测未来的输出。但是,的模型参数(矩阵 K 和字典 p 中的值)可能没有准确地捕捉到系统动力学。因此,即使模型预测温度违反约束,它也可能没有找到有效的控制动作来将温度保持在期望范围内。

可能的解决方案: * 系统识别: 使用真实世界数据仔细确定的 ARX 模型参数。这将涉及收集输入-输出数据并使用系统识别技术来估计模型参数。 * 替代模型结构: 如果怀疑 ARX 模型无法充分描述系统,请考虑使用其他模型结构,例如状态空间或传递函数模型。

  1. 扰动: 外部温度 ( T_externel ) 被视为扰动。如果扰动的影响远大于控制输入 ( beta ) 的影响,则控制器可能无法有效地调节温度。

可能的解决方案: * 增强控制权限: 如果可能,请增加控制输入的范围,使其对系统产生更大的影响。 * 级联控制: 实施级联控制方案,其中一个控制器管理外部温度的影响,而另一个控制器则关注于基于预处理温度的房间温度调节。

  1. 调优参数: MPC 的性能受预测范围、控制范围和各种惩罚参数(例如 DMAX DCOST )的影响。选择不当的调优参数会导致控制性能不佳。

可能的解决方案: * 调整预测范围: 根据系统的动态特性和扰动来调整预测范围。 * 调整惩罚参数: 调整 DMAX DCOST 等惩罚参数,以平衡控制性能与控制工作量。

  1. 初始条件: MPC 问题的初始条件(例如初始温度和控制输入值)会影响控制器的行为。

可能的解决方案: * 验证初始条件: 确保初始条件准确反映系统的实际初始状态。

要解决的问题,请尝试以下步骤:

  1. 验证模型: 在实施 MPC 之前,通过模拟不同的输入场景并将其与实际系统行为进行比较来彻底验证的 ARX 模型。
  2. 系统可控性: 分析系统以确保所选控制输入 ( beta ) 实际上能够以所需方式影响房间温度。
  3. 迭代调优: 系统地调整 MPC 参数,同时仔细监控系统响应以找到最佳设置。

通过解决这些问题,可以提高 MPC 控制器的性能,并有效地将房间温度保持在期望范围内。请记住,MPC 的成功实施很大程度上取决于准确的系统模型和对控制问题的透彻理解。

标签:python,gekko,mpc
From: 78809821

相关文章

  • Python:使用默认模块在python中读取excel
    我有Python2.6.6版本,但无法安装pandas、xlrd、xlwt等新模块。我想使用Python读取Excel。是否可以使用Python中存在的默认模块读取Excel。抱歉,不能使用Python2.6.6的默认模块读取Excel文件。Python没有内置的功能来处理Excel文件。使用外部库(如提......
  • 【Python】从0开始写脚本、Selenium详细教程、附源码案例(保姆篇)
    文章目录准备工作安装selenium配置浏览器驱动脚本测试什么是Selenium?Selenium功能示例(可直接拷贝执行)编写一个简单的Python脚本来使用Selenium打开一个网页,并获取网页的标题下面是一个示例,自动打开csdn并进行搜索Selenium使用Selenium元素定位文本输入、清除与提交......
  • Python控制台输出的华丽变身:色彩与风格的深度探索
    一、文章摘要本文深入探讨了Python标准输出中字体颜色的设置方法,特别是通过ANSI转义序列实现的文本样式控制。文章详细解析了ANSI转义序列的组成、各个颜色代码的含义,以及如何在Python中使用这些代码来改变终端输出的字体颜色、背景色、高光、加粗等样式。通过丰富的案例代码,......
  • 二十五、【机器学习】-【Python手搓3层神经网络】:从零构建深度学习模型的实战指南
    目录一、序章:为什么你需要掌握手搓神经网络二、基础篇:神经网络基础知识回顾三、实战配置:搭建3层神经网络的步骤与技巧(一)、__init__ 方法初始化神经网络(二)、train 方法实现了前向传播和反向传播(三)、query 方法(四)、全部代码四、总结一、序章:为什么你需要掌握手......
  • 在Python中将简单的字典导出到Excel文件中
    我是Python新手。我有一个简单的字典,其键和值如下dict1={"numberofstoragearrays":45,"numberofports":2390,......}我需要将它们放入Excel表中,如下numberofstoragearrays45numberofports2390我有一个非常大的字典。importpandasasp......
  • 将 python 脚本作为 AWS 胶水服务作业运行
    我有一个使用本地路径在本地运行的python脚本,但我需要复制此python脚本并将其作为AWS胶水服务作业运行并将输出保存在s3存储桶中。请帮助我逐步说明。将Python脚本作为AWSGlue作业运行的步骤如下:步骤1:修改的Python脚本以使其与Glue兼容......
  • Python - Decorating classes
    Whenwetalkaboutdecoratingclasses,wecaneitherdecorateindividualmethodsorwecancreateadecoratortodecoratethewholeclass.classMyClass:def__init__(self,a):self.a=a@timerdefmethod1(self,x,y):print......
  • 如何在 python 中使用矩阵分解从 3 个不同的矩阵(2 个交互矩阵和 1 个相似矩阵)创建一个
    我有3个不同大小的矩阵A、B、C,它们有一些共同的元素。A(相似性)与B(交互)有一些共同元素,但与C(第二交互矩阵)没有共同元素。B有一些与C相同的元素。我想创建一个基于B和C的矩阵M,但提供基于A、B、C的输出,就像推荐系统类型一样,其中根据评分、观看次数和偏好推荐电影。例......
  • Python - Decorators
    Adecoratorisacallablethattakesacallableasinputandreturnsacallable.Thisisthegeneraldefinitionofadecorator.Thecallableinthisdefinitioncanbeafunctionoraclass.Inourinitialdiscussion,wewilltalkaboutdecoratorfunctions......
  • Python捕获一组中的1000个项目进行处理
    我有一个包含数千条记录的大表(可能有3,000到75,000条记录),我将所有数字ID放入排序列表中。我想一次有序地处理一组1000个ID。我如何优雅地获取前1000个和“标签”,设置为“223344到337788”(字典在这里有意义吗,或者只是列表捕获中的第一个/最后一个项目......以跟......