We are pleased to announce the first public release version of the
ValidatedNumerics.jl package, a Julia package for doing rigorous
calculations
using floating-point based interval arithmetic. This includes methods for
rigorously finding roots of 1D real functions.
To install the package, do
julia> Pkg.add("ValidatedNumerics")
The package provides an Interval type and operations defined on it in such
a way that the result of any mathematical operations is *guaranteed* to
contain the true result. For convenience, an `@interval` macro is defined:
julia> using ValidatedNumerics
julia> @interval(0.1)
[0.09999999999999999, 0.1]
julia> @interval sin(0.1) + cos(0.2)
[1.0798999944880696, 1.07989999448807]
Just wrapping an operation with the `@interval` macro automatically
provides a guaranteed rigorous interval containing the true result (an
"enclosure").
Interval arithmetic provides a means to develop new algorithms that also
provide rigorous guaranteed results, for example for root finding.
The interval Newton method is implemented in the function `newton`, e.g.:
julia> f(x) = x^2 - 2
f (generic function with 1 method)
julia> newton(f, @interval(-5, 5))
2-element Array{Root{Float64},1}:
Root([-1.4142135623730951, -1.414213562373095], :unique)
Root([1.414213562373095, 1.4142135623730951], :unique)
The response from this function can be considered as a *mathematically
rigorous proof* that the function f
has exactly two roots in the interval [-5, 5], one in the first interval
and the other in the second.
The :unique symbol indicates that the algorithm *guarantees* that there
exists a root in the given
interval and that it is unique.
Currently root-finding functionality is restricted to one-variable real
functions.
Please let us know if you have particularly tricky functions whose
(non-multiple) roots you need to find!
Multi-dimensional root finding is planned for the future.
We of course welcome comments, criticism, and pull requests at
http://github.com/dpsanders/ValidatedNumerics.jl
David Sanders & Luis Benet