我得到了一个矩阵 [[4,-1,6],[2,1,6],[2,-1,8]] 并被要求使用 Numpy 库计算特征值和特征向量,特别是numpy.linalg.eig() 命令。该命令以标准化方式输出特征向量,但我需要它们作为整数。如何使用 Numpy 撤消特征向量矩阵的归一化?
代码:
import numpy as np
from numpy.linalg import eig
a1=np.array([[4,-1,6],[2,1,6],[2,-1,8]])
w, v = np.linalg.eig(a1)
注意:我必须使用 Numpy,而不是替代库。
我尝试过使用标准方法来撤消标准化,但它们没有起作用或给出了非常错误的答案。
从原始特征值分解开始:
import numpy as np
np.set_printoptions(linewidth=200)
from numpy.linalg import eig
A = np.array([[4, -1, 6], [2, 1, 6], [2, -1, 8]])
eigenvalues, eigenvectors = np.linalg.eig(A)
eigenvalues = np.diag(eigenvalues)
特征向量是:
array([[ 0.57735027+0.j , -0.29157823-0.33778223j, -0.29157823+0.33778223j],
[ 0.57735027+0.j , -0.88637126+0.j , -0.88637126-0.j ],
[ 0.57735027+0.j , -0.0505358 +0.11259408j, -0.0505358 -0.11259408j]])
和特征值:
array([[9.+0.00000000e+00j, 0.+0.00000000e+00j, 0.+0.00000000e+00j],
[0.+0.00000000e+00j, 2.+3.14018492e-16j, 0.+0.00000000e+00j],
[0.+0.00000000e+00j, 0.+0.00000000e+00j, 2.-3.14018492e-16j]])
第一个特征向量已经是实数,对应的特征值为 9。我们可以得到一个全整数版本:
e1 = eigenvectors[:, 0] / eigenvectors[0, 0]
e1 # array([1.+0.j, 1.+0.j, 1.+0.j])
另外两个特征向量对应于重复的特征值2,因此这些特征向量的线性组合也是对应于特征值2的特征向量。我们可以得到一个整数特征向量为:
e2 = eigenvectors[:, 1] - eigenvectors[:, 2]
e2 = e2 / e2[-1]
e2 # array([-3.-0.j, 0.+0.j, 1.+0.j])
至于最后一种,可能有更直接的方法,但检查使我发现:
e3 = eigenvectors[:, 1] + eigenvectors[:, 2]
e3 = e3 / e3[-1] - e2
e3 = e3 / e3[0]
e3 # array([1.00000000e+00+0.j, 2.00000000e+00-0.j, 1.26597084e-17-0.j])
问题陈述没有提到该过程需要自动化。我认为这是一个单独的问题。