有没有办法在同一个gekkoclass中用MHE更新MPC?
Is there a way to update MPC with MHE in the same gekko class?
我目前正在使用 MPC 使 TCLab 加热器达到某个设定点温度。我试图让 MHE 每 50 秒更新一次某些参数值。我有一个以前的 MPC 模型,效果非常好,我试图在我的主循环中添加一个部分,让它切换以提高某些值,然后切换回 MPC 模式。我看到其他人做同样的问题已经为 MPC 和 MHE 制作了一个 gekko class 然后让他们一起工作,但是有没有一种方法可以在我当前的 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 应用程序的初始条件和参数。你可以打开运行文件夹查看这些文件 if remote=False
(local solve):
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 应用程序的更新状态和参数。
我目前正在使用 MPC 使 TCLab 加热器达到某个设定点温度。我试图让 MHE 每 50 秒更新一次某些参数值。我有一个以前的 MPC 模型,效果非常好,我试图在我的主循环中添加一个部分,让它切换以提高某些值,然后切换回 MPC 模式。我看到其他人做同样的问题已经为 MPC 和 MHE 制作了一个 gekko class 然后让他们一起工作,但是有没有一种方法可以在我当前的 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 应用程序的初始条件和参数。你可以打开运行文件夹查看这些文件 if remote=False
(local solve):
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 应用程序的更新状态和参数。