JuliaLinearAlgebra / IterativeSolvers.jl

Iterative algorithms for solving linear systems, eigensystems, and singular value problems
MIT License
394 stars 106 forks source link

BiCGStab Fails Silently #339

Open packquickly opened 1 year ago

packquickly commented 1 year ago

I mentioned here https://github.com/JuliaLinearAlgebra/IterativeSolvers.jl/issues/338 that GMRES was failing silently from stagnation. Turns out BiCGStab is also failing silently from (some form of) breakdown.

Not so surprising that this fails given how I'm (mis)using the algorithm, but the failure should not be silent.

Reproducing code:

import IterativeSolvers: bicgstabl
import LinearAlgebra: cond, norm

for problem_dim in [25, 100]
    succeeded = 0
    for i = 1:100 
        condition_number = Inf
        matrix = nothing
        while condition_number > 1000
            matrix = randn(Float64, (problem_dim, problem_dim))
            condition_number = cond(matrix)
        end

        true_vec = randn(Float64, (problem_dim,))
        b = matrix * true_vec

        julia_soln = bicgstabl(matrix, b)

        residual_norm = norm(julia_soln - true_vec)

        succeeded += (residual_norm < 1)  # very loose tolerance!
    end
    println("problem dim: $problem_dim. succeeded: $succeeded")
end