【发布时间】:2015-02-25 19:17:11
【问题描述】:
我正在使用 numpy 计算对称方形数组的特征值和特征向量。我的数组是:
L = [[ 2. -1. -1. 0. 0. 0.]
[-1. 3. 0. -1. 0. -1.]
[-1. 0. 2. -1. 0. 0.]
[ 0. -1. -1. 3. -1. 0.]
[ 0. 0. 0. -1. 2. -1.]
[ 0. -1. 0. 0. -1. 2.]]
执行numpy.linalg.eig(L)时的结果如下所示
特征值:
[ 5.00000000e+00,
3.96872205e-16,
1.00000000e+00,
2.00000000e+00,
3.00000000e+00,
3.00000000e+00 ]
特征向量:
[[ -2.88675135e-01 4.08248290e-01 -5.00000000e-01 4.08248290e-01 -4.36632863e-01 4.44614891e-01]
[ 5.77350269e-01 4.08248290e-01 -3.34129212e-16 4.08248290e-01 -1.08813217e-01 -5.41271705e-01]
[ 2.88675135e-01 4.08248290e-01 -5.00000000e-01 4.08248290e-01 5.45446080e-01 9.66568140e-02]
[ -5.77350269e-01 4.08248290e-01 1.06732810e-16 4.08248290e-01 -1.08813217e-01 -5.41271705e-01]
[ 2.88675135e-01 4.08248290e-01 5.00000000e-01 4.08248290e-01 -4.36632863e-01 4.44614891e-01]
[ -2.88675135e-01 4.08248290e-01 5.00000000e-01 -4.08248290e-01 5.45446080e-01 9.66568140e-02]]
结果与您在analytically 计算时得到的结果接近(如果标准化),但似乎在特征值和特征向量中都引入了一些错误。有没有办法使用 numpy 绕过这些错误?
这些错误来自哪里? numpy 使用什么算法?
【问题讨论】:
-
对我来说看起来很准确
-
第二个特征值是3.96872205e-16而不是0。同样在3个特征向量中应该有两个0,而不是-3.34129212e-16和1.06732810e-16。
-
这些是几乎为零的舍入误差。如果
x是您的结果,您可以使用np.where(x < 1e-15, 0, x)消除所有这些舍入错误 -
Errrr ..... Wolfram Alpha 实际上是在分析计算它们,还是只是更好地适当地表示输出以提高人类可读性?通常,计算特征向量/特征值涉及求解与矩阵大小相同次数的多项式。 Abel-Ruffini theorem 表明在激进分子中没有解决方案。因此,对于任意 6x6 满秩矩阵,没有 解析解可以找到特征值/向量。可以证明是这样。