Я пытался разработать нелинейное прогнозирующее управление моделью (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
или около того. Я думаю, это из-за того, как я реализую ограничения.
Я не уверен, что это лучший способ опубликовать это, но есть ли у кого-нибудь из вас идеи о том, как правильно это реализовать?