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 线性组合(请参见备注)中,其特征值应充分远离虚轴。
此外,如果
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) 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 中添加。
参考文件
[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
示例
若给出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