赞
踩
Medel predictive control(MPC)是一种预测控制,可以依据未来的信息来控制当下的输入,本文主要介绍一种线性MPC(系统和约束都是线性)的实现方法,大致思路是将控制问题进行数学建模,整理成二次规划(quadratic programming,QP)的形式,而后求解。总体MPC的实现包括以下三步:
假设系统的离散状态方程为:
x
(
k
+
1
)
=
A
m
x
(
k
)
+
B
u
m
y
(
k
)
=
C
m
x
(
k
)
x(k+1) = A_{m}x(k)+Bu_{m} \\ y(k) = C_{m}x(k)
x(k+1)=Amx(k)+Bumy(k)=Cmx(k)
则可以先将状态方程整理成增广形式(augmented form),增广形式更加适用于轨迹跟踪,如下所示:
[
Δ
x
m
(
k
+
1
)
y
(
k
+
1
)
]
⏞
x
(
k
+
1
)
=
[
A
m
o
m
T
C
m
A
m
1
]
⏞
A
[
Δ
x
m
(
k
)
y
(
k
)
]
⏞
x
(
k
)
+
[
B
m
C
m
B
m
]
⏞
B
Δ
u
(
k
)
y
(
k
)
=
[
o
m
1
]
⏞
C
[
Δ
x
m
(
k
)
y
(
k
)
]
,
随后可以根据初始状态
x
(
k
i
)
x(k_i)
x(ki)和系统的状态方程得到在预测范围
N
p
N_p
Np的范围内所有的状态变量,如下所示:
x
(
k
i
+
1
∣
k
i
)
=
A
x
(
k
i
)
+
B
Δ
u
(
k
i
)
x
(
k
i
+
2
∣
k
i
)
=
A
x
(
k
i
+
1
∣
k
i
)
+
B
Δ
u
(
k
i
+
1
)
=
A
2
x
(
k
i
)
+
A
B
Δ
u
(
k
i
)
+
B
Δ
u
(
k
i
+
1
)
⋮
x
(
k
i
+
N
p
∣
k
i
)
=
A
N
p
x
(
k
i
)
+
A
N
p
−
1
B
Δ
u
(
k
i
)
+
A
N
p
−
2
B
Δ
u
(
k
i
+
1
)
+
…
+
A
N
p
−
N
c
B
Δ
u
(
k
i
+
N
c
−
1
)
.
而所有输出变量(观测变量)的表达如下所示:
y
(
k
i
+
1
∣
k
i
)
=
C
A
x
(
k
i
)
+
C
B
Δ
u
(
k
i
)
y
(
k
i
+
2
∣
k
i
)
=
C
A
2
x
(
k
i
)
+
C
A
B
Δ
u
(
k
i
)
+
C
B
Δ
u
(
k
i
+
1
)
y
(
k
i
+
3
∣
k
i
)
=
C
A
3
x
(
k
i
)
+
C
A
2
B
Δ
u
(
k
i
)
+
C
A
B
Δ
u
(
k
i
+
1
)
+
C
B
Δ
u
(
k
i
+
2
)
⋮
y
(
k
i
+
N
p
∣
k
i
)
=
C
A
N
p
x
(
k
i
)
+
C
A
N
p
−
1
B
Δ
u
(
k
i
)
+
C
A
N
p
−
2
B
Δ
u
(
k
i
+
1
)
+
…
+
C
A
N
p
−
N
c
B
Δ
u
(
k
i
+
N
c
−
1
)
根据上式,将复杂的线性方程写成矩阵形式:
Y
=
F
x
(
k
i
)
+
Φ
Δ
U
Y = Fx(k_i)+\Phi\Delta U
Y=Fx(ki)+ΦΔU
矩阵表达如下所示:
F
=
[
C
A
C
A
2
C
A
3
⋮
C
A
N
p
]
;
Φ
=
[
B
0
0
…
0
A
B
B
0
…
0
A
2
B
A
B
B
…
0
⋮
A
N
p
−
1
B
A
N
p
−
2
B
A
N
p
−
3
B
…
A
N
p
−
N
c
B
]
F=\left[
注意:式中的A,B,C是增广矩阵中的系数,不是原方程的系数
而后进入优化部分,定义待追踪的向量是
R
s
R_s
Rs,给输入的误差矩阵是
R
ˉ
\bar{R}
Rˉ,可以将代价函数写成以下格式(大多数书中对误差也有权重矩阵,但是通过调整
R
ˉ
\bar{R}
Rˉ也可以简介调整两项之间的权重差距,因此没有设置追踪误差权重):
J
=
(
R
s
−
Y
)
T
(
R
s
−
Y
)
+
Δ
U
T
R
ˉ
Δ
U
J=\left(R_{s}-Y\right)^{T}\left(R_{s}-Y\right)+\Delta U^{T} \bar{R} \Delta U
J=(Rs−Y)T(Rs−Y)+ΔUTRˉΔU,带入前面得到的数学方程,可以将代价函数整理成以下形式:
J
=
(
R
s
−
F
x
(
k
i
)
)
T
(
R
s
−
F
x
(
k
i
)
)
−
2
Δ
U
T
Φ
T
(
R
s
−
F
x
(
k
i
)
)
+
Δ
U
T
(
Φ
T
Φ
+
R
ˉ
)
Δ
U
.
J=\left(R_{s}-F x\left(k_{i}\right)\right)^{T}\left(R_{s}-F x\left(k_{i}\right)\right)-2 \Delta U^{T} \Phi^{T}\left(R_{s}-F x\left(k_{i}\right)\right)+\Delta U^{T}\left(\Phi^{T} \Phi+\bar{R}\right) \Delta U .
J=(Rs−Fx(ki))T(Rs−Fx(ki))−2ΔUTΦT(Rs−Fx(ki))+ΔUT(ΦTΦ+Rˉ)ΔU.
至此可以使用二次规划的包,得到优化的
Δ
U
\Delta U
ΔU
约束通常有三种形式,分别是约束控制变化速率,约束控制幅值和约束输出变量(观测变量),可以用以下矩阵统一表达:
[
M
1
M
2
M
3
]
Δ
U
≤
[
N
1
N
2
N
3
]
\left[
M
1
=
[
−
C
2
C
2
]
;
N
1
=
[
−
U
min
+
C
1
u
(
k
i
−
1
)
U
max
−
C
1
u
(
k
i
−
1
)
]
;
M
2
=
[
−
I
I
]
;
N
2
=
[
−
Δ
U
min
Δ
U
max
]
;
M
3
=
[
−
Φ
Φ
]
;
N
3
=
[
−
Y
min
+
F
x
(
k
i
)
Y
max
−
F
x
(
k
i
)
]
.
M
1
M_1
M1对应约束控制幅值,
C
1
,
C
2
C_1,C_2
C1,C2分别对应全为1矩阵和下三角矩阵
M
2
M_2
M2对应约束控制幅值
M
3
M_3
M3约束输出变量(观测变量)
以下代码从连续系统出发,而后离散化,根据自定义函数计算mpcgain,而后使用自定义二次优化函数优化,本例中对变量无约束。
clc clear close all dt = 0.1; % 采样时间 Ac = [1 1;0 1]; Bc = [0;1]; Cc = [1 0]; Dc = [0]; %% 离散方程 [Ap,Bp,Cp,Dp]=c2dm(Ac,Bc,Cc,Dc,dt); Np=20; Nc=4; [Phi,F,Phi_Phi,Phi_F,Phi_R,A_e, B_e,C_e] = mpcgain(Ap,Bp,Cp,Nc,Np); [n,n_in]=size(B_e); xm=[0;0]; Xf=zeros(n,1); N_sim=100; r=ones(N_sim,1); u=0; % u(k-1) =0 y=0; R_bar = 0.1*eye(Nc,Nc); H = 2*(Phi_Phi + R_bar); R_ref = ones(Np,1); A_cons = 0; b = 0; for kk=1:N_sim % DeltaU=inv(Phi_Phi+R_bar)*(Phi_R*r(kk)-Phi_F*Xf); f = -2*Phi'*(R_ref-F*Xf); DeltaU=QPhild(H,f,A_cons,b); deltau=DeltaU(1,1); u=u+deltau; u1(kk)=u; y1(kk)=y; xm_old=xm; xm=Ap*xm+Bp*u; y=Cp*xm; Xf=[xm-xm_old;y]; end % 将系统输出、控制量曲线显示出来: k=0:(N_sim-1); figure subplot(211) plot(k,y1) xlabel('Sampling Instant') legend('Output') subplot(212) plot(k,u1) xlabel('Sampling Instant') legend('Control')
说明,本函数和优化函数都来自参考文献的代码,我只进行了小修改,本来书中是使用求导的方法进行优化,所以本函数返回的矩阵并不都有用。
function [Phi,F,Phi_Phi,Phi_F,Phi_R,A_e, B_e,C_e]=mpcgain(Ap,Bp,Cp,Nc,Np) [m1,n1]=size(Cp); [n1,n_in]=size(Bp); A_e=eye(n1+m1,n1+m1); A_e(1:n1,1:n1)=Ap; A_e(n1+1:n1+m1,1:n1)=Cp*Ap; B_e=zeros(n1+m1,n_in); B_e(1:n1,:)=Bp; B_e(n1+1:n1+m1,:)=Cp*Bp; C_e=zeros(m1,n1+m1); C_e(:,n1+1:n1+m1)=eye(m1,m1); n=n1+m1; h(1,:)=C_e; F(1,:)=C_e*A_e; for kk=2:Np h(kk,:)=h(kk-1,:)*A_e; F(kk,:)= F(kk-1,:)*A_e; end v=h*B_e; Phi=zeros(Np,Nc); %declare the dimension of Phi Phi(:,1)=v; % first column of Phi for i=2:Nc Phi(:,i)=[zeros(i-1,1);v(1:Np-i+1,1)]; %Toeplitz matrix end BarRs=ones(Np,1); Phi_Phi= Phi'*Phi; Phi_F= Phi'*F; Phi_R=Phi'*BarRs; end
自定义优化函数,也可以使用matlab自带的优化函数:quadprog
function eta=QPhild(H,f,A_cons,b) % E=H; % F=f; % M=A_cons; % gamma=b; % eta =x [n1,m1]=size(A_cons); eta=-H\f; kk=0; for i=1:n1 if (A_cons(i,:)*eta>b(i)) kk=kk+1; else kk=kk+0; end end if (kk==0) return; end P=A_cons*(H\A_cons'); d=(A_cons*(H\f)+b); [n,m]=size(d); x_ini=zeros(n,m); lambda=x_ini; al=10; for km=1:38 %find the elements in the solution vector one by one % km could be larger if the Lagranger multiplier has a slow % convergence rate. lambda_p=lambda; for i=1:n w= P(i,:)*lambda-P(i,i)*lambda(i,1); w=w+d(i,1); la=-w/P(i,i); lambda(i,1)=max(0,la); end al=(lambda-lambda_p)'*(lambda-lambda_p); if (al<10e-8); break; end end eta=-H\f -H\A_cons'*lambda; end
Wang L. Model predictive control system design and implementation using MATLAB®[M]. Springer Science & Business Media, 2009.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。