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) 類陣列,選用
非奇異方陣
- 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
範例
給定 a、b、q 和 r,求解 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