相关链接:【Matlab】求解黎卡提 Riccati 方程 李雅普诺夫 Lyapunov 方程
黎卡提方程是最简单的一类非线性方程。形如
y ′ = P ( x ) y 2 + Q ( x ) y + R ( x ) y'=P(x)y^2+Q(x)y+R(x) y′=P(x)y2+Q(x)y+R(x)
的方程称为黎卡提方程。
From: 黎卡提方程-百度百科
代数 Riccati 方程(algebraic Riccati equation)是最优控制的非线性方程,和连续时间或是离散时间下,无限时间(infinite-horizon)的最优控制有关。
标准的代数Riccati方程分为如下两种:
连续时间代数Riccati方程(CARE):
A T P + P A − P B R − 1 B T P + Q = 0 A^TP + PA - PBR^{-1}B^TP + Q = 0 ATP+PA−PBR−1BTP+Q=0
离散时间代数Riccati方程(DARE):
P = A T P A − ( A T P B ) ( R + B T P B ) − 1 ( B T P A ) + Q P = A^TPA - (A^TPB)(R+B^TPB)^{-1}(B^TPA) + Q P=ATPA−(ATPB)(R+BTPB)−1(BTPA)+Q
P P P 是未知数的 n × n n \times n n×n 对称矩阵, A 、 B 、 Q A、B、Q A、B、Q 及 R R R 是已知实系数矩阵。
一般而言此方程式有许多的解,不过若有存在稳定解的话,希望可以找到稳定解。
在无限时间的最佳控制问题中,关注的是一些变数在相当时间之后的值,因此需在现在选定控制变数的值,让系统在之后的时间都在最佳状态下运作。控制变数在任意时间下的最佳值可以用 Riccati 方程的解以及状态变数当时的观测值求得。若观测变数及控制变数都不只一个,Riccati 方程就会是矩阵方程。
代数 Riccati 方程可以决定无限时间下非时变 LQR 控制器的解,以及无限时间下非时变 LQG 控制的解。这两个是控制理论中的基础问题。
LQR 控制器
最优控制理论主要探讨的是让动力系统以在最小成本来运作,若系统动态可以用一组线性微分方程表示,而其成本为二次泛函,这类的问题称为线性二次(LQ)问题。此类问题的解即为线性二次调节器,简称LQR。
LQG 控制
LQG控制 的全名是线性二次高斯控制,是控制理论中的基础最优控制问题之一。此问题和存在加性高斯白噪声的线性系统有关。此问题是要找到最佳的输出回授律,可以让二次费用函数的期望值最小化。其输出量测假设受到高斯噪声的影响,其初值也是高斯随机向量。
控制理论
控制理论是工程学与数学的跨领域分支,主要处理在有输入信号的动力系统的行为。系统的外部输入称为“参考值”,系统中的一个或多个变数需随著参考值变化,控制器处理系统的输入,使系统输出得到预期的效果。
典型的离散时间 LQR 问题,是要最小化以下的函数:
∑ t = 1 T ( y t T Q y t + u t T R u t ) \sum_{t=1}^{T} (y_t^T Q y_t + u_t^T R u_t) t=1∑T(ytTQyt+utTRut)
其状态方程如下:
y t = A y t − 1 + B u t y_t = Ay_{t-1} + Bu_t yt=Ayt−1+But
其中 y y y 是 n × 1 n × 1 n×1 的状态变数向量, u u u 是 k × 1 k × 1 k×1 的控制变数向量, A A A 是 n × n n × n n×n 的状态递移矩阵, B B B 是 n × k n × k n×k 的控制系数矩阵, Q ( n × n ) Q (n × n) Q(n×n) 是对应半正定状态损失函数矩阵, R ( k × k ) R (k × k) R(k×k) 是对应正定的控制损失函数矩阵。
从最后时间往前的推导可以找到每一个时间的最佳控制解:
u t ∗ = − ( B T P t B + R ) − 1 ( B T P t A ) y t − 1 u_t^* = -(B^TP_tB + R)^{-1} (B^T P_t A) y_{t-1} ut∗=−(BTPtB+R)−1(BTPtA)yt−1
其中对应正定 cost-to-go(代价函数) 矩阵 P P P 会依据下式,配合 P T = Q P_T = Q PT=Q,以逆向时间推导
P t − 1 = Q + A T P t A − A T P t B ( B T P t B + R ) − 1 B T P t A P_{t-1} = Q + A^T P_t A - A^T P_t B (B^TP_t B + R)^{-1} B^T P_t A Pt−1=Q+ATPtA−ATPtB(BTPtB+R)−1BTPtA
这个就是离散时间的代数 Riccati 方程。 P P P 的稳态解和和 T T T 趋近无限大时的无限时间问题有关,可以将动态方程反复迭代直到收敛,来求得 P P P 的稳态解,之后再将动态方程中的时间标注移除,来确认稳态解是否正确。
若代数 Riccati 方程存在稳定解,求解器一般会设法找到唯一的稳定解。稳定解的意思是指用此解控制相关的 LQR 系统,可以使闭回路的系统稳定。
针对CARE,其控制律为:
K = R − 1 B T P K = R^{-1} B^T P K=R−1BTP
闭回路递移矩阵为:
A − B K = A − B R − 1 B T P A-BK = A-BR^{-1}B^TP A−BK=A−BR−1BTP
其稳定的充分必要条件是所有的特征值都有负的实部。
针对 DARE,其控制律为:
K = ( R + B T P B ) − 1 B T P A K = (R + B^TPB)^{-1} B^T PA K=(R+BTPB)−1BTPA
闭回路递移矩阵为
A − B K = A − B ( R + B T P B ) − 1 B T P A A-BK = A - B(R+B^TPB)^{-1}B^TPA A−BK=A−B(R+BTPB)−1BTPA
其稳定的充分必要条件是所有的特征值在复数平面的单位圆内。
代数 Riccati 方程的解可以用 Riccati 方程的的迭代或是矩阵因式分解求得。离散时间问题的一种迭代方式是由有限时间问题下的动态 Riccati 方程,每一次迭代时,矩阵中的值都是从最终时间往前一段有限时间内的最佳解,若进行无限长的迭代。就会分敛到特定矩阵,是无限时间内的最佳解。
针对大型系统,也可以用找特征分解的方式求解。针对CARE,可以定义汉弥尔顿矩阵 (Hamiltonian):
Z = ( A − B R − 1 B T − Q − A T ) Z = \left(\begin{matrix} A & -BR^{-1}B^T \\ -Q & -A^T \end{matrix}\right) Z=(A−Q−BR−1BT−AT)
因为 Z Z Z 是汉弥尔顿矩阵 (Hamiltonian),若在虚轴上没有特征值,则会有恰好一半的特征值会有负的实部。若定义 2 n × n 2n\times n 2n×n 矩阵,其纵排 (column) 形成对应子空间的基底,表示为区块矩阵的形式,如下所示:
( U 1 U 2 ) \left(\begin{matrix} U_1 \\ U_2 \end{matrix}\right) (U1U2)
则
P = U 2 U 1 − 1 P = U_2 U_1^{-1} P=U2U1−1
是 Riccati 方程的解。而且 A − B R − 1 B T P A-BR^{-1}B^TP A−BR−1BTP 的特征值即为 Z Z Z 特征值中有负实部的特征值。
针对 DARE,若 A A A 是可逆矩阵,可以定义辛矩阵:
Z = ( A + B R − 1 B T ( A − 1 ) T Q − B R − 1 B T ( A − 1 ) T − ( A − 1 ) T Q ( A − 1 ) T ) Z = \left(\begin{matrix} A+BR^{-1}B^T(A^{-1})^TQ & -BR^{-1}B^T(A^{-1})^T \\ -(A^{-1})^{T}Q & (A^{-1})^T \end{matrix}\right) Z=(A+BR−1BT(A−1)TQ−(A−1)TQ−BR−1BT(A−1)T(A−1)T)
因为 Z Z Z 是辛矩阵,若在单位圆圆周上没有特征值,则会有恰好一半的特征值会在单位圆内。若定义 2 n × n 2n\times n 2n×n 矩阵,其纵排 (column) 形成对应子空间的基底,表示为区块矩阵的形式,如下所示:
( U 1 U 2 ) \left(\begin{matrix} U_1 \\ U_2 \end{matrix}\right) (U1U2)
则
P = U 2 U 1 − 1 P = U_2 U_1^{-1} P=U2U1−1
是 Riccati 方程的解。而且 A − B ( R + B T P B ) − 1 B T P A A-B(R+B^TPB)^{-1}B^TPA A−B(R+BTPB)−1BTPA 的特征值即为 Z Z Z 特征值中在单位圆内的特征值。
From: 代数Riccati方程
在LQR最优控制中,有连续时间最优控制,即LQR,也有离散时间最优控制DLQR,则在求解中一定会遇到解连续时间黎卡提方程和离散时间黎卡提方程的问题,本文主要针对离散时间黎卡提方程进行求解。
给定一个系统,如下所示:
x ( k + 1 ) = A x ( k ) + B u ( k ) x(k+1) = Ax(k)+Bu(k) x(k+1)=Ax(k)+Bu(k)
性能指标:
J ( u ) = ∑ n = 1 ∞ ( x T ( n ) Q x ( n ) + u T ( n ) R u ( n ) + 2 x T ( n ) L u ( n ) ) J(u) = \sum_{n=1}^{\infty} (x^T(n) Q x(n) + u^T(n) R u(n) + 2x^T(n) L u(n)) J(u)=n=1∑∞(xT(n)Qx(n)+uT(n)Ru(n)+2xT(n)Lu(n))
离散时间黎卡提方程:
P = A T P A − A T P B ( R + B T P B ) − 1 B T P A + Q K = ( R + B T P B ) − 1 B T P A u ( n ) = − K x ( n ) P = A^TPA - A^TPB(R+B^TPB)^{-1}B^TPA + Q \\ K = (R+B^TPB)^{-1} B^TPA \\ u(n) = -K x(n) P=ATPA−ATPB(R+BTPB)−1BTPA+QK=(R+BTPB)−1BTPAu(n)=−Kx(n)
即求解上述黎卡提方程有两种方法,一种是不变子空间法,另外一种是迭代法求解。
%======求解黎卡提方程==========%
clear all;clc;close all;
A = [0.8 0.3;-0.6 0];
B = [1 0.3;0 1.4];
L = [2 0.5;1 0.3];
Q = [7 1;1 3];
R = [3 1;1 2];
[Kr,Pr]=dlqr(A,B,Q,R,L); % 标准库求解
err = 10^(-15);
error = 10;
Pe = Q - L*inv(R)*L';
X = Q - L*inv(R)*L';
% X = (A - B*inv(R)*L')'*inv(B*inv(R)*B')*(A-B*inv(R)*L') +Q - L*inv(R)*L';
Last_Pe = Pe;
i = 1;
while (error>=err)
Pe = (A-B*inv(R)*L')'*inv(Last_Pe + B*inv(R)*B')*(A-B*inv(R)*L') +Q - L*inv(R)*L';
error = norm((Pe-Last_Pe),'Inf');
Last_Pe = Pe;
i = i +1;
end
Ke = inv(R+B'*Pe*B)*B'*Pe*A;
From: 求解离散黎卡提矩阵代数方程
ODE45——求解状态变量(微分方程组)