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)类数组

方阵

b(M,N)类数组

输入

q(M,M)类数组

输入

r(n,N)类数组

方阵

e(M,M)array_like,可选

非奇异方阵

s(M,N)ARRAY_LIKE,可选

输入

balanced布尔尔

指示是否对数据执行平衡步骤的布尔值。默认值设置为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}}\) AND条件编号 \(U_1\) 。这里, \(U\) 是2m×m的矩阵,它包含跨越2m行的稳定子空间的特征向量,并被划分为两个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

解代数Riccati方程的Schur方法>,麻省理工学院。信息与决策系统实验室。LIDS-R;859。在线提供:http://hdl.handle.net/1721.1/1301

3

P.Benner,“哈密顿矩阵的辛平衡”,2001,SIAM J.Sci。计算机,2001,第22卷(5), DOI:10.1137/S1064827500367993

示例

给定的 abq ,以及 r 解算 x

>>> 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