特征向量很复杂,但仅适用于大型矩阵

hel*_*ica 7 python numpy linear-algebra eigenvalue eigenvector

我正在尝试计算这个矩阵的特征向量和特征值

三对角矩阵示例

import numpy as np
la = 0.02
mi = 0.08
n = 500

d1 = np.full(n, -(la+mi), np.double)
d1[0] = -la
d1[-1] = -mi
d2 = np.full(n-1, la, np.double)
d3 = np.full(n-1, mi, np.double)

A = np.diagflat(d1) + np.diagflat(d2, -1) + np.diag(d3, 1)
e_values, e_vectors = np.linalg.eig(A)
Run Code Online (Sandbox Code Playgroud)

如果我将矩阵的维度设置为 n < 110,则输出很好。但是,如果我将其设置为 n >= 110,则特征值和特征向量分量都会变成具有显着虚部的复数。为什么会发生这种情况?它应该发生吗?这是非常奇怪的行为,坦率地说,我有点卡住了。

Mad*_*ist 7

您所看到的似乎是相当正常的舍入误差。这是以有限精度存储浮点数的不幸结果。对于大问题,它自然会变得相对更糟。这是特征值的实部与虚部的图:

在此处输入图片说明

您可以看到虚数实际上是噪声。这并不是说它们不重要。这是虚部与实部的图,表明在最坏的情况下该比率可以达到 0.06:

在此处输入图片说明

该比率随绝对和相对数量la和 的变化而变化mi。如果将两者都乘以 10,则得到

在此处输入图片说明

如果你 keepla = 0.02和 set mi = 0.8,你会得到一个更小的虚部:

在此处输入图片说明

当你做相反的事情时,事情会变得很奇怪,增加la10 倍,保持mi原样:

在此处输入图片说明

对于较小的特征值,计算的相对精度会降低,因此这并不奇怪。

鉴于虚部的幅度相对较小(至少对于重要的特征值),您可以采用结果的幅度或实部,因为您知道所有特征值都是实数。