我正在审查一些线性代数并在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的差异和发生的事情吗?它是用数字方式求解的,而且它们不是真正的特征向量,但它们似乎在某种意义上它们满足一定数值精度水平的条件?谢谢。
答案 0 :(得分:4)
这里,特征值3具有几何多重性2(矩阵的秩( A - 3 I )是1)并且有无数种方式可供选择这个本征空间的两个基矢量(特征向量)。
在normal matrix A 的情况下,numpy.linalg.eig
将返回一组行特征向量,形成整个空间的一组正交基,并在计算实践中返回特征向量每列中的排列和方向(符号)都是唯一的。在非正常情况下(如此处),没有唯一的选择,只有整个空间的唯一分区成为与每个特征值相关联的子(本征)空间。
您可以将特征值3(即返回的特征向量数组中的第0和第2列)的输出特征向量视为满足特征值方程的任意基集。
实现应该是LAPACK API的基础?GEEV
函数的包装器。除了匹配特征值的顺序(以共轭对排序)之外,输出特征向量的唯一约束似乎
每个特征向量都被缩放,因此欧几里德范数为1,最大分量为实数。
所以仍有很多任意性,我不会指望特定的输出。