Dal Teorema di Weierstrass (se f: [a, b]->R
è continua su [a, b], essa è dotata di massimo e di minimo) si può
dedurre il Lemma "Una funzione continua su un intervallo non può
passare da valori negativi a valori positivi senza annullarsi almeno in un punto"
(si dimostra per assurdo considerando la funzione 1/f(x)).
Questo lemma viene impiegato costruttivamente considerando intervalli via via
più piccoli (ognuno lungo la metà del precedente) e fermandosi o alla determinazione dello zero o al raggiungimento
della precisione richiesta.
Ad esempio nella figura si considerano gli intervalli [a0, b0], [a1=a0,
b1], [a2, b2=b1], [a3, b3=b2=b1] e fermandosi in quanto b3-a3 ha raggiunto la
precisione richiesta.
Quindi il valor medio c tra a3 e b3 approssima lo zero esatto per meno della
metà della precisione.
E' possibile fare delle prove qui di seguito:
Automatizzando la ricerca si può costruire un programma con il seguente input ed output:
|
Il programma è innanzitutto una implementazione di un algoritmo in uno specifico linguaggio di programmazione.
L'algoritmo di bisezione che segue è realizzato tramite un ciclo controllato dopo l'esecuzione dei calcoli ("ripeti") anziché prima ("mentre") e si ferma dopo un numero prefissato di iterazioni (da: Barozzi, G.,C., Corso di Analisi matematica, Cap. 6, Zanichelli,1989); altre informazioni in Pascal, Derive, Teoria .
0. A <- a, B <- b, KMAX <- kmax 1. K <- 0 2. ripetere | M <- (A + B)/2 | K <- K +1 | se f(M) =/= 0, allora | se f(A)*f(M) < 0, | allora B <- M | altrimenti: A <- M |_ fino a quando f(M) = 0, oppure K = KMAX 3. stampare M, f(M), K 4. fine |
Programma Javascript (realizzato con while)
Qui sotto si vede il modo in cui l'algoritmo è stato implementato utilizzando Javascript. Si è preferito controllare il ciclo prima della sua esecuzione: ciò rende necessaria qualche ripetizione ma qualcuno lo preferisce perché permette di non effettuare le istruzioni del ciclo se la soluzione è già trovata (è una questione di stile).
Le variabili di ingresso sono scritte in un modulo dati in celle di input a, b, e. Anche la funzione è scritta in una cella di ingresso (dati.f) e verrà ricalcolata (eval) di volta in volta.
Ricordiamo che in Javascript - come in diversi linguaggi basati su oggetti -
alla cella di ingresso è associato una valore (value) ma anche un nome
ecc. Quindi se della cella a si vuole il valore si dovrà scrivere dati.a.value
.
Per ottenere una copia gratuita di Borland Turbo pascal 5.5 si veda: Borland Museum Il seguente programma è tratto dal sito del Prof. S. Berardi in un testo RTF (cercare : "bisezione").
|