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)
我在 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)