背景:
现在我有一个矩阵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]
问题:
上述三种方法的计算结果显然不同,第一种方法计算得到的特征值和特征向量应该是正确的。
请问我在使用Arpack
和KrylovKit
的时候哪里有问题?