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\) 特征值都在单位圆外部,应可控。
相关的辛射线束(参见注释)的特征值应该充分远离单位圆。
此外,如果
e
和s
都不是确切的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 中添加。
参考材料
[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
示例
已知 a、b、q 和 r,求解 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