Системная динамика как ограничения fmin_slqp

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

Я не уверен, что это лучший способ опубликовать это, но есть ли у кого-нибудь из вас идеи о том, как правильно это реализовать?


person João    schedule 20.05.2018    source источник
comment
Если вы не предоставите jacobian, вам будет стоить численное различие. Кроме того, вы используете один из наиболее общих инструментов (решатели НЛП). которые не будут конкурировать с более ограниченными инструментами (например, QP, SOCP; трудно сделать вывод, если это соответствует такой скудной информации). Ваш вопрос сам по себе очень неполный (с точки зрения кода, а также интерпретация контекста + обозначения вашей формулы), и трудно порекомендовать что-либо, кроме: профилируйте свой код, чтобы увидеть, что медленно: single-function-eval; количество необходимых итераций и так далее.   -  person sascha    schedule 20.05.2018


Ответы (1)


Если ваша динамика линейна, вы можете просто сформулировать проблему в CVXPY и решить ее как QP. Это очень интуитивно понятно (код читается как математика. Вы можете следовать этому примеру пример для начала.

Если динамика нелинейная, я предлагаю вам использовать CASADI. Это позволяет определить нелинейную динамику и представить ее в нелинейной задаче MPC. Посмотрите этот небольшой пример, их вики Больше подробностей.

person bstellato    schedule 21.05.2018