gekko - 有没有办法在同一个 Gekko 类中使用 MHE 更新 MPC?

标签 gekko

我目前正在使用 MPC 让 TCLab 加热器达到某个设定点温度。我试图让 MHE 每 50 秒更新一次某些参数值。我有一个以前的 MPC 模型,效果很好,我尝试在我的主循环中添加一个部分,让它切换以改善某些值,然后切换回 MPC 模式。我已经看到其他人在做同样的问题时为 MPC 和 MHE 制作了一个壁虎类,然后让它们一起工作,但是有没有一种方法可以在我当前的 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 促进了 MHE 和 MPC 之间的信息传输,但将它们组合到单个应用程序中并不是当前的功能。热启动文件 est.t0 (MHE) 和 ctl.t0 (MPC) 存储先前的解决方案并使用它来初始化下一个解决方案。一个文件 est.xfer (MHE) 是一个传输文件,用于更新 MHE 应用程序的初始条件和参数。如果remote=False,您可以通过打开运行文件夹来查看这些文件。 (本地解决):

mhe.open_folder()
mpc.open_folder()

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

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

在循环中创建 MHE 和 MPC 模型

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

MHE with 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 和 MPC 应用程序之间传输值,那么一种选择是复制 est.xfer MHE 文件夹中的文件 mhe.path进入 MPC 文件夹 mpc.path .这将在 MPC 应用程序中使用来自 MHE 应用程序的更新状态和参数。

关于gekko - 有没有办法在同一个 Gekko 类中使用 MHE 更新 MPC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58325121/

相关文章:

python - 神经网络直线——GEKKO

python - 调用 Gekko solve 给出 TypeError : object of type 'int' has no len()

python - 如何将 GEKKO 中的值转换为 float

python - 延迟调用应该放在 gekko 代码中的什么位置?

python - 如何为实时系统实现 Python Gekko 应用程序?

python - 使用 GEKKO 模拟具有巨大阵列的状态空间方程

python - Gekko 非线性优化,约束函数评估 if 语句时出现对象类型错误

python - 通过 L0 范数/GEKKO 中非零元素的数量约束混合整数非线性优化问题

python - 在 Gekko Optimizer 中使用 cspline 插值