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\)右半平面上的所有特征值应可控。

  • 相关 hamiltonian 线性组合(请参见备注)中,其特征值应充分远离虚轴。

此外,如果 es 并不是准确地 None,那么 CARE 的广义版本

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

时求得解。如被省略,e 假设为单位矩阵,s 假设为零矩阵,其尺寸与 ab 分别兼容。

参数:
a(M, M) array_like

方阵

b(M, N) array_like

输入

q(M, M) array_like

输入

r(N, N) array_like

非奇异方阵

e(M, M) array_like, optional

非奇异方阵

s(M, N) array_like, optional

输入

balancedbool, optional

布尔值,指示是否在数据上执行平衡步骤。默认设置为 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 的矩阵,它包含跨越稳定子空间和划分为两个 m 行矩阵的特征向量的 2-m 行。如需了解更详细信息,请参阅 [1][2]

为了提高 QZ 分解精度,铅笔将经历一个平衡步骤,此处 \(H\)\(J\) 条目的绝对值总和(在删除总和的对角线条目之后)使用 [3] 中给出的配方进行平衡。

在版本 0.11.0 中添加。

参考文件

[1] (1,2)

P. van Dooren,“解决 Riccati 方程的广义特征值方法。”,《SIAM 期刊:科学与统计计算》,第 2 卷(2 期),DOI:10.1137/0902010

[2]

A.J. Laub, “解决代数 Riccati 方程的 Schur 方法”。马萨诸塞州理工学院。信息和决策系统实验室。快思录编号;859。在线获取:http://hdl.handle.net/1721.1/1301

[3]

P. Benner,"哈密顿矩阵辛分解"، 2001,SIAM J. Sci. Comput.,2001,卷 22(5),DOI:10.1137/S1064827500367993

示例

若给出abqr,则求解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