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

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

一、研究目的

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

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

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

                         MPC模型预测控制及在Matlab中实现函数定义越小,跟踪能力越强;

                        MPC模型预测控制及在Matlab中实现函数定义越小,输入越小,能耗越低。(用平方项来衡量e、u的绝对值大小)

        2.代价函数Cost Function

                MPC模型预测控制及在Matlab中实现函数定义,通过设计u,寻找最小的J的过程为最优化

        其中q,r为调节参数

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

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

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

                状态空间:MPC模型预测控制及在Matlab中实现函数定义

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

        具体地,例如已知系统MPC模型预测控制及在Matlab中实现函数定义,     MPC模型预测控制及在Matlab中实现函数定义,系统的参考目标MPC模型预测控制及在Matlab中实现函数定义,则误差矩阵MPC模型预测控制及在Matlab中实现函数定义

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

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

                其中,Q,R为调节矩阵,MPC模型预测控制及在Matlab中实现函数定义,MPC模型预测控制及在Matlab中实现函数定义,MPC模型预测控制及在Matlab中实现函数定义,MPC模型预测控制及在Matlab中实现函数定义为系统最优时的权重系数。

二、基本概念

        MPC(Model Predictive Control)模型预测控制:通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,用离散的状态空间表达,即MPC模型预测控制及在Matlab中实现函数定义

实现步骤:

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

Step2:基于MPC模型预测控制及在Matlab中实现函数定义的选择进行最优化

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

                其中,MPC模型预测控制及在Matlab中实现函数定义为k时刻的误差矩阵,MPC模型预测控制及在Matlab中实现函数定义为k时刻的输入矩阵,MPC模型预测控制及在Matlab中实现函数定义为终端(N时刻)误差,Q,R为调节矩阵,F为终端误差权重矩阵

Step3:实施一步MPC模型预测控制及在Matlab中实现函数定义(即从t=k运行到t=k+1即可)

                下一次从t=k+1时重复Step1到3,重新预测MPC模型预测控制及在Matlab中实现函数定义的输入

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

                称为滚动优化控制(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内,有MPC模型预测控制及在Matlab中实现函数定义,即MPC模型预测控制及在Matlab中实现函数定义

                同理,MPC模型预测控制及在Matlab中实现函数定义,x(k+i | k)表示在k时刻预测的第k+i时刻的系统状态

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

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

MPC模型预测控制及在Matlab中实现函数定义(误差加权和 + 输入加权和 + 终端误差项)

                ③初始条件(k时刻)  MPC模型预测控制及在Matlab中实现函数定义

                   预测的k+1时刻  MPC模型预测控制及在Matlab中实现函数定义

                   预测的k+2时刻MPC模型预测控制及在Matlab中实现函数定义

                   预测的k+N时刻MPC模型预测控制及在Matlab中实现函数定义

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

                简化为MPC模型预测控制及在Matlab中实现函数定义          (1)

                MPC模型预测控制及在Matlab中实现函数定义为k时刻预测的一段时间内的所有状态值的组合向量,MPC模型预测控制及在Matlab中实现函数定义为已知的t=k这一个时刻的状态值,MPC模型预测控制及在Matlab中实现函数定义,MPC模型预测控制及在Matlab中实现函数定义

                在t=k时刻的代价矩阵可表述为MPC模型预测控制及在Matlab中实现函数定义           (2)

                将式(1)代入(2)得MPC模型预测控制及在Matlab中实现函数定义

                其中,MPC模型预测控制及在Matlab中实现函数定义为增广矩阵,MPC模型预测控制及在Matlab中实现函数定义,MPC模型预测控制及在Matlab中实现函数定义

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

                则MPC模型预测控制及在Matlab中实现函数定义,该简化形式可以清晰看出MPC模型预测控制及在Matlab中实现函数定义与初始条件MPC模型预测控制及在Matlab中实现函数定义及输入MPC模型预测控制及在Matlab中实现函数定义的关系。

四、建模实例

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

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

                 在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

上一篇:C#程序中判断是否处在DEBUG调试状态或者RELEASE发布状态


下一篇:iisweb服务器完美解决方案