I need to find all the roots of a scalar function in a given interval. The function may have discontinuities. The algorithm can have a precision of ε (e.g. it is ok if the algorithm doesn't find two distinct roots that are closer than ε).
Does such algorithm exists? Could you point me papers about that?
Actually, I have a function to find a zero in a given interval using Brent's algorithm, and a function to find a minimum in a given interval. Using those two functions, I built my own algorithm, but I was wondering if a better algorithm exists. My algorithm is like that:
I start with an interval [a,b]
and a function f
. If sign(f(a+ε)) ≠ sign(f(b-ε))
, I know there is at least one zero between a
and b
, and I find z = zero(]a,b[)
. I test if z
really is a zero (it could be a discontinuity), by looking a the value of z-ε
and z+ε
. If it is, I add it to the list of found zeros. If f(a+ε)
and f(b-ε)
both are positive, I search m = min(]a, b[)
. If f(m)
still is positive, I search m = max(]a,b[)
because there could be a discontinuity between a
and b
. I do the opposite if f(a+ε)
and f(b-ε)
were negatives.
Now, from the point I found (z
or m
) I build a stack containing the zeros, discontinuities, and inflection points of my function. After the first iteration, the stack now looks like [a, z, b]
. I start again the algorithm from intervals ]a,z[
and ]z,b[
. When, between two points a
and b
, the extrema have the same sign than both interval ends, and there is no discontinuities at both extrema, I remove the interval from the stack. The algorithm ends when there is no more intervals.