【问题标题】:eigenvectors from numpy.eig not orthogonal来自 numpy.eig 的特征向量不正交
【发布时间】:2014-08-21 15:46:18
【问题描述】:

我的问题如下:使用 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]  

【问题讨论】:

    标签: python numpy eigenvector


    【解决方案1】:

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

    a=matM(60000)
    

    远非对称,

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

    abs(a).max() -> 1.08
    

    所以我不一定期望正交特征向量。是不是函数matM或者数据matA或者matB错了?

    【讨论】:

    • matAmatB 不太对称。
    • 好吧,linalg.eig() 是在 matM(60000) 上调用的,所以只要 matM(60000) 是对称的,matA,matB 就可以是非对称的。
    • 矩阵M不一定是对称的,正交特征向量的唯一条件是所有特征值互不相同吧??
    • @AlanMorningstar:不,这不正确。不同的特征值并不意味着正交的特征向量。
    【解决方案2】:

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

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

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

    numpy

    numpy.linalg.eig(any_matrix)
    

    返回任意矩阵的特征值和特征向量(特征向量可能不正交)

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

    eigen_values, eigen_vectors = numpy.linalg.eigh(symmetric_matrix)
    

    注意numpy.linalg.eigh 将只考虑矩阵的上三角部分或下三角部分来计算特征值(对于这些特殊矩阵,一部分就像另一部分的镜像)。

    因此,如果您传递一个既不是对称也不是 Hermitian 的矩阵来获得正交特征向量,它将构造一个具有矩阵下三角部分的对称矩阵(不是实际构造的,只是为了我们的理解)并返回特征值和特征向量(它们是正交的!)这个新矩阵。所以答案是错误的!

    更多详情请参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2022-01-20
      • 2016-10-17
      • 2015-06-30
      • 2013-09-17
      • 1970-01-01
      相关资源
      最近更新 更多