[英]Optimal control with time varying parameters and fixed control in Gekko
考虑如下最优控制问题:
min int(0,1) x(t).u(t)+u(t)**2
x.dt()= x(t)+u(t), x(0)=1
0 <= u(t) <= t**2+(1-t)**3 for 0<=t<=1
我的第一个问题是如何在 Gekko 中定义控制的上限。 此外,假设我们想将此问题与在规划范围内控制不变的情况进行比较,即u(0)=...=u(t)=...=u(1)
。 我们如何定义它?
在另一种情况下,如何在不同的子区间内有固定但未知的控制? 例如,在[0,t1]
,控制应该是固定的,在[t1,t2]
控制应该是固定的,但可以与[0,t1]
控制不同(例如 t1=0.5, t2=1, Tf=t2 =1)。
我很高兴知道是否可以研究 t1, t2, ... 也是控制和应该确定的情况?
这是解决问题的代码:
# min int(0,1) x(t).u(t)+u(t)**2
# x.dt()= x(t)+u(t), x(0)=1
# 0 <= u(t) <= t**2+(1-t)**3 for 0<=t<=1
import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False); m.time=np.linspace(0,1,101)
t = m.Var(0); m.Equation(t.dt()==1)
ub = m.Intermediate(t**2+(1-t)**3)
u = m.MV(0,lb=0,ub=1); m.Equation(u<=ub)
u.STATUS=1; u.DCOST=0; m.free_initial(u)
x = m.Var(0); m.Equation(x.dt()==x+u)
p = np.zeros(101); p[-1]=1; final=m.Param(p)
m.Minimize(m.integral(x*u+u**2)*final)
m.options.IMODE=6; m.options.NODES=3; m.solve()
print(m.options.OBJFCNVAL)
import matplotlib.pyplot as plt
plt.plot(m.time,x.value,'b--',label='x')
plt.plot(m.time,u.value,'k-',label='u')
plt.plot(m.time,ub.value,'r--',label='ub')
plt.legend()
plt.show()
该解决方案不是很有趣,因为最佳目标是u(t)=0
和x(t)=0
。 如果您添加像x(1)=0.75
这样的最终条件,那么解决方案会更有趣。
m.Equation(final*(x-0.75)==0)
如果您希望所有间隔都为一个值,那么我建议您使用u=m.FV()
类型。 当您设置u.STATUS=1
时,优化器可以在每个时间间隔调整u=m.MV()
类型。 您还可以使用m.options.MV_STEP_HOR=5
作为 Gekko 中所有 MV 的全局选项来降低自由度,否则u.MV_STEP_HOR=5
仅针对该 MV 进行调整。 有更多关于不同 Gekko 类型的信息。
您可以使用 m.time = [0,...,1] 设置最终时间,然后使用 time final tf
对其进行缩放。 您问题中的导数也需要除以tf
。 这是一个相关的火箭发射问题或最小化最终时间的詹宁斯最优控制问题。 您还可以设置多个时间间隔,然后使用m.Connection()
将它们连接起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.