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\) 在右半平面的所有特征值都应该是可控的。
相关的哈密顿矩阵束(参见注释)应该具有充分远离虚轴的特征值。
此外,如果
e
或s
不是精确的None
,则求解广义版本的 CARE\[E^HXA + A^HXE - (E^HXB + S) R^{-1} (B^HXE + S^H) + Q = 0\]当省略时,假设
e
为单位矩阵,s
为与a
和b
分别兼容大小的零矩阵。- 参数:
- a(M, M) 类数组
方阵
- b(M, N) 类数组
输入
- q(M, M) 类数组
输入
- r(N, N) 类数组
非奇异方阵
- e(M, M) 类数组,可选
非奇异方阵
- s(M, N) 类数组,可选
输入
- balancedbool,可选
布尔值,指示是否对数据执行平衡步骤。 默认设置为 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-by-m 矩阵,它保存跨越稳定子空间的特征向量,具有 2-m 行,并划分为两个 m 行矩阵。 有关更多详细信息,请参见 [1] 和 [2]。
为了提高 QZ 分解的精度,矩阵束经过一个平衡步骤,其中 \(H\) 和 \(J\) 条目的绝对值之和(在删除总和的对角线条目后)按照 [3] 中给出的方法进行平衡。
在 0.11.0 版本中添加。
参考文献
[2]A.J. Laub,“求解代数Riccati方程的舒尔方法”,麻省理工学院。信息和决策系统实验室。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