离散LQR理论推导

离散LQR

工程中用的大部分控制分为两种,无模型和基于模型的。无模型的主要是PID,基于模型的主要是LQR和MPC。PID的思想很直观不涉及推导,而LQR和MPC设计到一些具体数学公式的推导。这篇博客记录一下LQR的原理和推导过程,之后学到MPC了再详细展开记录。

首先限定讨论的范围,LQR(Linear Quadratic Regulation,线性二次调节器),针对的是线性时不变系统,本质上是一种状态反馈控制,最终目的是求反馈增益 K K K。此外,工程中应用中计算机控制是离散的,因此本篇博客讨论离散系统的LQR。

基于模型的控制,首先需要建立被控对象的模型。这里我们假设模型已经建立,状态矩阵和输入矩阵分别为 A A A B B B,系统离散状态空间方程为:
x ( k + 1 ) = A x ( k ) + B u ( k ) x(k+1) = Ax(k) + Bu(k) x(k+1)=Ax(k)+Bu(k)

LQR的思想是建立一个代价函数 J J J,找到某个控制律 u u u,使得代价函数最小,这里建立代价函数为:
J 0 → N = 1 2 x N T S x N + 1 2 ∑ k = 0 N − 1 ( x k T Q x k + u k T R u k ) J_{0\rightarrow N} = \frac{1}{2}x_N^T S x_N + \frac{1}{2}\sum\limits_{k=0}^{N-1}\left( x_k^T Q x_k + u_k^T R u_k \right) J0N=21xNTSxN+21k=0N1(xkTQxk+ukTRuk)
式中, N N N为终端时刻, S S S表示终端权重矩阵,即最终时刻系统状态的权重, Q Q Q R R R分别表示权重矩阵,这两个矩阵正定,赋予系统状态 x x x和系统输入 u u u中元素不同的权重,这些代价都是自行定义的参数。这个代价函数表示系统从初始 0 0 0时刻到最终 N N N时刻,状态和输入的加权平方和。

公式推导

先给出最终推导得到的形式:
P k = Q + A T P k − 1 A − A T P B ( B T P k − 1 B + R ) − 1 B T P k − 1 A K N − k = ( B T P k − 1 B + R ) − 1 B T P k − 1 A u N − k ∗ = − K N − k x N − k \begin{aligned} &P_{k} = Q + A^T P_{k-1} A - A^T P B(B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\ &K_{N-k} = (B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\ &u_{N-k}^* = -K_{N-k}x_{N-k} \end{aligned} Pk=Q+ATPk1AATPB(BTPk1B+R)1BTPk1AKNk=(BTPk1B+R)1BTPk1AuNk=KNkxNk
式中, k k k表示从 N N N时刻开始往前的步数, K K K表示反馈增益, P P P表示一个对称正定阵, u ∗ u^* u表示最优控制输入。

在推导的过程当中,我们需要时刻牢记推导的目标是找到最优的控制输入 u u u,使代价函数 J J J最小。这里的推导主要参考了b站DR_CAN的视频中反向迭代求解的方法。求解思路就是从最终时刻往前推,每一个迭代步骤的计算都需要用到上一步算出来的结果。

计算终端N时刻代价

首先讨论 N N N N N N时刻,代价函数可以表示为:
J N → N = 1 2 x N T S x N + 1 2 ∑ k = N N − 1 ( x k T Q x k + u k T R u k ) J_{N\rightarrow N} = \frac{1}{2}x_N^T S x_N + \frac{1}{2}\sum\limits_{k=N}^{N-1}\left( x_k^T Q x_k + u_k^T R u_k \right) JNN=21xNTSxN+21k=NN1(xkTQxk+ukTRuk)

终端时刻,加号后面的一项为 0 0 0,因为只有终端一个状态,那么其实终端时刻的代价与控制输入无关。这里我们令 S = P 0 S = P_0 S=P0,方便后续说明,终端代价为:
J N → N ∗ = 1 2 x N T P 0 x N J_{N\rightarrow N}^* = \frac{1}{2}x_N^T P_0 x_N JNN=21xNTP0xN

计算N-1时刻最优代价

接下来讨论 N − 1 N-1 N1 N N N时刻,代价函数为:
J N − 1 → N = 1 2 x N T P 0 x N + 1 2 ( x N − 1 T Q x N − 1 + u N − 1 T R u N − 1 ) J_{N-1 \rightarrow N} = \frac{1}{2}x_N^T P_0 x_N + \frac{1}{2}\left( x_{N-1}^T Q x_{N-1} + u_{N-1}^T R u_{N-1} \right) JN1N=21xNTP0xN+21(xN1TQxN1+uN1TRuN1)

根据状态空间方程,其中 x N = A x N − 1 + B u N − 1 x_N = Ax_{N-1} + Bu_{N-1} xN=AxN1+BuN1

为了找到 u N − 1 ∗ u_{N-1}^* uN1使 J N − 1 → N J_{N-1\rightarrow N} JN1N最小,首先求 J J J关于 u u u的偏导为 0 0 0的极值点,然后求二阶偏导大于0验证该极值点为极小值,即进行这两步:
∂ J N − 1 → N ∂ u N − 1 = 0 , ∂ 2 J N − 1 → N ∂ u N − 1 2 > 0 \frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}} = 0, \frac{\partial^2 J_{N-1 \rightarrow N}}{\partial u_{N-1}^2} > 0 uN1JN1N=0,uN122JN1N>0

