Trova tutte le radici di una funzione in un dato intervallo


9

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.


2
Esistono metodi basati sull'aritmetica degli intervalli.
LHF

Risposte:


6

Se stai usando Matlab, potresti provare il sistema Chebfun (dichiarazione di non responsabilità: ero uno sviluppatore attivo di questo progetto). Può trovare tutte le radici di una funzione monodimensionale in un intervallo chiuso o aperto per la precisione della macchina.

L'idea principale dietro il root-finder di Chebfun è quella di utilizzare una combinazione di bisection ricorsiva e Matrix del collega, un analogo della Matrix Companion , sui coefficienti di un interpolante della funzione target.

Ho una versione semplificata del codice qui . La funzione chebrootsassume una funzione anonima come primo input, l'intervallo finito come secondo e terzo argomento e un grado Ncome quarto e ultimo argomento. Per risultati ragionevoli, è possibile impostare Nsu 100.


0

In generale, questa è una ricerca senza speranza - senza alcune informazioni sulla continuità e / o sulla differenziabilità della funzione, tutto potrebbe succedere. Consideriamo ad esempio la funzione MATLAB definita sull'intervallo da 0 a 1:

funzione y = f (x)

y = 1,0;

if (x == 0,01)

y = 0,0;

fine

if (x == 0,013)

y = 0,0;

fine

if (x == 0.753124)

y = 0,0;

fine

Trattando questa funzione come una casella di blocco, non c'è modo di vedere che ha zero in questi tre punti e nessun altro punto nell'intervallo da 0 a 1 senza controllare ogni numero in virgola mobile compreso tra 0 e 1.


1
Questi tipi di zeri sono chiaramente impossibili da trovare, ma @Charles sembra essere interessato, nella peggiore delle ipotesi, alle funzioni della scatola nera con discontinuità di salto, ma non alle cosiddette discontinuità rimovibili.
Bill Barth,

1
Anche se ti limiti a saltare le discontinuità e anche se ti limiti a funzioni continue, se la funzione non è Lipschitz continua su intervalli noti, trovare tutti gli zero dalle valutazioni a un numero finito di punti non ti garantirà ottenere tutte le radici.
Brian Borchers,

peccato(1/X)[0,1]

ε
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.