Python 来自numpy.eig的特征向量不正交

Python 来自numpy.eig的特征向量不正交,python,numpy,eigenvector,Python,Numpy,Eigenvector,我的问题如下:使用scipy.linalg.eig来获得特征向量和特征值,我看到我所有的特征值都有重数1,但当我运行下面的代码时,它并不能确认特征向量是正交的,因为在这种情况下它们应该是正交的。为什么会这样?或者如何修复它 import scipy as SP import numpy as NP from scipy import linalg from numpy import linspace,asscalar,argsort import cmath import time matA=

我的问题如下:使用scipy.linalg.eig来获得特征向量和特征值,我看到我所有的特征值都有重数1,但当我运行下面的代码时,它并不能确认特征向量是正交的,因为在这种情况下它们应该是正交的。为什么会这样?或者如何修复它

import scipy as SP
import numpy as NP
from scipy import linalg
from numpy import linspace,asscalar,argsort
import cmath
import time

matA=SP.array([[-0.0001, 0., 0., 0.00001, 0., 0., 0.00002, 0.],[0., -0.0002, 0., 
  0., 0., 0., 0., 0.],[0., 0., -0.00015, 0., 0., -9.*10**-6, 
  0., -0.00005],[0.00001, 0., 0., -0.0001, 0., 0.00001, 1.*10**-6, 
  0.],[0., 0., 0., -5.*10**-6, -0.0001, 0., 0., 0.],[0., -9.*10**-6, 
  0., 0.00001, 0., -0.0002, 0., 0.00005],[0., 0., 0., 0.00002, 0., 
  0., -0.0001, 0.],[0., 0.00004, 0., 0., 0., 0.00005, 0., -0.00015]])

matB=SP.array([[0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 1.5*10**-10, 0., 0., 0., 
  0., 0.],[0., -1.5*10**-10, 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0.,
   0., 0., 0., 0.],[0., 0., 0., 0., 0., 3.*10**-10, 0., 0.],[0., 0., 
  0., 0., -3.*10**-10, 0., 2.*10**-10, 0.],[0., 0., 0., 0., 
  0., -2.*10**-10, 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0.]])

matdim=len(matB[0])

#coefficient matrix for original ODE
def matM(x):
    return matA+(x**2)*matB

#define sorted eigensystem function
def eigsys(x):
    evs,EVS=linalg.eig(matM(x),check_finite=False)
    absevs=abs(evs)
    idx=argsort(absevs)[::-1]
    evs=evs[idx]
    EVS=EVS[:,idx]
    return (evs,EVS)

#check for orthogonality
eigvecs=SP.transpose(eigsys(60000)[1])
for j in range(8):
    for i in range(8):
        print SP.vdot(eigvecs[i],eigvecs[j])

#show eigenvalues all have multiplicity 1
print eigsys(60000)[0]  

为什么它们应该是正交的?你的矩阵

a=matM(60000)
远不是对称的,

abs(a-a.T).max() -> 2.16


所以我不一定期望正交特征向量。函数
matM
或数据
matA
matB
是否可能是错误的?

为什么它们应该是正交的?你的矩阵

a=matM(60000)
远不是对称的,

abs(a-a.T).max() -> 2.16


所以我不一定期望正交特征向量。是否有可能函数
matM
或数据
matA
matB
错误?

正如许多其他引用的一样,不同的特征值不能保证特征向量是正交的

但是我们有两种特殊类型的矩阵 对称矩阵和厄米特矩阵

这里保证特征值为实,并且存在一组正交特征向量(即使特征值不不同)

numpy

numpy.linalg.eig(any_matrix)
返回任何矩阵的特征值和特征向量(特征向量可能不是正交的)

我们有内置的功能,可以找到对称矩阵和厄米矩阵的正交特征向量

eigen_values, eigen_vectors = numpy.linalg.eigh(symmetric_matrix)
注意: <代码> NoPy.LIALG.Ey> <代码>将只考虑矩阵的上三角部分或下三角部分来计算特征值(一部分像这些特殊矩阵的另一面的镜像)。< /P> 因此,如果你通过一个既不是对称的也不是厄米特矩阵的矩阵来得到正交的特征向量,它将用矩阵的下三角部分构造一个对称矩阵(不是真正构造的,只是为了我们的理解),并返回这个新矩阵的特征值和特征向量(它们是正交的!)。所以答案是错误的

有关更多详情,请参阅


正如许多其他人所引用的,不同的特征值并不保证特征向量是正交的

但是我们有两种特殊类型的矩阵 对称矩阵和厄米特矩阵

这里保证特征值为实,并且存在一组正交特征向量(即使特征值不不同)

numpy

numpy.linalg.eig(any_matrix)
返回任何矩阵的特征值和特征向量(特征向量可能不是正交的)

我们有内置的功能,可以找到对称矩阵和厄米矩阵的正交特征向量

eigen_values, eigen_vectors = numpy.linalg.eigh(symmetric_matrix)
注意: <代码> NoPy.LIALG.Ey> <代码>将只考虑矩阵的上三角部分或下三角部分来计算特征值(一部分像这些特殊矩阵的另一面的镜像)。< /P> 因此,如果你通过一个既不是对称的也不是厄米特矩阵的矩阵来得到正交的特征向量,它将用矩阵的下三角部分构造一个对称矩阵(不是真正构造的,只是为了我们的理解),并返回这个新矩阵的特征值和特征向量(它们是正交的!)。所以答案是错误的

有关更多详情,请参阅


matA
matB
不是很对称。那么,
linalg.eig()
matM(60000)
上被调用,所以
matA,matB
可以是非对称的,只要
matM(60000)
是对称的。矩阵M不必是对称的,正交特征向量的唯一条件是所有的特征值彼此不同,对吗?@AlanMorningstar:不,那是不对的。不同的特征值并不意味着正交的特征向量。
matA
matB
并不完全对称。那么,
linalg.eig()
matM(60000)
上被调用,因此
matA,matB
可以是非对称的,只要
matM(60000)
是对称的。矩阵M不必是对称的,正交特征向量的唯一条件是所有的特征值彼此不同,对吗?@AlanMorningstar:不,那是不对的。不同的特征值并不意味着正交特征向量。