这里需要用到矩阵求导和链式求导法则,(矩阵求导可以参考这篇博客,矩阵求导的公式为:
∂ A x ∂ x = A T , ∂ x T P x ∂ x = P x \frac{\partial Ax}{\partial x} = A^T, \frac{\partial x^T P x}{\partial x} = Px xAx=AT,xxTPx=Px
∂ 1 2 x N T P 0 X N ∂ u N − 1 = 1 2 ∂ x N ∂ u N − 1 ∗ ∂ x N T P 0 x N ∂ x N = B T P 0 x N \frac{\partial \frac{1}{2}x_N^T P_0 X_N}{\partial u_{N-1}} = \frac{1}{2}\frac{\partial x_N}{\partial u_{N-1}} * \frac{\partial x_N^T P_0 x_N}{\partial x_N} = B^T P_0 x_N uN121xNTP0XN=21uN1xNxNxNTP0xN=BTP0xN
求偏导过程为:
∂ 1 2 ( x N − 1 T Q x N − 1 + u N − 1 T R u N − 1 ) ∂ u N − 1 = R u N − 1 \frac{\partial \frac{1}{2} \left( x_{N-1}^T Q x_{N-1} + u_{N-1}^T R u_{N-1} \right)}{\partial u_{N-1}} = R u_{N-1} uN121(xN1TQxN1+uN1TRuN1)=RuN1

∂ J N − 1 → N ∂ u N − 1 = B T P 0 ( A x N − 1 + B u N − 1 ) + R u N − 1 = B T P 0 A x N − 1 + ( B T P 0 B + R ) u N − 1 \begin{aligned} \frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}} &= B^T P_0 \left(Ax_{N-1}+Bu_{N-1}\right) + Ru_{N-1}\\ &= B^T P_0 Ax_{N-1} + (B^T P_0 B + R)u_{N-1} \end{aligned} uN1JN1N=BTP0(AxN1+BuN1)+RuN1=BTP0AxN1+(BTP0B+R)uN1

∂ J N − 1 → N ∂ u N − 1 = 0 \frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}} = 0 uN1JN1N=0,可以找到的极值点。
u N − 1 ∗ = − ( B T P 0 B + R ) − 1 B T P 0 A x N − 1 u_{N-1}^* = -(B^T P_0 B + R)^{-1}B^T P_0 A x_{N-1} uN1=(BTP0B+R)1BTP0AxN1
接下来求二阶偏导验证此时的极值点为极小值(求二阶偏导验证>0)。
∂ 2 J N − 1 → N ∂ u N − 1 2 = ∂ ∂ J N − 1 → N ∂ u N − 1 ∂ u N − 1 = ( B T P 0 B + R T ) \frac{\partial^2 J_{N-1 \rightarrow N}}{\partial u_{N-1}^2} = \frac{\partial \frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}}}{\partial u_{N-1}} = (B^T P_0 B + R^T) uN122JN1N=uN1uN1JN1N=(BTP0B+RT)
其中,二次型 B T P 0 B > 0 B^T P_0 B > 0 BTP0B>0,权重矩阵 R > 0 R > 0 R>0,因此 ∂ 2 J N − 1 → N ∂ u N − 1 2 > 0 \frac{\partial^2 J_{N-1 \rightarrow N}}{\partial u_{N-1}^2} > 0 uN122JN1N>0,上面求的极值点为极小值点。

