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\) 单元盘外,应可控。
相应的辛铅笔(见注)应该有足够远离单位圆的特征值。
而且,如果
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)类数组
方阵
- 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
示例
给定的 a , b , q ,以及 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