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 ae 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 ae b. Faccio il contrario se f(a+ε)e f(b-ε)fossi negativi.
Ora, dal punto in cui ho trovato ( zo 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 ae 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.