2013-05-01 27 views
4

我使用scipy.linalg.solve_discrete_lyapunov計算矩陣P正在使用scipy.linalg.solve_discrete_lyapunov我正確

中號Ť PM - P = -Q其中M = A - BKQ = I

(見下文並且還參見Lyapunov Equation)。然而,對於計算的P我得到M T PM-P≠ - Q

下面是代碼:

import numpy as np 
import scipy as sp 

A = np.array([[-1.86194971, 3.49237959],[-2.34245904, 3.86194971]]) 
B = np.array([[ 3000., 2500.5], [ 2000.2, 3000.]]) 
K = np.array([[ 0.0001367, -0.00016844], [-0.00069637, 0.0009627]]) 
I = np.array([[1., 0.],[0., 1.]]) 

# Eigenvalues of A are (0.9, 1.1) 
# Eigenvalues of A-BK are (0.29, 0.49) (i.e. A-BK is Schur) 

P = sp.linalg.solve_discrete_lyapunov(A-np.dot(B,K), I) 

# P= [[ 6.61311138 4.32497891] 
#  [ 4.32497891 4.36910499]] 

# But after checking (A-BK)^TP(A-BK)-P, that is 

J = np.dot((A.transpose()-np.dot(K.transpose(),B.transpose())),np.dot(P,A-np.dot(B,K)))-P 

# I get the following 
# J = (A-BK)^TP(A-BK)-P = [[ -1.11929701 -19.5567893 ] 
#       [-19.5567893 37.89911723]] 
#     
# Not equal to -I? 
+0

@askewchan:謝謝你的ED它。 – 605na 2013-05-02 04:25:49

回答

3

M = A - np.dot(B,K)。然後solve_discrete_lyapunov(M, I)是解決

np.dot(M, np.dot(P, M.T)) - P = -I 

In [64]: M = A - np.dot(B,K) 

In [65]: np.dot(M, np.dot(P,M.T)) - P 
Out[65]: 
array([[ -1.00014927e+00, -9.93418066e-05], 
     [ -9.93418066e-05, -1.00006419e+00]]) 

In [66]: np.allclose(np.dot(M, np.dot(P,M.T)) - P, -I, atol=0.001) 
Out[66]: True 

如果你想解決

np.dot(M.T, np.dot(P, M)) - P + I = 0 

然後調用

P = solve_discrete_lyapunov(M.T, I) 
+0

謝謝您的回覆。也許我忽視了一些非常簡單的東西,但是不應該'scipy.linalg.solve_discrete_lyapunov'正在解決_np.dot(MT,np.dot(P,M)) - P + I = 0_(另請參見[離散Lyapunov方程 - SciPy的](http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.solve_discrete_lyapunov.html));因爲_np.dot(M,np.dot(P,M.T)) - P = -I_是一個不同的方程,因此,PM_不等於_MPM T _。再一次,也許我忽略了一些非常簡單的東西,無論如何謝謝你的幫助和任何進一步的幫助。 – 605na 2013-05-02 04:27:54

+0

再次感謝您的快速回復。根據[離散Lyapunov方程 - SciPy](http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.solve_discrete_lyapunov.html)如果你想解決'np.dot(MT,np。點(P,M)) - P = - 我叫'solve_discrete_lyapunov(M,I)'... – 605na 2013-05-02 12:48:59

+0

是的,我同意文檔說。然而,經驗證據表明否則。 (注意:我沒有嘗試過源代碼算法,也沒有最近的足夠版本的scipy來測試'solve_discrete_lyapunov',我只是想通過上面顯示的單個計算。) – unutbu 2013-05-02 12:53:41