Skip to content

Commit f20fa8f

Browse files
mfaltandreasnoack
authored andcommitted
Fix schur Issue (#59)
* Fixed _schur! for corner case and fixed _eigvals!(::Schur,... ) * Wrong issue number
1 parent 787510a commit f20fa8f

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

src/eigenGeneral.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,11 @@ function _schur!(H::HessenbergFactorization{T}; tol = eps(real(T)), debug = fals
9898

9999
# Determine if the matrix splits. Find lowest positioned subdiagonal "zero"
100100
for _istart in iend - 1:-1:1
101-
if abs(HH[_istart + 1, _istart]) < tol*(abs(HH[_istart, _istart]) + abs(HH[_istart + 1, _istart + 1]))
101+
if abs(HH[_istart + 1, _istart]) <= tol*(abs(HH[_istart, _istart]) + abs(HH[_istart + 1, _istart + 1]))
102102
istart = _istart + 1
103103
debug && @printf("Split! Subdiagonal element is: %10.3e and istart now %6d\n", HH[istart, istart - 1], istart)
104104
break
105-
elseif _istart > 1 && abs(HH[_istart, _istart - 1]) < tol*(abs(HH[_istart - 1, _istart - 1]) + abs(HH[_istart, _istart]))
105+
elseif _istart > 1 && abs(HH[_istart, _istart - 1]) <= tol*(abs(HH[_istart - 1, _istart - 1]) + abs(HH[_istart, _istart]))
106106
debug && @printf("Split! Next subdiagonal element is: %10.3e and istart now %6d\n", HH[_istart, _istart - 1], _istart)
107107
istart = _istart
108108
break
@@ -138,7 +138,6 @@ function _schur!(H::HessenbergFactorization{T}; tol = eps(real(T)), debug = fals
138138

139139
debug && @printf("Wilkinson-like shift! Subdiagonal is: %10.3e, last subdiagonal is: %10.3e\n", HH[iend, iend - 1], HH[iend - 1, iend - 2])
140140
_d = t*t - 4d
141-
142141
if _d isa Real && _d >= 0
143142
# real eigenvalues
144143
a = t/2
@@ -291,7 +290,7 @@ function _eigvals!(S::Schur{T}; tol = eps(real(T))) where T
291290
while i < n
292291
Hii = HH[i, i]
293292
Hi1i1 = HH[i + 1, i + 1]
294-
if abs(HH[i + 1, i]) < tol*(abs(Hi1i1) + abs(Hii))
293+
if abs(HH[i + 1, i]) <= tol*(abs(Hi1i1) + abs(Hii))
295294
vals[i] = Hii
296295
i += 1
297296
else

test/eigengeneral.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ end
5151
@test sort(GenericLinearAlgebra._eigvals!(GenericLinearAlgebra._schur!(copy(A))), by = t -> (real(t), imag(t))) sort(eigvals(A), by = t -> (real(t), imag(t)))
5252
end
5353

54+
@testset "Convergence in with 0s Issue 58." begin
55+
A = [0.0 1.0 0.0; -1.0 0.0 0.0; 0.0 0.0 0.0]
56+
@test sort(GenericLinearAlgebra._eigvals!(GenericLinearAlgebra._schur!(copy(A))), by = t -> (real(t), imag(t))) sort(eigvals(A), by = t -> (real(t), imag(t)))
57+
B = [0.0 0.0 0.0; 0.0 0.0 1.0; 0.0 -1.0 0.0]
58+
@test sort(GenericLinearAlgebra._eigvals!(GenericLinearAlgebra._schur!(copy(B))), by = t -> (real(t), imag(t))) sort(eigvals(B), by = t -> (real(t), imag(t)))
59+
end
60+
5461
@testset "Extract Schur factor" begin
5562
A = randn(5, 5)
5663
@test sum(eigvals(schur(A).T)) sum(eigvals(Float64.(schur(big.(A)).T)))

0 commit comments

Comments
 (0)