在同一个gekko类中,是否可以用MHE更新MPC?

时间:2019-10-10 14:20:41

标签: gekko

我当前正在使用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

1 个答案:

答案 0 :(得分:4)

Gekko促进了MHE和MPC之间的信息传输,但是将它们组合到单个应用程序中并不是当前功能。 Warmstart文件public function generateStatistics(string $dateFrom, string $dateTo, int $id) { return Statistics::whereBetween('date', [$dateFrom, $dateTo])->where('user_id', $id)->groupBy('ip')->get(); } (MHE)和est.t0(MPC)存储先前的解决方案,并使用它来初始化下一个解决方案。文件ctl.t0(MHE)是用于从MHE应用程序更新初始条件和参数的传输文件。如果est.xfer(本地求解),您可以通过打开运行文件夹来查看这些文件:

remote=False

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

Gekko还使用CSV文件传输值并在下一个mhe.open_folder() mpc.open_folder() 命令之前更新应用程序。 Gekko中的每个变量m.solve()只有一个x。如果您拥有MHE和MPC应用程序,则需要在每个x.value命令之前管理如何为所有变量重新加载x.value和所有选项。即使使用m.solve()函数,在脚本中进行管理也很繁琐。

循环创建MHE和MPC模型

一种更简单的方法是创建两个分别用于MHE和MPC的模型。为方便起见,可以将模型建立在循环(see complete example)中,以便变量和方程式仅定义一次。

MHE with MPC

deepcopy()

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

应用程序特定配置

# 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文件夹est.xfer复制到MPC文件夹{{1 }}。这将使用MPC应用程序中MHE应用程序中更新的状态和参数。