Я работаю над выполнением простых линейных алгебраических манипуляций с numpy. Все было действительно здорово до сих пор, когда я беру простые матрицы 2x2, чьи собственные значения и векторы, которые я знаю, и проверяю numpy на них.
Например, в приведенной ниже примере матрицы есть единственное собственное значение e = 1 и один связанный собственный вектор [-3, 1]:
A = np.array([[-2, -9],
[ 1, 4]])
vals, vects = np.linalg.eig(A)
vals2, vects2 = np.linalg.eigh(A)
vals3 = np.linalg.eigvals(A)
print("Eigenvalues (linalg.eig): \n", vals)
print("Eigenvalues (linalg.eigvals): \n", vals3)
print("Eigenvectors: \n", vects)
приводит к следующему:
Eigenvalues (linalg.eig):
[1.+1.89953279e-08j 1.-1.89953279e-08j]
Eigenvalues (linalg.eigvals):
[1.+1.89953279e-08j 1.-1.89953279e-08j]
Eigenvectors:
[[ 0.9486833 +0.00000000e+00j 0.9486833 -0.00000000e+00j]
[-0.31622777-2.00228337e-09j -0.31622777+2.00228337e-09j]]
Я понимаю, что собственные векторы имеют формат столбца. Если вы пренебрегаете маленькими мнимыми частями, оба вектора являются ПОЧТИ скалярными кратными единственного правильного собственного вектора.
Моя матрица не является симметричной c или сопряженной симметрией c, и поэтому linalg.eigh
не должна работать, но я все равно попробовал. Это дает мне реальные ценности, но они полностью поддельные.
Я также искал другие подобные вопросы и не нашел удовлетворительных ответов. Самый близкий из приведенных мною ответов - это один из ответов, в котором предлагается написать функцию для удаления собственных значений их маленьких мнимых частей. Это работает, но все еще оставляет неправильные собственные векторы.
Что здесь происходит? Как я могу это просто исправить? Кажется, немного сложно написать свои собственные функции для исправления такой хорошо зарекомендовавшей себя библиотеки, чтобы сделать ее правильной для простых вычислений.