引入
Riccati 方程是求解最优控制问题的关键。此前,我们都是用变分法与极大值原理理解的 Riccati 方程。事实上, Riccati 方程还可以用一种更直观的方法推导得来——不需要哈密顿量,不需要拉格朗日乘子,而是基于大家都知道的动态规划算法。
离散系统的动态规划
回顾动态规划算法
首先,我们回顾一下动态规划中最经典的最优路径问题。
例如有一块 n×n 的棋盘,棋子在棋盘的左上角。每一步棋子可以选择向右或向下走,直到抵达右下角的终点。此时,给棋盘上相邻格点间的每一段路径都设置一个代价,而我们的目标是找出那条是总路径所有代价之和最小的路径。
用动态规划的思想,我们知道我们可以从终点的格点开始,嵌套循环遍历求出每个格点到终点的最小代价。对每个格点,只需要比较右方格点的最小代价与向右路径代价的和,与下方格点的最小代价与向下路径代价的和,然后选出其中最小作为当前格点的最小代价,同时在格点数据结构的属性中记录代价最小的路径即可。
不难知道,整个路径的“最小代价”之和就是指标函数。为了模拟整个移动过程的代价累计,我们不妨设移动过程中的每一个状态都有一级最小代价,指标则是所有最小代价的和。
现在我们来写成公式形式。设走完全程需要 N 步,离散系统为:
xk+1=f(xk,uk)
对每个状态,定义每个状态的最小代价
V(xk)=ukmin(l(xk,uk)+V(xk+1))=ukmin[l(xk,uk)+V(f(xk,uk))],k∈[0,N−1]
同时我们有边界条件
V(xN)=lf
其中,l(xk,uk) 表示路径的代价,lf 表示终端状态的代价,其中的参数 uk 是输入,即向右还是向下。我们的目标是求出最优的输入使得指标最小。此时指标就等于:
J=V(x0)=lf+i=0∑N−1uiminl(xi,ui)
最优控制为:
uk∗(x)=argukmin[l(xk,uk)+V(f(xk,uk))]
求解
设系统为线性系统
xk+1=Akxk+Bkuk
我们不妨将性能指标定义为线性二次型形式,即
J=xNTSxN+k=0∑N−1(xkTQkxk+ukTRkuk)
则每一步的指标可以表示为 l(xk,uk)=xTQx+uTRu。对每一步的最优指标可以写出贝尔曼方程:
V(xk)=ukmin[xkTQkxk+ukTRkuk+V(xk+1)]=ukmin[xkTQkxk+ukTRkuk+V(Akxk+Bkuk)]
边界条件为
V(xN)=xNTSxN
由于系统是线性系统,指标为二次型,我们可以定性得到 V(xk) 也是二次型。我们不妨设 V(xk)=xkTPkxk。则贝尔曼方程可以表示为:
V(xk)=ukmin[xkTQkxk+ukTRkuk+(Akxk+Bkuk)TPk+1(Akxk+Bkuk)]
令偏导等于零,
∂uk∗∂V(xk)=2Rkuk+2BkTPk+1(Akxk+Bkuk)=0
解得
uk∗=−(Rk+BkTPk+1Bk)−1BkTPk+1Akxk
二阶偏导为
∂uk∗2∂2V(xk)=2Rk+2BkTPk+1Bk
由 P 的定义可知 P 半正定,又由 R 的正定性,∂uk2∂2V(xk)≻0,故 uk∗ 是最优控制。不妨设 Kk=(Rk+BkTPk+1Bk)−1BkTPk+1Ak,则 uk∗=−Kkxk。接下来为了方便,将省略下标 k。将最优控制代回到贝尔曼方程,并改写 V(xk):
xTPkxPk=xTQx+xTKTRKx+xT(A−BK)TPk+1(A−BK)x=Q+KTRK+(A−BK)TPk+1(A−BK)=Q+KTRK+ATPk+1A+KTBTPk+1BK−KTBTPk+1A−ATPk+1BK=Q+ATPk+1A+KT(R+BTPk+1B)K−KTBTPk+1A−ATPk+1BK
为了化简两个非二次型形式的负项,我们需要回到 K 的定义:
KBTPk+1AKTBTPk+1A=(R+BTPk+1Bk)−1BTPk+1A=(R+BTPk+1B)K=KT(R+BTPk+1B)K
将上式转置可得 ATPk+1BK=KT(R+BTPk+1B)TK=KT(R+BTPk+1B)K=KTBTPk+1A,故
Pk=Q+ATPk+1A−KTBTPk+1A
带入 K 的表达式,得
Pk=Qk+AkTPk+1Ak−AkTPk+1Bk(Rk+BkTPk+1Bk)−1BkTPk+1Ak
这就是离散时间代数 Riccati 方程。负反馈增益由 Kk=(Rk+BkTPk+1Bk)−1BkTPk+1Ak 得到。
连续系统的动态规划
设连续系统
x˙=A(t)x(t)+B(t)u(t)
其中 u(t)∈U。这里我们使用线性二次型指标,性能指标为
J=xT(T)Sx(T)+∫t0T[xT(t)Q(t)x(t)+uT(t)R(t)u(t)]dt
则最小指标
V(x(t),t)=u(t)∈Umin{xT(T)Sx(T)+∫tT(xTQx+uTRu)dt}=u(t)∈Umin{∫tt+Δt(xTQx+uTRu)dt+xT(T)Sx(T)+∫t+ΔtT(xTQx+uTRu)dt}=u(t)∈Umin{∫tt+Δt(xTQx+uTRu)dt+V(x(t+Δt),t+Δt)}
容易知道,连续系统无法直接求出迭代式,需要使用微分方程求解。其中 V(x(t+Δt)) 使用泰勒公式展开
V(x(t+Δt),t+Δt)=V(x(t),t)+dtdVΔt+o(Δt)2=V(x(t),t)+(∂x∂V)TdtdxΔt+∂t∂VΔt+o(Δt)2
两边 V(x(t)) 抵消,有
0=u(t)∈Umin∫tt+Δt(xTQx+uTRu)dt+(∂x∂V)TdtdxΔt+∂t∂VΔt+o(Δt)2
现在令 Δt→0,对 t 求导有:
0∂t∂V=u(t)∈Umin[(xTQx+uTRu)+(∂x∂V)Tdtdx+∂t∂V]=−u(t)∈Umin[(xTQx+uTRu)+(∂x∂V)T(Ax+Bu)]
我们不妨继续设 V(x(t),t)=xT(t)P(t)x(t),其中 P(t) 是对称矩阵。则 ∂t∂V=xTP˙x,∂x∂V=2Px。上式变为
xTP˙x=−u(t)∈Umin[(xTQx+uTRu)+2xTPT(Ax+Bu)]
令右式对u的偏导为零,
2Ru∗+2BTPx=0u∗=−R−1BTPx
设负反馈增益 K(t)=R−1(t)BT(t)P(t),则 u∗(t)=−K(t)x(t)。将最优控制代回,得到关于 P(t) 的微分方程:
−xTP˙x−P˙=xTQx+xTKTRKx+2xTPT(A−BK)x=Q+KTRK+2PT(A−BK)=Q+PTBR−1BTP+2PTA−2PTBR−1BTP=Q+2PTA−PTBR−1BTP
即
P˙+2PA−PBR−1BTP+Q=0
这就是 PT=P 时的连续时间代数 Riccati 微分方程,负反馈增益为 K(t)=R−1(t)BT(t)P(t)。