Системная динамика как ограничение fmin_slsqp - PullRequest
0 голосов
/ 20 мая 2018

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

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

1 Ответ

0 голосов
/ 21 мая 2018

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

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

...