系统动力学作为fmin_slsqp的约束



我一直在尝试用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()

然后将其用作fmin_slsqpf_eqcons.

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新