You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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}$的其余控制值
    • 时域向前滚动一个采样步长,重复上述求解流程
  • 当前运行情况:代码执行后可输出符合预期的仿真结果,但存在两点待确认:
    1. 代码中GEKKO相关接口的调用是否符合规范
    2. 滚动切换预测时域时的状态重置逻辑是否正确:此前尝试直接用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:06:22