Preciso encontrar todas as raízes de uma função escalar em um determinado intervalo. A função pode ter descontinuidades. O algoritmo pode ter uma precisão de ε (por exemplo, está ok se o algoritmo não encontrar duas raízes distintas mais próximas que ε).
Esse algoritmo existe? Você poderia me apontar documentos sobre isso?
Na verdade, tenho uma função para encontrar um zero em um determinado intervalo usando o algoritmo de Brent e uma função para encontrar um mínimo em um determinado intervalo. Usando essas duas funções, criei meu próprio algoritmo, mas fiquei pensando se existe um algoritmo melhor. Meu algoritmo é assim:
Começo com um intervalo [a,b]
e uma função f
. Se sign(f(a+ε)) ≠ sign(f(b-ε))
, eu sei que há pelo menos um zero entre a
e b
, e acho z = zero(]a,b[)
. Testo se z
realmente é um zero (pode ser uma descontinuidade), procurando o valor de z-ε
e z+ε
. Se for, adiciono-o à lista de zeros encontrados. Se f(a+ε)
e f(b-ε)
ambos são positivos, eu procuro m = min(]a, b[)
. Se f(m)
ainda é positivo, procuro m = max(]a,b[)
porque pode haver uma descontinuidade entre a
e b
. Eu faço o oposto se f(a+ε)
e f(b-ε)
foram negativos.
Agora, a partir do ponto em que encontrei ( z
ou m
), construo uma pilha contendo os zeros, descontinuidades e pontos de inflexão da minha função. Após a primeira iteração, a pilha agora se parece [a, z, b]
. Começo novamente o algoritmo a partir de intervalos ]a,z[
e ]z,b[
. Quando, entre dois pontos a
e b
, os extremos têm o mesmo sinal que os dois intervalos, e não há descontinuidades nos dois extremos, removo o intervalo da pilha. O algoritmo termina quando não há mais intervalos.