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



我尝试通过 numpy.linalg.eign*100*100 3D矩阵K对角度化,并获取eigenvalues w和eigenVectors v。矩阵是100*100,但我想通过广播来完成,这就是我设置的数字n。矩阵不是庇护所。

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

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

  1. 我认为这是因为浮点数计算的算法错误,但是为什么?
  2. numpy.linalg是否使用拉帕克?这是否可能来自拉帕克(Lapack(的错误?
  3. 我如何摆脱+0.j

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

编辑:

  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)
    

因此,该测试是严格的比较all(w.imag == 0.0),然后是用w = w.real铸造的特征值。

最新更新