Using NLsolve to find multiple roots

I have two non-linear equations for which I want to find all roots.
Using nlsolve only returns one root.
How can I configure it to return all roots, say in some range of parameters?

You may be interested in IntervalRootFinding.jl. Here’s a tutorial: https://github.com/JuliaIntervals/IntervalRootFinding.jl.
edit:
The tutorial is actually here:
Interval root finding tutorial

3 Likes

Thanks, this package indeed seems to do the job!

However, I am having a hard time to take the actual number out of the returned interval.
The returned roots are put in rts and they are

3-element Vector{Root{IntervalBox{2, Float64}}}:
 Root([-0.261043, -0.261042] × [0.722688, 0.722689], :unique)
 Root([0.26962, 0.269621] × [0.26962, 0.269621], :unique)
 Root([0.722688, 0.722689] × [-0.261043, -0.261042], :unique)

So rts[1].interval[1] gives back the first interval [-0.261043, -0.261042]. I want to get one number from this so I can plot it or do other operations with it.
When I run first(rts[1].interval[1]) I still get the entire interval [-0.261043, -0.261042].
I looked in the documentation and didn’t find a specification on how to do that. If you happen to know, I would love the help:)

For practical purposes, I would check that the interval is sufficiently narrow (below some \epsilon) and then just take a midpoint or something similar.

yes, this is exactly what I had in mind.
The problem is that I don’t know how to get the bounds of the interval object.

You can extract the low and high value of an interval as

low, high = interval.lo, interval.hi
2 Likes

thanks! this works! perhaps you can point me to where in the docs I can find more useful operations?

Please refer to Interval arithmetic tutorial for more operations on the interval. However, there is no docs for .lo and .hi. I find these fields in the source code.

2 Likes

An easy way to learn about fields inside types is using typeof and fieldnames. Following the same setup in the tutorial, you can do:

julia> rts
2-element Vector{Root{Interval{Float64}}}:
 Root([1.99999, 2.00001], :unique)
 Root([-1.72982e-09, 1.38862e-09], :unique)

julia> rts |> typeof
Vector{Root{Interval{Float64}}} (alias for Array{Root{Interval{Float64}}, 1})

julia> rts[1] |> typeof |> fieldnames
(:interval, :status)

julia> rts[1].interval |> typeof |> fieldnames
(:lo, :hi)
2 Likes