Мне нужно диагонализировать плохо обусловленную разреженную матрицу с очень маленькими значениями. Я должен сказать, что C ++ с LAPACK может делать правильно, поэтому я надеюсь, что Джулия может сделать это также. Проблема проста: eigvals(Matrix)
дает правильный спектр, но eigen(Matrix)
дает плохой спектр и, как следствие, плохие собственные векторы. Итак, мой вопрос:
Есть ли способ правильно рассчитать собственные векторы?
Я вставляю здесь минимальный полный пример:
using LinearAlgebra
using SparseArrays
hops=[-1.0e-60, -1.0e-55, -1.0e-50, -1.0e-45, -1.0e-40, -1.0e-35, -1.0e-30, -1.0e-25, -1.0e-20, -1.0e-15, -1.0e-10, -1.0e-5, -0.00316228, -1.0e-5, -1.0e-10, -1.0e-15, -1.0e-20, -1.0e-25, -1.0e-30, -1.0e-35, -1.0e-40, -1.0e-45, -1.0e-50, -1.0e-55, -1.0e-60]
ham=diagm(-1 => hops, 1=>hops)
ham_dense=Array(ham)
s1=eigvals(ham_dense)
s2,basis=eigen(ham_dense)
println(s1)
println(s2)
В бетоне мы имеем, что eigvals
дает:
[- 0.00316231, -3.16228e-8, -3.16228e-13, -3.16228e-18, -3.16228e-23,
-3.16228e-28, -3.16228e-33, -3.16228e-38, -3.16228e-43, -3.16228e-48, -3.16228e-53, -3.16228e-58, -3.16225e-63, 3.16225e -63, 3.16228e-58, 3.16228e-53, 3.16228e-48, 3.16228e-43, 3.16228e-38, 3.16228e-33, 3.16228e-28, 3.16228e-23, 3.16228e-18, 3.16228e -13, 3,16228e-8, 0,00316231]
И спектр, полученный с помощью eigen
:
[- 0,00316231, -3,16228e-8, -3,16225e-13, -2,09351e-18, 0,0, 0,0, 0,0,
0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 4,24468e-18, 3,1623e-13, 3,16228e-8, 0,00316231]
Заранее большое спасибо.