为了账号安全,请及时绑定邮箱和手机立即绑定

GEKKO:避免预测中第一个 MV 值的影响

GEKKO:避免预测中第一个 MV 值的影响

胡说叔叔 2023-10-06 11:01:46
我在 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是 1 ,在我的例子中意味着冰箱处于打开状态。但是,温度预测从默认值u0 开始。因此,冰箱中的温度在下一个时间步长中上升,并且仅在下一个时间步长中开始下降。我可以将 value 定义为之前的结果,u但这也不是 100% 正确。我怎样才能避免这种情况?还有其他选择可以让我的预测正确开始吗?我很感激你的帮助:)
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

有一个选项可以计算任何参数或变量(包括 MV)的初始条件:

m.free_initial(u)

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

free_initial(mv)

https://img1.sycdn.imooc.com//651f78e20001bafc10780339.jpg

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)

https://img1.sycdn.imooc.com//651f78ef00015f6810410353.jpg

查看完整回答
反对 回复 2023-10-06
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信