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) 類陣列,選用

非奇異方陣

s(M, N) 類陣列,選用

輸入

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}\) 的對稱性和 \(U_1\) 的條件數有關。此處,\(U\) 是 2m 乘 m 的矩陣,其保存跨越穩定子空間的特徵向量,具有 2-m 列,並劃分為兩個 m 列的矩陣。詳情請參閱 [1][2]

為了提高 QZ 分解的準確性,鉛筆會經過一個平衡步驟,其中 \(H\)\(J\) 的行/列(在移除對角線項目後)的絕對值總和會按照 [3] 中給出的方法進行平衡。如果資料有小的數值雜訊,平衡可能會放大其影響,並且需要進行一些清理。

在版本 0.11.0 中新增。

參考文獻

[1] (1,2)

P. van Dooren , “求解 Riccati 方程式的廣義特徵值方法。”,《SIAM Journal on Scientific and Statistical Computing》,第 2 卷第 2 期,DOI:10.1137/0902010

[2]

A.J. Laub,“求解代數 Riccati 方程式的 Schur 方法。”,麻省理工學院。資訊與決策系統實驗室。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

範例

給定 abqr,求解 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