scipy.linalg.

solve_continuous_are#

scipy.linalg.solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True)[源]#

求解连续时间代数 Riccati 方程 (CARE)。

CARE 定义为

\[X A + A^H X - X B R^{-1} B^H X + Q = 0\]

解存在的限制是

  • \(A\) 在右半平面上的所有特征值都应该是可控的。

  • 相关的哈密顿铅笔(参见注释)的特征值应与虚轴有足够远的距离。

此外,如果 es 不精确为 None,则求解广义形式的 CARE

\[E^HXA + A^HXE - (E^HXB + S) R^{-1} (B^HXE + S^H) + Q = 0\]

当省略时,e 假定为单位矩阵,s 假定为零矩阵,其大小分别与 ab 兼容。

文档中假定数组参数具有指定的“核心”形状。但是,此函数的数组参数可能在核心形状前附加额外的“批处理”维度。在这种情况下,数组被视为低维切片的批处理;详情请参见批处理线性运算

参数:
a(M, M) 数组类对象

方阵

b(M, N) 数组类对象

输入

q(M, M) 数组类对象

输入

r(N, N) 数组类对象

非奇异方阵

e(M, M) 数组类对象, 可选

非奇异方阵

s(M, N) 数组类对象, 可选

输入

balanced布尔值, 可选

指示是否对数据执行平衡步骤的布尔值。默认设置为 True。

返回:
x(M, M) ndarray

连续时间代数 Riccati 方程的解。

引发:
LinAlgError

对于无法分离铅笔的稳定子空间的情况。详见注释部分和参考文献。

另请参见

solve_discrete_are

求解离散时间代数 Riccati 方程

注释

该方程通过形成扩展哈密顿矩阵铅笔来求解,如[1]中所述,由分块矩阵给出的 \(H - \lambda J\)

[ A    0    B ]             [ E   0    0 ]
[-Q  -A^H  -S ] - \lambda * [ 0  E^H   0 ]
[ S^H B^H   R ]             [ 0   0    0 ]

并使用 QZ 分解方法。

在此算法中,失败条件与乘积 \(U_2 U_1^{-1}\) 的对称性以及 \(U_1\) 的条件数相关。其中,\(U\) 是一个 2m 乘 m 的矩阵,它包含跨越稳定子空间的特征向量,具有 2m 行并分成两个 m 行矩阵。详情请参阅[1][2]

为了提高 QZ 分解的精度,铅笔经过一个平衡步骤,其中 \(H\)\(J\) 项的绝对值之和(在去除和的对角线项后)按照[3]中给出的方法进行平衡。

0.11.0 版本新增。

参考文献

[1] (1,2)

P. van Dooren,《求解 Riccati 方程的广义特征值方法》,《SIAM Journal on Scientific and Statistical Computing》,第2卷第2期,DOI:10.1137/0902010

[2]

A.J. Laub,《求解代数 Riccati 方程的 Schur 方法》,马萨诸塞州理工学院。信息与决策系统实验室。LIDS-R;859。在线可获取:http://hdl.handle.net/1721.1/1301

[3]

P. Benner,《哈密顿矩阵的辛平衡》,2001,SIAM J. Sci. Comput.,2001,第22卷第5期,DOI:10.1137/S1064827500367993

示例

给定 a, b, q, 和 r,求解 x

>>> import numpy as np
>>> from scipy import linalg
>>> a = np.array([[4, 3], [-4.5, -3.5]])
>>> b = np.array([[1], [-1]])
>>> q = np.array([[9, 6], [6, 4.]])
>>> r = 1
>>> x = linalg.solve_continuous_are(a, b, q, r)
>>> x
array([[ 21.72792206,  14.48528137],
       [ 14.48528137,   9.65685425]])
>>> np.allclose(a.T.dot(x) + x.dot(a)-x.dot(b).dot(b.T).dot(x), -q)
True