其他分享
首页 > 其他分享> > MPC模型预测控制及在Matlab中实现函数定义

MPC模型预测控制及在Matlab中实现函数定义

作者:互联网

基于b站DR_CAN老师的MPC控制视频【MPC模型预测控制器】4_数学建模推导--Matlab代码详解_哔哩哔哩_bilibili的学习分享如下:

一、研究目的

        在约束条件(物理限制)下达到最优的系统表现。

        1.对于单输入单输出(SISO)系统:

        

                         \int _{0}^{t}e^{2}dt越小,跟踪能力越强;

                        \int _{0}^{t}u^{2}dt越小,输入越小,能耗越低。(用平方项来衡量e、u的绝对值大小)

        2.代价函数Cost Function

                J=\int _{0}^{t}qe^{2}+ru^{2}dt\rightarrow minJ,通过设计u,寻找最小的J的过程为最优化

        其中q,r为调节参数

                ①若q>>r,则误差e对于设计系统的影响权重更大

                ②若r>>q,则系统设计更看重输入u

        3.对于多输入多输出(MIMO)系统:

                状态空间:\left\{\begin{matrix} \frac{dX}{dt}=AX+BU \\ Y=CX \end{matrix}\right.

                 代价函数:J=\int _{0}^{\infty }E^{T}QE+U^{T}RUdt

        具体地,例如已知系统\frac{d}{dt}\begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix} =A\begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix}+B \begin{bmatrix} u_{1}\\ u_{2} \end{bmatrix},     \begin{bmatrix} y_{1}\\ y_{2} \end{bmatrix}= \begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix},系统的参考目标R=\begin{bmatrix} r_{1}\\ r_{2} \end{bmatrix}= \begin{bmatrix} 0\\ 0 \end{bmatrix},则误差矩阵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^{T}QE=\begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix}^{T}\begin{bmatrix} q_{1}& 0\\ 0& q_{2} \end{bmatrix}\begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix} =q_{1}x_{1}^{2}+q_{2}x_{2}^{2}

                U^{T}RU=\begin{bmatrix} u_{1}\\ u_{2} \end{bmatrix}^{T}\begin{bmatrix} r_{1}& 0\\ 0& r_{2} \end{bmatrix}\begin{bmatrix} u_{1}\\ u_{2} \end{bmatrix} =r_{1}u_{1}^{2}+r_{2}u_{2}^{2}

                其中,Q,R为调节矩阵,q_{1},q_{2},r_{1},r_{2}为系统最优时的权重系数。

二、基本概念

        MPC(Model Predictive Control)模型预测控制:通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,用离散的状态空间表达,即X_{k+1}=AX_{k}+BU_{k}

实现步骤:

Step1:估计/测量读取当前k时刻的系统状态

Step2:基于u_{k},u_{k+1},...,u_{k+N}的选择进行最优化

                代价函数:J=\sum_{k}^{N-1}E_{k}^{T}QE_{k}+U_{k}^{T}RU_{k}+E_{N}^{T}FE_{N}

                其中,E_{k}为k时刻的误差矩阵,U_{k}为k时刻的输入矩阵,E_{N}为终端(N时刻)误差,Q,R为调节矩阵,F为终端误差权重矩阵

Step3:实施一步u_{k}(即从t=k运行到t=k+1即可)

                下一次从t=k+1时重复Step1到3,重新预测u_{k+1},...,u_{k+N+1}的输入

                即每一轮的预测都是预测区间和控制区间整体右移一个单位,整个过程是向右滚动的,

                称为滚动优化控制(Receding Horizon Control),系统对控制器的计算能力要求高。

三、MPC最优化建模

(对于模型求解的原理是基于二次规划(Quadratic Programming)模型的求解,通过调用Matlab、Python等二次规划函数求解,下面的代码用到Matlab的quadprog函数)

1.如何建立二次规划模型

        已知系统模型:X(k+1) = AX(k) + BU(k),输出Y=X,参考目标R=0

        其中,X(k+1) 为k+1时刻的状态变量,X(k) 为k时刻的状态变量,U(k)为k时刻的输入变量。

        在k时刻:

                ①设u(k+i | k)表示在k时刻预测的第k+i时刻的输入值,在预测区间N内,有u(k | k),u(k+1| k),...,u(k+N-1 | k),即U_{k}=\begin{bmatrix} u(k|k)\\ u(k+1|k)\\ ...\\ u(k+N-1|k) \end{bmatrix}

                同理,X_{k}=\begin{bmatrix} x(k|k)\\ x(k+1|k)\\ ...\\ x(k+N|k) \end{bmatrix},x(k+i | k)表示在k时刻预测的第k+i时刻的系统状态

                ②误差E=Y-R=X-0=X

                代价方程J=\sum_{i=0}^{N-1}x(k+i|k)^{T}Qx(k+i|k)+u(k+i|k)^{T}Ru(k+i|k)+x(k+N)^{T}Fx(k+N)

