【问题标题】:Issues with Scipy in computing eigenvalues and eigenvectorsScipy 在计算特征值和特征向量方面的问题
【发布时间】:2020-07-16 23:33:28
【问题描述】:

我正在研究微分算子的光谱特性。去感受事物 我决定从计算具有周期性边界条件的一维拉普拉斯算子的特征值和特征向量开始

Lap = 
[[-2, 1, 0, 0, ..., 1],
 [ 1,-2, 1, 0, ..., 0],
 [ 0, 1,-2, 1, ..., 0],
 ...
 ...
 [ 0, 0, ..., 1,-2, 1],
 [ 1, 0, ..., 0, 1,-2]]

所以我运行以下命令

import numpy as np
import scipy.linalg as scilin

N = 12
Lap = np.zeros((N, N))
for i in range(N):
   Lap[i, i] = -2
   Lap[i, (i+1)%N] = 1
   Lap[i, (i-1)%N] = 1

eigvals, eigvecs = scilin.eigh(Lap)

在哪里

> print(eigvals)
[-4.00000000e+00 -3.73205081e+00 -3.73205081e+00 -3.00000000e+00
 -3.00000000e+00 -2.00000000e+00 -2.00000000e+00 -1.00000000e+00
 -1.00000000e+00 -2.67949192e-01 -2.67949192e-01  9.43689571e-16]

这是我所期望的。但是我决定验证这些特征值和特征向量 是正确的。我最终得到的是

> (Lap - eigvals[0]*np.identity(N)).dot(eigvecs[0])
array([ 0.28544445,  0.69044928,  0.83039882,  0.03466493, -0.79854101,
       -0.81598463, -0.78119579, -0.7445237 , -0.769496  , -0.79741997,
       -1.09625463, -0.69683007])

我希望得到零向量。那么这里发生了什么?

【问题讨论】:

  • 特征向量是eigvecs,所以表达式应该是(Lap - eigvals[0]*np.identity(N)).dot(eigvecs[:,0])

标签: python numpy scipy eigenvalue eigenvector


【解决方案1】:

正如@Warren 在评论中提到的,特征向量是eigvecs 的列。在 numpy 索引中,eigvecs[0] 代表eigvecs 的第一行。修复它:

print((Lap-eigvals[0]*np.eye(N))@eigvecs[:,0])

[-6.66133815e-16  2.55351296e-15 -1.77635684e-15  1.11022302e-16
  5.55111512e-16 -2.22044605e-16 -3.66373598e-15 -4.44089210e-16
  7.77156117e-16 -1.11022302e-16 -1.66533454e-15  2.22044605e-15]

基本上全为0(由于精度问题,数字在那里)

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多