使用 numpy.linalg.eig() 反转特征值矩阵的归一化

问题描述 投票:0回答:1

我得到了一个矩阵 [[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,而不是替代库。

我尝试过使用标准方法来撤消标准化,但它们没有起作用或给出了非常错误的答案。

python numpy matrix linear-algebra eigenvector
1个回答
0
投票

从原始特征值分解开始:

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])

问题陈述没有提到该过程需要自动化。我认为这是一个单独的问题。

© www.soinside.com 2019 - 2024. All rights reserved.