Gekko的时变参数最优控制与固定控制

2024-04-29 04:46:46 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑最优控制问题:

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。。。是否也是控制,是否应该确定


Tags: for间隔定义tfdt情况min控件
1条回答
网友
1楼 · 发布于 2024-04-29 04:46:46

以下是解决此问题的代码:

# 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)=0x(t)=0。如果添加像x(1)=0.75这样的最终条件,则解决方案更有趣

m.Equation(final*(x-0.75)==0)

Optimal Control Solution

如果您希望所有的间隔都是一个值,那么我建议您使用u=m.FV()类型。当您设置u.STATUS=1时,u=m.MV()类型可由优化器在每个时间间隔进行调整。您还可以使用m.options.MV_STEP_HOR=5作为Gekko中所有MV的全局选项来减少自由度,或者u.MV_STEP_HOR=5仅为该MV调整自由度。有more information on the different Gekko types

您可以使用m.time=[0,…,1]设置最终时间,然后使用time finaltf缩放它。问题中的导数也需要除以tf。这里有一个相关的rocket launch problemJennings optimal control problem来最小化最终时间。您还可以设置多个时间间隔,然后将它们与m.Connection()连接

相关问题 更多 >