Python 系统动力学作为fmin_slsqp的约束

Python 系统动力学作为fmin_slsqp的约束,python,optimization,constraints,mpc,Python,Optimization,Constraints,Mpc,我一直在尝试用python开发一个非线性模型预测控制(MPC)。该控制器的目标是最小化成本函数,系统动力学作为其约束,如中所述。 对于不熟悉它的人,每个时间步,控制器都会提前N个时间步进行预测,并尝试最小化成本函数,将预测的控制输入(u)和动力学(x)作为优化问题的独立变量 一个问题是自变量在它们之间是相依的,即x(k+1)依赖于x(k)和u(k)等等。 正如我所说的,我必须将动态作为约束来实现。我一直在使用以下代码执行此操作: def constraint(self, ux0, x0):

我一直在尝试用python开发一个非线性模型预测控制(MPC)。该控制器的目标是最小化成本函数,系统动力学作为其约束,如中所述。
对于不熟悉它的人,每个时间步,控制器都会提前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\u slsqp
上的
f_eqcons

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

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


我不确定这里是否是发布这篇文章的最佳方式,但你们中有人对实现这一点的正确方式有什么想法吗?

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


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

如果您不提供雅可比矩阵,数值微分将花费您的成本。此外,您正在使用一个更通用的工具(NLP解算器)。这将无法与更严格的工具竞争(例如,QP、SOCP;鉴于信息稀疏,很难推断是否适合)。您的问题本身非常不完整(代码方面;以及公式的上下文+符号解释)除此之外,很难推荐任何东西:对代码进行概要分析,看看什么是慢的:单个函数的评估;需要的迭代次数等等。