0

我一直在尝试在 python 中开发非线性模型预测控制(MPC)。该控制器的目标是最小化成本函数,系统动力学作为它的约束,如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_eqconson fmin_slsqp

x_next基本上,属于自变量的动力学和状态之间的差异x必须为零。

真正的问题是,N=100例如,我得到 500 个自变量,并且计算优化需要很长时间。我的意思是,我什至不能得到结果,我将不得不使用,至少N=500左右。我认为这是因为我实施约束的方式。

我不确定这是否是发布此内容的最佳方式,但是你们中的任何人对实现此内容的正确方法有一些想法吗?

4

1 回答 1

0

如果您的动力学是线性的,您可以简单地在CVXPY中制定问题并将其解决为 QP。它非常直观(代码读取为数学。您可以按照此示例示例开始。

如果动态是非线性的,我建议您使用CASADI。它允许定义非线性动力学并将它们转换为非线性 MPC 问题。看看这个小例子,他们的 wiki 了解更多细节。

于 2018-05-21T14:58:58.423 回答