GEKKO:避免在预测中暗示第一个 MV 值

GEKKO: avoid the implication of the first MV Value in prediction

我在 MPC 模式下使用 GEKKO (Solver APOPT)。我定义我的操纵变量如下:

u = m.MV(lb=0, ub=1, integer=True)
u.STATUS = 1 

我故意不使用:

u = m.MV(value=1 ,lb=0, ub=1, integer=True)
u.STATUS = 1 

或:

u = m.MV(value=0 ,lb=0, ub=1, integer=True)
u.STATUS = 1 

因为我不知道下一个决定是什么,我希望我的优化器来定义它。显然当你没有定义 u 的值时,GEKKO 给它一个默认值 0.

问题是 u 的这个值用于我的模型预测以及其他不希望的计算(见图)。如您所见,u 的新值在我的例子中表示冰箱打开。但是,温度预测以默认值 u 开始,即 0。因此,冰箱中的温度会在下一个时间步上升,并且只会在下一个时间步开始下降。我可以将值定义为 u 的先前结果,但这也不是 100% 正确的。

我怎样才能避免这种情况?还有其他选项可以让我的预测开始正确吗?

感谢您的帮助:)

包含 MV 的任何参数或变量都有一个 option to calculate the initial condition

m.free_initial(u)

这是一个简单的应用程序,显示了此函数对解决方案的影响。

free_initial(mv)

import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False)
m.time = np.linspace(0,10,11)
mv = m.MV(value=0,lb=0,ub=1,integer=True);    mv.STATUS=1
cv = m.CV(value=1); cv.SPHI=0.6; cv.SPLO=0.4; cv.STATUS=1
m.Equation(3*cv.dt()+(cv-1)==-0.8*mv)
m.free_initial(mv)
m.options.IMODE=6; m.options.CV_TYPE=1
m.options.NODES=3; m.options.MV_TYPE=0
m.options.SOLVER =1
m.solve(disp=False)

import matplotlib.pyplot as plt
plt.step(m.time,mv,'r.',markersize=5,where='post',label='MV')
plt.plot(m.time,cv,'b:',label='CV')
plt.plot([0,10],[0.6,0.6],'k:',label='SP Range')
plt.plot([0,10],[0.4,0.4],'k:')
plt.legend(); plt.xlabel('Time')
plt.show()

没有free_initial(mv)