2013-09-18 128 views
8

Tôi đang tính toán số nguyên tử trong Matlab và Numpy, nhưng nhận được các kết quả khác nhau. Tôi đã được ấn tượng rằng chỉ có một tập hợp các eigenvectors cho một ma trận nhất định, tuy nhiên cả hai kết quả đầu ra này có vẻ hợp lệ.Kết quả đầu ra vector nguyên sinh xung đột giữa Matlab và Numpy

Đây là mã của tôi matlab:

m = [ 1.4675 + 0.0000i 0.1669 + 1.2654i; 
     0.1669 - 1.2654i 1.3085 + 0.0000i] 
[eig_vec,eig_val] = eig(m) 

eig_val chứa:

eig_val = 
    0.1092   0 
      0 2.6668 

eig_vec chứa:

eig_vec = 
     0.0896 + 0.6789i 0.0953 + 0.7225i 
    -0.7288 + 0.0000i 0.6848 + 0.0000i 

Đây là mã python của tôi:

m = np.array([[1.46753694+0.j,   0.16692111+1.26535838j], 
       [0.16692111-1.26535838j, 1.30851770+0.j]]) 
eig_val,eig_vec = linalg.eigh(m) 

eig_val chứa:

array([ 0.10923247, 2.66682217]) 

chứa eig_vec:

array([[-0.68477170+0.j  , -0.72875765+0.j  ], 
     [ 0.09530915-0.72249836j, -0.08955653+0.67889021j]]) 

bất cứ ai có thể giải thích tại sao những kết quả đầu ra là khác nhau, nó có vẻ như mỗi hai bộ khác nhau của vector riêng là phiên bản xoay của nhau. Là một trong những thiết lập chính xác hơn mà khác?

+1

các thành phần riêng biệt không phải là duy nhất: http://stackoverflow.com/a/18152804/97160, nhưng tôi nghĩ cả MATLAB và NumPy đều dựa vào cùng một thói quen LAPACK để tính toán chúng, vì vậy bạn có thể sẽ nhận được kết quả tương tự. – Amro

+0

Xem [câu hỏi cũ hơn] (http://stackoverflow.com/questions/13041178/could-we-get-different-solutions-for-eigenvectors-from-a-matrix/13041400#13041400) để đọc thêm về - tính độc đáo của các eigenvectors (nó liên quan đến MATLAB so với toán học, nhưng về cơ bản là một câu hỏi trùng lặp) ... –

Trả lời

14

Điều này không rõ ràng ngay lập tức, nhưng các đặc tính riêng mà bạn đang được trả lại thực sự giống nhau trong cả hai trường hợp. Hãy thử như sau:

>>> matlab_eigvec = np.array([[0.0896+0.6789j, 0.0953+0.7225j], 
...       [-0.7288+0.j, 0.6848+0.j]]) 
>>> 
>>> f1, f2 = matlab_eigvec.T # matlab eigenvectors 
>>> e1, e2 = eig_vec.T # numpy eigenvectors 
>>> f1/e1 
array([-0.13084653-0.99142531j, -0.13079065-0.99146862j]) 
>>> f2/e2 
array([-0.13077050-0.99141326j, -0.13078845-0.99145198j]) 

Vì vậy, bạn có thể nhận được các vector riêng matlab bằng cách nhân những NumPy bởi -0.13-0.99j, tức là chúng có colinear và do đó cũng giống như xa như vector riêng có liên quan.

+0

wow cảm ơn! Thật khó cho tôi nghĩ về những hướng "phức tạp", nhưng giờ nó hoàn toàn có ý nghĩa. – mackuntu