2013-03-22 1 views
3

scipy.linalg.eig가 왼쪽 및 오른쪽 고유 벡터를 계산하는 방법에 관한 질문이 있습니다. 어쩌면 내가 모든 것을 오해했을 지 모르지만 상황이 내게 맞지 않는 것처럼 보입니다 ...scipy.linalg.eig가 올바른 왼쪽 고유 벡터를 제공합니까?

처음부터. i 번째 열은을 의미 어디 기대한다 함수가 left_v의 열로 고유 벡터를 왼쪽으로 얻을 호출하는 동안 left=True을 설정 한 후

ev, left_v, right_v = scipy.linalg.eig(A, left=True)

manual에 따르면, : 고유 모두 고유 벡터를 얻기 위해 나는 다음을 사용 i 번째 고유치. 그러나 결과는 내가 예상 한 것이 아니므로 간단한 점검을 수행했습니다.

I는 (자세한 내용 here 모양) 함수를 두 번 호출 우측 및 좌측 고유 벡터를 계산 :

left_v_2의 열 left_ev에 대응하는 값과 관련된 고유 벡터이다
right_ev, right_v_2 = scipy.linalg.eig(A) 
left_ev, left_v_2 = scipy.linalg.eig(A.T) 

. right_ev_2left_ev_2 모두 동일한 고유치를 제공하지만, 순서가 다르므로이를 고려해야 만합니다.

하나는 전자가 후자의 공액 따라서 left_evleft=True으로 scipy.linalg.eig로부터 얻어진 유효 좌측 고유 벡터 아니라고 빠르게 자리 (고유 값에 대한 재 배열)과 left_evleft_ev_2 수를 비교.

고유 벡터의 유효성에 대한 또 다른 검사는 임의의 실제 사각 매트릭스 좌우 고유 벡터, 즉 biorthogonal 있습니다에 대한 사실을 기반으로 수행 할 수 있습니다

left_v.T.dot(right_v)는 대각 행렬을 제공해야하지만, '아무튼 (I)이 변경 될 때까지 t는 는 : left_v.T.conj().dot(right_v)

동안 :

left_v_2.T.dot(right_v_2)는 예상 된 대각 행렬을 준다.

비슷한 문제가 발생 했나요? 내가하는 말로 바른가? eig을 설명하는 동안 sciPy 설명서가 약간 부정확합니까? 조언 해 줄 수 있어요?

감사합니다. 신원을하는 복합체 (.H 의미이다) 양쪽의 (즉, 에르 미트 전치)를 바꾸어 복용하고 b 가정,

a.H vl[:,i] = w[i].conj() b.H vl[:,i] 

을 또는 :

답변

3

소개 vleig 문서화 문자열은 말한다 ,

vl[:,i].H a = w[i] vl[:,i].H 

그래서 vl의 켤레 전치의 행 a 실제 좌측 고유 벡터이다.

장난 꾸러기 배열은 실제로 .H 속성을 갖지 않으므로 .conj(). T를 사용해야합니다. T.여기

는 계산을 확인하는 스크립트입니다 :

import numpy as np 
from scipy.linalg import eig 

# This only affects the printed output. 
np.set_printoptions(precision=4) 

a = np.array([[6, 2], 
       [-1, 4]]) 

w, vl, vr = eig(a, left=True) 

print "eigenvalues:", w 
print 

# check the left eigenvectors one-by-one: 
for k in range(a.shape[0]): 
    val = w[k] 
    # Use a slice to maintain shape; vec is a 2x1 array. 
    # That allows a meaningful transpose using .T. 
    vec = vl[:, k:k+1] 
    # rowvec is 1x2; it is the conjugate transpose of vec. 
    # This should be the left eigenvector. 
    rowvec = vec.conj().T 
    # Verify that rowvec is a left eigenvector 
    lhs = rowvec.dot(a) 
    rhs = val * rowvec 
    print "Compare", lhs, "to", rhs 
    print rowvec, "is", 
    if not np.allclose(lhs, rhs): 
     print "*NOT*", 
    print "a left eigenvector for eigenvalue", val 

print 
print "Matrix version:" 
print "This" 
print vl.conj().T.dot(a) 
print "should equal this" 
print np.diag(w).dot(vl.conj().T) 

출력 :

vl : double or complex ndarray 
    The normalized left eigenvector corresponding to the eigenvalue 
    ``w[i]`` is the column v[:,i]. Only returned if ``left=True``. 
    Of shape ``(M, M)``. 

: 이제

eigenvalues: [ 5.+1.j 5.-1.j] 

Compare [[ 1.6330+2.4495j 4.0825+0.8165j]] to [[ 1.6330+2.4495j 4.0825+0.8165j]] 
[[ 0.4082+0.4082j 0.8165-0.j ]] is a left eigenvector for eigenvalue (5+1j) 
Compare [[ 1.6330-2.4495j 4.0825-0.8165j]] to [[ 1.6330-2.4495j 4.0825-0.8165j]] 
[[ 0.4082-0.4082j 0.8165+0.j ]] is a left eigenvector for eigenvalue (5-1j) 

Matrix version: 
This 
[[ 1.6330+2.4495j 4.0825+0.8165j] 
[ 1.6330-2.4495j 4.0825-0.8165j]] 
should equal this 
[[ 1.6330+2.4495j 4.0825+0.8165j] 
[ 1.6330-2.4495j 4.0825-0.8165j]] 

eig 문서화 문자열도 반환 값의 설명에 말한다 그리고 이는 잠재적으로 오해의 소지가있다. ft eigenvector (예. http://mathworld.wolfram.com/LeftEigenvector.html 또는 http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#Left_and_right_eigenvectors)는 행 벡터이므로 실제로는 왼쪽 고유 벡터 인 열의 켤레 전치입니다 (vl).

+0

감사합니다. 워렌. 나는 당신이 vl의 켤레 전치가 일반적으로 사용되는 관습에 따라 왼쪽 고유 벡터임을 확인했다. 이제 질문은 왜 'eig' doscstring이이 모호한 정보를 제공 했는가? –

+0

Fwiw, A = np.array ([[0., -1], [1, 0]]); w, L, R = eig (A, 왼쪽 = True, 오른쪽 = True); "L *. R : \ n", L.conj(). T.dot (R)' 은'I'를 기대한다면'- I' - 문제를 일으 킵니다. 일반적으로'np.diag (1 -1 -1 1)'일 수 있으니 빠른 수정이 필요하지 않습니까? (버전 : numpy 1.14.1 scipy 1.0.0 python 2.7.14 mac 10.10.5) – denis

+1

일반적으로 L.conj(). T.dot (R)은 * 대각선이어야하지만 반드시 ID 일 필요는 없습니다 . 생성물이 신원이라는 좌/우 고유 벡터가 존재하지만, '고유 벡터'는 그러한 고유 벡터를 계산할 수 없다. –

관련 문제