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

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

Optimal Control Solution

如果您希望所有间隔均为一个值,则建议您使用u=m.FV()类型。设置u=m.MV()时,优化器会在每个间隔调整u.STATUS=1类型。您还可以使用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]设置最终时间,然后使用最终时间tf对其进行缩放。问题中的导数也需要除以tf。这是相关的rocket launch problemJennings optimal control problem,可以最大程度地减少最终时间。您还可以设置多个时间间隔,然后将其与m.Connection()连接。