fmin\u slsqp的系统动力学约束

2024-09-28 03:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试用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上的fmin_slsqp

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

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

我不知道这里是否是最好的方式张贴这一点,但你们有任何人对一个适当的方法来实现这一点的想法


Tags: 函数模型self目标系统方式时间动态
1条回答
网友
1楼 · 发布于 2024-09-28 03:19:14

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

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

相关问题 更多 >

    热门问题