Оптимальное управление с изменяющимися во времени параметрами и фиксированным управлением в Gekko

#python #gekko

#python #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) . Как мы можем это определить?

В другом случае, как возможно иметь фиксированный, но неизвестный контроль в разных подинтервалах? Например, in [0,t1] , управление должно быть фиксированным, in [t1,t2] управление должно быть фиксированным, но может отличаться от управления in [0,t1] (например, t1 = 0,5, t2 = 1, Tf = t2 = 1).

Я был бы благодарен узнать, возможно ли изучить случай, когда t1, t2, … также являются контролем и должны быть определены?

Ответ №1:

Вот код, который дает решение проблемы:

 # 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 and x(t)=0 . Если вы добавите окончательное условие, например x(1)=0.75 , тогда решение будет более интересным.

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

Оптимальное решение для управления

Если вы хотите, чтобы весь интервал был одним значением, я рекомендую вам использовать u=m.FV() тип. u=m.MV() Тип настраивается оптимизатором с каждым заданным интервалом u.STATUS=1 . Вы также можете уменьшить степени свободы с m.options.MV_STEP_HOR=5 помощью опции as a global в Gekko для всех MV или u.MV_STEP_HOR=5 настроить ее только для этого MV. Существует больше информации о различных типах Gekko.

Вы можете установить конечное время, используя m.time = [0, …,1], а затем масштабировать его с помощью time final tf . Производные в вашей задаче tf также необходимо разделить на. Вот связанная с этим проблема запуска ракеты или проблема оптимального управления Дженнингса, которая минимизирует конечное время. Вы также можете настроить несколько временных интервалов, а затем соединить их m.Connection() .