【问题标题】:Is there a way to update MPC with MHE in the same gekko class?有没有办法在同一个 gekko 类中用 MHE 更新 MPC?
【发布时间】:2019-10-10 14:20:41
【问题描述】:

我目前正在使用 MPC 让 TCLab 加热器达到某个设定点温度。我试图让 MHE 每 50 秒更新一次某些参数值。我有一个以前的 MPC 模型,效果非常好,我尝试在我的主循环中添加一个部分,让它切换以提高某些值,然后切换回 MPC 模式。我已经看到其他做同样问题的人已经为 MPC 和 MHE 制作了一个 gekko 类,然后让它们一起工作,但是有没有一种方法可以在我当前的 MPC 循环中添加一个允许MHE 更新某些值,然后切换回 MPC?

这是我添加到循环中的代码,用于更新变量,但它没有更新我的值

 if i%50 == 0 or i == 0:

            m.options.IMODE = 5
            Q1.STATUS = 0
            Q1.FSTATUS = 1
            Q2.STATUS = 0
            Q2.FSTATUS = 1

            U.FSTATUS = 1
            α1.FSTATUS = 1
            α2.FSTATUS = 1
            τ.FSTATUS = 1

            m.solve(disp = False)

            Q1.STATUS = 1
            Q1.FSTATUS = 1
            Q2.STATUS = 1
            Q2.FSTATUS = 1


            m.options.IMODE = 6
            U.FSTATUS = 0
            α1.FSTATUS = 0
            α2.FSTATUS = 0
            τ.FSTATUS = 0

【问题讨论】:

    标签: gekko


    【解决方案1】:

    Gekko 促进了 MHE 和 MPC 之间的信息传输,但将它们组合到一个应用程序中并不是当前的功能。热启动文件 est.t0 (MHE) 和 ctl.t0 (MPC) 存储先前的解决方案并使用它来初始化下一个解决方案。文件est.xfer (MHE) 是一个传输文件,用于更新来自 MHE 应用程序的初始条件和参数。如果remote=False(本地解决),您可以通过打开运行文件夹查看这些文件:

    mhe.open_folder()
    mpc.open_folder()
    

    为什么单个应用程序具有挑战性

    Gekko 还使用 CSV 文件来传输值并在下一个 m.solve() 命令之前更新应用程序。 Gekko 中的每个变量x 只有一个x.value。如果您有 MHE 和 MPC 应用程序,则需要在每个 m.solve() 命令之前管理如何为所有变量重新加载 x.value 和所有选项。即使使用deepcopy() 函数,在脚本中管理它也会非常乏味。

    循环创建 MHE 和 MPC 模型

    更简单的方法是创建两个单独的模型,分别用于 MHE 和 MPC。为此,可以在循环中构建模型 (see complete example),以便只定义一次变量和方程。

    # initialize MHE and MPC
    mhe = GEKKO(name='tclab-mhe')
    mpc = GEKKO(name='tclab-mpc')
    
    # create 2 models (MHE and MPC) in loop
    for m in [mhe,mpc]:
        # Adjustable Parameters
        # heat transfer (W/m2-K)
        m.U = m.FV(value=2.76,lb=1.0,ub=5.0)
        # Semi-fundamental correlations (energy balances)
        m.Equation(mass*Cp*m.TH1.dt() == m.U*A*(m.TaK-m.T1i) \
                      + eps * sigma * A * (m.TaK**4 - m.T1i**4) \
                      + m.Q_C12 + m.Q_R12 \
                      + m.alpha1 * m.Q1)
        # Empirical correlations (lag equations to emulate conduction)
        m.Equation(m.tau * m.TC1.dt() == -m.TC1 + m.TH1)
    

    定义方程式后,可以使用特定于该模式的各种选项配置 MHE 和 MPC 应用程序。

    应用特定配置

    # ------------------------------
    # Configure MHE
    mhe.time = np.linspace(0,120,31)
    mhe.options.IMODE   = 5 # MHE
    # FV tuning
    mhe.U.STATUS = 1
    mhe.Ta.STATUS = 0
    # ------------------------------
    # Configure MPC
    mpc.time = [0,4,8,12,15,20,25,30,35,40,50,60,70,80,90]
    # FV tuning
    mpc.U.STATUS = 0
    mpc.Ta.STATUS = 0
    mpc.U.FSTATUS = 1
    mpc.Ta.FSTATUS = 1
    # Global Options
    mpc.options.IMODE   = 6 # MPC
    

    如果您想在每个循环中轻松地在 MHE 和 MPC 应用程序之间传输值,那么一种选择是将 est.xfer 文件从 MHE 文件夹 mhe.path 复制到 MPC 文件夹 mpc.path 中。这将在 MPC 应用程序中使用来自 MHE 应用程序的更新状态和参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多