如何解决带控制变量的 GEKKO 最优控制
大家好,我写了下面的代码,通常变量“y”应该收敛到“z_obj”,但事实并非如此。这是我得到的代码和情节
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
类型的 DMAXLO
和 m.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()
创建额外的方程。在 documentation、Quick Start guide 和 #17 of 18 in the Gekko examples 中还有关于 m.MV()
和 m.CV()
类型的附加信息。
我设法解决了它..我必须摆脱 u.STATUS =1 并保持 u.FSTATUS=1 。但我不知道为什么!请解释一下!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。