求解特征值和特征向量


#1

背景:

现在我有一个矩阵A,需要求解特征值和特征向量:

julia> A = [-1 1 0;-4 3 0; 1 0 2]
3×3 Array{Int64,2}:
 -1  1  0
 -4  3  0
  1  0  2

方法:

①. 使用Julia自带的eigen()函数:

julia> a,b = eigen(A)
Eigen{Float64,Float64,Array{Float64,2},Array{Float64,1}}
eigenvalues:
3-element Array{Float64,1}:
 1.0
 1.0
 2.0
eigenvectors:
3×3 Array{Float64,2}:
  0.408248   0.408248  0.0
  0.816497   0.816497  0.0
 -0.408248  -0.408248  1.0
julia> a
3-element Array{Float64,1}:
 1.0
 1.0
 2.0

julia> b
3×3 Array{Float64,2}:
  0.408248   0.408248  0.0
  0.816497   0.816497  0.0
 -0.408248  -0.408248  1.0

②. 使用 Arpack.jl 中的eigs() 函数:

julia> c,d = eigs(A)
┌ Warning: Adjusting nev from 6 to 1
└ @ Arpack C:\Users\13522\.julia\packages\Arpack\cu5By\src\Arpack.jl:99
(Complex{Float64}[1.9999999999999991 + 0.0im], Complex{Float64}[-5.551115123125783e-16 + 0.0im; -1.5457470373125837e-15 + 0.0im; 1.0 + 0.0im], 1, 1, 3, [0.0, 0.0, 0.0])

julia> c
1-element Array{Complex{Float64},1}:
 1.9999999999999991 + 0.0im

julia> d
3×1 Array{Complex{Float64},2}:
  -5.551115123125783e-16 + 0.0im
 -1.5457470373125837e-15 + 0.0im
                     1.0 + 0.0im

③. 使用KrylovKit.jl中的eigsolve()函数:

julia> e,f = eigsolve(A)
(Complex{Float64}[2.000000000000001 + 0.0im, 1.0000000383063683 + 0.0im, 0.9999999616936321 + 0.0im], Array{Complex{Float64},1}[[-4.718447854656915e-16 + 0.0im, -1.1657341758564144e-15 + 0.0im, -1.0000000000000007 + 0.0im], [-0.408248282644608 + 0.0im, -0.8164965809277258 + 0.0im, 0.4082482982831185 + 0.0im], [-0.40824829828311715 + 0.0im, -0.8164965809277259 + 0.0im, 0.40824828264460933 + 0.0im]], ConvergenceInfo: 3 converged values after 1 iterations and 3 applications of the linear map;
norms of residuals are given by (5.1840796077941e-31, 4.326222965869518e-31, 4.3262228508925784e-31).
)

julia> e
3-element Array{Complex{Float64},1}:
  2.000000000000001 + 0.0im
 1.0000000383063683 + 0.0im
 0.9999999616936321 + 0.0im

julia> f
3-element Array{Array{Complex{Float64},1},1}:
 [-4.718447854656915e-16 + 0.0im, -1.1657341758564144e-15 + 0.0im, -1.0000000000000007 + 0.0im]
 [-0.408248282644608 + 0.0im, -0.8164965809277258 + 0.0im, 0.4082482982831185 + 0.0im]
 [-0.40824829828311715 + 0.0im, -0.8164965809277259 + 0.0im, 0.40824828264460933 + 0.0im]

问题:

上述三种方法的计算结果显然不同,第一种方法计算得到的特征值和特征向量应该是正确的。

请问我在使用ArpackKrylovKit的时候哪里有问题? :sweat_smile:


#2

这些结果不都一样吗?
1、3 结果只有特征值差了个符号
2 忽略了相同的特征值


#3

是哎。。。我看他算出来是复数的形式以为他们不一样,没仔细看:sweat_smile:

那第二种方法怎么才能把相同的特征值显示出来呢?