微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带控制变量的 GEKKO 最优控制

如何解决带控制变量的 GEKKO 最优控制

大家好,我写了下面的代码,通常变量“y”应该收敛到“z_obj”,但事实并非如此。这是我得到的代码和情节

enter image description here

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt  

m = GEKKO()

m.time = np.linspace(0,10,11)
z=np.repeat(20,11)
z_obj=m.Param(value=z)
y = m.Var(14)
u=m.CV(lb=0)
u.STATUS=1
u.FSTATUS=1
t = m.Param(value=m.time)
m.Equation(y.dt()==u)
m.Equation(u.dt()<=1)
m.Equation(u.dt()>=-5)
m.Obj((y-z_obj)**2)
m.options.IMODE=6
m.solve(disp=False)
plt.plot(m.time,y.value)
plt.xlabel('time')
plt.ylabel('y')
plt.show()

解决方法

要对操纵变量实施变化率约束,请使用 DMAXHI 类型的 DMAXLOm.MV() 选项。

Rate of Change Limit on the MV

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt  

m = GEKKO()

m.time = np.linspace(0,10,11)
z=20
y = m.Var(14)
u=m.MV(lb=0)
u.STATUS=1; u.DMAXHI=1; u.DMAXLO=-5
t = m.Param(value=m.time)
m.Equation(y.dt()==u)
m.Obj((y-z)**2)
m.options.IMODE=6
m.solve(disp=False)
plt.subplot(2,1,1)
plt.plot(m.time,y.value,'r--',label='y')
plt.ylabel('y'); plt.legend()
plt.subplot(2,2)
plt.plot(m.time,u.value,'b-',label='u')
plt.ylabel('u'); plt.legend()
plt.xlabel('time')
plt.show()

您当前的方法是创建另一个 m.CV(),以便您拥有可用的导数。这也有效,但会为 m.CV() 创建额外的方程。在 documentationQuick Start guide#17 of 18 in the Gekko examples 中还有关于 m.MV()m.CV() 类型的附加信息。

,

我设法解决了它..我必须摆脱 u.STATUS =1 并保持 u.FSTATUS=1 。但我不知道为什么!请解释一下!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。