@@ -625,6 +625,52 @@ if VERSION >= v"1.6.0-DEV.292"
625625 end
626626end
627627
628+ # Symmetric eigvals #
629+ # -------------------#
630+
631+ function LinearAlgebra. eigvals (A:: Symmetric{<:Dual{Tg,T,N}} ) where {Tg,T<: Real ,N}
632+ λ,Q = eigen (Symmetric (value .(parent (A))))
633+ parts = ntuple (j -> diag (Q' * getindex .(partials .(A), j) * Q), N)
634+ Dual {Tg} .(λ, tuple .(parts... ))
635+ end
636+
637+ function LinearAlgebra. eigvals (A:: Hermitian{<:Complex{<:Dual{Tg,T,N}}} ) where {Tg,T<: Real ,N}
638+ λ,Q = eigen (Hermitian (value .(real .(parent (A))) .+ im .* value .(imag .(parent (A)))))
639+ parts = ntuple (j -> diag (real .(Q' * (getindex .(partials .(real .(A)) .+ im .* partials .(imag .(A)), j)) * Q)), N)
640+ Dual {Tg} .(λ, tuple .(parts... ))
641+ end
642+
643+ function LinearAlgebra. eigvals (A:: SymTridiagonal{<:Dual{Tg,T,N}} ) where {Tg,T<: Real ,N}
644+ λ,Q = eigen (SymTridiagonal (value .(parent (A). dv),value .(parent (A). ev)))
645+ parts = ntuple (j -> diag (Q' * getindex .(partials .(A), j) * Q), N)
646+ Dual {Tg} .(λ, tuple .(parts... ))
647+ end
648+
649+ # A ./ (λ - λ') but with diag special cased
650+ function _lyap_div! (A, λ)
651+ for (j,μ) in enumerate (λ), (k,λ) in enumerate (λ)
652+ if k ≠ j
653+ A[k,j] /= μ - λ
654+ end
655+ end
656+ A
657+ end
658+
659+ function LinearAlgebra. eigen (A:: Symmetric{<:Dual{Tg,T,N}} ) where {Tg,T<: Real ,N}
660+ λ = eigvals (A)
661+ _,Q = eigen (SymTridiagonal (value .(parent (A). dv),value .(parent (A). ev)))
662+ parts = ntuple (j -> Q* _lyap_div! (Q' * getindex .(partials .(A), j) * Q - Diagonal (getindex .(partials .(λ), j)), value .(λ)), N)
663+ Eigen (λ,Dual {Tg} .(Q, tuple .(parts... )))
664+ end
665+
666+ function LinearAlgebra. eigen (A:: SymTridiagonal{<:Dual{Tg,T,N}} ) where {Tg,T<: Real ,N}
667+ λ = eigvals (A)
668+ _,Q = eigen (SymTridiagonal (value .(parent (A))))
669+ parts = ntuple (j -> Q* _lyap_div! (Q' * getindex .(partials .(A), j) * Q - Diagonal (getindex .(partials .(λ), j)), value .(λ)), N)
670+ Eigen (λ,Dual {Tg} .(Q, tuple .(parts... )))
671+ end
672+
673+
628674# ##################
629675# Pretty Printing #
630676# ##################
0 commit comments