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

Python 如何使特征值和特征向量保持实数而不是复数?,python,numpy,matrix,complex-numbers,eigenvalue,Python,Numpy,Matrix,Complex Numbers,Eigenvalue,我试图通过numpy.linalg.eig对an*100*1003d矩阵K进行对角化,得到特征值w和特征向量v。矩阵是100*100,但我想用广播来做,这就是我设置的数字n。矩阵不是厄米矩阵 w,v=np.linalg.eig(K) 起初,我尝试了n=1000,我得到了真实的特征值和特征向量,即xxxxxxxx e+xx,但当我尝试n=2000时,w和v的元素显示xxxxxxxx e+xx+0.j。由于+0.j,在使用w和v进行进一步计算时会给出复数 我认为这是因为浮点数计算的算法错误,但为什

我试图通过
numpy.linalg.eig
对a
n*100*100
3d矩阵
K
进行对角化,得到特征值
w
和特征向量
v
。矩阵是
100*100
,但我想用广播来做,这就是我设置的数字
n
。矩阵不是厄米矩阵

w,v=np.linalg.eig(K)
起初,我尝试了
n=1000
,我得到了真实的特征值和特征向量,即
xxxxxxxx e+xx
,但当我尝试
n=2000
时,
w
v
的元素显示
xxxxxxxx e+xx+0.j
。由于
+0.j
,在使用
w
v
进行进一步计算时会给出复数

  • 我认为这是因为浮点数计算的算法错误,但为什么呢
  • numpy.linalg是否使用LAPACK?这可能是拉帕克的错误吗
  • 我怎样才能摆脱
    +0.j

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

    编辑:

  • 如果你确定你的矩阵只有实特征值,你可以用对称矩阵来剥离复杂的部分,或者使用对称矩阵的专用工具

  • 至于
    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)
    

  • 因此,测试是一个严格的比较
    all(w.imag==0.0)
    ,只有这样,特征值才能用
    w=w.real

    转换为实,我在解一个矩阵微分方程<代码>+0.j表示特征值的虚部为
    0
    ?矩阵对称/厄米特吗?你们怎么知道它有真正的特征值?好问题,我也在试着弄清楚。它不是厄米特矩阵,但没有广播,只对一个矩阵进行对角化
    100*100
    矩阵总是给出实特征值和向量。如果我同时对2000个
    100*100
    矩阵进行对角化,它会显示
    +0.j
    虚部。如果虚部为零,为什么不使用
    输出。实
    +0.j
    表示特征值的虚部为0?或者这仅仅意味着它们是复数?你可以尝试通过使用来切换打印精度。由于double的有限精度,一个非常小的、不重要的虚部可以隐藏在
    0.j
    后面。您可以使用
    numpy.real
    对其进行dicard。要检查掉落复杂零件是否不会损坏特征向量v和特征值w,可以计算剩余
    |w v-K.v | |
    的范数,并将其与范数
    |v |
    进行比较。