#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()
.