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
对an*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
进行进一步计算时会给出复数
+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 |
进行比较。