我一直在尝试在 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_eqcons
on fmin_slsqp
。
x_next
基本上,属于自变量的动力学和状态之间的差异x
必须为零。
真正的问题是,N=100
例如,我得到 500 个自变量,并且计算优化需要很长时间。我的意思是,我什至不能得到结果,我将不得不使用,至少N=500
左右。我认为这是因为我实施约束的方式。
我不确定这是否是发布此内容的最佳方式,但是你们中的任何人对实现此内容的正确方法有一些想法吗?