J=\sum(误差加权和 + 输入加权和 + 终端误差项)

                ③初始条件(k时刻)  x(k|k) = x_{k}

                   预测的k+1时刻  x(k+1|k) = Ax(k|k)+Bu(k|k)=Ax_{k}+Bu(k|k)

                   预测的k+2时刻x(k+2|k) = Ax(k+1|k)+Bu(k+1|k)=Ax_{k}^{2}+ABu(k|k)+Bu(k+1|k)

                   预测的k+N时刻x(k+N|k) =Ax_{k}^{N}+A^{N-1}Bu(k|k)+...+Bu(k+N-1|k)

                   综上,X_{k}=\begin{bmatrix} x(k|k)\\ x(k+1|k)\\ x(k+2|k)\\ ...\\ x(k+N|k) \end{bmatrix}=\begin{bmatrix} I\\ A\\ A^{2}\\ ...\\ A^{N} \end{bmatrix}x_{k}+\begin{bmatrix} 0 &0 &... &0 \\ B & 0 & ... & 0\\ AB &B &... &... \\ ... & ... & ... &0 \\ A^{N-1}B& A^{N-2}B &... & B \end{bmatrix}\begin{bmatrix} u(k|k)\\ u(k+1|k))\\ ...\\ ...\\ u(k+N-1|k) \end{bmatrix}

                简化为X_{k}=Mx_{k}+CU_{k}          (1)

                X_{k}为k时刻预测的一段时间内的所有状态值的组合向量,x_{k}为已知的t=k这一个时刻的状态值,M=\begin{bmatrix} I\\ A\\ A^{2}\\ ...\\ A^{N} \end{bmatrix},C=\begin{bmatrix} 0 &0 &... &0 \\ B & 0 & ... & 0\\ AB &B &... &... \\ ... & ... & ... &0 \\ A^{N-1}B& A^{N-2}B &... & B \end{bmatrix}

                在t=k时刻的代价矩阵可表述为J_{k}=X_{k}^{T}QX_{k}+U_{k}^{T}RU_{k}           (2)

                将式(1)代入(2)得J_{k}=x_{k}^{T}M^{T}\bar{Q}Mx_{k}+x_{k}^{T}M^{T}\bar{Q}CU_{k}+U_{k}^{T}C^{T}\bar{Q}Mx_{k}+u_{k}^{T}C^{T}\bar{Q}Cu_{k}+U_{k}^{T}\bar{Q}U_{k}

                其中,\bar{Q},\bar{R}为增广矩阵,\bar{Q}=\begin{bmatrix} Q & & & \\ & ... & & \\ & &Q & \\ & & & F \end{bmatrix},\bar{R}=\begin{bmatrix} R & & & \\ & R & & \\ & &... & \\ & & & R \end{bmatrix}

                令M^{T}\bar{Q}M=G,C^{T}\bar{Q}M=E,C^{T}\bar{Q}C+\bar{R}=H

                则J_{k}=x_{k}^{T}Gx_{k}+2x_{k}^{T}EU_{k}+U_{k}^{T}HU_{k},该简化形式可以清晰看出J_{k}与初始条件x_{k}及输入U_{k}的关系。

四、建模实例

                对于系统x(k+1) = Ax(k) + Bu(k),系统的维度为:x(k):n×1 ; A:n×n ; B:n×p ; u(k):p×1,运算过程中各矩阵的维度有:

                 在Matlab中定义函数:

function [M,C,Q_bar,R_bar,G,E,H,U_k] = MPC_Zero_Ref(A,B,N,x_k,Q,R,F)

%%%%%%%%%%%建立一个以0为参考目标的MPC求解函数
%%%%%%%%%%%其中,状态矩阵A,输入矩阵B系统维度N,初始条件x_k,权重矩阵Q,R及终端误差矩阵F为输入
%%%%%%%%%%%输出中U_k为所求控制器,其余为简化过程中引入的中间变量

n=size(A,1); %A是n×n矩阵,求n
p=size(B,2); %B是n×p矩阵,求p
M=[eye(n);zeros(N*n,n)];%初始化M矩阵,M矩阵是(N+1)n × n的,
                        %它上面是n × n个“I”,这一步先把下半部分写成0
C=zeros((N+1)*n,N*p);%初始化C矩阵,这一步令它有(N+1)n × NP个0
%定义M和C
tmp=eye(n);%定义一个n × n的I矩阵
for i=1:N%循环,i从1到N
    rows = i*n+(1:n);%定义当前行数,从i×n开始,共n行
    C(rows,:)=[tmp*B,C(rows-n,1:end-p)];%将C矩阵填满
    tmp=A*tmp;%每一次将tmp左乘一次A
    M(rows,:)=tmp;%将M矩阵写满
end
%定义Q_bar
S_q=size(Q,1);%找到Q的维度
S_r=size(R,1);%找到R的维度
Q_bar=zeros((N+1)*S_q,(N+1)*S_q);%初始化Q_bar为全0矩阵
for i=0:N
    Q_bar(i*S_q+1:(i+1)*S_q,i*S_q+1:(i+1)*S_q)=Q;%将Q写到Q_bar的对角线上
end
Q_bar(N*S_q+1:(N+1)*S_q,N*S_q+1:(N+1)*S_q)=F;%将F放在最后一个位置

%定义R_bar
R_bar=zeros(N*S_r,N*S_r);%初始化R_bar为全0矩阵
for i=0:N-1
    R_bar(i*S_r+1:(i+1)*S_r,i*S_r+1:(i+1)*S_r)=R;
end

%求解
G=M'*Q_bar*M;%G
E=C'*Q_bar*M;%E
H=C'*Q_bar*C+R_bar;%H

%最优化
f=(x_k'*E')';%定义f矩阵
U_k=quadprog(H,f);%用二次规划求解最优化U_k
end

标签:bar,定义,预测,矩阵,Matlab,时刻,输入,MPC
来源: https://blog.csdn.net/m0_46427461/article/details/122609776