我当前正在使用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
答案 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)中,以便变量和方程式仅定义一次。
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应用程序中更新的状态和参数。