前言
在自动控制理论领域,基于对象的传递函数,使用劳斯判据、根轨迹、伯德图、奈奎斯特曲线等工具的古典自动控制原理,和基于对象的状态空间方程,使用李雅普诺夫定律、状态观测器等工具的现代控制理论(这里指的是狭义上的现代控制理论,有些比较广义的说法中,现代控制理论还把模糊控制、神经网络控制、预测控制等都包含进去了,个人倾向于狭义的说法)无疑是学术上的两座高峰,它们都有着坚固的数学基础,经过严格的数学公式推导与证明,从理论上保证了所设计的自动控制系统稳定(这里的稳定类似于数学上函数收敛的概念),应用十分广泛。但也有一些专家学者另辟蹊径,提出一些十分有趣的控制理论,这些控制理论的基础架构完全独立于前面两者,自成一派。可惜的是这些控制理论由于某些缺陷(文章的最后我们会稍稍讨论一下缺陷)导致应用范围十分受限,个人认为除非学术上需要,这些控制理论不必做过多研究,实际中应用也很少(工业慢对象上基本是PID一招鲜吃遍天),但是这些算法蕴含的思想还是值得一讲的。
上个世纪,基于状态空间方程的现代控制理论在航空航天等高精度,需要快速控制的领域成就卓越,解决了很多古典控制理论中的难题,但工业被控对象有非线性,耦合性强,参数还会随时间变化等特点,无法建立精确模型,导致现代控制理论应用效果很差,于是人们开始探索一些更适用于工业被控对象的智能控制算法,预测控制就是在这样的背景下诞生的。预测控制算法是一类算法的统称,比较经典的预测控制算法有模型预测控制(MPC),动态矩阵控制(Dynamic Matrix Control, DMC),广义预测控制(GPC),它们的区别是预测模型有所不同,但这些算法的思想都是一致的:预测模型——滚动优化——反馈校正,通过三个步骤的配合,预测控制在一些行业取得了良好的效果。
预测控制为什么有效果呢?打个不恰当的比方,两个人洗澡,一个人调节水温用手试,发现太烫了往右拧,又太冷了再往左拧,就这样来回来回好几次,水温终于调好了。另一个人就比较厉害了,他将阀门和水温的关系建立了一个预测模型,提前进行预测,现在水太冷,他把阀门按照预期的水温直接就拧到了对应位置,实际水温可能会比预期的稍高或稍低,他会先修正预测模型,然后再微调阀门位置。第二个人的水温调节过程要比第一个人优雅许多,但是他需要一个更加强大的大脑来构建预测模型。
动态矩阵控制在经典的预测控制算法中相对好理解一些,下面我会分几篇文章来介绍。预测控制算法的共性就是矩阵运算很多,初次看推导会觉得很绕,但实际应用不需要把公式全部用代码实现,只有几个涉及到结论的公式需要编程,用着用着再回来看看推导,就会有一种豁然开朗的感觉。下面我会尽量讲的通俗一些,但还是需要一些控制理论和线性代数相关的基础,可以先看结论,想理解透彻再去翻翻相关内容。
算法推导
首先要介绍一些基本概念,我们要控制的东西,专业名词叫被控对象(也称作系统/被控系统,后面我也会混用)。控制理论中的很多概念都和数学有关联,数学中的一个简单函数
y
=
f
(
x
)
y=f(x)
y=f(x),自变量
x
x
x变化会导致因变量
y
y
y变化,到了控制理论中,函数的
x
x
x和
y
y
y有了具体含义,分别是被控对象的输入和被控对象的输出,函数有多个自变量或多个因变量,对应到控制理论中,这个系统就是多输入/多输出的(输入也叫控制量,输出也叫被控量)。
y
=
f
(
x
)
y=f(x)
y=f(x)如果是完全连续的,称作线性的,如果存在不连续的部分,称作非线性的,与之相似,被控对象同样也分为线性对象和非线性对象。
早期的控制理论研究的被控对象都是线性的,虽然后来针对非线性对象有了一些研究成果,但只能局限于一些特殊情况或者得到一些特殊解。工程上很多被控对象都是非线性的,但经常采用的方法是不针对非线性本身进行研究,而将非线性对象分解为多个线性对象(非线性对象在局部/一段范围内一般也有很好的线性特征),这样我们就可以使用各种针对线性对象的工具了。
预测模型
最基本的动态矩阵控制针对的是完全线性的对象,下面我们针对单输入单输出的线性对象进行推导。线性对象有一个特点,满足叠加性,也就是说给对象
y
=
f
(
u
)
y=f(u)
y=f(u)两个不同输入
u
1
u_1
u1和
u
2
u_2
u2,得到的输出
y
1
y_1
y1和
y
2
y_2
y2相加,与给对象输入
u
1
+
u
2
u_1+u_2
u1+u2得到的输出是相等的,这个与数学中的函数特性是一致的:
y
1
+
y
2
=
f
(
u
1
)
+
f
(
u
2
)
=
f
(
u
1
+
u
2
)
\begin{equation} y_1+y_2=f(u_1)+f(u_2)=f(u_1+u_2) \end{equation}
y1+y2=f(u1)+f(u2)=f(u1+u2) 式(1)非常简单,却是预测控制得以对未来进行预测的基础。控制系统稳定之后(输入不再变化),再给系统一个新的阶跃输入
Δ
u
{\varDelta u}
Δu,间隔相同采样周期
d
t
dt
dt采集
N
+
1
N+1
N+1个输出(
N
N
N称作建模时域),我们会得到一组输出的采样序列
y
0
,
y
1
,
…
,
y
N
y_0,y_1,\dots,y_N
y0,y1,…,yN,如图所示:
类似于深度学习需要先进行数据预处理一样,我们这里也对序列进行平移和标准化(标准化就是所有数据都除以
Δ
u
{\varDelta u}
Δu,也就是无论阶跃输入是多少,都统一成
Δ
u
=
1
{\varDelta u}=1
Δu=1):
a
=
[
a
1
a
2
…
a
N
]
=
[
y
1
−
y
0
Δ
u
y
2
−
y
0
Δ
u
…
y
N
−
y
0
Δ
u
]
\begin{equation} \textit{\textbf{a}} = \begin{bmatrix} a_1\\a_2\\\dots\\a_N \end{bmatrix} = \begin{bmatrix} \frac{y_1-y_0}{\varDelta u}\\ \frac{y_2-y_0}{\varDelta u}\\ \dots\\ \frac{y_N-y_0}{\varDelta u}\\ \end{bmatrix} \end{equation}
a=
a1a2…aN
=
Δuy1−y0Δuy2−y0…ΔuyN−y0
上式得到的
a
\textit{\textbf{a}}
a称作阶跃响应模型,
a
\textit{\textbf{a}}
a用一列数表示了给系统施加单位输入时输出的数值,这就是DMC的预测模型。DMC的预测模型很简单对吧,这个“模型”简单到连公式都没有,哈哈。利用
a
\textit{\textbf{a}}
a,就可以对接下来
P
P
P个时刻的系统输出进行预测,
P
P
P称作预测时域,显然
P
P
P一定是小于等于
N
N
N的,因为预测模型只知道到
N
N
N为止输出的情况。补充一下,有些推导中是预测到
N
N
N个未来时刻输出,个人认为这样会导致后面的公式
P
P
P和
N
N
N看的有点乱,我倾向于预测全部用
P
P
P表示,毕竟它叫做“预测时域”。大家知道一下,我后面的
P
P
P全部用
N
N
N代替也是可以的,因为
P
P
P必须小于等于
N
N
N这个规则没有违背。
有了预测模型,下面开始推导算法,假设现在所处的时刻是
k
k
k时刻,且
k
k
k时刻及之后输入
u
u
u都不再变化(注意是不再变化,即输入的增量
Δ
u
{\varDelta u}
Δu为0,输入
u
u
u本身可能是不为0的)时预测未来的输出为
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k),
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)是一组数不是一个数:
y
~
P
0
(
k
)
=
[
y
~
0
(
k
+
1
∣
k
)
y
~
0
(
k
+
2
∣
k
)
…
y
~
0
(
k
+
P
∣
k
)
]
]
\begin{equation}\bm{\widetilde{y}_{P0}(k)}=\begin{bmatrix}\widetilde{y}_{0}(k+1|k)\\ \widetilde{y}_{0}(k+2|k)\\ \dots\\ \widetilde{y}_{0}(k+P|k)] \end{bmatrix}\end{equation}
y
P0(k)=
y
0(k+1∣k)y
0(k+2∣k)…y
0(k+P∣k)]
后续都用加粗表示这个变量是一个矩阵(包括行/列向量),式(3)里面的变量都只是一种表示方式,一种指代的代号,后面出现类似形式的变量含义也是类似的。后面公式中所有带波浪号~变量表示是一个估计(预测)的值,
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)中的下标
P
P
P表示对未来进行
P
P
P步预测,下标0表示未来没有施加控制增量,
k
k
k表示现在是
k
k
k时刻,
y
~
0
(
k
+
1
∣
k
)
\widetilde{y}_{0}(k+1|k)
y
0(k+1∣k)中的下标0表示未来没有施加控制增量,
k
+
1
∣
k
k+1|k
k+1∣k表示在
k
k
k时刻预测
k
+
1
k+1
k+1时刻,
k
+
2
∣
k
k+2|k
k+2∣k表示在
k
k
k时刻预测
k
+
2
k+2
k+2时刻,依此类推。
你可能会奇怪还没有开始进行预测,怎么就冒出来一堆要预测的值呢?很好的问题!
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)里面每个数是多少,我们确实还不知道,预测模型里只提供了输入变化时预测未来的输出值,并没有提供输入不变时对未来的预测。先别急,我们知道式(3)中的变量都还没有值,先当作已经知道好了,这是数学中常有的一种思路,虽然某个值未知,但我们可以装作它已知,然后通过一系列推导后,最后得到它的值。
假设式(3)已知情况下,在
k
k
k时刻施加一个控制增量
Δ
u
(
k
)
\varDelta u(k)
Δu(k),根据叠加性原理,显然可以预测出施加控制增量后的未来
P
P
P个输出
y
~
P
1
(
k
)
\bm{\widetilde{y}_{P1}(k)}
y
P1(k)为:
y
~
P
1
(
k
)
=
y
~
P
0
(
k
)
+
a
Δ
u
(
k
)
\begin{equation} \bm{\widetilde{y}_{P1}(k)}=\bm{\widetilde{y}_{P0}(k)}+\textit{\textbf{a}} \varDelta u(k) \end{equation}
y
P1(k)=y
P0(k)+aΔu(k) 式(4)是一种精简写法,详细列一下的话其实式(4)由
P
P
P行公式构成:
{
y
~
1
(
k
+
1
∣
k
)
=
y
~
0
(
k
+
1
∣
k
)
+
a
1
Δ
u
(
k
)
y
~
1
(
k
+
2
∣
k
)
=
y
~
0
(
k
+
2
∣
k
)
+
a
2
Δ
u
(
k
)
…
y
~
1
(
k
+
P
∣
k
)
=
y
~
0
(
k
+
P
∣
k
)
+
a
P
Δ
u
(
k
)
\begin{equation} \begin{dcases} \widetilde{y}_1(k+1|k)=\widetilde{y}_0(k+1|k)+a_1 \varDelta u(k)\\ \widetilde{y}_1(k+2|k)=\widetilde{y}_0(k+2|k)+a_2 \varDelta u(k)\\ \dots\\ \widetilde{y}_1(k+P|k)=\widetilde{y}_0(k+P|k)+a_P \varDelta u(k) \end{dcases} \end{equation}
⎩
⎨
⎧y
1(k+1∣k)=y
0(k+1∣k)+a1Δu(k)y
1(k+2∣k)=y
0(k+2∣k)+a2Δu(k)…y
1(k+P∣k)=y
0(k+P∣k)+aPΔu(k) 继续叠加,我们将一系列的控制增量一共
M
M
M个施加给对象:
Δ
u
M
(
k
)
=
[
Δ
u
(
k
)
Δ
u
(
k
+
1
)
…
Δ
u
(
k
+
M
−
1
)
]
\begin{equation} \bm{\varDelta u_M(k)}= \begin{bmatrix} \varDelta u(k)\\ \varDelta u(k+1)\\\dots\\ \varDelta u(k+M-1) \end{bmatrix} \end{equation}
ΔuM(k)=
Δu(k)Δu(k+1)…Δu(k+M−1)
强调一下,DMC的运算都是一个时刻一个时刻推演下去的,所以步序非常重要!!!一定要清楚预测
k
k
k时刻还是
k
+
1
k+1
k+1时刻输出,控制增量是
k
k
k时刻还是
k
+
1
k+1
k+1时刻施加给对象的。上面的控制增量在
k
k
k时刻施加给对象的是
Δ
u
(
k
)
\varDelta u(k)
Δu(k),在下个时刻也就是
k
+
1
k+1
k+1时刻观测到输出的变化,
k
+
1
k+1
k+1时刻施加给对象的是
Δ
u
(
k
)
+
Δ
u
(
k
+
1
)
\varDelta u(k)+\varDelta u(k+1)
Δu(k)+Δu(k+1),在下一时刻也就是
k
+
2
k+2
k+2时刻观测到输出的变化,一直到
k
+
M
−
1
k+M-1
k+M−1时刻把上面
M
M
M个控制增量全部施加给对象,在下一时刻
k
+
M
k+M
k+M时刻观测到输出的变化,在
k
+
M
k+M
k+M时刻一直到
k
+
P
−
1
k+P-1
k+P−1时刻控制增量不再继续叠加了。
分开列公式,在
k
k
k时刻及之后依次施加
M
M
M个控制增量,基于
k
k
k时刻预测
k
+
1
k+1
k+1时刻到
k
+
M
k+M
k+M时刻的输出为:
{
y
~
M
(
k
+
1
∣
k
)
=
y
~
0
(
k
+
1
∣
k
)
+
a
1
Δ
u
(
k
)
y
~
M
(
k
+
2
∣
k
)
=
y
~
0
(
k
+
2
∣
k
)
+
a
2
Δ
u
(
k
)
+
a
1
Δ
u
(
k
+
1
)
…
y
~
M
(
k
+
M
∣
k
)
=
y
~
0
(
k
+
M
∣
k
)
+
a
M
Δ
u
(
k
)
+
a
M
−
1
Δ
u
(
k
−
1
)
+
⋯
+
a
1
Δ
u
(
k
+
M
−
1
)
\begin{equation} \begin{dcases} \widetilde{y}_M(k+1|k)=\widetilde{y}_0(k+1|k)+a_1 \varDelta u(k)\\ \widetilde{y}_M(k+2|k)=\widetilde{y}_0(k+2|k)+a_2 \varDelta u(k)+a_1 \varDelta u(k+1)\\ \dots\\ \widetilde{y}_M(k+M|k)=\widetilde{y}_0(k+M|k)+a_M \varDelta u(k)+a_{M-1} \varDelta u(k-1)+\dots+a_{1} \varDelta u(k+M-1) \end{dcases} \end{equation}
⎩
⎨
⎧y
M(k+1∣k)=y
0(k+1∣k)+a1Δu(k)y
M(k+2∣k)=y
0(k+2∣k)+a2Δu(k)+a1Δu(k+1)…y
M(k+M∣k)=y
0(k+M∣k)+aMΔu(k)+aM−1Δu(k−1)+⋯+a1Δu(k+M−1) 在
k
k
k时刻及之后依次施加
M
M
M个控制增量,基于
k
k
k时刻预测
k
+
M
+
1
k+M+1
k+M+1时刻到
k
+
P
k+P
k+P时刻的输出为:
{
y
~
M
(
k
+
M
+
1
∣
k
)
=
y
~
0
(
k
+
M
+
1
∣
k
)
+
a
M
+
1
Δ
u
(
k
)
+
a
M
Δ
u
(
k
+
1
)
+
⋯
+
a
2
Δ
u
(
k
+
M
−
1
)
y
~
M
(
k
+
M
+
2
∣
k
)
=
y
~
0
(
k
+
M
+
2
∣
k
)
+
a
M
+
2
Δ
u
(
k
)
+
a
M
+
1
Δ
u
(
k
+
1
)
+
⋯
+
a
3
Δ
u
(
k
+
M
−
1
)
…
y
~
M
(
k
+
P
∣
k
)
=
y
~
0
(
k
+
P
∣
k
)
+
a
P
Δ
u
(
k
)
+
a
P
−
1
Δ
u
(
k
+
1
)
+
⋯
+
a
P
−
M
+
1
Δ
u
(
k
+
M
−
1
)
\begin{equation} \begin{dcases} \widetilde{y}_M(k+M+1|k)=\widetilde{y}_0(k+M+1|k)+a_{M+1} \varDelta u(k)+a_M \varDelta u(k+1)+\dots+a_2\varDelta u(k+M-1)\\ \widetilde{y}_M(k+M+2|k)=\widetilde{y}_0(k+M+2|k)+a_{M+2} \varDelta u(k)+a_{M+1} \varDelta u(k+1)+\dots+a_3\varDelta u(k+M-1)\\ \dots\\ \widetilde{y}_M(k+P|k)=\widetilde{y}_0(k+P|k)+a_{P} \varDelta u(k)+a_{P-1} \varDelta u(k+1)+\dots+a_{P-M+1}\varDelta u(k+M-1) \end{dcases} \end{equation}
⎩
⎨
⎧y
M(k+M+1∣k)=y
0(k+M+1∣k)+aM+1Δu(k)+aMΔu(k+1)+⋯+a2Δu(k+M−1)y
M(k+M+2∣k)=y
0(k+M+2∣k)+aM+2Δu(k)+aM+1Δu(k+1)+⋯+a3Δu(k+M−1)…y
M(k+P∣k)=y
0(k+P∣k)+aPΔu(k)+aP−1Δu(k+1)+⋯+aP−M+1Δu(k+M−1) 上面的式(7)和式(8)写成矩阵形式:
y
~
P
M
(
k
)
=
y
~
P
0
(
k
)
+
A
Δ
u
M
(
k
)
\begin{equation} \bm{\widetilde{y}_{PM}(k)}=\bm{\widetilde{y}_{P0}(k)}+\bm{A \varDelta u_M(k)} \end{equation}
y
PM(k)=y
P0(k)+AΔuM(k) 其中:
y
~
P
M
(
k
)
=
[
y
~
M
(
k
+
1
∣
k
)
y
~
M
(
k
+
2
∣
k
)
…
y
~
M
(
k
+
P
∣
k
)
]
]
\begin{equation}\bm{\widetilde{y}_{PM}(k)}=\begin{bmatrix}\widetilde{y}_{M}(k+1|k)\\ \widetilde{y}_{M}(k+2|k)\\ \dots\\ \widetilde{y}_{M}(k+P|k)] \end{bmatrix}\end{equation}
y
PM(k)=
y
M(k+1∣k)y
M(k+2∣k)…y
M(k+P∣k)]
A
=
[
a
1
…
0
⋮
⋱
⋮
a
M
…
a
1
⋮
⋱
⋮
a
P
…
a
P
−
M
+
1
]
P
×
M
\begin{equation} \bm{A}=\begin{bmatrix} a_1&\dots&0\\ \vdots&\ddots&\vdots\\ a_M&\dots&a_1\\ \vdots&\ddots&\vdots\\ a_P&\dots&a_{P-M+1} \end{bmatrix} _{P×M} \end{equation}
A=
a1⋮aM⋮aP…⋱…⋱…0⋮a1⋮aP−M+1
P×M 这里的
A
\bm{A}
A叫做动态矩阵,这就是动态矩阵控制的由来,可以看到动态矩阵其实就是预测模型取了前面一部分,重新排列组合构成的。
前面已经假设过
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)已知,那么在式(9)基础上,未来给系统输入任何已知控制增量,我们都可以预测出系统输出。到此为止,我们有了预测模型,并在预测模型基础上预测了未来有限个时刻内(
P
P
P个时刻)对象的输出。
滚动优化
所谓自动控制算法,目的是什么呢?是求得控制量的解,某个范围内,或者某些条件下,这个解对于被控对象来说是最优的。
最优代表了什么呢?最优代表了我把求得的控制量输入给系统,能够使系统最快且最准地从当前状态移动到我期望的状态,比如我想让水温从现在的20℃升到30℃,要足够快,并且温度上升的过程中要精确,如果温度到达期望状态是这样的过程:从20℃升到35℃,又降到25℃,又升到33℃,又降到27℃,最后才到30℃,这样显然不准。
在理论研究中,最优确实只需要关注怎样让输出又快又准,但是在实际工程中,最优还包括了控制量的稳定,因为实际工程中,控制量要交给执行机构去动作,比如阀门,不能一下开到顶,又一下关到死,这样大开大合,对实际设备损害极大。比如某一种算法,让水流量从0t/h升到100t/h,只需要一秒钟,一步到位,又快又准,但是观察控制量,从0%一秒到100%,下一秒又一下降到1%,然后下一秒50%,反复的开关开关,很伤设备。
结合上面的讨论,先给出DMC的性能指标函数:
min
(
J
)
=
∑
i
=
1
P
q
i
[
ω
(
k
+
i
)
−
y
~
M
(
k
+
i
∣
k
)
]
2
+
∑
j
=
1
M
λ
j
Δ
u
2
(
k
+
j
−
1
)
\begin{equation} \min(J)=\sum_{i=1}^{P}q_i\lbrack \omega(k+i)-\widetilde{y}_M(k+i|k) \rbrack ^2+\sum_{j=1}^{M}\lambda_j\varDelta u^2(k+j-1) \end{equation}
min(J)=i=1∑Pqi[ω(k+i)−y
M(k+i∣k)]2+j=1∑MλjΔu2(k+j−1) 要求出最优的控制增量,就要使得式(6)这
M
M
M个控制增量带入式(12)后,在所有的控制增量中能使性能指标函数最小。式(12)出现了很多新的变量,下面慢慢来解释。
ω
(
k
+
i
)
\omega(k+i)
ω(k+i)叫做参考轨迹,表示的是
P
P
P个公式:
ω
(
k
+
i
)
=
α
i
y
(
k
)
+
(
1
−
α
i
)
y
SP
(
k
+
i
)
,
i
=
1
,
2
,
⋯
,
P
\begin{equation} \omega(k+i) = \alpha ^iy(k)+(1-\alpha ^i)y_{\text{SP}}(k+i),i=1,2,\cdots,P \end{equation}
ω(k+i)=αiy(k)+(1−αi)ySP(k+i),i=1,2,⋯,P
y
SP
(
k
+
i
)
y_{\text{SP}}(k+i)
ySP(k+i)是从
k
+
1
k+1
k+1时刻到
k
+
P
k+P
k+P时刻每个时刻设定值,设定值是提前给定好的。
α
\alpha
α叫做柔化因子,是一个0到1之间人工调节的参数,不同取值柔化强度不同。式(13)就是对设定值做一个“削弱”,传统的控制算法会把设定值直接提供给控制算法去计算,DMC是将柔化轨迹作为计算用的设定值,显然通过柔化轨迹这样慢慢增加设定值,控制过程会平缓一些,但速度上会减慢。在控制中,快速和稳定往往只能相对去平衡,鱼和熊掌不可兼得。
y
~
M
(
k
+
i
∣
k
)
\widetilde{y}_M(k+i|k)
y
M(k+i∣k)就是式(10)中的预测值,
Δ
u
(
k
+
j
−
1
)
\varDelta u(k+j-1)
Δu(k+j−1)就是式(6)这些控制增量,这是要求解的量,
q
i
(
i
=
1
,
2
,
⋯
,
P
)
q_i(i=1,2,\cdots,P)
qi(i=1,2,⋯,P)和
λ
j
(
j
=
1
,
2
,
⋯
,
M
)
\lambda_j(j=1,2,\cdots,M)
λj(j=1,2,⋯,M)是人工给定的系数,这些系数要一个一个给定太繁琐了,我们一般采用同一个系数,也就是
q
1
=
q
2
=
⋯
=
q
P
=
q
q_1=q_2=\cdots=q_P=q
q1=q2=⋯=qP=q和
λ
1
=
λ
2
=
⋯
=
λ
M
=
λ
\lambda_1=\lambda_2=\cdots=\lambda_M=\lambda
λ1=λ2=⋯=λM=λ。
式(12)是DMC最核心的公式,分为两部分,前一部分是未来预测值和设定值(参考轨迹)的误差乘以权重的累加和,后一部分是控制增量乘以权重的累加和,前一部分小,说明足够快和准,后一部分小,说明控制增量足够稳,结合起来,所给出的性能指标函数同时考虑了快准稳。
还需要说明一下,式(12)中最能体现预测控制独特性的就是
y
~
M
(
k
+
i
∣
k
)
\widetilde{y}_M(k+i|k)
y
M(k+i∣k)这一项,一般的控制算法计算误差,都是采用当前的反馈值和当前的设定值,基于当前及历史上的已知信息求解最优控制量,而预测控制基于预测模型,预测了不同控制增量下未来的输出,从而可以在当前时刻将未来的控制增量全部规划好。两个人开车,一个人只看眼前的车流量选择最快的路线,而另一个预测到了路途上每个路口的车流量,提前规划好了全局最快速的行驶路线,显然后者更优秀。
式(12)稍微加工一下,写成更美观的式(14)形式,这两个式子含义是一样的,只是式(14)的矩阵形式在数学上更加美观,符号是一一对应的不再解释了:
min
(
J
)
=
∥
ω
P
(
k
)
−
y
~
P
M
(
k
)
∥
Q
2
+
∥
Δ
u
M
(
k
)
∥
Λ
2
\begin{equation} \min(J)=\lVert \bm{\omega_P(k)}-\bm{\widetilde{y}_{PM}(k)} \rVert_Q^2+\lVert \bm{\varDelta u_M(k)} \rVert_\Lambda^2 \end{equation}
min(J)=∥ωP(k)−y
PM(k)∥Q2+∥ΔuM(k)∥Λ2 上式中
Δ
u
M
(
k
)
\bf{\varDelta u_M(k)}
ΔuM(k)是要求解的未知量,其他都已知,这其实是一个求一元二次函数极值的问题,如果是普通的一元二次函数,我们初中就学过,求它的导数为0的点即可得到极值。式(14)比较麻烦的是多个未知量构成了矩阵,需要矩阵求导相关知识,这里就不做介绍了,感兴趣可以找找相关文献,方法上其实是十分类似的,跳过一下,直接得到求解的结果:
Δ
u
M
(
k
)
=
(
A
T
Q
A
+
Λ
)
−
1
A
T
Q
[
ω
P
(
k
)
−
y
~
P
0
(
k
)
]
\begin{equation} \bm{\varDelta u_M(k)=(A^{\text{T}}QA+\Lambda)^{-1}A^{\text{T}}Q[\omega_P(k)-\widetilde{y}_{P0}(k)] } \end{equation}
ΔuM(k)=(ATQA+Λ)−1ATQ[ωP(k)−y
P0(k)] 其中
Q
\bm{Q}
Q和
Λ
\bm{\Lambda}
Λ是
P
×
P
P×P
P×P和
M
×
M
M×M
M×M大小的矩阵,只有对角线为
q
q
q和
λ
\lambda
λ:
Q
=
[
q
…
0
⋮
⋱
⋮
0
…
q
]
P
×
P
\begin{equation} \bm{Q}=\begin{bmatrix} q&\dots&0\\ \vdots&\ddots&\vdots\\ 0&\dots&q\\ \end{bmatrix} _{P×P} \end{equation}
Q=
q⋮0…⋱…0⋮q
P×P
Λ
=
[
λ
…
0
⋮
⋱
⋮
0
…
λ
]
M
×
M
\begin{equation} \bm{\Lambda}=\begin{bmatrix} \lambda&\dots&0\\ \vdots&\ddots&\vdots\\ 0&\dots&\lambda\\ \end{bmatrix} _{M×M} \end{equation}
Λ=
λ⋮0…⋱…0⋮λ
M×M 式(15)右边都是已知量,于是在
k
k
k时刻我们就可以得到未来的
M
M
M步控制增量,接下来在现有控制量上依次叠加控制增量即可,所以
k
+
1
k+1
k+1时刻控制量为:
u
(
k
+
1
)
=
u
(
k
)
+
Δ
u
(
k
)
\begin{equation} u(k+1)=u(k)+\varDelta u(k) \end{equation}
u(k+1)=u(k)+Δu(k) 虽然一次得到了未来的
M
M
M步控制增量,但是如果到了
k
+
1
k+1
k+1时刻会重新计算一遍控制增量,也就是说实际上每个时刻,我们预测了未来
P
P
P步的输出,计算出了
M
M
M步的控制增量,但实际上只采用其中第一个控制增量:
Δ
u
(
k
)
=
c
T
Δ
u
M
(
k
)
=
c
T
(
A
T
Q
A
+
Λ
)
−
1
A
T
Q
[
ω
P
(
k
)
−
y
~
P
0
(
k
)
]
\begin{equation} \varDelta u(k)=c^{\text{T}}\bm{\varDelta u_M(k)}=\bm{c^{\text{T}}}\bm{(A^{\text{T}}QA+\Lambda)^{-1}A^{\text{T}}Q[\omega_P(k)-\widetilde{y}_{P0}(k)]} \end{equation}
Δu(k)=cTΔuM(k)=cT(ATQA+Λ)−1ATQ[ωP(k)−y
P0(k)] 这里的
c
T
=
[
1
0
…
0
]
1
×
M
\bm{c^{\text{T}}}=\begin{bmatrix}1&0&\dots&0\\\end{bmatrix} _{1×M}
cT=[10…0]1×M。
有些控制算法寻找最优控制量,是尽可能达到“全局最优”,而从前面的求解可以看出,预测控制求的最优解是限定在
P
P
P个时刻内的,也就是说我们求的是局部最优解,随着时间推移,求解的范围也会跟着移动,但都是在基于“当前”的未来
P
P
P步之内,不断向前,循环求解,这就是预测控制中滚动优化的思想。
反馈校正
到这里为止,我们得到了DMC的控制律式(19),那么建立预测模型,设定好参数,DMC算法就可以运行起来了吗?不,别忘记我们一开始提出的假设
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)还是个未知量呢!前面为了得到控制律先假设它存在,现在该知道它到底是多少了,这就是DMC最后一个核心环节,反馈校正的工作。
我们在
k
k
k时刻将
Δ
u
(
k
)
\varDelta u(k)
Δu(k)施加给对象,同时计算出未来的预测输出
y
~
P
1
(
k
)
\bm{\widetilde{y}_{P1}(k)}
y
P1(k),注意因为只施加了一个控制增量,后面的控制增量还都没有施加也就是都为0,所以预测输出应该是
y
~
P
1
(
k
)
\bm{\widetilde{y}_{P1}(k)}
y
P1(k),而不是
y
~
P
M
(
k
)
\bm{\widetilde{y}_{PM}(k)}
y
PM(k)。时间来到
k
+
1
k+1
k+1时刻,现在可以观测到对象的实际输出
y
(
k
+
1
)
y(k+1)
y(k+1),取出
y
~
P
1
(
k
)
\bm{\widetilde{y}_{P1}(k)}
y
P1(k)中的第一行
y
~
1
(
k
+
1
∣
k
)
\widetilde{y}_1(k+1|k)
y
1(k+1∣k),求一下误差
e
(
k
+
1
)
e(k+1)
e(k+1):
e
(
k
+
1
)
=
y
(
k
+
1
)
−
y
~
1
(
k
+
1
∣
k
)
\begin{equation} e(k+1)=y(k+1)-\widetilde{y}_1(k+1|k) \end{equation}
e(k+1)=y(k+1)−y
1(k+1∣k) 这个误差表明
k
+
1
k+1
k+1时刻预测模型得到的预测输出与实际输出的误差,这个误差不为0表示我们建立的预测模型不是完全准确,需要校正预测模型,校正的方法很简单,就是在
y
~
P
1
(
k
)
\bm{\widetilde{y}_{P1}(k)}
y
P1(k)基础上加上误差,为了灵活调整,这里有一个参数
h
\bf{h}
h用来调节校正强度,和前面的
q
q
q,
λ
\lambda
λ一样,本身
h
\bf{h}
h是
P
P
P行1列的可调整参数,但是太繁琐了,同样令
h
1
=
h
2
=
⋯
=
h
P
=
h
h_1=h_2=\cdots=h_P=h
h1=h2=⋯=hP=h,一般没有特殊需要
h
=
1
h=1
h=1即可,先分开列一下公式:
{
y
~
C
O
R
(
k
+
1
∣
k
+
1
)
=
y
~
1
(
k
+
1
∣
k
)
+
h
e
(
k
+
1
)
y
~
C
O
R
(
k
+
2
∣
k
+
1
)
=
y
~
1
(
k
+
2
∣
k
)
+
h
e
(
k
+
1
)
…
y
~
C
O
R
(
k
+
P
∣
k
+
1
)
=
y
~
1
(
k
+
P
∣
k
)
+
h
e
(
k
+
1
)
\begin{equation} \begin{dcases} \widetilde{y}_{COR}(k+1|k+1)=\widetilde{y}_1(k+1|k)+h e(k+1)\\ \widetilde{y}_{COR}(k+2|k+1)=\widetilde{y}_1(k+2|k)+h e(k+1)\\ \dots\\ \widetilde{y}_{COR}(k+P|k+1)=\widetilde{y}_1(k+P|k)+h e(k+1) \end{dcases} \end{equation}
⎩
⎨
⎧y
COR(k+1∣k+1)=y
1(k+1∣k)+he(k+1)y
COR(k+2∣k+1)=y
1(k+2∣k)+he(k+1)…y
COR(k+P∣k+1)=y
1(k+P∣k)+he(k+1) 然后同样用矩阵形式表达:
y
~
COR
(
k
+
1
)
=
y
~
P
1
(
k
)
+
h
e
(
k
+
1
)
\begin{equation} \bm{\widetilde{y}_\text{COR}(k+1)}=\bm{\widetilde{y}_{P1}(k)}+\textit{\textbf{h}}e(k+1) \end{equation}
y
COR(k+1)=y
P1(k)+he(k+1)
y
~
COR
(
k
+
1
)
\bm{\widetilde{y}_\text{COR}(k+1)}
y
COR(k+1)就是
k
+
1
k+1
k+1时刻校正后的未来预测输出:
y
~
COR
(
k
+
1
)
=
[
y
~
C
O
R
(
k
+
1
∣
k
+
1
)
y
~
C
O
R
(
k
+
2
∣
k
+
1
)
…
y
~
C
O
R
(
k
+
P
∣
k
+
1
)
]
]
\begin{equation} \bm{\widetilde{y}_\text{COR}(k+1)}=\begin{bmatrix}\widetilde{y}_{COR}(k+1|k+1)\\ \widetilde{y}_{COR}(k+2|k+1)\\ \dots\\ \widetilde{y}_{COR}(k+P|k+1)] \end{bmatrix} \end{equation}
y
COR(k+1)=
y
COR(k+1∣k+1)y
COR(k+2∣k+1)…y
COR(k+P∣k+1)]
上面的过程求实际输出和预测输出的误差,然后用来修正预测模型,这就是反馈校正的思想。
得到
k
+
1
k+1
k+1时刻校正后的未来预测输出,我们发现,此时未来的控制增量就是都为0的!也就是说,式(21)除了第一行,从第二行到最后一行,表示的就是在
k
+
1
k+1
k+1时刻,未来控制增量全为0时对
k
+
2
k+2
k+2到
k
+
P
k+P
k+P时刻的输出预测!
y
~
0
(
k
+
1
+
i
∣
k
+
1
)
=
y
~
COR
(
k
+
1
+
i
∣
k
+
1
)
,
i
=
1
,
2
,
⋯
,
P
−
1
\begin{equation} \widetilde{y}_0(k+1+i|k+1)=\widetilde{y}_\text{COR}(k+1+i|k+1),i=1,2,\cdots,P-1 \end{equation}
y
0(k+1+i∣k+1)=y
COR(k+1+i∣k+1),i=1,2,⋯,P−1 但是上面的
y
~
0
(
k
+
1
+
i
∣
k
+
1
)
\widetilde{y}_0(k+1+i|k+1)
y
0(k+1+i∣k+1)就等于
y
~
P
0
(
k
+
1
)
\bm{\widetilde{y}_{P0}(k+1)}
y
P0(k+1)吗?不是的,因为
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)表示
k
k
k时刻对
k
+
1
k+1
k+1到
k
+
P
k+P
k+P时刻的预测,那么
y
~
0
(
k
+
1
+
i
∣
k
+
1
)
\widetilde{y}_0(k+1+i|k+1)
y
0(k+1+i∣k+1)显然还得再加一行对
k
+
P
+
1
k+P+1
k+P+1时刻的预测才能等价于
y
~
P
0
(
k
+
1
)
\bm{\widetilde{y}_{P0}(k+1)}
y
P0(k+1),但是式(21)只计算到了
k
+
P
k+P
k+P时刻,并没有得到
k
+
P
+
1
k+P+1
k+P+1时刻预测输出。为了保证预测能持续进行下去,DMC简单粗暴地采用了近似,认为
y
~
0
(
k
+
P
+
1
∣
k
+
1
)
=
y
~
0
(
k
+
P
∣
k
+
1
)
\widetilde{y}_0(k+P+1|k+1)=\widetilde{y}_0(k+P|k+1)
y
0(k+P+1∣k+1)=y
0(k+P∣k+1),于是得到了完整的
y
~
P
0
(
k
+
1
)
\bm{\widetilde{y}_{P0}(k+1)}
y
P0(k+1):
y
~
P
0
(
k
+
1
)
=
S
⋅
y
~
COR
(
k
+
1
)
\begin{equation} \bm{\widetilde{y}_{P0}(k+1)}=\bm{S}\cdot \bm{\widetilde{y}_\text{COR}(k+1)} \end{equation}
y
P0(k+1)=S⋅y
COR(k+1) 其中
S
\bm{S}
S叫做移位矩阵:
S
=
[
0
1
0
⋯
⋯
0
0
0
⋱
⋱
⋮
⋮
⋮
⋱
⋱
1
0
0
0
⋯
⋯
1
]
P
×
P
\begin{equation} \bm{S}= \begin{bmatrix} 0&1&0& \cdots & \cdots & 0\\ 0&0&\ddots & \ddots &&\vdots\\ \vdots & \vdots && \ddots & \ddots &1\\ 0&0&0&\cdots & \cdots &1 \end{bmatrix} _{P×P} \end{equation}
S=
00⋮010⋮00⋱0⋯⋱⋱⋯⋯⋱⋯0⋮11
P×P 这样
k
+
1
k+1
k+1时刻就可以由基础预测值继续求解控制律,完成下一时刻的控制器输出和误差校正。其实到这里细心的你会发现,我们虽然得到了
y
~
P
0
(
k
+
1
)
\bm{\widetilde{y}_{P0}(k+1)}
y
P0(k+1),但是
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)还是没有嘛!确实,因为因果关系是先有
k
k
k时刻的预测值,才能有
k
+
1
k+1
k+1时刻的预测值,一个人没有迈出第一步,怎么迈出第二步第三步呢?为了在因果上能实现,我们回到起点,也就是0时刻,或者叫DMC计算的第一步,这时让
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)全部为0,当然这个预测是和对象完全不符的,但是因为DMC有反馈校正环节,通过反馈校正,我们的
y
~
P
0
(
k
)
\bm{\widetilde{y}_{P0}(k)}
y
P0(k)会逐渐逼近对象实际输出。自此,DMC就完整实现了闭环,可以编程来解决实际问题了。
实际的编程并不需要把上面推导的公式全部实现,只需要能够求出控制增量即可,也就是式(19)右边全部要先求出来,其中
c
T
(
A
T
Q
A
+
Λ
)
−
1
A
T
Q
\bm{c^{\text{T}}}\bm{(A^{\text{T}}QA+\Lambda)^{-1}A^{\text{T}}Q}
cT(ATQA+Λ)−1ATQ在得到预测模型并且确定参数后就可以固定,不需要每次运算循环都计算一遍(除非参数变动或者模型有变化),只有
ω
P
(
k
)
−
y
~
P
0
(
k
)
\bm{\omega_P(k)-\widetilde{y}_{P0}(k)}
ωP(k)−y
P0(k)这部分要每次循环都进行求解。
相关讨论
通过上面的推导,我们感受了预测控制算法的独特思想,预测模型——滚动优化——反馈校正,DMC作为一种经典的预测控制算法,得到了一些实际应用,但是在理论上很难站稳脚跟,因为在它之前的控制算法,都是在数学稳定的基础上进行算法设计,DMC并没有在理论上证明稳定(这也与DMC算法本身基于离散的而不是连续的过程有关,古典控制理论很多工具都依赖于连续对象,离散对象可用的工具很少),而是先提出了算法本身。DMC算法到现在已经提出五六十年了,理论上的稳定性证明依然停留在一些特殊情况,在通用情况下的稳定性并没有得到证明,也就是说,虽然我们可以使用DMC算法做一些控制,但是前面的理论推导算是“想当然”的结果,可能预测着预测着模型与实际偏差越来越大,这都是说不准的。随着人工智能的发展,更先进的控制算法不断提出,DMC本身也一直没有得到继续发展——它的数学基础太薄弱了,但是算法蕴含的思想依然让人眼前一亮,希望大家看过之后能有一些启发。