自编Matlab代码实现MPC基本算法

自编Matlab代码实现MPC的基本算法

本文属于入门级的教程,适合刚入坑的萌新看。在写之前我在网上找了一下相关的文章,发现没有一个写得很直观的答案,刚好最近在研究MPC,于是决定自己写一个,针对最简单的线性约束系统,推导其优化的过程原理,揭示其简单的结构。另外关于MPC的理论,可以自行参考相关教材,这里不再赘述。

首先要介绍一下一个基于Matlab的工具MPT3,这是一个优化工具箱,同样也能调用MPC,感兴趣的同学可以自己点进去看一下。今天要用的模型也是来自这里面的一个demo,可以参考这个网址https://www.mpt3.org/UI/RegulationProblem

一、模型准备

这里用最简单的线性模型来进行解释,用差分方程进行描述如下:
x + = A x + B u x^{+}=Ax+Bu x+=Ax+Bu
其中, A = [ 1 1 0 1 ] A=\begin{bmatrix}1& 1\\ 0& 1\end{bmatrix} A=[1011] B = [ 1 0.5 ] B=\begin{bmatrix} 1\\ 0.5\end{bmatrix} B=[10.5]. 初始状态 x 0 = [ 4 0 ] ′ x_0=\begin{bmatrix} 4 &0\end{bmatrix}' x0=[40]. 然后是状态量以及控制量的约束限制:
[ − 5 − 5 ] ≤ x ≤ [ 5 5 ] , − 1 ≤ u ≤ 1 \begin{bmatrix} -5\\ -5\end{bmatrix}\leq x\leq \begin{bmatrix} 5\\ 5\end{bmatrix}, -1\leq u\leq1 [55]x[55],1u1
一般的线性MPC中用的是二次优化,分别包含了针对状态量的代价函数 x k ′ Q x k x_k'Qx_k xkQxk项以及针对控制量的代价函数 u k ′ R u k u_k'Ru_k ukRuk:
J ( k , N p ) = m i n ∑ t = k k + N p ( x t ′ Q x t + u t ′ R u t ) J_{(k,N_p)}=\mathrm {min} \sum_{t=k}^{k+N_p}(x_t'Qx_t+u_t'Ru_t) J(k,Np)=mint=kk+Np(xtQxt+utRut)
表示的是在时刻 t t t,滚动时域步长为 N p N_p Np的优化目标函数,目的是要让状态量 x x x以及控制量 u u u尽量的小,即使用最少的能量使系统状态量尽快稳定到零点(或者是稳定到某一个状态,这也是一般优化问题的目的)。其中代价系数矩阵的取值分别为:
Q = [ 1 0 0 1 ] , R = 1 Q=\begin{bmatrix}1& 0\\ 0& 1\end{bmatrix}, R=1 Q=[1001],R=1
其取值可以根据设计要求在状态量与控制量的大小之间平衡。预测时域的长度选为 N p = 5 N_p=5 Np=5,模型及参数准备完毕开始进行下一步。

二、两个关键问题

2.1 未来状态量的变量替换

为了使用Matlab中的quadprog函数进行在线二次优化,求解Matlab中的优化问题,需要对优化目标进行转换,变换为关于控制量 u t u_t ut的优化函数,回顾优化目标函数,里面包含了在 N p N_p Np步后的未来系统状态量 x t x_t xt,这里需要将其描述为关于优化目标 u t u_t ut的函数。由于是线性系统,通过不停的迭代可以很容易得到 x t x_t xt关于 u t u_t ut的表达式:
x k + 1 ∣ k = A x k + B u k x k + 2 ∣ k = A x k + 1 ∣ k + B u k + 1 = A 2 x k + A B u k + B u k + 1 … … x k + N p ∣ k = A x k + N p − 1 ∣ k + B u k + N p − 1 = A N p

评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值