Necesito encontrar todas las raíces de una función escalar en un intervalo dado. La función puede tener discontinuidades. El algoritmo puede tener una precisión de ε (por ejemplo, está bien si el algoritmo no encuentra dos raíces distintas más cercanas que ε).
¿Existe tal algoritmo? ¿Podría señalarme documentos sobre eso?
En realidad, tengo una función para encontrar un cero en un intervalo dado usando el algoritmo de Brent, y una función para encontrar un mínimo en un intervalo dado. Usando esas dos funciones, construí mi propio algoritmo, pero me preguntaba si existe un algoritmo mejor. Mi algoritmo es así:
Comienzo con un intervalo [a,b]
y una función f
. Si sign(f(a+ε)) ≠ sign(f(b-ε))
, sé que hay al menos un cero entre a
y b
, y lo encuentro z = zero(]a,b[)
. Compruebo si z
realmente es un cero (podría ser una discontinuidad), mirando el valor de z-ε
y z+ε
. Si es así, lo agrego a la lista de ceros encontrados. Si f(a+ε)
y f(b-ε)
ambos son positivos, busco m = min(]a, b[)
. Si f(m)
todavía es positivo, busco m = max(]a,b[)
porque podría haber una discontinuidad entre a
y b
. Hago lo contrario si f(a+ε)
y f(b-ε)
fueran negativos.
Ahora, desde el punto en que encontré ( z
o m
) construyo una pila que contiene los ceros, las discontinuidades y los puntos de inflexión de mi función. Después de la primera iteración, ahora se ve la pila [a, z, b]
. Comienzo nuevamente el algoritmo a partir de intervalos ]a,z[
y ]z,b[
. Cuando, entre dos puntos a
y b
, los extremos tienen el mismo signo que ambos extremos del intervalo, y no hay discontinuidades en ambos extremos, elimino el intervalo de la pila. El algoritmo termina cuando no hay más intervalos.