Ho bisogno di trovare tutte le radici di una funzione scalare in un dato intervallo. La funzione potrebbe presentare discontinuità. L'algoritmo può avere una precisione di ε (es. È ok se l'algoritmo non trova due radici distinte che sono più vicine di ε).
Esiste un tale algoritmo? Potresti indicarmi documenti a riguardo?
In realtà, ho una funzione per trovare uno zero in un determinato intervallo usando l'algoritmo di Brent e una funzione per trovare un minimo in un determinato intervallo. Usando queste due funzioni, ho creato il mio algoritmo, ma mi chiedevo se esistesse un algoritmo migliore. Il mio algoritmo è così:
Comincio con un intervallo [a,b]
e una funzione f
. Se sign(f(a+ε)) ≠ sign(f(b-ε))
, so che c'è almeno uno zero tra a
e b
, e trovo z = zero(]a,b[)
. Provo se z
è davvero uno zero (potrebbe essere una discontinuità), osservando il valore di z-ε
e z+ε
. Se lo è, lo aggiungo all'elenco degli zeri trovati. Se f(a+ε)
ed f(b-ε)
entrambi sono positivi, cerco m = min(]a, b[)
. Se f(m)
è ancora positivo, cerco m = max(]a,b[)
perché potrebbe esserci una discontinuità tra a
e b
. Faccio il contrario se f(a+ε)
e f(b-ε)
fossi negativi.
Ora, dal punto in cui ho trovato ( z
o m
) ho creato uno stack contenente gli zeri, le discontinuità e i punti di flesso della mia funzione. Dopo la prima iterazione, lo stack ora sembra [a, z, b]
. Ricomincio l'algoritmo da intervalli ]a,z[
e ]z,b[
. Quando, tra due punti a
e b
, gli estremi hanno lo stesso segno di entrambi gli intervalli, e non vi sono discontinuità in entrambi gli estremi, rimuovo l'intervallo dallo stack. L'algoritmo termina quando non ci sono più intervalli.