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

kin*_*hen 5 python numpy matrix eigenvalue complex-numbers

我尝试将n*100*1003d矩阵对角化Knumpy.linalg.eig并获得特征值w和特征向量v。矩阵是100*100,但是我想通过广播来做,这就是n我设置的数字。矩阵不是厄米矩阵。

w,v=np.linalg.eig(K)
Run Code Online (Sandbox Code Playgroud)

起初,我尝试了n=1000,我得到真正的特征向量,即xxxxxxxxxe+xx,但当我尝试n=2000的,元素wv表演xxxxxxxxxe+xx+0.j。由于+0.j,使用时给出了复数wv进行了进一步的计算。

  1. 我以为是因为浮点数计算的算法错误,但是为什么呢?
  2. numpy.linalg是否使用LAPACK?是否有可能来自LAPACK的错误?
  3. 我该如何摆脱+0.j

ewc*_*wcz 3

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

编辑:

  1. 如果您确定您的矩阵只有实数特征值,您可以使用numpy.real专用numpy.linalg.eigh于对称矩阵的复数部分。

  2. 至于numpy.linalg.eig, 中的相关部分numpy/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)
    
    Run Code Online (Sandbox Code Playgroud)

因此测试是严格的比较all(w.imag == 0.0),只有这样才能将特征值转换为实数w = w.real