diff --git a/src/internal_itp.jl b/src/internal_itp.jl index af6ee0b97..06f685045 100644 --- a/src/internal_itp.jl +++ b/src/internal_itp.jl @@ -30,7 +30,7 @@ function SciMLBase.solve(prob::IntervalNonlinearProblem{IP, Tuple{T, T}}, alg::I args...; maxiters = 1000, kwargs...) where {IP, T} f = Base.Fix2(prob.f, prob.p) - left, right = prob.tspan # a and b + left, right = minmax(prob.tspan...) # a and b fl, fr = f(left), f(right) ϵ = eps(T) if iszero(fl) @@ -40,7 +40,7 @@ function SciMLBase.solve(prob::IntervalNonlinearProblem{IP, Tuple{T, T}}, alg::I return SciMLBase.build_solution(prob, alg, right, fr; retcode = ReturnCode.ExactSolutionRight, left, right) end - span = abs(right - left) + span = right - left k1 = T(alg.scaled_k1) / span n0 = T(alg.n0) n_h = exponent(span / (2 * ϵ)) @@ -49,7 +49,7 @@ function SciMLBase.solve(prob::IntervalNonlinearProblem{IP, Tuple{T, T}}, alg::I i = 1 while i ≤ maxiters - span = abs(right - left) + span = right - left mid = (left + right) / 2 r = ϵ_s - (span / 2) diff --git a/test/internal_rootfinder.jl b/test/internal_rootfinder.jl index a334eb577..82b0632e7 100644 --- a/test/internal_rootfinder.jl +++ b/test/internal_rootfinder.jl @@ -36,4 +36,14 @@ for Rootfinder in (InternalITP,) @test abs.(solve(inp3, rf).u) ≈ sqrt.(p) @test abs.(solve(inp4, rf).u) ≈ sqrt.(p) end + + # https://github.com/SciML/DifferentialEquations.jl/issues/1087 + # Test with normal and reversed tspan. + # The expected zero is -acos(p), but there is another zero at acos(p) just outside tspan + f(u, p) = cos(u) - p + p = 0.9 + inp1 = IntervalNonlinearProblem(f, (-1.1 * acos(p), 0.9 * acos(p)), p) + inp2 = IntervalNonlinearProblem(f, (0.9 * acos(p), -1.1 * acos(p)), p) + @test solve(inp1, rf).u ≈ -acos(p) + @test solve(inp2, rf).u ≈ -acos(p) end