MPC模型预测控制理论分析详解
MPC的基本原理与特点
基本原理
其实MPC的思想很直白也很简单:在每个采样时刻,用测量到的信息和一个模型,求解一个优化问题,并将优化出来的结果的第一个量作用到系统中,之后如此反复。总的来说分为三步:
- 预测系统未来动态
- (数值)求解优化问题
- 将优化解的第一个元素作用于系统
同时这里有几个点需要思考:
- 模型的形式是什么
- 模型为什么会有预测功能,如何体现的
- 优化问题如何建立以及怎么求解
这些问题在推导过程中会一一体现。
特点
1.基于模型
在MPC中,需要一个描述对象动态行为的模型,作用是用来根据当前的测量值预测未来的动态。但是需要注意的是,我们更注重模型的作用,即预测,而不是模型的具体形式。至于这个模型是如何构建的并不重要,只要它具有根据当前状态和未来控制输入预测未来输出的能力就可以。比如可以使用状态空间模型,传递函数模型,模糊模型等等。
2.滚动优化
简单来说就是如下的表格:
时刻 | 预测时间区间 |
---|---|
k | [ k + 1 , k + p ] 系 统 动 态 [k+1,k+p]系统动态 [k+1,k+p]系统动态 |
k+1 | [ k + 2 , k + p + 1 ] 系 统 动 态 [k+2,k+p+1]系统动态 [k+2,k+p+1]系统动态 |
k+2 | [ k + 3 , k + p + 2 ] 系 统 动 态 [k+3,k+p+2]系统动态 [k+3,k+p+2]系统动态 |
可以看出,这种优化是在线进行的,虽然不是全局最优,但是这种滚动的处理,可以将模型失配、时变、干扰等不确定考虑在里面,进行实时的弥补。
3.前馈-反馈结构
- 模型中的预测作用考虑到了来自未来参考输入和可测干扰的前馈补偿
- 作用在系统中的控制量考虑到了当前测量的状态值的反馈补偿
从无约束模型预测控制出发理解推导过程
这里我们使用控制里面常见的状态空间模型,并且在不考虑约束的情况下进行一个详细的公式推导。主要分为三个步骤:使用模型预测系统未来动态,求解优化问题,解的第一个元素作用到系统
。
1.使用状态空间模型
这里直接给出离散情况下系统的状态空间模型:
x
(
k
+
1
)
=
A
x
(
k
)
+
B
(
k
)
u
(
k
)
y
c
(
k
)
=
C
x
(
k
)
\begin{aligned} x(k+1) &= Ax(k)+B(k)u(k)\\[2mm] y_c(k)&=Cx(k) \end{aligned}
x(k+1)yc(k)=Ax(k)+B(k)u(k)=Cx(k)
这里为了引入积分以减少或消除静态误差,将模型改写成增量形式,设:
Δ
x
(
k
)
=
x
(
k
)
−
x
(
k
−
1
)
Δ
u
(
k
)
=
u
(
k
)
−
u
(
k
−
1
)
Δx(k)=x(k)-x(k-1)\\[2mm] Δu(k)=u(k)-u(k-1)
Δx(k)=x(k)−x(k−1)Δu(k)=u(k)−u(k−1)
这样状态空间模型就可以改写成:
Δ
x
(
k
+
1
)
=
A
Δ
x
(
k
)
+
B
Δ
u
(
k
)
y
(
k
)
=
C
Δ
x
(
k
)
+
y
(
k
−
1
)
\begin{aligned} Δx(k+1) &= AΔx(k) + BΔu(k)\\[2mm] y(k) &= CΔx(k)+y(k-1) \end{aligned}
Δx(k+1)y(k)=AΔx(k)+BΔu(k)=CΔx(k)+y(k−1)
2.模型的预测功能
这是MPC求解的第一步:使用模型预测。
我们可以观察状态方程,其实它表达的是:给定一个当前状态和输入,就能计算出下一时刻的状态,那么这里的预测就是计算出的下一时刻状态。而有了下一时刻的状态和输入,就可以计算下下时刻的状态,以此类推,想预测之后多久的都可以。当前状态是测量出来的,而各个时间的输入是需要优化的变量,根据这个思路进行公式推导(这就是使用模型进行预测的体现)。这里设置预测时域为
p
p
p,控制时域为
m
m
m。并且
m
≤
p
m≤p
m≤p。
首先根据当前时刻
k
k
k拿到的数据和优化变量控制对下一时刻进行预测:
Δ
x
(
k
+
1
∣
k
)
=
A
Δ
x
(
k
)
+
B
Δ
u
(
k
)
Δx(k+1|k) = AΔx(k)+BΔu(k)
Δx(k+1∣k)=AΔx(k)+BΔu(k)
现在进行一步预测之后,就拥有了当前状态和下一时刻状态,同理,用
k
+
1
k+1
k+1时刻状态也可以对
k
+
2
k+2
k+2进行预测。
Δ
x
(
k
+
2
∣
k
)
=
A
Δ
x
(
k
+
1
∣
k
)
+
B
Δ
u
(
k
+
1
)
Δx(k+2|k) = AΔx(k+1|k)+BΔu(k+1)
Δx(k+2∣k)=AΔx(k+1∣k)+BΔu(k+1)
进一步,使用
k
k
k时刻测量的量表示
k
+
2
k+2
k+2时刻的预测值为:
Δ
x
(
k
+
2
∣
k
)
=
A
Δ
x
(
k
+
1
∣
k
)
+
B
Δ
u
(
k
+
1
)
=
A
(
A
Δ
x
(
k
)
+
B
Δ
u
(
k
)
)
+
B
Δ
u
(
k
+
1
)
=
A
2
Δ
x
(
k
)
+
A
B
Δ
u
(
k
)
+
B
Δ
u
(
k
+
1
)
\begin{aligned} Δx(k+2|k) &= AΔx(k+1|k)+BΔu(k+1)\\[2mm] &= A( AΔx(k)+BΔu(k))+BΔu(k+1)\\[2mm] &=A^2Δx(k)+ABΔu(k)+BΔu(k+1) \end{aligned}
Δx(k+2∣k)=AΔx(k+1∣k)+BΔu(k+1)=A(AΔx(k)+BΔu(k))+BΔu(k+1)=A2Δx(k)+ABΔu(k)+BΔu(k+1)
以此类推,如果我们希望预测控制步长结束之前最后的第
m
m
m步,那么有:
Δ
x
(
k
+
m
∣
k
)
=
A
m
Δ
x
(
k
)
+
A
m
−
1
B
Δ
u
(
k
)
+
A
m
−
2
B
Δ
u
(
k
+
1
)
+
.
.
.
+
B
Δ
u
(
k
+
m
−
1
)
Δx(k+m|k) = A^mΔx(k)+A^{m-1}BΔu(k)+A^{m-2}BΔu(k+1)+...+BΔu(k+m-1)
Δx(k+m∣k)=AmΔx(k)+Am−1BΔu(k)+Am−2BΔu(k+1)+...+BΔu(k+m−1)
当控制步长结束之后,我们假设控制量不变,也就是
Δ
u
=
0
Δu=0
Δu=0,那么有:
Δ
x
(
k
+
p
∣
k
)
=
A
p
Δ
x
(
k
)
+
A
p
−
1
B
Δ
u
(
k
)
+
A
p
−
2
B
Δ
u
(
k
+
1
)
+
.
.
.
+
A
p
−
m
B
Δ
u
(
k
+
m
−
1
)
Δx(k+p|k) = A^pΔx(k)+A^{p-1}BΔu(k)+A^{p-2}BΔu(k+1)+...+A^{p-m}BΔu(k+m-1)
Δx(k+p∣k)=ApΔx(k)+Ap−1BΔu(k)+Ap−2BΔu(k+1)+...+Ap−mBΔu(k+m−1)
同样的思路,对于输出方程在控制步长没有结束之前有:
y
(
k
+
m
∣
k
)
=
∑
i
=
1
m
C
A
i
Δ
x
(
k
)
+
∑
i
=
1
m
C
A
i
−
1
B
Δ
u
(
k
)
+
∑
i
=
1
m
−
1
C
A
i
−
1
B
Δ
u
(
k
+
1
)
+
.
.
.
+
C
B
Δ
u
(
k
+
m
−
1
)
+
y
(
k
)
y(k+m|k)=\sum_{i=1}^mCA^iΔx(k)+\sum_{i=1}^mCA^{i-1}BΔu(k)+\sum_{i=1}^{m-1}CA^{i-1}BΔu(k+1)+...+CBΔu(k+m-1)+y(k)\\
y(k+m∣k)=i=1∑mCAiΔx(k)+i=1∑mCAi−1BΔu(k)+i=1∑m−1CAi−1BΔu(k+1)+...+CBΔu(k+m−1)+y(k)
在控制步长结束之后:
y
(
k
+
p
∣
k
)
=
∑
i
=
1
p
C
A
i
Δ
x
(
k
)
+
∑
i
=
1
p
C
A
i
−
1
B
Δ
u
(
k
)
+
∑
i
=
1
p
−
1
C
A
i
−
1
B
Δ
u
(
k
+
1
)
+
.
.
.
+
∑
i
=
1
p
−
m
+
1
C
A
i
−
1
B
Δ
u
(
k
+
m
−
1
)
+
y
(
k
)
y(k+p|k)=\sum_{i=1}^pCA^iΔx(k)+\sum_{i=1}^pCA^{i-1}BΔu(k)+\sum_{i=1}^{p-1}CA^{i-1}BΔu(k+1)+...+\sum_{i=1}^{p-m+1}CA^{i-1}BΔu(k+m-1)+y(k)
y(k+p∣k)=i=1∑pCAiΔx(k)+i=1∑pCAi−1BΔu(k)+i=1∑p−1CAi−1BΔu(k+1)+...+i=1∑p−m+1CAi−1BΔu(k+m−1)+y(k)
以上就完成了预测。虽然写成这样就可以,但是为了方便计算和之后的推导,我们把它写成矩阵的形式(其实就是一个简单的列排列)。
为了方便理解这里先用
p
=
2
p=2
p=2举个例子:
y
(
k
+
1
∣
k
)
=
C
A
Δ
x
(
k
)
+
C
B
Δ
u
(
k
)
+
y
(
k
)
y
(
k
+
2
∣
k
)
=
(
C
A
2
+
C
A
)
Δ
x
(
k
)
+
(
C
A
B
+
C
B
)
Δ
u
(
k
)
+
C
B
Δ
u
(
k
+
1
)
+
y
(
k
)
\begin{aligned} y(k+1|k) &= CAΔx(k)+CBΔu(k)+y(k)\\ y(k+2|k) &= (CA^2+CA)Δx(k)+(CAB+CB)Δu(k)+CBΔu(k+1)+y(k) \end{aligned}
y(k+1∣k)y(k+2∣k)=CAΔx(k)+CBΔu(k)+y(k)=(CA2+CA)Δx(k)+(CAB+CB)Δu(k)+CBΔu(k+1)+y(k)
这两个式子并列之后,可以整理成矩阵的形式:
(
y
(
k
+
1
∣
k
)
y
(
k
+
2
∣
k
)
)
=
(
C
A
(
C
A
2
+
C
A
)
)
Δ
x
(
k
)
+
(
C
B
0
C
A
B
C
B
)
(
Δ
u
(
k
)
Δ
u
(
k
+
1
)
)
+
(
I
n
y
×
n
y
I
n
y
×
n
y
)
y
(
k
)
\left( \begin{array}{c} y(k+1|k)\\ y(k+2|k) \end{array} \right)= \left( \begin{array}{c} CA\\ (CA^2+CA) \end{array} \right)Δx(k)+ \left( \begin{array}{ccc} CB &0\\ CAB &CB \end{array} \right) \left( \begin{array}{c} Δu(k)\\ Δu(k+1) \end{array} \right)+ \left( \begin{array}{c} I_{n_y×n_y}\\ I_{n_y×n_y} \end{array} \right)y(k)
(y(k+1∣k)y(k+2∣k))=(CA(CA2+CA))Δx(k)+(CBCAB0CB)(Δu(k)Δu(k+1))+(Iny×nyIny×ny)y(k)
这里需要说明一些,
Δ
x
,
Δ
u
,
y
Δx,Δu,y
Δx,Δu,y一般都是一个向量,所以后面的
y
y
y前面的系数是一个个单位矩阵。在明白矩阵构成方式之后,将其扩展到
k
=
p
k=p
k=p时刻,可以写成如下形式:
Y
(
k
+
1
∣
k
)
=
S
x
Δ
x
(
k
)
+
S
u
Δ
U
(
k
)
+
I
y
(
k
)
Y(k+1|k)=S_xΔx(k)+S_uΔU(k)+Iy(k)
Y(k+1∣k)=SxΔx(k)+SuΔU(k)+Iy(k)
其中:
Y
(
k
+
1
∣
k
)
=
(
y
(
k
+
1
∣
k
)
y
(
k
+
2
∣
k
)
⋮
y
(
k
+
p
∣
k
)
)
p
×
1
Y(k+1|k)= \left( \begin{array}{c} y(k+1|k)\\ y(k+2|k)\\ \vdots\\ y(k+p|k) \end{array} \right)_{p×1}
Y(k+1∣k)=⎝⎜⎜⎜⎛y(k+1∣k)y(k+2∣k)⋮y(k+p∣k)⎠⎟⎟⎟⎞p×1
Δ
U
(
k
)
=
(
Δ
u
(
k
)
Δ
u
(
k
+
1
)
⋮
Δ
u
(
k
+
m
−
1
)
)
m
×
1
ΔU(k)= \left( \begin{array}{c} Δu(k)\\ Δu(k+1)\\ \vdots\\ Δu(k+m-1) \end{array} \right)_{m×1}
ΔU(k)=⎝⎜⎜⎜⎛Δu(k)Δu(k+1)⋮Δu(k+m−1)⎠⎟⎟⎟⎞m×1
S
x
=
(
C
A
∑
i
=
1
2
C
A
i
⋮
∑
i
=
1
p
C
A
i
)
p
×
1
S_x= \left( \begin{array}{c} CA\\ \sum_{i=1}^2CA^i\\ \vdots\\ \sum_{i=1}^pCA^i \end{array} \right)_{p×1}
Sx=⎝⎜⎜⎜⎛CA∑i=12CAi⋮∑i=1pCAi⎠⎟⎟⎟⎞p×1
I
=
(
I
n
y
×
n
y
I
n
y
×
n
y
⋮
I
n
y
×
n
y
)
p
×
1
I= \left( \begin{array}{c} I_{n_y×n_y}\\ I_{n_y×n_y}\\ \vdots\\ I_{n_y×n_y} \end{array} \right)_{p×1}
I=⎝⎜⎜⎜⎛Iny×nyIny×ny⋮Iny×ny⎠⎟⎟⎟⎞p×1
S
u
=
(
C
B
0
0
⋯
0
∑
i
=
1
2
C
A
i
−
1
B
C
B
0
⋯
0
⋮
⋮
⋮
⋱
⋮
∑
i
=
1
m
C
A
i
−
1
B
∑
i
=
1
m
−
1
C
A
i
−
1
B
⋯
⋯
C
B
∑
i
=
1
p
C
A
i
−
1
B
∑
i
=
1
p
−
1
C
A
i
−
1
B
⋯
⋯
∑
i
=
1
p
−
m
+
1
C
A
i
−
1
B
)
S_u= \left( \begin{array}{ccc} CB &0&0&\cdots&0\\[2mm] \sum_{i=1}^2CA^{i-1}B &CB&0&\cdots&0\\[2mm] \vdots&\vdots&\vdots&\ddots&\vdots&\\[2mm] \sum_{i=1}^mCA^{i-1}B&\sum_{i=1}^{m-1}CA^{i-1}B&\cdots&\cdots&CB\\[2mm] \sum_{i=1}^pCA^{i-1}B&\sum_{i=1}^{p-1}CA^{i-1}B&\cdots&\cdots& \sum_{i=1}^{p-m+1}CA^{i-1}B \end{array} \right)
Su=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛CB∑i=12CAi−1B⋮∑i=1mCAi−1B∑i=1pCAi−1B0CB⋮∑i=1m−1CAi−1B∑i=1p−1CAi−1B00⋮⋯⋯⋯⋯⋱⋯⋯00⋮CB∑i=1p−m+1CAi−1B⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
这里可以看出,
S
u
S_u
Su是一个下三角,这直接反映了控制量在时间上的因果关系,即之后的输入对之前的输入没有影响。
3.优化问题的建立
一般来说,目标函数的选取没有标准形式,这是一种艺术而不是数学。考虑一种最简单的形式,我们希望被控输出接近参考输入:
J
=
∑
i
=
1
p
Q
i
(
y
(
k
+
i
∣
k
)
−
r
(
k
+
i
)
)
2
J=\sum_{i=1}^pQ_i(y(k+i|k)-r(k+i))^2
J=i=1∑pQi(y(k+i∣k)−r(k+i))2
这里
Q
i
Q_i
Qi是权重,表示的是在时刻
i
i
i对各个分量误差的加权。通常来说,还希望控制的变化不要太大:
J
=
∑
i
=
1
p
Q
i
(
y
(
k
+
i
∣
k
)
−
r
(
k
+
i
)
)
2
+
∑
i
=
1
m
H
i
(
Δ
u
(
k
+
i
−
1
)
)
2
J=\sum_{i=1}^pQ_i(y(k+i|k)-r(k+i))^2+\sum_{i=1}^mH_i(Δu(k+i-1))^2
J=i=1∑pQi(y(k+i∣k)−r(k+i))2+i=1∑mHi(Δu(k+i−1))2
设参考序列:
R
(
k
+
1
)
=
(
r
(
k
+
1
)
r
(
k
+
2
)
⋮
r
(
k
+
p
)
)
p
×
1
R(k+1)=\left( \begin{array}{c} r(k+1)\\ r(k+2)\\ \vdots\\ r(k+p) \end{array} \right)_{p×1}
R(k+1)=⎝⎜⎜⎜⎛r(k+1)r(k+2)⋮r(k+p)⎠⎟⎟⎟⎞p×1
这样我们就可以将目标函数写成矩阵的形式:
J
=
Q
(
Y
(
k
+
1
∣
k
)
−
R
(
k
+
1
)
)
2
+
H
(
Δ
U
(
k
)
)
2
J=Q(Y(k+1|k)-R(k+1))^2+H(ΔU(k))^2
J=Q(Y(k+1∣k)−R(k+1))2+H(ΔU(k))2
这里可以看到目标函数都是平方项,如果我们定义:
ρ
=
(
Q
(
Y
(
k
+
1
∣
k
)
−
R
(
k
+
1
)
)
H
Δ
U
(
k
)
)
ρ=\left( \begin{array}{c} \sqrt{Q}(Y(k+1|k)-R(k+1))\\ \sqrt{H}ΔU(k)\\ \end{array} \right)
ρ=(Q(Y(k+1∣k)−R(k+1))HΔU(k))
那么目标函数就可以简化成:
J
=
ρ
T
ρ
J=ρ^Tρ
J=ρTρ
这样我们就可以将开环优化问题描述成如下形式:
min
Δ
U
(
k
)
J
(
x
(
k
)
,
Δ
U
(
k
)
,
m
,
p
)
s
.
t
.
Y
(
k
+
1
∣
k
)
=
S
x
Δ
x
(
k
)
+
S
u
Δ
U
(
k
)
+
I
y
(
k
)
\min_{ΔU(k)}J(x(k),ΔU(k),m,p)\\[2mm] \begin{aligned} s.t. Y(k+1|k)=S_xΔx(k)+S_uΔU(k)+Iy(k) \end{aligned}
ΔU(k)minJ(x(k),ΔU(k),m,p)s.t. Y(k+1∣k)=SxΔx(k)+SuΔU(k)+Iy(k)
4.优化问题求解
这是MPC求解的第二和第三步:求解优化问题,将第一个解作用到系统。
这里举一个例子,首先看一个很简单的优化问题:
m
i
n
x
1
2
+
x
2
2
s
.
t
.
x
1
+
x
2
=
1
\begin{aligned} &min x_1^2+x_2^2\\[2mm] &s.t. x_1+x_2=1 \end{aligned}
min x12+x22s.t. x1+x2=1
如果是你你怎么求解,当然可以拉格朗日,但是我选择让
x
1
=
1
−
x
2
x_1=1-x_2
x1=1−x2,然后带到目标函数中,进行求解。这个思路有了之后,其实MPC的推导,也是一个道理,只不过是将模型放进了目标函数里面。
我们现在将
Y
Y
Y带到
ρ
ρ
ρ的第一项中:
ρ
=
(
Q
(
S
x
Δ
x
(
k
)
+
S
u
Δ
U
(
k
)
+
I
y
(
k
)
−
R
(
k
+
1
)
)
H
Δ
U
(
k
)
)
=
(
Q
S
u
H
)
Δ
U
(
k
)
−
(
Q
(
R
(
k
+
1
)
−
S
x
Δ
x
(
k
)
−
I
y
(
k
)
)
0
)
=
(
Q
S
u
H
)
Δ
U
(
k
)
−
(
Q
E
(
k
+
1
∣
k
)
0
)
=
A
z
−
b
\begin{aligned} ρ&=\left( \begin{array}{c} \sqrt{Q}(S_xΔx(k)+S_uΔU(k)+Iy(k)-R(k+1))\\ \sqrt{H}ΔU(k)\\ \end{array} \right)\\[3mm] &=\left( \begin{array}{c} \sqrt{Q}S_u\\ \sqrt{H}\\ \end{array} \right)ΔU(k)-\left( \begin{array}{c} \sqrt{Q}(R(k+1)-S_xΔx(k)-Iy(k))\\ 0\\ \end{array} \right)\\[3mm] &=\left( \begin{array}{c} \sqrt{Q}S_u\\ \sqrt{H}\\ \end{array} \right)ΔU(k)-\left( \begin{array}{c} \sqrt{Q}E(k+1|k)\\ 0\\ \end{array} \right)\\[3mm] &=Az-b \end{aligned}
ρ=(Q(SxΔx(k)+SuΔU(k)+Iy(k)−R(k+1))HΔU(k))=(QSuH)ΔU(k)−(Q(R(k+1)−SxΔx(k)−Iy(k))0)=(QSuH)ΔU(k)−(QE(k+1∣k)0)=Az−b
对
ρ
T
ρ
=
(
A
z
−
b
)
T
(
A
z
−
b
)
ρ^Tρ=(Az-b)^T(Az-b)
ρTρ=(Az−b)T(Az−b)求导等于零:
d
ρ
T
ρ
d
z
=
2
A
T
(
A
z
−
b
)
=
0
\frac{\mathrm{d} ρ^Tρ }{\mathrm{d} z} = 2A^T(Az-b)=0
dzdρTρ=2AT(Az−b)=0
得到最优解为:
z
∗
=
(
A
T
A
)
−
1
A
T
b
z^*=(A^TA)^{-1}A^Tb
z∗=(ATA)−1ATb
这样我们就可以求解出最优解了,这里需要强调一下,对于
E
(
k
+
1
∣
k
)
=
R
(
k
+
1
)
−
S
x
Δ
x
(
k
)
−
I
y
(
k
)
E(k+1|k)=R(k+1)-S_xΔx(k)-Iy(k)
E(k+1∣k)=R(k+1)−SxΔx(k)−Iy(k)
这里面都是计算或者观测出来的量。如果将结果
z
∗
z^*
z∗写成:
z
∗
=
Δ
U
∗
=
K
(
R
(
k
+
1
)
−
S
x
Δ
x
(
k
)
−
I
y
(
k
)
)
z^* = ΔU^*=K(R(k+1)-S_xΔx(k)-Iy(k))
z∗=ΔU∗=K(R(k+1)−SxΔx(k)−Iy(k))
可以看出,这里面的前馈反映在未来的参考输入
R
(
k
+
1
)
R(k+1)
R(k+1),反馈则反映在当前时刻获取的
Δ
x
(
k
)
和
y
(
k
)
Δx(k)和y(k)
Δx(k)和y(k)上。
加入约束之后的计算方法
对于约束的解释
可能有人有疑问,刚才上面的模型构建中其实是有约束的(模型约束)。这里说的约束一般指的是对自变量范围的约束,而不是模型的约束。那又会有人有疑问,目标函数里面的加权项考虑了对控制动作变化不能太大的要求,这其实是一个软约束。MPC中的约束,是指在优化问题中包含时域硬约束:
u
m
i
n
≤
u
(
k
+
i
)
≤
u
m
a
x
,
i
=
0
,
1
,
.
.
.
,
m
−
1
Δ
u
m
i
n
≤
Δ
u
(
k
+
i
)
≤
Δ
u
m
a
x
,
i
=
0
,
1
,
.
.
.
,
m
−
1
\begin{aligned} u_{min}≤&u(k+i)≤u_{max}, i=0,1,...,m-1\\[2mm] Δu_{min}≤&Δu(k+i)≤Δu_{max}, i=0,1,...,m-1 \end{aligned}
umin≤Δumin≤u(k+i)≤umax, i=0,1,...,m−1Δu(k+i)≤Δumax, i=0,1,...,m−1
目标函数抛弃常数项,转化成 z T H z − g T z z^THz-g^Tz zTHz−gTz
这一步的思路很简单,这里先给个简单的例子,比如你想求
x
2
+
3
x
+
1
x^2+3x+1
x2+3x+1的最小化的那个点
x
∗
x^*
x∗,完全可以不管后面的
1
1
1,求
x
2
+
3
x
x^2+3x
x2+3x的
x
∗
x^*
x∗就可以了。初中就知道
−
b
/
2
a
-b/2a
−b/2a对吧。这里一个道理。对于刚才的目标函数省去最后一项,直接可以推导出:
J
1
=
Δ
U
(
k
)
T
H
Δ
U
(
k
)
−
G
(
k
+
1
∣
k
)
T
Δ
U
(
k
)
\begin{aligned} J_1 = ΔU(k)^THΔU(k)-G(k+1|k)^TΔU(k) \end{aligned}
J1=ΔU(k)THΔU(k)−G(k+1∣k)TΔU(k)
其中:
H
=
S
u
T
Q
S
u
+
H
G
(
k
+
1
∣
k
)
=
2
S
u
T
Q
E
(
k
+
1
∣
k
)
H = S_u^TQS_u+H\\[2mm] G(k+1|k)=2S_u^TQE(k+1|k)
H=SuTQSu+HG(k+1∣k)=2SuTQE(k+1∣k)
控制增量约束转化成 C z ≤ b Cz≤b Cz≤b
对于控制的增量:
Δ
u
m
i
n
≤
Δ
u
(
k
+
i
)
≤
Δ
u
m
a
x
,
i
=
0
,
1
,
.
.
.
,
m
−
1
Δu_{min}≤Δu(k+i)≤Δu_{max}, i=0,1,...,m-1
Δumin≤Δu(k+i)≤Δumax, i=0,1,...,m−1
可以将其竖着排列,就会有:
(
Δ
u
m
i
n
Δ
u
m
i
n
⋮
Δ
u
m
i
n
)
≤
Δ
U
(
k
)
≤
(
Δ
u
m
a
x
Δ
u
m
a
x
⋮
Δ
u
m
a
x
)
\left( \begin{array}{c} Δu_{min}\\ Δu_{min}\\ \vdots\\ Δu_{min}\\ \end{array} \right)≤ΔU(k)≤ \left( \begin{array}{c} Δu_{max}\\ Δu_{max}\\ \vdots\\ Δu_{max}\\ \end{array} \right)
⎝⎜⎜⎜⎛ΔuminΔumin⋮Δumin⎠⎟⎟⎟⎞≤ΔU(k)≤⎝⎜⎜⎜⎛ΔumaxΔumax⋮Δumax⎠⎟⎟⎟⎞
将左边的小于乘一个负号,这样可以改写成:
Δ
U
(
k
)
≤
(
Δ
u
m
a
x
Δ
u
m
a
x
⋮
Δ
u
m
a
x
)
−
Δ
U
(
k
)
≤
(
−
Δ
u
m
i
n
−
Δ
u
m
i
n
⋮
−
Δ
u
m
i
n
)
ΔU(k)≤ \left( \begin{array}{c} Δu_{max}\\ Δu_{max}\\ \vdots\\ Δu_{max}\\ \end{array} \right)\\ -ΔU(k)≤ \left( \begin{array}{c} -Δu_{min}\\ -Δu_{min}\\ \vdots\\ -Δu_{min}\\ \end{array} \right)
ΔU(k)≤⎝⎜⎜⎜⎛ΔumaxΔumax⋮Δumax⎠⎟⎟⎟⎞−ΔU(k)≤⎝⎜⎜⎜⎛−Δumin−Δumin⋮−Δumin⎠⎟⎟⎟⎞
这样合并成:
(
T
−
T
)
Δ
U
(
k
)
≤
(
Δ
u
m
a
x
Δ
u
m
a
x
⋮
Δ
u
m
a
x
−
Δ
u
m
i
n
−
Δ
u
m
i
n
⋮
−
Δ
u
m
i
n
)
\left( \begin{array}{c} T\\ -T\\ \end{array} \right)ΔU(k)≤ \left( \begin{array}{c} Δu_{max}\\ Δu_{max}\\ \vdots\\ Δu_{max}\\ -Δu_{min}\\ -Δu_{min}\\ \vdots\\ -Δu_{min}\\ \end{array} \right)
(T−T)ΔU(k)≤⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛ΔumaxΔumax⋮Δumax−Δumin−Δumin⋮−Δumin⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
其中:
T
=
(
I
n
u
×
n
u
0
⋯
0
0
I
n
u
×
n
u
⋯
0
⋮
⋮
⋮
0
0
⋯
I
n
u
×
n
u
)
T=\left( \begin{array}{ccc} I_{n_u×n_u}&0& \cdots&0\\[2mm] 0&I_{n_u×n_u}&\cdots&0\\[2mm] \vdots&\vdots&&\vdots\\[2mm] 0&0&\cdots&I_{n_u×n_u}\\[2mm] \end{array} \right)
T=⎝⎜⎜⎜⎜⎜⎜⎜⎛Inu×nu0⋮00Inu×nu⋮0⋯⋯⋯00⋮Inu×nu⎠⎟⎟⎟⎟⎟⎟⎟⎞
控制量约束转化成 C z ≤ b Cz≤b Cz≤b
由于有如下关系:
Δ
u
(
k
+
i
)
=
u
(
k
+
i
)
−
u
(
k
+
i
−
1
)
Δu(k+i)=u(k+i)-u(k+i-1)
Δu(k+i)=u(k+i)−u(k+i−1)
因此当
i
=
0
i=0
i=0有
u
(
k
)
=
u
(
k
−
1
)
+
Δ
u
(
k
)
u(k)=u(k-1)+Δu(k)
u(k)=u(k−1)+Δu(k),进而有:
u
m
i
n
≤
u
(
k
)
≤
u
m
a
x
⟹
{
Δ
u
(
k
)
≤
u
m
a
x
−
u
(
k
−
1
)
−
Δ
u
(
k
)
≤
−
(
u
m
i
n
−
u
(
k
−
1
)
)
u_{min}≤u(k)≤u_{max} \Longrightarrow\begin{cases} Δu(k)≤u_{max}-u(k-1)\\ -Δu(k)≤-(u_{min}-u(k-1)) \end{cases}
umin≤u(k)≤umax⟹{Δu(k)≤umax−u(k−1)−Δu(k)≤−(umin−u(k−1))
对
i
=
1
i=1
i=1有
u
(
k
+
1
)
=
u
(
k
−
1
)
+
Δ
u
(
k
)
+
Δ
u
(
k
+
1
)
u(k+1)=u(k-1)+Δu(k)+Δu(k+1)
u(k+1)=u(k−1)+Δu(k)+Δu(k+1),因此有
u
m
i
n
≤
u
(
k
+
1
)
≤
u
m
a
x
⟹
{
Δ
u
(
k
)
+
Δ
u
(
k
+
1
)
≤
u
m
a
x
−
u
(
k
−
1
)
−
(
Δ
u
(
k
)
+
Δ
u
(
k
+
1
)
)
≤
−
(
u
m
i
n
−
u
(
k
−
1
)
)
u_{min}≤u(k+1)≤u_{max} \Longrightarrow\begin{cases} Δu(k)+Δu(k+1)≤u_{max}-u(k-1)\\ -(Δu(k)+Δu(k+1))≤-(u_{min}-u(k-1)) \end{cases}
umin≤u(k+1)≤umax⟹{Δu(k)+Δu(k+1)≤umax−u(k−1)−(Δu(k)+Δu(k+1))≤−(umin−u(k−1))
以此类推,对于任何
i
=
0
,
1
,
2...
,
m
−
1
i=0,1,2...,m-1
i=0,1,2...,m−1:
u
m
i
n
≤
u
(
k
+
i
)
≤
u
m
a
x
⟹
{
∑
j
=
0
i
Δ
u
(
k
+
j
)
≤
u
m
a
x
−
u
(
k
−
1
)
−
∑
j
=
0
i
Δ
u
(
k
+
j
)
≤
−
(
u
m
i
n
−
u
(
k
−
1
)
)
u_{min}≤u(k+i)≤u_{max} \Longrightarrow\begin{cases} \sum_{j=0}^iΔu(k+j)≤u_{max}-u(k-1)\\[3mm] -\sum_{j=0}^iΔu(k+j)≤-(u_{min}-u(k-1)) \end{cases}
umin≤u(k+i)≤umax⟹⎩⎨⎧∑j=0iΔu(k+j)≤umax−u(k−1)−∑j=0iΔu(k+j)≤−(umin−u(k−1))
使用同样的方法,可以将其写成如下形式:
(
L
−
L
)
Δ
U
(
k
)
≤
(
u
m
a
x
−
u
(
k
−
1
)
u
m
a
x
−
u
(
k
−
1
)
⋮
u
m
a
x
−
u
(
k
−
1
)
−
(
u
m
i
n
−
u
(
k
−
1
)
)
−
(
u
m
i
n
−
u
(
k
−
1
)
)
⋮
−
(
u
m
i
n
−
u
(
k
−
1
)
)
)
\left( \begin{array}{c} L\\ -L\\ \end{array} \right)ΔU(k)≤ \left( \begin{array}{c} u_{max}-u(k-1)\\ u_{max}-u(k-1)\\ \vdots\\ u_{max}-u(k-1)\\ -(u_{min}-u(k-1))\\ -(u_{min}-u(k-1))\\ \vdots\\ -(u_{min}-u(k-1))\\ \end{array} \right)
(L−L)ΔU(k)≤⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛umax−u(k−1)umax−u(k−1)⋮umax−u(k−1)−(umin−u(k−1))−(umin−u(k−1))⋮−(umin−u(k−1))⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
其中:
L
=
(
I
n
u
×
n
u
0
⋯
0
I
n
u
×
n
u
I
n
u
×
n
u
⋯
0
⋮
⋮
⋮
I
n
u
×
n
u
I
n
u
×
n
u
⋯
I
n
u
×
n
u
)
L=\left( \begin{array}{ccc} I_{n_u×n_u}&0& \cdots&0\\[2mm] I_{n_u×n_u}&I_{n_u×n_u}&\cdots&0\\[2mm] \vdots&\vdots&&\vdots\\[2mm] I_{n_u×n_u}&I_{n_u×n_u}&\cdots&I_{n_u×n_u}\\[2mm] \end{array} \right)
L=⎝⎜⎜⎜⎜⎜⎜⎜⎛Inu×nuInu×nu⋮Inu×nu0Inu×nu⋮Inu×nu⋯⋯⋯00⋮Inu×nu⎠⎟⎟⎟⎟⎟⎟⎟⎞
转化为QP问题
其实个人认为MPC最后转化为什么问题求解绝大多数情况取决于目标函数的设计。我们可以看到目标函数设计成了二次型的,动力学方程和时域约束条件是线性的,所以问题就变成了一个二次规划(QP)问题:
min
z
z
T
H
z
−
g
T
z
s
.
t
.
C
z
≤
b
\min_z z^THz-g^Tz\\[2mm] s.t. Cz≤b
zmin zTHz−gTzs.t. Cz≤b
一般对于这种问题最常用的两种方法是:积极集法(active-set method)
和内点法(interior-point method)
。这样我们就把MPC问题变成了QP问题进行求解即可。之后将求出的第一个变量作用上去,并循环这个过程。对应于现实问题比如:
- 速度跟踪,可以参考:【Carsim Simulink自动驾驶仿真】基于MPC的速度控制
- 轨迹跟踪,可以参考:【Carsim Simulink自动驾驶仿真】基于MPC的轨迹跟踪控制