# Verified real linear systems

IntervalLinearAlgebra.epsilon_inflationMethod
epsilon_inflation(A::AbstractMatrix{T}, b::AbstractArray{S, N};
r=0.1, ϵ=1e-20, iter_max=20) where {T<:Real, S<:Real, N}

epsilon_inflation(A::AbstractMatrix{T}, b::AbstractArray{S, N};
r=0.1, ϵ=1e-20, iter_max=20) where {T<:Interval, S<:Interval, N}

Gives an enclosure of the solution of the square linear system $Ax=b$ using the ϵ-inflation algorithm, see algorithm 10.7 of [RUM10]

Input

• A – square matrix of size n × n
• b – vector of length n or matrix of size n × m
• r – relative inflation, default 10%
• ϵ – absolute inflation, default 1e-20
• iter_max – maximum number of iterations

Output

• x – enclosure of the solution of the linear system
• cert – Boolean flag, if cert==true, then x is certified to contain the true

solution of the linear system, if cert==false, then the algorithm could not prove that $x$ actually contains the true solution.

Algorithm

Given the real system $Ax=b$ and an approximate solution $̃x$, we initialize $x₀ = [̃x, ̃x]$. At each iteration the algorithm computes the inflation

$y = xₖ * [1 - r, 1 + r] .+ [-ϵ, ϵ]$

and the update

$xₖ₊₁ = Z + (I - CA)y$,

where $Z = C(b - Ax₀)$ and $C$ is an approximate inverse of $A$. If the condition $xₖ₊₁ ⊂ y$ is met, then $xₖ₊₁$ is a proved enclosure of $A⁻¹b$ and cert is set to true. If the condition is not met by the maximum number of iterations, the latest computed enclosure is returned, but $cert$ is set to false, meaning the algorithm could not prove that the enclosure contains the true solution. For interval systems, $̃x$ is obtained considering the midpoint of $A$ and $b$.

Notes

• This algorithm is meant for real linear systems, or interval systems with

very tiny intervals. For interval linear systems with wider intervals, see the solve function.

Examples

julia> A = [1 2;3 4]
2×2 Matrix{Int64}:
1  2
3  4

julia> b = A * ones(2)
2-element Vector{Float64}:
3.0
7.0

julia> x, cert = epsilon_inflation(A, b)
(Interval{Float64}[[0.999999, 1.00001], [0.999999, 1.00001]], true)

julia> ones(2) .∈ x
2-element BitVector:
1
1

julia> cert
true
source