solve_continuous_are#
- scipy.linalg.solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True)[source]#
解連續時間代數Riccati方程式 (CARE)。
CARE 的定義如下
\[X A + A^H X - X B R^{-1} B^H X + Q = 0\]解存在的限制條件為
在右半平面的 \(A\) 所有特徵值都應是可控制的。
相關的漢米爾頓算符 (參見註解) 應具有充分遠離虛軸的特徵值。
此外,如果
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) 類陣列
方陣
- b(M, N) 類陣列
輸入
- q(M, M) 類陣列
輸入
- r(N, N) 類陣列
非奇異方陣
- e(M, M) 類陣列,選用
非奇異方陣
- s(M, N) 類陣列,選用
輸入
- balancedbool,選用
布林值,指示是否對資料執行平衡步驟。預設值設為 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 的矩陣,其保存跨越穩定子空間的特徵向量,具有 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, Vol.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, Vol.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