首页 > 编程问答 >使用 GEKKO 的预测控制模型

使用 GEKKO 的预测控制模型

时间:2024-07-21 03:58:16浏览次数:11  
标签:python gekko mpc

我正在对 MPC 进行建模,以将建筑物的温度保持在给定的时间间隔内,同时最大限度地减少能耗。我正在使用 GEKKO 来建模我的算法。

我编写了以下代码。首先,我使用输入数据(干扰:外部温度和控制)和输出 y (温度)来确定我的模型。然后,我构建了一个 ARX 模型(使用 GEKKO 中的 arx 函数。这是我的代码:

# Import library 
import numpy as np
import pandas as pd
import time

# Initialize Model

ts = 300
t = np.arange(0,len(data_1)*ts, ts)
u_id = data_1[['T_ext','beta']]
y_id = data_1[['T_int']]

# system identification

#meas : the time-series next step is predicted from prior measurements as in ARX

na=5; nb=5 # ARX coefficients
print('Identify model')
start = time.time()
yp,p,K = m.sysid(t,u_id,y_id,na,nb,objf=100,scale=False,diaglevel=0,pred='meas')
print('temps de prediction :'+str(time.time()-start)+'s')

#%% create control ARX model

T_externel = np.array([5.450257,5.448852,5.447447,5.446042,5.444637,5.443232,5.441826,5.440421,5.439016, 
                       5.440421,5.437610,5.436205,5.434799,5.433394,5.431988,5.430583,5.429177,5.427771,
                        5.426365, 5.424959, 5.423553  ])

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)   

# lower,heigh bound for MV
TL = m.Param(values = 16)
TH = m.Param(values = 18)
    

# steady state initialization
m.options.IMODE = 1
m.solve(disp=False)

# set up MPC
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 = 2.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.options.CV_TYPE=2 # the objective is an l2-norm (squared error)
m.T.SP = 17           # set point


TL.values = np.ones(len(T_externel))*16
TH.values = np.ones(len(T_externel))*18
m.T.value = 17 # Temprature starts at 17

for i in range(len(T_externel)):
    m.d = T_externel[i]
    m.solve(disp = False)
    
    if m.options.APPSTATUS == 1:
        # Retrieve new values
        beta  = m.beta.NEWVAL

    else:
        # Solution failed
        beta  = 0.0


我收到以下错误:

  File c:\algoritmempc\gekko_mpc.py:84
    m.arx(p,m.y,m.u)

ValueError: operands could not be broadcast together with shapes (2,) (0,) 

我还有另一个问题。由于我的输入之一是干扰,所以我不确定我声明变量的方式是否正确(我想自己提供干扰)。


错误信息表明正在尝试对具有不兼容形状的数组执行操作。具体而言,似乎在尝试将形状为 (2,) 的数组与形状为 (0,) 的数组一起使用。这表明其中一个数组为空,在尝试执行类似广播或逐元素运算的操作时,这会导致问题。

以下是的代码中可能出现此错误的一些可能原因:

  1. m.sysid() 返回的 p 的形状不正确。 这可能是由于提供的输入数据 ( t u_id y_id ) 或选择的 na nb 的值造成的。请确保的输入数据形状正确,并且为模型选择了适当的阶数。可能希望尝试使用不同的阶数值或不同的系统识别方法。
  2. m.u 的初始化不正确。 正在使用 m.Array(m.MV, 2) 创建 m.u ,但这可能会创建不兼容的形状。尝试使用更明确的初始化,例如 m.u = [m.MV(value=0), m.MV(value=0)]
  3. GEKKO 版本不兼容。 较旧版本的 GEKKO 在处理 arx 函数和多输入系统方面存在一些问题。请确保使用的是最新版本的 GEKKO。可以使用 pip install --upgrade gekko 进行更新。

对于的第二个问题,似乎正在以正确的方式声明干扰。通过将 m.d 定义为 m.Param 并为其分配外部温度值,可以在预测控制问题中将其作为已知的外部干扰。

以下是关于如何修复代码的建议:

  1. 检查 p 的形状。 在调用 m.sysid() 后,打印 p 的形状并确保它与的预期相符。如果它为空或具有意外的形状,则需要调查系统识别步骤。
  2. 修改 m.u 的初始化。 如上所述,尝试使用更明确的初始化来确保 m.u 具有正确的形状。
  3. 更新 GEKKO。 确保使用的是最新版本的 GEKKO。

如果在尝试这些建议后仍然遇到问题,请提供以下信息的更多上下文:

  • data_1 数据框的结构和内容。
  • p m.y m.u 的形状,在调用 m.arx() 之前。
  • 正在使用的 GEKKO 版本。

借助这些信息,我可以为提供更具体的帮助来解决的问题。

标签:python,gekko,mpc
From: 78766494

相关文章

  • python 舰队容器
    我正在尝试使用容器在flet中制作一个菜单,它应该是半透明的,但其中的项目不是。我尝试将opacity=1分配给元素,但没有成功-它们与容器一样透明感谢任何帮助我的代码:nickname=ft.TextField(label="xxx",hint_text="xxx")column=ft.Column(controls=[nickname......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......
  • 调试用 C 编写的 Python 扩展
    我非常熟悉编写C代码,并且很擅长编写Python代码。我正在尝试学习如何用C编写可以从OSX10.15.7上的Python-3.9.X调用的模块。我已经得到了几个“helloworld”类型的示例,但是对于复杂的示例,我正在努力弄清楚如何调试我编写的C扩展。MWE:src/add.c//......
  • 具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误
    我有一个非常大的SAS文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用pandas中chunksize方法的read_sas选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。此特定SAS文件有794......
  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......
  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......
  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......