系统动力学作为fmin_slsqp的约束

时间:2018-05-20 17:02:00

标签: python optimization constraints mpc

我一直在尝试在python中开发非线性模型预测控制(MPC)。该控制器的目标是最小化成本函数,系统动力学作为约束,如1中所述。
对于那些不熟悉它的人,每个时间步,控制器提前N步进行预测,并尝试最小化具有控制输入(u)和预测的动态(x)作为优化问题的独立变量的成本函数。 / p>

一个问题是独立变量将依赖于它们,即x(k + 1)取决于x(k)和u(k)等等。
正如我所说,我必须将动态实现为约束。我已经使用以下代码这样做了:

how='outer'

然后将其用作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,我获得了500个独立变量,并且需要永远计算优化。我的意思是,我甚至无法获得结果,我将不得不使用,至少N=100左右。我认为这是因为我实施约束的方式。

我不确定这是否是发布此内容的最佳方式,但您是否有任何想法以正确的方式实现此目的?

1 个答案:

答案 0 :(得分:0)

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

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