摘抄自B站DR_CAN大神,万分感谢传授知识。我仅在此做一下记录,方便日后学习。
首先写一个MPC函数:
function [M,C,Q_bar,R_bar,G,E,H,U_k,u_k]=MPC_Zero_Ref(A,B,Q,R,F,N,x_k) % N是预测区间
n=size(A,1); % 得到A的行数
p=size(B,2); % 得到B的列数
M=[eye(n);zeros(N*n,n)]; % 初始化M矩阵,上面是n*n的单位矩阵,下面是n列0矩阵
C=zeros((N+1)*n,N*p); % 初始化C矩阵
% 定义M和C
tmp=eye(n); %定义一个n*n的单位矩阵
for i=1:N
rows=i*n+(1:n); % i=1,n=2的时候,(1:2)就是对第三行、第四行赋值
C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; % 将C矩阵填满
tmp=A*tmp;
M(rows,:)=tmp ; % 将矩阵M写满
end
% 定义Q_bar和
s_q=size(Q,1);
s_r=size(R,1);
Q_bar=zeros(N+1*s_q,(N+1)*s_q);
for i=0:N
Q_bar(i*s_q+1:(i+1)*s_q,i*s_q+1:(i+1)*s_q)= Q;
end
Q_bar(N*s_q+1:(N+1)*s_q,N*s_q+1:(N+1)*s_q)= F;
%定义R——bar
R_bar=zeros(N*s_r,N*s_r);
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;
E=C'*Q_bar*M;
H=C'*Q_bar*C+R_bar;
%
f=(x_k'*E')'; %定义f矩阵
U_k=quadprog(H,f);
end
然后在命令行输入:
clc;clear;
A=[1,0.1;0,2];
B=[0;0.5];
N=25;
x_k=[5;5];
Q=[1 0;0 1];
R=0.1;
F=[1 0;0 1];
[M,C,Q_bar,R_bar,G,E,H,U_k]=MPC_Zero_Ref(A,B,Q,R,F,N,x_k); %前面是输出,后面是输入的初始状态量
% M C Q_bar R_bar,G E H是根据MPC推导出来的,主要就是看输出的控制量U_K