scipy.linalg.

solve_discrete_are#

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

求解离散时间代数 Riccati 方程 (DARE)。

DARE 的定义如下

\[A^HXA - X - (A^HXB) (R + B^HXB)^{-1} (B^HXA) + Q = 0\]

求解存在的限制是

  • 所有的 \(A\) 特征值都在单位圆外部,应可控。

  • 相关的辛射线束(参见注释)的特征值应该充分远离单位圆。

此外,如果 es 都不是确切的 None,则求解 DARE 的广义形式

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

如果省略,将把 e 假设为单位矩阵,把 s 假设为零矩阵。

参数:
a(M, M) array_like

方阵

b(M, N) array_like

输入

q(M,M)类数组

输入

r(N,N)类数组

方阵

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

非奇异方阵

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

输入

balancedboolean

指示执行数据平衡步骤的 boolean 值。默认为 True。

返回值:
x(M,M)ndarray

离散代数 Riccati 方程的解。

引发:
LinAlgError

对于无法隔离铅笔稳定子空间的情况。请参见备注部分和参考材料了解详情。

参见

solve_continuous_are

求解连续代数 Riccati 方程

备注

该方程的求解是通过形成扩展辛矩阵铅笔,如 [1] 中所述的,由分块矩阵指定的 \(H - \lambda J\)

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

使用 QZ 分解法。

在此算法中,失败条件与乘积 \(U_2 U_1^{-1}\) 的对称性及 \(U_1\) 的条件数有关。其中,\(U\) 是 2m×m 矩阵,用于容纳跨越稳定子空间且包含 2-m 行的特征向量,并被分割成两个 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 方法”,马萨诸塞州理工学院。信息与决策系统实验室。LIDS-R;859。可在线获取:http://hdl.handle.net/1721.1/1301

[3]

P. Benner,“辛平衡汉密尔顿矩阵”,2001 年,SIAM 科学与统计计算期刊,2001 年,第 22 卷(5),DOI:10.1137/S1064827500367993

示例

已知 abqr,求解 x

>>> import numpy as np
>>> from scipy import linalg as la
>>> a = np.array([[0, 1], [0, -1]])
>>> b = np.array([[1, 0], [2, 1]])
>>> q = np.array([[-4, -4], [-4, 7]])
>>> r = np.array([[9, 3], [3, 1]])
>>> x = la.solve_discrete_are(a, b, q, r)
>>> x
array([[-4., -4.],
       [-4.,  7.]])
>>> R = la.solve(r + b.T.dot(x).dot(b), b.T.dot(x).dot(a))
>>> np.allclose(a.T.dot(x).dot(a) - x - a.T.dot(x).dot(b).dot(R), -q)
True