# 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, K, info = icare(A, B, Q, R, S) 求解如下代数 Riccati 方程:
X, L, K, info = icare(A, B, Q, R, S, G) 求解如下代数 Riccati 方程:
X, L, K, info = icare(A, Q, E, G) 求解如下代数 Riccati 方程:
X, L, K, info = icare(A, B, Q, R, S, E, G) 求解如下代数 Riccati 方程:
___ = icare(___; as = true) 计算连续时间代数 Riccati 方程的反稳定解 X,该解将所有特征值 L 置于右半平面上。 示例
# 示例
求解连续时间代数 Riccati 方程
求解代数 Riccati 方程:
根据以下矩阵:
最有效的办法是使用
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 - 关于唯一解的信息矩阵
包含有关唯一解
对于更多的信息,请参见算法。
# 局限性
可检测
# 算法
不变子空间的基底
icare 使用以下矩阵束运行,并计算一个不变子空间的基底
数据会自动缩放,以降低虚轴附近特征值的灵敏度,并增加稳定和反稳定不变子空间之间的距离。
解、状态反馈增益和缩放向量之间的关系
解 X 和状态反馈增益 K 与缩放向量相关,
其中,