参考链接:https://www.bilibili.com/video/BV1P54y1m7CZ/?spm_id_from=333.337.search-card.all.click&vd_source=e01172ea292c1c605b346101d7006c61

# 一、什么是离散 LQR

  连续 LQR 问题可以参考上一篇文章,离散 LQR 问题即将连续 LQR 进行离散化处理,离散状态空间表达式如下:

xk+1=Akxk+Bkukx_{k+1}=A_k x_k+B_k u_k

  代价函数JJ 的离散化表达式如下:

J=k=0(xkTQxk+ukTRuk),Q=QT,R=RT,Q0,R>0J=\sum_{k=0}^{\infty}\left(x_{k}^{T} Q x_{k}+u_{k}^{T} R u_{k}\right) , Q=Q^{T}, R=R^{T}, Q \geq 0, R>0

  为了方便计算,将JJ 使用如下形式进行表达(由于离散状态空间表达式中包含xkx_{k}xk+1x_{k+1} 以及uku_k,故xx 的下标要多一位,nn 趋于无穷):

J=k=0n1(xkTQxk+ukTRuk)+xnTQxn,Q=QT,R=RT,Q0,R>0J=\sum_{k=0}^{n-1}\left(x_{k}^{T} Q x_{k}+u_{k}^{T} R u_{k}\right) + x_{n}^{T} Q x_{n}, Q=Q^{T}, R=R^{T}, Q \geq 0, R>0

# 二、离散 LQR 公式推导

  在离散 LQR 公式的推导中,需要使用拉格朗日乘子法,以第三个式子为目标函数,第一个式子为约束条件,从而构造拉格朗日函数如下:

J=k=0n1(xkTQxk+ukTRuk)+xnTQxn+k=0n1λk+1(Axk+Bukxk+1)J=\sum_{k=0}^{n-1}\left(x_{k}^{T} Q x_{k}+u_{k}^{T} R u_{k}\right) + x_{n}^{T} Q x_{n}+\sum_{k=0}^{n-1}\lambda_{k+1}\left( A x_k+B u_k -x_{k+1}\right)

  将上式进行如下化简:

  对上述过程的最终结果对变量xkx_{k}uku_k 以及λ\lambda 进行求导可得如下结果:

  根据HkH_k 的定义进行求导有:

  带入求导结果中可得:

  我们最要得到的是uku_k,根据式22 可知uku_k 可由λk+1\lambda_{k+1} 唯一求得,而根据式11 可知λk+1\lambda_{k+1}λk\lambda_k 相关,而式44 可以求出λn\lambda_n,故可以使用递推的方式进行求解,下图展示了由λn\lambda_n 递推得到λn1\lambda_{n-1} 的演算过程:

  由上式推导过程推广到一般式可得递归关系,也就是 Riccati 方程如下所示:

  一般使用的 Riccati 方程形式如下,可由上式推导得出:

# 三、离散 LQR 的 matlab 求解

  在 matlab 中可以使用 [K,S,e] = dlqr(A,B,Q,R) 进行求解,其中KK 为全状态反馈矩阵,其他两个参数含义可在 matlab 文档中获取,KK 的定义可参考连续 LQR 文章,KK 的计算公式如下:

Kk=(R+BTPk+1B)1BTPk+1AkK_k=\left(R+B^{\mathrm{T}} P_{k+1} B\right)^{-1} B^{\mathrm{T}} P_{k+1} A_{k}

uk=(R+BTPk+1B)1BTPk+1Akxku_k=-\left(R+B^{\mathrm{T}} P_{k+1} B\right)^{-1} B^{\mathrm{T}} P_{k+1} A_{k} x_{k}

# 四、离散 LQR 总结

  • (1)将连续系统离散化,得到离散系统;
  • (2)求解 Riccati 方程,获得PkP_k 的序列;
  • (3)使用第三节中的公式求解反馈矩阵KkK_k 的序列;
  • (4)使用第三节中的公式求解反馈矩阵uku_k 的序列;
更新于 阅读次数