Numpy - модальная матрица и диагональные собственные значения

1

Я написал простой код линейной алгебры в Python Numpy для вычисления диагонали собственных значений путем вычисления $M ^ {- 1}.A.M $(M - модальная матрица) и работает странно.

Здесь код:

import numpy as np

array = np.arange(16)
array = array.reshape(4, -1)
print(array)

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

eigenvalues, eigenvectors = np.linalg.eig(array)

print eigenvalues
[  3.24642492e+01  -2.46424920e+00   1.92979794e-15  -4.09576009e-16]

print eigenvectors
[[-0.11417645 -0.7327781   0.54500164  0.00135151]
 [-0.3300046  -0.28974835 -0.68602671  0.40644504]
 [-0.54583275  0.15328139 -0.2629515  -0.8169446 ]
 [-0.76166089  0.59631113  0.40397657  0.40914805]]

inverseEigenVectors = np.linalg.inv(eigenvectors) #M^(-1)
diagonal= inverseEigenVectors.dot(array).dot(eigenvectors) #M^(-1).A.M

print(diagonal)
[[  3.24642492e+01  -1.06581410e-14   5.32907052e-15   0.00000000e+00]
 [  7.54951657e-15  -2.46424920e+00  -1.72084569e-15  -2.22044605e-16]
 [ -2.80737213e-15   1.46768503e-15   2.33547852e-16   7.25592561e-16]
 [ -6.22319863e-15  -9.69656080e-16  -1.38050658e-30   1.97215226e-31]]

окончательная "диагональная" матрица должна быть диагональной матрицей с собственными значениями на главной диагонали и нулями в другом месте. но это не... два первых основных диагональных значения ARE собственные значения, но две секунды не являются (хотя, как и два вторых собственных значения, они почти равны нулю).

и, кстати, число, подобное $-1.06581410e-14 $, буквально равно нулю, так как я могу сделать numpy показать их как ноль?

Что я делаю неправильно?

Спасибо...

  • 2
    Подсказка: строка 3 = 2 * строка 2 - строка 1
  • 1
    Э-э-э ... тогда ... Определитель матрицы равен нулю? и det (A) = произведение собственных значений ... и собственные значения должны быть равны нулю? если я правильно понял до сих пор, то почему numpy вычисляет EigenValues и не дает 0 в качестве ответа?
Показать ещё 5 комментариев
Теги:
numpy
linear-algebra
eigenvalue
eigenvector

2 ответа

2
Лучший ответ

Просто округлите конечный результат до нужных цифр:

print(diagonal.round(5))

array([[ 32.46425,   0.     ,   0.     ,   0.     ],
       [  0.     ,  -2.46425,   0.     ,   0.     ],
       [  0.     ,   0.     ,   0.     ,   0.     ],
       [  0.     ,   0.     ,   0.     ,   0.     ]])

Не путайте точность вычислений и политик печати. ​​

  • 0
    Спасибо ... я буду иметь это в виду ...
1
>>> diagonal[np.abs(diagonal)<0.0000000001]=0
>>> print diagonal
[[ 32.4642492   0.          0.          0.       ]
 [  0.         -2.4642492   0.          0.       ]
 [  0.          0.          0.          0.       ]
 [  0.          0.          0.          0.       ]]
>>>
  • 0
    Спасибо ... если бы я только мог выбрать 2 лучших ответа ...
  • 0
    Вы очень добры! Ответ БМ имеет свои преимущества (+1 к БМ)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню