Я пытался разработать нелинейную модель прогнозирующего управления (MPC) в Python.Целью этого контроллера является минимизация функции стоимости с учетом динамики системы в качестве ее ограничений, как описано в 1 .
Для тех, кто не знаком с ней, каждый шаг по времени контроллер делает прогнозN шагов вперед и пытается минимизировать функцию стоимости, имеющую управляющие входы (u) и динамику (x) прогнозов в качестве независимых переменных задачи оптимизации.
Одна проблема заключается в том, что независимые переменные будут зависимымимежду ними, т. е. x (k + 1) зависит от x (k) и u (k) и т. д.
Как я уже сказал, я должен реализовать динамику в качестве ограничений.Я делал это с помощью следующего кода:
def constraint(self, ux0, x0):
u = ux0[0:self.N]
x = ux0[self.N:].reshape(self.N, 4).T
x_next = x0
for i in range(0, self.N-1):
x0 = self.next_state(x0, u[i])
x_next = np.c_[x_next, x0]
return (x-x_next).T.flatten()
И затем использовал это как f_eqcons
на fmin_slsqp
.
По сути, разница между динамикой x_next
а состояние, принадлежащее независимым переменным x
, должно быть равно нулю.
Реальная проблема заключается в том, что, например, при N=100
я получаю 500 независимых переменных, и для вычисления оптимизации требуется вечность.Я имею в виду, я не могу даже получить результаты, и мне придется использовать, по крайней мере N=500
или около того.Я думаю, что это из-за того, как я реализую ограничения.
Я не уверен, что это лучший способ опубликовать это, но есть ли у кого-нибудь из вас идеи о том, как правильно реализовать это?