基于b站DR_CAN老师的MPC控制视频【MPC模型预测控制器】4_数学建模推导--Matlab代码详解_哔哩哔哩_bilibili的学习分享如下:
一、研究目的
在约束条件(物理限制)下达到最优的系统表现。
1.对于单输入单输出(SISO)系统:
越小,跟踪能力越强;
越小,输入越小,能耗越低。(用平方项来衡量e、u的绝对值大小)
2.代价函数Cost Function
,通过设计u,寻找最小的J的过程为最优化
其中q,r为调节参数
①若q>>r,则误差e对于设计系统的影响权重更大
②若r>>q,则系统设计更看重输入u
3.对于多输入多输出(MIMO)系统:
状态空间:
代价函数:
具体地,例如已知系统, ,系统的参考目标,则误差矩阵
其中,Q,R为调节矩阵,,,,为系统最优时的权重系数。
二、基本概念
MPC(Model Predictive Control)模型预测控制:通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,用离散的状态空间表达,即
实现步骤:
Step1:估计/测量读取当前k时刻的系统状态
Step2:基于的选择进行最优化
代价函数:
其中,为k时刻的误差矩阵,为k时刻的输入矩阵,为终端(N时刻)误差,Q,R为调节矩阵,F为终端误差权重矩阵
Step3:实施一步(即从t=k运行到t=k+1即可)
下一次从t=k+1时重复Step1到3,重新预测的输入
即每一轮的预测都是预测区间和控制区间整体右移一个单位,整个过程是向右滚动的,
称为滚动优化控制(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内,有,即
同理,,x(k+i | k)表示在k时刻预测的第k+i时刻的系统状态
②误差E=Y-R=X-0=X
代价方程
即(误差加权和 + 输入加权和 + 终端误差项)
③初始条件(k时刻)
预测的k+1时刻
预测的k+2时刻
预测的k+N时刻
综上,
简化为 (1)
为k时刻预测的一段时间内的所有状态值的组合向量,为已知的t=k这一个时刻的状态值,,
在t=k时刻的代价矩阵可表述为 (2)
将式(1)代入(2)得
其中,为增广矩阵,,
令
则,该简化形式可以清晰看出与初始条件及输入的关系。
四、建模实例
对于系统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