@@ -625,6 +625,52 @@ if VERSION >= v"1.6.0-DEV.292"
625
625
end
626
626
end
627
627
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
+
628
674
# ##################
629
675
# Pretty Printing #
630
676
# ##################
0 commit comments