【发布时间】:2018-08-06 14:04:15
【问题描述】:
我构造了一个 100*100 矩阵 k 并想使用 numpy.linalg.eig 对其进行对角化。
k=np.zeros((100,100))
np.fill_diagonal(k,-2)
np.fill_diagonal(k[1:,:-1],1.5)
np.fill_diagonal(k[:-1,1:],0.5)
当我尝试更小的矩阵时,比如
w,v=np.linalg.eig(k[:10,:10])
特征值w 和特征向量v 是实数。但是当我尝试更大的矩阵或整个完整的矩阵时
w,v=np.linalg.eig(k)
w 和 v 原来是复数,虚部不可忽略。
我也尝试scipy.linalg.eig,它有类似的问题。
我想取特征值和特征向量的自然对数。在我的模型中,复数没有物理意义。
我怎样才能只有独立的实数特征值和特征向量?如果没有,如何通过python将复杂的特征值和特征向量变为实数?
【问题讨论】:
-
你能证明任何三对角方阵都必须有实特征值吗?如果你做不到,那么你能做的并不多。根据维基百科,实对称三对角矩阵具有实特征值,如果所有非对角元素均非零,则所有特征值都是不同的(简单)。您的矩阵似乎不属于此类,因此这些可能是该矩阵的特征值。你没有做错任何事,也无法改变。
-
有趣的是,直到 64 x 64 大小的所有特征值都是实数。在 65 x 65 大小处出现虚部,并且它们不是很小:大约 0.01。突然的变化,让我怀疑。如果特征值是正确的,并且您不想要复杂的特征值,那么唯一的方法是过滤掉虚部超过某个阈值(1e-16 左右)的那些。
-
虚部足够大以至于不可忽略。我只是想知道python是否可以将复杂的特征值/向量对更改为真实的。
-
根据 Wikipedia,如果非对角线值的乘积为正(在这种情况下为
0.5*1.5 = .75),Toepelitz tridiagonal matrix(这似乎是)应该具有真正的特征值 -
@DanielF 很好的发现!特征向量 can also be found in closed form,所以 OP 根本不需要 NumPy 的 eig(这显然在这里挣扎)。
标签: python numpy scipy linear-algebra eigenvalue