我正在复习一些线性代数,并在 Python 中完成一些实现。我正在解决与查找矩阵 A
的特征向量相关的问题。
A = [[ 1, 2,-2],
[-2, 5,-2],
[-6, 6,-3]]
当我手动解决这个问题时,我得到特征值 3 和 -3,其中 3 的重数为 2。我的特征向量是 [[1/3], [1/3], [1]] , [[1], [1], [0]], [[-1], [0], [1]]
。
在 NumPy 中尝试我的实现:
import numpy as np
A = [[ 1, 2, -2],
[-2, 5, -2],
[-6, 6, -3]]
np.linalg.eig(A)
给出输出
(array([ 3., -3., 3.]), array([[ 0.53452248, -0.30151134, -0.05332571],
[-0.26726124, -0.30151134, -0.73225996],
[-0.80178373, -0.90453403, -0.67893425]]))
特征值是我所期望的,但特征向量让我感到困惑。从我读过的内容来看,我知道它们是列并且它们是标准化的,即 norm(e1) = 1
。此外,在数值上它们似乎是正确的,因为它们满足 Ax = lambda*x 方程。
此外,当我在 SymPy 中执行时,我得到了预期的结果。
from sympy.matrices import Matrix, eye, zeros, ones, diag, GramSchmidt
A = Matrix([[ 1, 2, -2],
[-2, 5, -2],
[-6, 6, -3]])
A.eigenvects()
输出:
[(-3, 1, [Matrix([
[1/3],
[1/3],
[ 1]])]), (3, 2, [Matrix([
[1],
[1],
[0]]), Matrix([
[-1],
[ 0],
[ 1]])])]
谁能阐明 NumPy 的差异以及发生了什么?它是用数值求解的吗,这些不是真正的特征向量,但它们似乎在某种意义上满足了一定数值精度水平内的条件?谢谢。
最佳答案
这里,特征值 3 的几何重数为 2(矩阵 (A - 3 I) 的秩为 1),有无穷多种选择方式此特征空间的两个基向量(特征向量)。
在normal matrix的情况下A,numpy.linalg.eig
将返回一组行特征向量,形成整个空间的一组正交基,在计算实践中,特征向量在排列时是唯一的以及每列中的方向(符号)。在非正态情况下(如此处),没有唯一的选择,只有将整个空间唯一划分为与每个特征值关联的子(特征)空间。
您可以将特征值 3 的输出特征向量(即返回的特征向量数组中的第 0 列和第 2 列)视为满足特征值方程的任意一组基。
实现应该是底层 ?GEEV
的包装器LAPACK API 的功能。除了匹配特征值的顺序(按共轭对排序)之外,输出特征向量的唯一约束似乎
Each eigenvector is scaled so that the Euclidean norm is 1 and the largest component is real.
所以仍然有很多随意性,我不会指望特定的输出。
关于python - 使用 NumPy 计算特征向量的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750689/