Skip to content

Commit

Permalink
Fix trv intersection and try fixing IntervalBox
Browse files Browse the repository at this point in the history
  • Loading branch information
Kolaru committed Jan 9, 2024
1 parent 09c0160 commit b4a54a2
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
[compat]
BranchAndPrune = "0.2.1"
ForwardDiff = "0.10"
IntervalArithmetic = "0.21"
IntervalArithmetic = "0.22"
Reexport = "1"
StaticArrays = "1"
julia = "1"
Expand Down
2 changes: 1 addition & 1 deletion src/IntervalRootFinding.jl
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ const D = derivative

const where_bisect = 0.49609375 # 127//256

const Region = Union{Interval, SVector{N, Interval} where N}
const Region = Union{Interval, SVector{N, <:Interval} where N}

IntervalBox(x::Interval, N::Integer) = SVector{N}(fill(x, N))
IntervalBox(xx::Vararg{Interval, N}) where N = SVector{N}(xx...)
Expand Down
16 changes: 9 additions & 7 deletions src/contractors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ function (N::Newton)(X::Interval ; α=where_bisect)
return m - (N.f(m) / N.f′(X))
end

function (N::Newton)(X::SVector{<:Interval} ; α=where_bisect)
function (N::Newton)(X::SVector{M, <:Interval} ; α=where_bisect) where M
m = interval.(mid.(X, α))
J = N.f′(X)
y = gauss_elimination_interval(J, N.f(m)) # J \ f(m)
return IntervalBox(m .- y)
return m .- y
end

"""
Expand Down Expand Up @@ -85,7 +85,7 @@ function (K::Krawczyk)(X::Interval ; α=where_bisect)
return m - Y*K.f(m) + (1 - Y*K.f′(X)) * (X - m)
end

function (K::Krawczyk)(X::SVector{<:Interval} ; α=where_bisect)
function (K::Krawczyk)(X::SVector{N, <:Interval} ; α=where_bisect) where N
jacobian = K.f′
mm = mid.(X, α)
J = jacobian(X)
Expand All @@ -100,7 +100,7 @@ end
Similar to `isempty` function for `IntervalBox`, but also works for `SVector`
of `Interval`.
"""
safe_isempty(X) = isempty(IntervalBox(X))
safe_isempty(X) = any(isempty_interval.(X))

"""
contract(contractor, R)
Expand All @@ -113,7 +113,7 @@ function contract(B::Bisection, R::Root)

imX = B.f(X)

if !(in_interval(0, imX)) || safe_isempty(imX)
if !(all(in_interval.(0, imX))) || safe_isempty(imX)
return Root(X, :empty)
end

Expand All @@ -132,7 +132,8 @@ function contract(C::Union{Newton, Krawczyk}, R::Root)
# Only happens if X is partially out of the domain of f
safe_isempty(contracted_X) && return Root(X, :unknown) # force bisection

NX = intersect_interval(contracted_X, X)
NX = intersect_interval(bareinterval(contracted_X), bareinterval(X))
NX = IntervalArithmetic._unsafe_interval(NX, min(decoration(contracted_X), decoration(X)), isguaranteed(contracted_X))

!isbounded(X) && return Root(NX, :unknown) # force bisection
safe_isempty(NX) && return Root(X, :empty)
Expand All @@ -153,7 +154,8 @@ This function assumes that it is already known that `X` contains a unique root.
"""
function refine(C::Union{Newton, Krawczyk}, X::Region, root_problem)
while diam(X) > root_problem.abstol
NX = intersect_interval(C(X), X)
NX = intersect_interval(bareinterval(C(X)), bareinterval(X))
NX = IntervalArithmetic._unsafe_interval(NX, min(decoration(C(X)), decoration(X)), isguaranteed(C(X)))
isequal_interval(NX, X) && break # reached limit of precision
X = NX
end
Expand Down
2 changes: 1 addition & 1 deletion src/linear_eq.jl
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ function gauss_elimination_interval!(x::AbstractArray, A::AbstractMatrix, b::Abs
p[i] = (b[i] - temp) / A[i, i]
end

return p .∩ x
return intersect_interval.(p, x)
end

function gauss_elimination_interval1(A::AbstractMatrix, b::AbstractArray; precondition=true)
Expand Down

0 comments on commit b4a54a2

Please sign in to comment.