如何使特征值和特征向量保持真实而不是复杂?

时间:2018-02-08 21:55:34

标签: python numpy matrix complex-numbers eigenvalue

我尝试按n*100*100K三维矩阵numpy.linalg.eig对角化,得到特征值w和特征向量v。矩阵是100*100,但我想用广播来做,这就是我设置的数字n。矩阵不是埃尔米特人。

w,v=np.linalg.eig(K)

首先,我尝试了n=1000,我得到了真正的特征值和特征向量,即xxxxxxxxxe+xx,但当我尝试n=2000时,w和{{1}的元素}}显示v。由于xxxxxxxxxe+xx+0.j,在使用+0.jw进行进一步计算时,它给出了复数。

  1. 我认为这是因为浮点数计算的算法错误,但为什么呢?
  2. numpy.linalg使用LAPACK吗?这可能是LAPACK的错误吗?
  3. 如何摆脱v

1 个答案:

答案 0 :(得分:0)

根据文档,numpy.linalg.eig使用(用于实际参数)LAPACK例程DGEEV,它不对输入矩阵做任何假设(除了真实)。如果矩阵在浮点精度内足够对称,则返回的特征值的复杂部分将为零(WI的输出参数DGEEV)。但是,由于精度有限,可能会出现一些虚假的复杂零件。

编辑:

  1. 如果你确定你的矩阵只有真正的特征值,你可以用numpy.real剥离复杂的部分,或者使用专门用于对称矩阵的numpy.linalg.eigh

  2. 至于numpy.linalg.eignumpy/linalg/linalg.py中的相关部分是:

    w, vt = _umath_linalg.eig(a, signature=signature, extobj=extobj)
    
    if not isComplexType(t) and all(w.imag == 0.0):
        w = w.real
        vt = vt.real
        result_t = _realType(result_t)
    else:
        result_t = _complexType(result_t)
    
  3. 因此,测试是严格的比较all(w.imag == 0.0),然后只有w = w.real投射到真实的特征值。