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.
| Passo | a | b | m | f(m) |
|---|---|---|---|---|
| 1 | 1 | 2 | 1,5 | 0,25 |
| 2 | 1 | 1,5 | 1,25 | -0,4375 |
| 3 | 1,25 | 1,5 | 1,375 | -0,109375 |
| 4 | 1,375 | 1,5 | 1,4375 | 0,0664 |
| 5 | 1,375 | 1,4375 | 1,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
fcome parametro, così lo stesso codice vale per qualunque equazione; max_iterevita il ciclo infinito se il metodo non converge;- il controllo del segno iniziale in
bisezioneprotegge da intervalli che non contengono una radice; - in
newtonil controllod == 0evita la divisione per zero.
Criteri di arresto
Un ciclo numerico deve sapere quando fermarsi. Tre criteri, spesso combinati:
- Ampiezza dell’intervallo (bisezione): .
- Differenza tra approssimazioni: .
- 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
| Bisezione | Newton | |
|---|---|---|
| Serve | Intervallo con cambio di segno | Derivata e punto iniziale |
| Convergenza | Sempre, ma lenta (un bit per passo) | Molto veloce, se parte vicino |
| Rischi | Pochi | Derivata nulla, punto lontano, divergenza |
| Costo per passo | Una 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.