github仓库
最优化控制
研究动机
在一定的约束条件下达到最优的系统表现,最优是综合分析的最优
代价函数与评判标准
对于单输入单输出系统控制,e(t)为误差, u(t)为输入
当 ∫ 0 t e 2 d t \int_0^te^2dt ∫ 0 t e 2 d t 最小时,就可以保证系统的追踪性很好
当 ∫ 1 t u 2 d t \int_1^tu^2dt ∫ 1 t u 2 d t 最小时,可以保证系统的输入最小,能耗最低
控制过程的代价函数
J = ∫ 1 t ( q e 2 + r u 2 ) d t J = \int_1^t(qe^2+ru^2)dt
J = ∫ 1 t ( q e 2 + r u 2 ) d t
目的就是设计一个u使J达到最小值
q和r就是我们可以调节的参数,如果 q > > r q>>r q > > r 那么就是设计过程更加注重误差,如果 r > > q r>>q r > > q 的话,就是设计过程更加注重能耗最低
对于多输入多输出的系统控制中
d x d t = A x + B u \frac{dx}{dt} = Ax +Bu d t d x = A x + B u x是系统的状态变量
Y = C x Y=Cx Y = C x Y就是系统的输出
代价方程就是
J = ∫ 0 t ( E T Q E + u T R u ) d t J = \int_0^t(E^TQE + u^TRu)dt
J = ∫ 0 t ( E T Q E + u T R u ) d t
一个栗子:
[ y 1 y 2 ] = [ x 1 x 2 ] \begin{bmatrix} y_1 \\ y_2\\ \end{bmatrix} = \begin{bmatrix} x_1 \\ x_2 \\ \end{bmatrix} [ y 1 y 2 ] = [ x 1 x 2 ]
R = [ r 1 r 2 ] = [ 0 0 ] R = \begin{bmatrix}r_1\\r_2\\ \end{bmatrix} = \begin{bmatrix}0\\0\\ \end{bmatrix} R = [ r 1 r 2 ] = [ 0 0 ]
⇒ E = [ e 1 e 2 ] = [ y 1 − r 1 y 2 − r 2 ] = [ x 1 x 2 ] ⇒E = \begin{bmatrix}e_1\\e_2\\\end{bmatrix} = \begin{bmatrix}y_1-r_1\\y_2-r_2\\\end{bmatrix} = \begin{bmatrix}x_1\\x_2\\\end{bmatrix} ⇒ E = [ e 1 e 2 ] = [ y 1 − r 1 y 2 − r 2 ] = [ x 1 x 2 ]
⇒ E T Q E = [ x 1 x 2 ] [ q 1 0 0 q 2 ] [ x 1 x 2 ] = q 1 x 1 2 + q 2 x 2 2 ⇒E^TQE=\begin{bmatrix}x_1&x_2\\\end{bmatrix}\begin{bmatrix}q_1&0\\0&q_2\\\end{bmatrix}\begin{bmatrix}x_1\\x_2\\\end{bmatrix} = q_1x_1^2+q_2x_2^2 ⇒ E T Q E = [ x 1 x 2 ] [ q 1 0 0 q 2 ] [ x 1 x 2 ] = q 1 x 1 2 + q 2 x 2 2
⇒ u T R u = r 1 u 1 2 + r 2 u 2 2 ⇒u^TRu = r_1u_1^2+r_2u_2^2 ⇒ u T R u = r 1 u 1 2 + r 2 u 2 2
Q和R都是调节矩阵, q 1 , q 2 , r 1 , r 2 q_1,q_2,r_1,r_2 q 1 , q 2 , r 1 , r 2 都是权重系数,如果过多的关注 x 1 x_1 x 1 的话,可以适当的将 q 1 , r 1 q_1,r_1 q 1 , r 1 加大,加重权重系数
MPC
通过模型来预测系统在某一时间段内的表现来进行最优化控制,多用于数位控制,多采用离散型状态空间的表达形式 X k + 1 = A X k + B u k X_{k+1} = AX_k+Bu_k X k + 1 = A X k + B u k
分析步骤
在当前时刻,即k时刻
测量/估计当前状态,输出为 Y k Y_k Y k
基于 u k , u k + 1 , … . u k + N u_k,u_{k+1},….u_{k+N} u k , u k + 1 , … . u k + N 来进行最优化, N为预测出空间,N-1为控制范围
代价函数
X k = [ x ( k + 1 ∣ k ) x ( k + 2 ∣ k ) … x ( k + N ∣ k ) ] U k = [ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ] o u t p u t : Y = X r e f e r e n c e : R E = Y − R = X − R X_k=\begin{bmatrix}x(k+1|k)\\x(k+2|k)\\\dots\\x(k+N|k)\end{bmatrix}\\U_k=\begin{bmatrix}u(k|k)\\u(k+1|k)\\\dots\\u(k+N-1|k)\end{bmatrix}\\output:Y=X\\reference:R\\E=Y-R=X-R
X k = ⎣ ⎢ ⎢ ⎢ ⎡ x ( k + 1 ∣ k ) x ( k + 2 ∣ k ) … x ( k + N ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤ U k = ⎣ ⎢ ⎢ ⎢ ⎡ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤ o u t p u t : Y = X r e f e r e n c e : R E = Y − R = X − R
J = ∑ k N − 1 E k T Q E k + U k T R U k + E N T F E N J = ∑_k^{N-1}E_k^TQE_k+U_k^TRU_k+E_N^TFE_N
J = k ∑ N − 1 E k T Q E k + U k T R U k + E N T F E N
其中 E N T F E N E_N^TFE_N E N T F E N 代表了最终的结果,就是期望值,也就是最末一点,终端误差,预测区间最后时刻的误差的代价函数,目的就是找到 J J J 的最小值
并且 Q 与 R 都是对角矩阵
需要找到 u k , u k + 1 , … . u k + N u_k,u_{k+1},….u_{k+N} u k , u k + 1 , … . u k + N 并非要使用所有的 u k u_k u k ,只实施第一个也就是 u k u_k u k ,当时间到达k+1的时候,就要把窗口,也就是预测区间向右移动,每一步都需要去求解一个最优化问题——滚动优化问题
mpc在预测的过程中会考虑到系统的约束
二次规划
一般形式
m i n Z T Q Z + C T Z min\ Z^TQZ+C^TZ
m i n Z T Q Z + C T Z
当Q为对角矩阵时,这个式子为
∑ i = 1 n q i z i 2 \sum_{i=1}^n q_iz_i^2
i = 1 ∑ n q i z i 2
就变成了一个最小二乘的形式
对于一个系统状态方程
x ( k + 1 ) = A x ( k ) + B u ( k ) s t a t e : x = [ x 1 x 2 … x n ] i n p u t : u = [ u 1 u 2 … u n ] x(k+1)=Ax(k)+Bu(k)\\state:x=\begin{bmatrix}x_1\\x_2\\\dots\\x_n\end{bmatrix}\\input:u=\begin{bmatrix}u_1\\u_2\\\dots\\u_n\end{bmatrix}
x ( k + 1 ) = A x ( k ) + B u ( k ) s t a t e : x = ⎣ ⎢ ⎢ ⎢ ⎡ x 1 x 2 … x n ⎦ ⎥ ⎥ ⎥ ⎤ i n p u t : u = ⎣ ⎢ ⎢ ⎢ ⎡ u 1 u 2 … u n ⎦ ⎥ ⎥ ⎥ ⎤
利用增广矩阵来表示k时刻的预测的结果
x ( k + 1 ∣ k ) u ( k ∣ k ) x ( k + 2 ∣ k ) u ( k + 1 ∣ k ) … x ( k + N ∣ k ) u ( k + N − 1 ∣ k ) x(k+1|k)~~~u(k|k)\\x(k+2|k)~~~u(k+1|k)\\\dots\\x(k+N|k)~~~u(k+N-1|k)
x ( k + 1 ∣ k ) u ( k ∣ k ) x ( k + 2 ∣ k ) u ( k + 1 ∣ k ) … x ( k + N ∣ k ) u ( k + N − 1 ∣ k )
其中 N 表示预测的区间
定义
X k = [ x ( k ∣ k ) x ( k + 1 ∣ k ) … x ( k + N ∣ k ) ] U k = [ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ] o u t p u t : Y = X r e f e r e n c e : R = 0 E = Y − R = X − 0 = X X_k=\begin{bmatrix}x(k|k)\\x(k+1|k)\\\dots\\x(k+N|k)\end{bmatrix}\\U_k=\begin{bmatrix}u(k|k)\\u(k+1|k)\\\dots\\u(k+N-1|k)\end{bmatrix}\\output:Y=X\\reference:R=0\\E=Y-R=X-0=X
X k = ⎣ ⎢ ⎢ ⎢ ⎡ x ( k ∣ k ) x ( k + 1 ∣ k ) … x ( k + N ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤ U k = ⎣ ⎢ ⎢ ⎢ ⎡ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤ o u t p u t : Y = X r e f e r e n c e : R = 0 E = Y − R = X − 0 = X
代价函数为
J k → k + N = ∑ i = 0 N − 1 { x ( k + i ∣ k ) T Q x ( k + i ∣ k ) + u ( k + i ∣ k ) T R u ( k + i ∣ k ) } + x ( k + N ) T F x ( k + N ) J_{k\rightarrow k+N}=∑_{i=0}^{N-1} \{x(k+i|k)^TQx(k+i|k)+u(k+i|k)^TRu(k+i|k)\} + x(k+N)^TFx(k+N)
J k → k + N = i = 0 ∑ N − 1 { x ( k + i ∣ k ) T Q x ( k + i ∣ k ) + u ( k + i ∣ k ) T R u ( k + i ∣ k ) } + x ( k + N ) T F x ( k + N )
其中
X ( k + i ∣ k ) T Q X ( k + i ∣ k ) X(k+i|k)^TQX(k+i|k) X ( k + i ∣ k ) T Q X ( k + i ∣ k ) 误差加权和
u ( k + i ∣ k ) T R u ( k + i ∣ k ) u(k+i|k)^TRu(k+i|k) u ( k + i ∣ k ) T R u ( k + i ∣ k ) 输入加权和
x ( k + N ) T F x ( k + N ) x(k+N)^TFx(k+N) x ( k + N ) T F x ( k + N ) 终端误差
在k时刻时
x ( k ∣ k ) = x k 该时刻的初始条件 x ( k + 1 ∣ k ) = A x ( k ∣ k ) + B u ( k ∣ k ) = A x k + B u ( k ∣ k ) x ( k + 2 ∣ k ) = A x ( k + 1 ∣ k ) + B u ( k + 1 ∣ k ) = A 2 x ( k ∣ k ) + A B u ( k ∣ k ) + B u ( k + 1 ∣ k ) x ( k + N ∣ k ) = A N x k + ∑ i = 0 N − 1 A N − 1 − i B u ( k + i ∣ k ) x(k|k)=x_k~~~\text{该时刻的初始条件}\\x(k+1|k)=Ax(k|k)+Bu(k|k)=Ax_k+Bu(k|k)\\x(k+2|k)=Ax(k+1|k)+Bu(k+1|k)=A^2x(k|k)+ABu(k|k)+Bu(k+1|k)\\x(k+N|k)=A^Nx_k+\sum_{i=0}^{N-1}{A^{N-1-i}Bu(k+i|k)}
x ( k ∣ k ) = x k 该时刻的初始条件 x ( k + 1 ∣ k ) = A x ( k ∣ k ) + B u ( k ∣ k ) = A x k + B u ( k ∣ k ) x ( k + 2 ∣ k ) = A x ( k + 1 ∣ k ) + B u ( k + 1 ∣ k ) = A 2 x ( k ∣ k ) + A B u ( k ∣ k ) + B u ( k + 1 ∣ k ) x ( k + N ∣ k ) = A N x k + i = 0 ∑ N − 1 A N − 1 − i B u ( k + i ∣ k )
根据之前定义简化方程
X k = [ I A A 2 … A N ] x k + [ 0 0 . . . 0 B 0 . . . 0 A B B . . . 0 … A N − 1 B A N − 2 B . . . B ] U k X_k=\begin{bmatrix}I\\A\\A^2\\\dots\\A^N\end{bmatrix}x_k+\begin{bmatrix}0&0&...&0\\B&0&...&0\\AB&B&...&0\\\dots\\A^{N-1}B&A^{N-2}B&...&B\end{bmatrix}U_k
X k = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ I A A 2 … A N ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ x k + ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 0 B A B … A N − 1 B 0 0 B A N − 2 B . . . . . . . . . . . . 0 0 0 B ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ U k
可令
M = [ I A A 2 … A N ] C = [ 0 0 . . . 0 B 0 . . . 0 A B B . . . 0 … A N − 1 B A N − 2 B . . . B ] M=\begin{bmatrix}I\\A\\A^2\\\dots\\A^N\end{bmatrix}\\C=\begin{bmatrix}0&0&...&0\\B&0&...&0\\AB&B&...&0\\\dots\\A^{N-1}B&A^{N-2}B&...&B\end{bmatrix}
M = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ I A A 2 … A N ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ C = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 0 B A B … A N − 1 B 0 0 B A N − 2 B . . . . . . . . . . . . 0 0 0 B ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
其中 M M M 为 ( N + 1 ) × 1 (N+1)\times 1 ( N + 1 ) × 1 , C C C 为 ( N + 1 ) × N (N+1)\times N ( N + 1 ) × N 矩阵
则简化为
X k = M x k + C U k X_k=Mx_k+CU_k
X k = M x k + C U k
代价函数为
J k → k + N = ∑ i = 0 N − 1 { x ( k + i ∣ k ) T Q x ( k + i ∣ k ) + u ( k + i ∣ k ) T R u ( k + i ∣ k ) } + x ( k + N ) T F x ( k + N ) J_{k\rightarrow k+N}=∑_{i=0}^{N-1} \{x(k+i|k)^TQx(k+i|k)+u(k+i|k)^TRu(k+i|k)\} + x(k+N)^TFx(k+N)
J k → k + N = i = 0 ∑ N − 1 { x ( k + i ∣ k ) T Q x ( k + i ∣ k ) + u ( k + i ∣ k ) T R u ( k + i ∣ k ) } + x ( k + N ) T F x ( k + N )
其中第一项与最后一项为
x ( k ∣ k ) T Q x ( k ∣ k ) + . . . + x ( k + N − 1 ∣ k ) T Q x ( k + N − 1 ∣ k ) + x ( k + N ∣ k ) T Q x ( k + N ∣ k ) ⇒ [ x ( k ∣ k ) x ( k + 1 ∣ k ) … x ( k + N ∣ k ) ] T [ Q 0 . . . 0 0 Q . . . 0 … 0 0 . . . F ] [ x ( k ∣ k ) x ( k + 1 ∣ k ) … x ( k + N ∣ k ) ] x(k|k)^TQx(k|k)+...+x(k+N-1|k)^TQx(k+N-1|k)+x(k+N|k)^TQx(k+N|k)\\\Rightarrow \begin{bmatrix}x(k|k)\\x(k+1|k)\\\dots\\x(k+N|k)\end{bmatrix}^T\begin{bmatrix}Q&0&...&0\\0&Q&...&0\\\dots\\0&0&...&F\end{bmatrix}\begin{bmatrix}x(k|k)\\x(k+1|k)\\\dots\\x(k+N|k)\end{bmatrix}
x ( k ∣ k ) T Q x ( k ∣ k ) + . . . + x ( k + N − 1 ∣ k ) T Q x ( k + N − 1 ∣ k ) + x ( k + N ∣ k ) T Q x ( k + N ∣ k ) ⇒ ⎣ ⎢ ⎢ ⎢ ⎡ x ( k ∣ k ) x ( k + 1 ∣ k ) … x ( k + N ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤ T ⎣ ⎢ ⎢ ⎢ ⎡ Q 0 … 0 0 Q 0 . . . . . . . . . 0 0 F ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ x ( k ∣ k ) x ( k + 1 ∣ k ) … x ( k + N ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤
令
Q ‾ = [ Q 0 . . . 0 0 Q . . . 0 … 0 0 . . . F ] \overline{Q}=\begin{bmatrix}Q&0&...&0\\0&Q&...&0\\\dots\\0&0&...&F\end{bmatrix}
Q = ⎣ ⎢ ⎢ ⎢ ⎡ Q 0 … 0 0 Q 0 . . . . . . . . . 0 0 F ⎦ ⎥ ⎥ ⎥ ⎤
则上式为
X k T Q ‾ X k X_k^T\overline{Q}X_k
X k T Q X k
中间一项为
u ( k ∣ k ) T R u ( k ∣ k ) + . . . + u ( k + N − 1 ∣ k ) T R u ( k + N − 1 ∣ k ) ⇒ [ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ] T [ R 0 . . . 0 0 R . . . 0 … 0 0 . . . R ] [ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ] u(k|k)^TRu(k|k)+...+u(k+N-1|k)^TRu(k+N-1|k)\\\Rightarrow \begin{bmatrix}u(k|k)\\u(k+1|k)\\\dots\\u(k+N-1|k)\end{bmatrix}^T\begin{bmatrix}R&0&...&0\\0&R&...&0\\\dots\\0&0&...&R\end{bmatrix}\begin{bmatrix}u(k|k)\\u(k+1|k)\\\dots\\u(k+N-1|k)\end{bmatrix}
u ( k ∣ k ) T R u ( k ∣ k ) + . . . + u ( k + N − 1 ∣ k ) T R u ( k + N − 1 ∣ k ) ⇒ ⎣ ⎢ ⎢ ⎢ ⎡ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤ T ⎣ ⎢ ⎢ ⎢ ⎡ R 0 … 0 0 R 0 . . . . . . . . . 0 0 R ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ u ( k ∣ k ) u ( k + 1 ∣ k ) … u ( k + N − 1 ∣ k ) ⎦ ⎥ ⎥ ⎥ ⎤
令
R ‾ = [ R 0 . . . 0 0 R . . . 0 … 0 0 . . . R ] \overline{R}=\begin{bmatrix}R&0&...&0\\0&R&...&0\\\dots\\0&0&...&R\end{bmatrix}
R = ⎣ ⎢ ⎢ ⎢ ⎡ R 0 … 0 0 R 0 . . . . . . . . . 0 0 R ⎦ ⎥ ⎥ ⎥ ⎤
上式化简为
U k T R ‾ U k U_k^T\overline{R}U_k
U k T R U k
故而代价函数为
J k → k + N = X k T Q ‾ X k + U k T R ‾ U k J_{k\rightarrow k+N}=X_k^T\overline{Q}X_k+U_k^T\overline{R}U_k
J k → k + N = X k T Q X k + U k T R U k
由于
X k = M x k + C U k X_k=Mx_k+CU_k
X k = M x k + C U k
则
J k → k + N = ( M x k + C U k ) T Q ‾ ( M x k + C U k ) + U k T R ‾ U k J_{k\rightarrow k+N}=(Mx_k+CU_k)^T\overline{Q}(Mx_k+CU_k)+U_k^T\overline{R}U_k
J k → k + N = ( M x k + C U k ) T Q ( M x k + C U k ) + U k T R U k
分开之后为
J k → k + N = x k T M T Q ‾ M x k + x k T M T Q ‾ C U k + U k T C T Q ‾ M x k + U k T C T Q ‾ C U k + U k T R ‾ U k J_{k\rightarrow k+N}=x_k^TM^T\overline{Q}Mx_k+x_k^TM^T\overline{Q}CU_k+U_k^TC^T\overline{Q}Mx_k+U_k^TC^T\overline{Q}CU_k+U_k^T\overline{R}U_k
J k → k + N = x k T M T Q M x k + x k T M T Q C U k + U k T C T Q M x k + U k T C T Q C U k + U k T R U k
对于第2项和第3项,它们互为转置,并且 Q ‾ \overline{Q} Q 是对称的,所以可以简化合并为
2 x k T M T Q ‾ C U k 2x_k^TM^T\overline{Q}CU_k
2 x k T M T Q C U k
对于第4项和第5项,也可以化简为
U k T ( C T Q ‾ C + R ‾ ) U k U_k^T(C^T\overline{Q}C+\overline{R})U_k
U k T ( C T Q C + R ) U k
可令
G = M T Q ‾ M E = M T Q ‾ C H = C T Q ‾ C + R ‾ G=M^T\overline{Q}M\\E=M^T\overline{Q}C\\H=C^T\overline{Q}C+\overline{R}
G = M T Q M E = M T Q C H = C T Q C + R
最终,代价函数写作
J k → k + N = x k T G x k + 2 x k T E U k + U k T H U k J_{k\rightarrow k+N}=x_k^TGx_k+2x_k^TEU_k+U_k^THU_k
J k → k + N = x k T G x k + 2 x k T E U k + U k T H U k
求解最优解,先求导数为0处,即
∂ J ∂ U k = 0 \frac{\partial J}{\partial U_k}=0
∂ U k ∂ J = 0
f i r s t p a r t : 0 s e c o n d p a r t : 2 E T x k s e c o n d p a r t : ( H + H T ) U k first~part:0\\second~part:2E^Tx_k\\second~part:(H+H^T)U_k
f i r s t p a r t : 0 s e c o n d p a r t : 2 E T x k s e c o n d p a r t : ( H + H T ) U k
即
∂ J k → k + N ∂ U k = 2 E T x k + ( H + H T ) U k = 0 \frac{\partial J_{k\rightarrow k+N}}{\partial U_k}=2E^Tx_k+(H+H^T)U_k=0
∂ U k ∂ J k → k + N = 2 E T x k + ( H + H T ) U k = 0
求得
U k = − 2 ( H + H T ) − 1 E T x k U_k=-2(H+H^T)^{-1}E^Tx_k
U k = − 2 ( H + H T ) − 1 E T x k
验证是否为极小值
∂ 2 J k → k + N ∂ U k 2 = ( H + H T ) T = H T + H \frac{\partial^2 J_{k\rightarrow k+N}}{\partial U_k^2}=(H+H^T)^T=H^T+H
∂ U k 2 ∂ 2 J k → k + N = ( H + H T ) T = H T + H
由于H中的 Q ‾ \overline{Q} Q , C C C , R ‾ \overline{R} R 都为正定阵,所以结果一定是正定的,故得证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 clear; clear all; clc; A = [1 0.1 ; 0 2 ]; n = size (A, 1 ); B = [0.2 1 ; 0.5 2 ]; p = size (B, 2 ); Q = [100 0 ; 0 1 ]; F = [100 0 ; 0 1 ]; R = [1 0 ; 0 0.1 ]; k_step = 100 ; x_k = zeros (n, k_step); x_k(:, 1 ) = [20 ; -20 ]; u_k = zeros (p, k_step); N = 5 ; [E, H] = MPC_Matrices(A, B,Q, R, F, N); for k = 1 : k_step u_k(:, k) = Prediction(x_k(:, k), E, H, N, p); x_k(:, k+1 ) = (A * x_k(:, k) + B * u_k(:, k)); end subplot(2 , 1 , 1 ); hold ;for i = 1 : size (x_k, 1 ) plot (x_k(1 , :)); plot (x_k(2 , :)); end legend ("x1" , "x2" );hold off;subplot(2 , 1 , 2 ); hold ;for i = 1 : size (x_k, 1 ) plot (u_k(1 , :)); plot (u_k(2 , :)); end legend ("u1" , "u2" );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function [E , H] =MPC_Matrices (A,B,Q,R,F,N) n=size (A,1 ); p=size (B,2 ); M=[eye (n);zeros (N*n,n)]; C=zeros ((N+1 )*n,N*p); tmp=eye (n); for i =1 :N rows =i *n+(1 :n); C(rows,:)=[tmp*B,C(rows-n, 1 :end -p)]; tmp= A*tmp; M(rows,:)=tmp; end Q_bar = kron(eye (N),Q); Q_bar = blkdiag (Q_bar,F); R_bar = kron(eye (N),R); G=M'*Q_bar*M; E=C'*Q_bar*M; H=C'*Q_bar*C+R_bar; end
1 2 3 4 5 function u_k = Prediction (x_k,E,H,N,p) U_k = zeros (N*p,1 ); U_k = quadprog(H,E*x_k); u_k = U_k(1 :p,1 ); end