参考链接: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+Bkuk
代价函数J 的离散化表达式如下:
J=k=0∑∞(xkTQxk+ukTRuk),Q=QT,R=RT,Q≥0,R>0
为了方便计算,将J 使用如下形式进行表达(由于离散状态空间表达式中包含xk、xk+1 以及uk,故x 的下标要多一位,n 趋于无穷):
J=k=0∑n−1(xkTQxk+ukTRuk)+xnTQxn,Q=QT,R=RT,Q≥0,R>0
# 二、离散 LQR 公式推导
在离散 LQR
公式的推导中,需要使用拉格朗日乘子法,以第三个式子为目标函数,第一个式子为约束条件,从而构造拉格朗日函数如下:
J=k=0∑n−1(xkTQxk+ukTRuk)+xnTQxn+k=0∑n−1λk+1(Axk+Buk−xk+1)
将上式进行如下化简:
对上述过程的最终结果对变量xk 和uk 以及λ 进行求导可得如下结果:
根据Hk 的定义进行求导有:
带入求导结果中可得:
我们最要得到的是uk,根据式2 可知uk 可由λk+1 唯一求得,而根据式1 可知λk+1 与λk 相关,而式4 可以求出λn,故可以使用递推的方式进行求解,下图展示了由λn 递推得到λn−1 的演算过程:
由上式推导过程推广到一般式可得递归关系,也就是 Riccati
方程如下所示:
一般使用的 Riccati
方程形式如下,可由上式推导得出:
# 三、离散 LQR 的 matlab 求解
在 matlab
中可以使用 [K,S,e] = dlqr(A,B,Q,R)
进行求解,其中K 为全状态反馈矩阵,其他两个参数含义可在 matlab
文档中获取,K 的定义可参考连续 LQR
文章,K 的计算公式如下:
Kk=(R+BTPk+1B)−1BTPk+1Ak
uk=−(R+BTPk+1B)−1BTPk+1Akxk
# 四、离散 LQR 总结
- (1)将连续系统离散化,得到离散系统;
- (2)求解
Riccati
方程,获得Pk 的序列;
- (3)使用第三节中的公式求解反馈矩阵Kk 的序列;
- (4)使用第三节中的公式求解反馈矩阵uk 的序列;