若令其中的 ( B T P 0 B + R ) − 1 B T = K N − 1 (B^T P_0 B + R)^{-1}B^T = K_{N-1} (BTP0B+R)1BT=KN1,那么 u N − 1 ∗ u_{N-1}^* uN1可以写为:
u N − 1 ∗ = − K N − 1 x N − 1 u_{N-1}^* = -K_{N-1}x_{N-1} uN1=KN1xN1
此时的输入量已经是一个状态反馈 u = − K x u=-Kx u=Kx的形式。接下来把把 u N − 1 ∗ u_{N-1}^* uN1代入 J N − 1 → N J_{N-1 \rightarrow N} JN1N,可得代价函数的最优形式:
J N − 1 → N ∗ = 1 2 x N − 1 T [ ( A − B K N − 1 ) T P 0 ( A − B K N − 1 ) + K N − 1 T R K N − 1 + Q ] x N − 1 J_{N-1 \rightarrow N}^* = \frac{1}{2}x_{N-1}^T \left[(A-BK_{N-1})^T P_0 (A-BK_{N-1}) + K_{N-1}^T R K_{N-1} + Q\right] x_{N-1} JN1N=21xN1T[(ABKN1)TP0(ABKN1)+KN1TRKN1+Q]xN1

这个二次型中间的矩阵变量其实都已经通过上面步骤推导得到了,那么可以令 P 1 = ( A − B K N − 1 ) T P 0 ( A − B K N − 1 ) + K N − 1 T R K N − 1 + Q P_{1} = (A-BK_{N-1})^T P_0 (A-BK_{N-1}) + K_{N-1}^T R K_{N-1} + Q P1=(ABKN1)TP0(ABKN1)+KN1TRKN1+Q。那么 N − 1 N-1 N1 N N N时刻的代价函数可以写为:
J N − 1 → N ∗ = 1 2 x N − 1 T P 1 x N − 1 J_{N-1 \rightarrow N}^* = \frac{1}{2}x_{N-1}^T P_{1} x_{N-1} JN1N=21xN1TP1xN1
此时与 N → N N\rightarrow N NN时刻的代价函数形式一致:
J N → N ∗ = 1 2 x N T P 0 x N J_{N \rightarrow N}^* = \frac{1}{2}x_{N}^T P_{0} x_{N} JNN=21xNTP0xN

那么由此可以迭代推导, ( N − 2 ) → N (N-2) \rightarrow N (N2)N时刻的代价函数的最优形式为:
J N − 2 → N ∗ = 1 2 x N − 2 T P 2 x N − 2 J_{N-2 \rightarrow N}^* = \frac{1}{2}x_{N-2}^T P_2 x_{N-2} JN2N=21xN2TP2xN2

归纳递推

那么 ( N − k ) → N (N-k) \rightarrow N (Nk)N时刻的代价函数最优形式为:
J N − k → N ∗ = 1 2 x N − k T P k x N − k J_{N-k \rightarrow N}^* = \frac{1}{2}x_{N-k}^T P_{k} x_{N-k} JNkN=21xNkTPkxNk

其中
P k = ( A − B K N − k ) T P k − 1 ( A − B K N − k ) + K N − k T R K N − k + Q K N − k = ( B T P k − 1 B + R ) − 1 B T P k − 1 A \begin{aligned} &P_{k} = (A-BK_{N-k})^T P_{k-1} (A-BK_{N-k}) + K_{N-k}^T R K_{N-k} + Q\\ &K_{N-k} = (B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \end{aligned} Pk=(ABKNk)TPk1(ABKNk)+KNkTRKNk+QKNk=(BTPk1B+R)1BTPk1A
由于 P P P R R R都是对称正定,因此 ( ( B T P k − 1 B + R ) − 1 ) T = ( B T P k − 1 B + R ) − 1 ((B^TP_{k-1}B+R)^{-1})^T = (B^TP_{k-1}B+R)^{-1} ((BTPk1B+R)1)T=(BTPk1B+R)1。把上面的 K N − k K_{N-k} KNk代入到 P k P_k Pk中可以得到 P k P_k Pk的迭代形式:
P k = Q + A T P k − 1 A − A T P k − 1 B ( B T P k − 1 B + R ) − 1 B T P k − 1 A P_{k} = Q + A^T P_{k-1} A - A^T P_{k-1} B(B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\ Pk=Q+ATPk1AATPk1B(BTPk1B+R)1BTPk1A

至此,LQR公式推导完毕。

应用demo

LQR实现轨迹跟踪的demo可以参考这篇博客

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值