2026a

# icare


连续时间代数 Riccati 方程的隐式求解器

函数库: TyControlSystems

# 描述

icare 用于求解连续时间代数 Riccati 方程中的唯一解 X,闭环特征值 L 和状态反馈增益 K,并返回关于连续时间代数 Riccati 方程解的附加信息 info

代数 Riccati 方程在 LQR / LQG 控制、H2-∞ 和 H-∞ 控制、卡尔曼滤波和谱分解或协素数分解中起着关键作用。

# 语法

X, L, K, info = icare(A, Q, G)
X, L, K, info = icare(A, B, Q, R, S)
X, L, K, info = icare(A, B, Q, R, S, G)
X, L, K, info = icare(A, Q, E, G)
X, L, K, info = icare(A, B, Q, R, S, E, G)
___ = icare(___; as = true)

# 说明

X, L, K, info = icare(A, Q, G) 求解如下代数 Riccati 方程:

稳定解 X 把所有特征值 L 置于左半平面上。 示例


X, L, K, info = icare(A, B, Q, R, S) 求解如下代数 Riccati 方程:

稳定解 X 把所有特征值 L 置于左半平面上。 示例


X, L, K, info = icare(A, B, Q, R, S, G) 求解如下代数 Riccati 方程:

稳定解 X 把所有特征值 L 置于左半平面上。


X, L, K, info = icare(A, Q, E, G) 求解如下代数 Riccati 方程:

稳定解 X 把所有特征值 L 置于左半平面上。


X, L, K, info = icare(A, B, Q, R, S, E, G) 求解如下代数 Riccati 方程:

稳定解 X 把所有特征值 L 置于左半平面上。


___ = icare(___; as = true) 计算连续时间代数 Riccati 方程的反稳定解 X,该解将所有特征值 L 置于右半平面上。 示例

# 示例

求解连续时间代数 Riccati 方程

求解代数 Riccati 方程:

根据以下矩阵:

最有效的办法是使用 ,然后使用 icare 找到解决方案。

using TyControlSystems
using TyBase
A = [-1 2 3; 4 5 -6; 7 -8 9];
B = [5; 6; -7];
C = [7 -8 9];
G = -B * B';
Q = C' * C;
X, L, K, info = icare(A, Q, G);

分别查看 X、L、K 和 info 矩阵。

X
3×3 Matrix{Float64}:
 15.3201   4.23693  17.009
  4.23693  2.62523   4.41227
 17.009    4.41227  19.0374
L
3-element Vector{Float64}:
 -76.96930709006527
 -10.119132829893562
  -3.2138632276768977
K
0×3 Matrix{Float64}
info 
6×3 Matrix{Float64}:
 -0.380469  -0.650673   0.00218693
 -0.361588   0.38059   -0.385492
  0.457457   0.472768   0.0539662
  0.320792  -0.240248  -0.520803
 -0.414605   0.250713  -0.583992
  0.490332  -0.296124  -0.486

提示

对于不同的硬件环境,结果 info 可能不同,进一步的描述请参见 info

当矩阵 B 和 C 具有较大的条目时,上述方法可能会导致数值不准确,因为它们通过平方来计算 G 和 Q 矩阵的。由于数值范围有限,计算精度可能会降低甚至失败。例如,如果 norm(B)为 1e6,则 norm(G)为 1e12,并且由于数值误差,虚轴 1e-4 内的任何特征值都可能被判断为 “ 虚数 ”。

为了获得更高的数值精度,可以按以下方式重写代数 Riccati 方程:

上式是如下方程的标准形式。

其中 ,,

使用具有上述值的 icare 计算解决方案。

