我需要输出一个矩阵的特征值和特征向量。使用numpy.linalg.eig
这样的函数,这似乎是一个微不足道的任务。事实证明,它输出正确的特征值,但有一些错误的特征向量。
假设我们有一个矩阵A:
的数据
我们知道这个的特征值是:
的
类似地,其特征向量为:
的
的
所以用这个公式,
的
对于第一特征值,我们有:
型
你可以使用下面的代码来测试它:
import numpy as np
A = np.array([[0, 2],
[2, 3]])
I = np.eye(2)
eigenvector = [[1, 2],
[-2, 1]]
eigenvalue = [4, -1]
for i in range(2):
print(f"eigenvalue = {eigenvalue[i]}, eigenvector = {eigenvector[i]}")
print(f"(A-λ*I)v = {(A-eigenvalue[i]*I)@eigenvector[i]}")
print(" ")
字符串
然而,如果我们尝试numpy.linalg.eig
来计算特征向量和特征值,我们会遇到一些问题。
这会发现以下不正确的特征值:
型
类似地,它找到的特征向量是:
型
型
现在,当我们测试第一个特征向量时,我们得到的结果不同于零:
型
你可以使用下面的代码看到这一点:
import numpy as np
from numpy.linalg import eig
A = np.array([[0, 2],
[2, 3]])
I = np.eye(2)
eigenvalue, eigenvector = eig(A)
for i in range(2):
print(f"eigenvalue = {eigenvalue[i]}, eigenvector = {eigenvector[i]}")
print(f"(A-λ*I)v = {(A-eigenvalue[i]*I)@eigenvector[i]}")
print(" ")
型
我做错了什么?如何使用numpy.linalg.eig
得到正确的特征向量?
2条答案
按热度按时间cgfeq70w1#
Numpy返回归一化的特征向量,即它们具有单位长度(如documentation所示)。此外,您需要选择第一列以获得第一个特征向量。如果你使用
eigenvector[:, 0]*np.sqrt(5)
,你会看到特征向量与你手工计算的相同。2lpgd9682#
首先是几个格式注解。
对于普通浏览器,数学符号不是特别可读,例如第一个月
当运行带有打印结果的代码时,如果您实际显示结果,那就太好了。因此:
字符串
使用numpy可以打印整个数组,例如
型
将其与您的价值观进行比较:
型
eigenvalue
顺序切换;eigenvector
值的比例为2:1。匹配符号(按列)需要更多的思考。如果我们用列代替行,
型
对
[numpy] eigenvectors
的快速搜索显示,错误的行和列至少可以追溯到2015年。