基于Python GEKKO实现滚动时域控制(RHC)的方法正确性验证
GEKKO滚动时域控制实现的正确性校验
问题背景
- 实现目标:基于Python的GEKKO库搭建滚动时域控制(Receding Horizon Control, RHC)逻辑,校验代码建模、接口调用的规范性与逻辑正确性
- 采用的RHC标准逻辑:
- 每个采样时刻$t_k$,针对$t_k$至$t_k+H-1$范围的预测时域构建并求解最优控制问题(OCP)
- 仅应用求解得到的$t_k$时刻控制量,直接丢弃预测序列中$u_{k+1}$至$u_{k+H-1}$的其余控制值
- 时域向前滚动一个采样步长,重复上述求解流程
- 当前运行情况:代码执行后可输出符合预期的仿真结果,但存在两点待确认:
- 代码中GEKKO相关接口的调用是否符合规范
- 滚动切换预测时域时的状态重置逻辑是否正确:此前尝试直接用
.VALUE方法给状态变量x1、x2赋新初始值时,触发了TypeError: 'float' object is not subscriptable报错
待校验完整代码
import numpy as np import matplotlib.pylab as plt from gekko import GEKKO if __name__ == '__main__': # 初始化GEKKO模型 m = GEKKO() # 预测时域配置 nRHC = 21 tRHC = 2 m.time = np.linspace(0, tRHC, nRHC) # 定义操纵变量(控制量) u = m.MV(value=0.0,fixed_initial=False) u.STATUS = 1 u.DCOST = 0 # 定义状态变量 t = m.SV(value=0) x1 = m.SV(value=1) x2 = m.SV(value=0) # 构建系统动力学方程 m.Equation(t.dt() == 1) m.Equation(x1.dt() == x2) m.Equation(x2.dt() == (1 - x2*x2)*x1 - x2 + u) # 构建优化目标 m.Minimize(10*x1**2 + 10*x2**2 + u**2) # 求解器通用参数配置 m.options.IMODE = 6 m.options.NODES = 11 m.options.MV_TYPE = 2 m.options.SOLVER = 3 # 全仿真周期配置 nTotal = 101 tTotal = np.linspace(0, 10, nTotal) uStore = np.zeros((1,nTotal)) xStore = np.zeros((2,nTotal)) xStore[:,0] = [1, 0] # 滚动求解循环 for i in range(nTotal): print('Solving Step: ', i+1, ' of ', nTotal-1) if i == nTotal-1: break # 求解当前预测时域下的MPC问题 m.solve(disp=False) # 更新下一预测时域的初始状态 t.VALUE = t[1] x1.MEAS = x1[1] x2.MEAS = x2[1] # 存储当前步求解结果 uStore[:,i] = u.NEWVAL xStore[:,i+1] = np.array([x1[1], x2[1]]) # 绘制状态响应曲线 f1, axs = plt.subplots(2) axs[0].plot(tTotal, xStore[0,:]) axs[0].set_ylabel('x') axs[0].grid() axs[1].plot(tTotal, xStore[1,:]) axs[1].set_ylabel('x_dot') axs[1].set_xlabel('time') axs[1].grid() # 展示绘图结果 plt.show()
校验诉求
- 确认上述代码中GEKKO各类函数、属性的调用方式是否合规
- 重点确认滚动环节的状态重置逻辑是否符合RHC的标准实现规范,定位此前
.VALUE赋值触发类型错误的原因
内容的提问来源于stack exchange,提问作者MSAE
相关产品推荐
相关产品推荐