n = size(A,1);
m = size(B,2);
p = size(C,1);
R = blkdiag(eye(m),-eye(p));
BB = [B zeros(n,p)];
S = [zeros(n,m) C'];
X2, L2, K2, info2 = icare(A, BB, 0, R, S);

分别查看 X2、L2、K2 和 info2 矩阵。

X2
3×3 Matrix{Float64}:
 15.3201   4.23693  17.009
  4.23693  2.62523   4.41227
 17.009    4.41227  19.0374
L2
3-element Vector{Float64}:
 -76.96930709006527
 -10.119132829893585
  -3.2138632276768946
K2
2×3 Matrix{Float64}:
 -17.0406  6.05009  -21.7435
  -7.0     8.0       -9.0
info2
8×3 Matrix{Float64}:
 -0.380469  -0.650673   0.00218693
 -0.361588   0.38059   -0.385492
  0.457457   0.472768   0.0539662
  0.320792  -0.240248  -0.520803
 -0.414605   0.250713  -0.583992
  0.490332  -0.296124  -0.486
 -4.31599    2.37591   -2.70597
 -4.34654    3.34451   -3.58494

其中,X2 是唯一的稳定解,K2 包含状态反馈增益,L2 包含闭环特征值。

连续时间代数 Riccati 方程的反稳定解

求连续时间代数 Riccati 方程的反稳定解:

根据以下矩阵:

为了获得更高的数值精度,按以下方式重写代数 Riccati 方程:

上式是如下方程的标准形式。

其中 ,,

使用 as = true 计算反稳定解。

using TyControlSystems
using TyBase
A = [-1 2 3; 4 5 -6; 7 -8 9];
B = [5; 6; -7];
C = [7 -8 9];
n = size(A, 1);
m = size(B, 2);
p = size(C, 1);
R = blkdiag(eye(m), -eye(p));
BB = [B zeros(n, p)];
S = [zeros(n, m) C'];
X, L, K, info = icare(A, BB, 0, R, S; as = true);

分别查看 X、L、K 和 info 矩阵。

X
3×3 Matrix{Float64}:
 -18.0978   10.909    -1.84662
  10.909    -6.71949   1.43541
  -1.84662   1.43541  -0.942579
L
3-element Vector{Float64}:
 76.96930709006517
  3.213863227676887
 10.11913282989361
K
2×3 Matrix{Float64}:
 -12.1085  4.18027   5.97737
  -7.0     8.0      -9.0
info
8×3 Matrix{Float64}:
 -0.280949  -0.384326   0.181192
 -0.431207  -0.715792   0.130398
  0.485237  -0.54018   -0.468566
 -0.393746   0.110273  -0.757188
  0.404126  -0.12086    0.326763
 -0.425816   0.146197   0.22473
  3.43674   -1.19717   -3.39848
 -5.85014    1.82557    3.99193

这里,X 是唯一的反稳定解,K 包含状态反馈增益,L 包含闭环特征值。

# 输入参数

A, B, Q, R, S, E, G - 输入矩阵
矩阵

输入矩阵,指定为矩阵。

矩阵 Q、R 和 G 必须是 Hermitian 矩阵。若一个方阵等于其复共轭转置,则该方阵是 Hermitian 矩阵,即

有关 Hermitian 矩阵的更多信息,请参见 ishermitian

矩阵 R 和 E 必须是可逆的。

当不指定 B、R、S、E 和 G 矩阵时,icare 使用如下默认值:

  • B = 0
  • R =
  • S = 0
  • E =
  • G = 0

如果输入 Q、R 和 G 是标量值,icare 将它们解释为单位矩阵的倍数。

数据类型: Float | Int

as - 计算反稳定解
布尔值

计算反稳定解,指定为布尔值,默认为假。启用此选项时,icare 将计算反稳定解 ,该解 的所有特征值放在右半平面中。

需要唯一的稳定和反稳定解才能知道 Riccati 微分方程的完整相位图。

数据类型: Bool

# 输出参数

X - Riccati 方程的唯一解
矩阵

连续时间代数 Riccati 方程的唯一解,以矩阵形式返回。

默认情况下,X 是连续时间代数 Riccati 方程的稳定解。当使用 “as = true” 选项时,X 是反稳定解。

若关联的 Hamiltonian 矩阵在虚轴上具有特征值, X 返回为 []。

数据类型: Float | Int

L - 闭环特征值
矩阵

闭环特征值,以矩阵形式返回。

闭环特征值 L 的计算公式为:

当关联的 Hamiltonian 矩阵在虚轴上具有特征值时,X 和 K 返回为 []。换句话说,即使 X 和 K 是空矩阵,L 也是非空的。

K - 状态反馈增益
矩阵

状态反馈增益,以矩阵形式返回。

状态反馈增益 K 的计算公式为:

若关联的 Hamiltonian 矩阵在虚轴上具有特征值,K 返回为 []。

数据类型: Float | Int

info - 关于唯一解的信息
矩阵

包含有关唯一解 的信息,以矩阵形式返回,其值为 ,表示关联缩放矩阵束的稳定不变子空间的基底。

对于更多的信息,请参见算法

# 局限性

必须是可稳定的, 必须是可逆的,有限稳定解 X 才会存在。虽然这些条件通常是不够的,但当满足以下条件时,它们就足够了:

  • 可检测

# 算法

不变子空间的基底

icare 使用以下矩阵束运行,并计算一个不变子空间的基底 ,与这矩阵束的稳定或反稳定有限特征值相关。

数据会自动缩放,以降低虚轴附近特征值的灵敏度,并增加稳定和反稳定不变子空间之间的距离。

解、状态反馈增益和缩放向量之间的关系

X 和状态反馈增益 K 与缩放向量相关, 由以下方程组组成:

其中,

# 另请参阅

clyap | dlyap | idare