JuliaLinearAlgebra / ArnoldiMethod.jl

The Arnoldi Method with Krylov-Schur restart, natively in Julia.
https://julialinearalgebra.github.io/ArnoldiMethod.jl/dev
MIT License
102 stars 18 forks source link

Steer convergence #80

Closed haampie closed 6 years ago

haampie commented 6 years ago

For matrices with very dominant eigenvalues at one end of the spectrum, partialschur has trouble targeting eigenvalues on the other side.

For example:

julia> A = Diagonal([1:0.001:2; 4:7]);
julia> round.(eigvals(partialschur(A, nev=10, which=SR())[1].R), digits=3)
10-element Array{Float64,1}:
 7.0
 6.0
 5.0
 4.0
 1.0
 1.001
 1.002
 1.003
 1.004
 1.005

I'm not sure what the best way is to deal with this issue.

If you would remove them from the search subspace with purging techniques, they would enter the space soon enough again.

If you would lock them in the search subspace such that these directions are deflated (what happens now), they might slow down the convergence to the other eigenvectors because the locked vectors reduce the size of the active search subspace -- you should have to increase maxdim then to get the same rate of convergence if the matrix were deflated explicitly.


Further, there is the question when we know for sure there are unwanted dominant eigenvalues converged. The simplest criterion: after nev Ritz vectors have converged, we should let another converge, and see if it is closer to the target than anything that has converged already. If so, continue, if not, we're done. (This is still heuristics!)


Another interesting approach would be to purge the unwanted Ritz vectors from the search subspace, but remember their Ritz values, and then use these as shifts in implicit restart s.t. there's a filter to remove these vectors. Maybe it's not unstable to do this implicit restart with exact eigenvalues if the corresponding ritz vector has not converged? idk.

haampie commented 6 years ago

Closed via #81