gl/ripetizioni

Metodo di Newton e bisezione in Python

Metodo di bisezione e di Newton-Raphson per trovare gli zeri di una funzione, con codice Python completo, criteri di arresto e confronto della convergenza.

di Gaetano Livornese

  • #informatica
  • #quinta superiore
  • #liceo scientifico
  • #calcolo numerico
  • #metodo di newton
  • #python

Se sei in quinta al liceo scientifico opzione scienze applicate, nel primo quadrimestre l’informatica arriva al calcolo numerico: trovare gli zeri di una funzione con il computer, quando l’equazione non si risolve con una formula. La verifica scritta o la consegna di laboratorio su questo blocco cade di solito tra sei e nove settimane da ora, fra fine novembre e dicembre. Il tempo c’è, e il tema è uno dei più belli del programma, perché per la prima volta il codice che scrivi dà un risultato che puoi controllare con la calcolatrice.

Vedo ogni anno nelle mie lezioni gli stessi due ostacoli: capire perché il metodo converge, e scrivere un ciclo con un criterio di arresto sensato. Uso sempre lo stesso esempio, il più semplice che esista: , la cui radice positiva è . Conosciamo già la risposta, quindi possiamo vedere se il metodo la trova.

Se Python è ancora un po’ nuovo, parti da programmazione in Python da zero. Per ragionare su cicli e condizioni prima del codice ti serve diagrammi di flusso e pseudocodice; per un altro esempio di algoritmo con confronto di costo, algoritmi di ordinamento.

Metodo di bisezione

L’idea viene dal teorema degli zeri: se è continua in e e hanno segno opposto, nell’intervallo c’è almeno una radice. Si prende il punto medio e si tiene la metà in cui il segno cambia. Ripeti.

Per su : e , segni opposti, si parte.

Passoabmf(m)
1121,50,25
211,51,25-0,4375
31,251,51,375-0,109375
41,3751,51,43750,0664
51,3751,43751,40625-0,0225

Dopo 5 passi la radice è in : l’errore massimo è . A ogni passo l’intervallo si dimezza, quindi dopo passi l’ampiezza è . Per avere un errore sotto da un intervallo di ampiezza 1 serve , cioè (infatti ).

Metodo di Newton–Raphson

Newton usa la derivata: dal punto si traccia la tangente al grafico e si prende dove incontra l’asse . La formula è:

Per la derivata è , e la formula diventa . Partiamo da :

Dopo soli 3 passi le cifre giuste sono 11. Un’osservazione utile per la verifica: il numero di cifre corrette circa raddoppia a ogni passo (errore: circa , poi , poi ). La bisezione guadagna invece un solo bit (un fattore 2) per passo.

Il codice Python

Ho testato queste funzioni con python3 sull’esempio di sopra.

def f(x):
    return x * x - 2

def df(x):
    return 2 * x

def bisezione(f, a, b, tol=1e-6, max_iter=100):
    if f(a) * f(b) > 0:
        raise ValueError("f(a) e f(b) devono avere segno opposto")
    for i in range(1, max_iter + 1):
        m = (a + b) / 2
        if f(m) == 0 or (b - a) / 2 < tol:
            return m, i
        if f(a) * f(m) < 0:
            b = m
        else:
            a = m
    return (a + b) / 2, max_iter

def newton(f, df, x0, tol=1e-10, max_iter=50):
    x = x0
    for i in range(1, max_iter + 1):
        d = df(x)
        if d == 0:
            raise ZeroDivisionError("derivata nulla")
        x_nuovo = x - f(x) / d
        if abs(x_nuovo - x) < tol:
            return x_nuovo, i
        x = x_nuovo
    return x, max_iter

print(bisezione(f, 1, 2))
print(newton(f, df, 1.5))

Output: la bisezione dà circa 1.4142141 in 20 iterazioni, Newton 1.4142135623730951 in 4 iterazioni. Con tolleranza la bisezione ne richiede 34. A parità di precisione, Newton fa meno del 15 % del lavoro.

Alcune scelte da saper spiegare in laboratorio:

  • le funzioni ricevono f come parametro, così lo stesso codice vale per qualunque equazione;
  • max_iter evita il ciclo infinito se il metodo non converge;
  • il controllo del segno iniziale in bisezione protegge da intervalli che non contengono una radice;
  • in newton il controllo d == 0 evita la divisione per zero.

Criteri di arresto

Un ciclo numerico deve sapere quando fermarsi. Tre criteri, spesso combinati:

  1. Ampiezza dell’intervallo (bisezione): .
  2. Differenza tra approssimazioni: .
  3. Residuo: . Attenzione: se la funzione è molto piatta vicino alla radice, un residuo piccolo non garantisce un vicino.

Aggiungi sempre un numero massimo di iterazioni: è l’ultima rete di sicurezza.

Confronto e limiti

BisezioneNewton
ServeIntervallo con cambio di segnoDerivata e punto iniziale
ConvergenzaSempre, ma lenta (un bit per passo)Molto veloce, se parte vicino
RischiPochiDerivata nulla, punto lontano, divergenza
Costo per passoUna valutazione di e

In pratica: Newton è più veloce, la bisezione è più robusta. Un errore tipico: partire con Newton da per . La derivata vale 0 e il codice solleva l’eccezione. Con il primo passo manda il punto a e servono altri passi per tornare vicino alla radice: il metodo funziona, ma il punto di partenza conta.

Se vuoi un livello oltre il liceo, dove si studia anche l’errore e la convergenza in modo formale, lo trovi in calcolo numerico: metodi per l’esame. Per la parte di analisi dietro Newton, utile ripassare le derivate spiegate bene.

Un esercizio completo

Trova come radice positiva di , con Newton da . La derivata è e il passo è .

Il valore esatto è : al terzo passo l’errore è già sotto . Quante iterazioni avrebbe usato la bisezione su per la stessa tolleranza? Serve , cioè (). Il confronto 3 contro 27 è la risposta che molti professori vogliono sentire sulla velocità di convergenza.

Un’avvertenza sul codice: se ti chiedono di modificarlo per , cambiano solo f e df, non le due funzioni dei metodi. Se hai dovuto toccare bisezione o newton, qualcosa non è generale.

Metti alla prova

Prima di una verifica rifai a mano tre iterazioni di Newton per da e controlla poi con il codice. Poi prova la simulazione sulle verifiche del liceo, gratuita. Se vuoi riguardare insieme il tuo codice di laboratorio, possiamo farlo in una lezione di prova online con me.

Domande frequenti

Quante iterazioni servono alla bisezione per avere un errore sotto 10^-6?

Servono 20 iterazioni partendo da un intervallo di ampiezza 1, perché l'ampiezza si dimezza a ogni passo e 2^20 supera un milione.

Quando il metodo di Newton non funziona?

Quando la derivata si annulla vicino al punto di partenza o quando il punto iniziale è troppo lontano dalla radice: il metodo può uscire dall'intervallo o non convergere.

Perché la bisezione richiede f(a) e f(b) di segno opposto?

Per il teorema degli zeri, se la funzione è continua e cambia segno agli estremi, dentro l'intervallo c'è almeno una radice.

Quale criterio di arresto conviene usare nel metodo di Newton?

Fermarsi quando la differenza fra due approssimazioni successive è minore di una tolleranza, e porre sempre un numero massimo di iterazioni.

Continua a leggere

Vuoi applicare quello che hai letto?

Parliamone 30 minuti gratis: guardiamo insieme dove sei bloccato e ti dico onestamente come posso aiutarti.

Oppure scrivimi su WhatsApp.