Sei sulla pagina 1di 211

Annamaria Mazzia

Appunti di Calcolo Numerico

Dipartimento di Ingegneria Civile Edile e Ambientale


Università degli Studi di Padova

Creative Commons Attribuzione- Non commerciale -Non opere derivate 3.0 Italia License

a.a. 2012/2013
Annamaria Mazzia: Appunti di Calcolo Numerico,
Dipartimento di Ingegneria Civile Edile e Ambientale
Università degli Studi di Padova
VERSIONE A . A . 2012/2013 .

SITO DELLE DISPENSE :


http://dispense.dmsa.unipd.it/
E - MAIL :
mazzia@dmsa.unipd.it
Questo lavoro è stato rilasciato sotto la licenza C REATIVE C OMMONS ATTRIBUZIONE - N ON COMMERCIALE -
N ON OPERE DERIVATE 3.0 I TALIA L ICENSE,
Per leggere una copia della licenza visita il sito web (http://creativecommons.org/licenses/
by-nc-nd/3.0/it/)

Foto di copertina: Pietre...


Per ricordare l’etimologia della parola CALCOLO: dal latino Calculus – pietruzza, lapillo – a sua volta dimi-
nuitivo di Calx, nel senso originario di ghiaia, sasso, perchè gli antichi, per fare i loro conti, utilizzavano
pietruzze al posto di cifre aritmetiche. (definizione tratta dal Vocabolario Etimologico della Lingua Italiana di
O. Pianigiani http://www.etimo.it)
Indice

Indice iii

1 Struttura dell’elaboratore 1
1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 La preistoria del computer: Babbage e Lovelace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Gli albori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Architettura del Computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Software e Sistema Operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5.1 Per capire meglio il sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 Il file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.7 Un po’ di storia sui sistemi operativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.8 Lavorare in ambiente Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.9 Editor di testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2 Richiami di analisi 13
2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Identità trigonometriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Regole su funzione esponenziale e logaritmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Derivate e integrali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5 Teoremi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Rappresentazione dei numeri nel calcolatore 19


3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Aritmetica di macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 Conversione di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Rappresentazione IEEE dei numeri di macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5 Precisione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.6 Propagazione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.7 Instabilità e malcondizionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.7.1 Instabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.7.2 Malcondizionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4 Zeri di funzione 37
4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Metodo delle Bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3 Metodo del Punto Fisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.4 Il Metodo di Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.5 Convergenza di un metodo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

iii
I NDICE

4.6 Complessità computazionale di uno schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48


4.7 Il metodo delle secanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.8 Confronto tra i metodi di Newton-Raphson e la Regula Falsi . . . . . . . . . . . . . . . . . . . . . 50
4.9 Metodo di Newton-Raphson per radici multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.10 Controllo sugli scarti e grafici di convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.11 Osservazioni sull’ordine di convergenza di un metodo iterativo . . . . . . . . . . . . . . . . . . . 54
4.12 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

5 Interpolazione 61
5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.1 Funzioni base monomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.2 Polinomi di Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.3.3 Formula dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.3.4 Differenze divise e formula di Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.4 Considerazioni sull’interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4.1 Fenomeno di Runge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4.2 Malcondizionamento nell’interpolazione con funzioni base monomiali . . . . . . . . . 73
5.5 Interpolazione polinomiale a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.1 Interpolazione lineare a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.5.2 Interpolazione spline cubica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.5.3 Curve parametriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

6 Approssimazione 85
6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2 Retta di regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3 Approssimazione polinomiale ai minimi quadrati . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4 Approssimazioni di tipo esponenziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

7 Metodi diretti per la soluzione di sistemi lineari 93


7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.2 Elementi di Algebra Lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.3 Metodo di eliminazione di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3.1 Sostituzione all’indietro e in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3.2 Eliminazione di Gauss: esempio particolare . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.3.3 Eliminazione di Gauss: caso generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.4 Strategie di pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7.5 Fattorizzazione triangolare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.5.1 Fattorizzazione LDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.5.2 Fattorizzazione di Gauss senza pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.5.3 Fattorizzazione di Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

8 Metodi Iterativi per la soluzione di sistemi lineari 113


8.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.2 Metodi iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.3 Norme di vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.4 Norme di matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.5 Autovalori e autovettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.6 Metodi classici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

iv
Indice

8.6.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118


8.6.2 Controllo della convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
8.6.3 I metodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.6.4 Convergenza dei metodi di Jacobi, Gauss-Seidel, rilassamento . . . . . . . . . . . . . . . 125
8.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

9 Problemi non lineari in più variabili 131


9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
9.2 Metodo di Newton per sistemi di equazioni in più variabili . . . . . . . . . . . . . . . . . . . . . . 132
9.3 Minimi quadrati non lineari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

10 Integrazione numerica 141


10.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
10.2 Formula dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
10.3 Formule di Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.3.1 Formula di Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
10.3.2 Sull’errore della formula di Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . 147
10.4 Formule composte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
10.4.1 Formula composta dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
10.4.2 Confronti tra la formula dei trapezi e di Cavalieri-Simpson . . . . . . . . . . . . . . . . . 152
10.5 Estrapolazione di Richardson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.6 Approssimazione di Romberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.7 Introduzione alle formule di quadratura di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
10.7.1 Proprietà delle formule di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10.7.2 Formule di Gauss-Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10.7.3 Altre formule di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
10.7.4 Applicazione delle formule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10.7.5 Sulla funzione peso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10.8 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

11 Differenziazione numerica ed equazioni alle derivate ordinarie 165


11.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
11.2 Differenziazione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
11.3 Sulle equazioni differenziali ordinarie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
11.4 Metodo di Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
11.5 Metodo di Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
11.6 Metodo di Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
11.7 Studio dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
11.8 Errori di troncamento locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
11.9 Convergenza e stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
11.9.1 Convergenza di Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
11.9.2 Stabilità di Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
11.9.3 Convergenza di Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.9.4 Stabilità di Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.9.5 Convergenza di Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.9.6 Stabilità di Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
11.9.7 Sulla stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
11.10 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

12 Primi passi in MATLAB® 183


12.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
12.2 Avvio di MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
12.2.1 Matrici e vettori in MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

v
I NDICE

12.3 Comandi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187


12.4 MATLAB® per scrivere ed eseguire programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.4.1 Strutture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.5 Dati di input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
12.5.1 Programma sul metodo delle bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
12.6 Dati di output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
12.7 Grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
12.8 Sulle potenzialità di MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.9 Applicazioni di MATLAB® nel Calcolo Numerico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.9.1 Sull’instabilità numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.9.2 Sull’interpolazione e approssimazione di dati . . . . . . . . . . . . . . . . . . . . . . . . . 195
12.9.3 Confronto tra schemi per equazioni differenziali ordinarie . . . . . . . . . . . . . . . . . 202

Bibliografia 205

vi
C APITOLO 1
Struttura dell’elaboratore

I computer sono incredibilmente


veloci, accurati e stupidi. Gli uomini
sono incredibilmente lenti,
inaccurati e intelligenti. L’insieme
dei due costituisce una forza
incalcolabile.

Albert Einstein

1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 La preistoria del computer: Babbage e Lovelace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Gli albori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Architettura del Computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Software e Sistema Operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5.1 Per capire meglio il sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 Il file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.7 Un po’ di storia sui sistemi operativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.8 Lavorare in ambiente Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.9 Editor di testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.1 Introduzione
Se dobbiamo comprare un computer, abbiamo solo l’imbarazzo della scelta tra i tanti disponibili sul
mercato. Ma in base a quali criteri scegliamo un computer?
Le caratteristiche fondamentali di un computer si possono riassumere in poche parole-chiave: pro-
cessore, sistema operativo, memoria. Cosa significano esattamente? E, prima ancora, cosa significa
Computer?

Definizione 1.1.1 Computer = elaboratore elettronico digitale


Dispositivo elettronico che elabora le informazioni, immesse sotto forma di dati
numerici, secondo una sequenza di istruzioni preordinate (programma).
G Elaboratore: macchina capace di immagazzinare ed elaborare dati in base
ad una serie di istruzioni (programmi) memorizzate sul computer
G elettronico: utilizza componenti elettroniche per elaborare le informazioni
G digitale: elabora e memorizza segnali digitali basati su cifre binarie: 0 e 1

1
1. S TRUTTURA DELL’ ELABORATORE

Figura 1.1: Stralci di volantini pubblicitari per l’acquisto di un computer.

In generale, un computer esegue operazioni logiche e aritmetiche e ha una memoria per conservare i dati.
Un programma contiene le informazioni relative alle operazioni da eseguire.
Hardware Si definisce hardware la struttura fisica del computer cioè i i suoi componenti elettronici e i dispositivi
fisici che lo compongono.
Software Si chiama, invece, software l’insieme delle istruzioni (i programmi) che consentono all’hardware di
svolgere i propri compiti (per esempio, il sistema operativo – Windows, Linux, etc – è un tipo di software;
programmi applicativi come Word, Excel, LaTex sono dei software).
Attraverso un computer, elaboriamo dati (numeri, suoni, video, fotografie) in modo da ottenere in-
formazioni (lettere, tabelle, risultati di procedimenti numerici. . . ). Alcune di queste informazioni possono
diventare dati da elaborare di nuovo al computer.

1.2 La preistoria del computer: Babbage e Lovelace


La seconda metà del diciannovesimo secolo fu un tempo di grande fermento in numerosi campi, dall’in-
gegneria ai trasporti, dalla comunicazione all’architettura... Furono scoperti nuovi materiali, la forza animale
fu sostituita dalla forza motrice, le navi a vapore iniziarono a competere con quelle a vela, la rete ferroviaria
si espanse sempre più, il telegrafo elettrico rivoluzionò le comunicazioni... In questo contesto, ingegneri, ar-
chitetti, matematici, astronomi, marinai, banchieri, agenti assicurativi... – chiunque avesse a che fare con il
calcolo – si basava su tavole di calcolo per eseguire i calcoli meno banali. Tuttavia, si sa, gli uomini possono
sbagliare e il timore che su quelle tavole ci fossero degli errori era giustificato: un errore non trovato poteva
diventare un disastro nelle numerose applicazioni in cui le tavole di calcolo venivano usate!
Charles Già nel 1812 Charles Babbage1 era consapevole dell’inaccuratezza dei calcoli fatti dall’uomo. Nel suo
Babbage lavoro, Babbage doveva verificare l’esattezza di tavole di calcolo che sarebbero state usate da banchieri come
da marinai. Le navi avrebbero identificato la loro posizione in mare mediante quelle tavole! Eliminare il
rischio dell’errore umano divenne per lui un desiderio sempre più grande. Egli stesso scrisse che, mentre
era seduto nella stanza della Società Analitica, a Cambridge, lavorando, mezzo addormentato, su una tavola
dei logaritmi, arrivò un altro membro della società che gli chiese cosa stesse sognando. E lui rispose : – Sto
pensando che tutte queste tavole – riferendosi alle tavole dei logaritmi – potrebbero essere calcolate da una
macchina!
Nel 1821, Babbage e il suo amico e astronomo John Herschel stanno controllando delle tabelle calcolate
a mano. Errore dopo errore, Babbage esclama : – Volesse Dio che questi calcoli venissero eseguiti da una
macchina a vapore!
1 Charles Babbage (1791-1871), inventore e matematico inglese, è senza dubbio il primo ad avere avuto il concetto del moderno
calcolatore.

2
1.3. Gli albori

Il suo desiderio di creare una macchina per eseguire calcoli si concretizzò in due progetti, quello della
Macchina alle Differenze e quello della Macchina Analitica2 . La Macchina alle Differenze doveva calcolare
in modo automatico funzioni polinomiali ma non venne mai completata per il suo costo eccessivamente
elevato. La Macchina Analitica, invece, doveva essere una macchina di calcolo programmabile, e si può con-
siderare come la prima idea del moderno computer. Anche questo progetto, tuttavia, rimase incompiuto.
Solo nel 2002 è stato possibile costruire una macchina che rispondesse al progetto di Babbage.
Nel 1833, Babbage incontrò Ada Lovelace3 , figlia del famoso poeta Lord Byron. Lovelace, appena dicias- Ada Lovelace
settenne, aveva parecchie conoscenze matematiche, inusuali per l’epoca, e si entusiasmò talmente tanto per
il progetto di Babbage, da intuire altre potenzialità della macchina stessa, come la capacità dei numeri di
poter rappresentare altre entità quali le lettere dell’alfabeto o le note musicali, e che dalla manipolazione dei
numeri la macchina avrebbe esteso la propria potenza oltre il mondo della matematica. Sempre la Lovela-
ce intuì che la soluzione dei problemi matematici si sarebbe effettuata attraverso delle procedure di calcolo
(quelli che noi chiamiamo programmi).
Alla luce degli sviluppi che si sono avuti nel ventesimo secolo, la visione di Babbage e della Lovelace
appare profetica.

1.3 Gli albori


Il 1800 si chiude con una grande invenzione: nel 1896, Guglielmo Marconi inventa la radio. Il 1900 si apre
con altre importanti invenzioni: il triodo, il registratore magnetico, la televisione, fino ad arrivare intorno alla
metà del 1900 con il transistor (nel 1947) e il circuito integrato (nel 1958). La nuova tecnologia elettromeccani-
ca ed elettronica si rivelò decisiva per lo sviluppo dei computer, grazie allo studio sistematico della teoria dei
circuiti elettrici. Il più noto tra gli studiosi di questa teoria fu l’americano Claude Shannon4 . Il suo contributo
fondamentale fu quello di elaborare un metodo sistematico per progettare reti logiche capaci di eseguire le
operazioni logico-aritmetiche desiderate: detto più semplicemente, egli mostrò come trasformare una asse-
gnata operazione matematica in un circuito elettrico costruito con interruttori e relè di commutazione (quelli
usati nelle telecomunicazioni). Nel 1948, il suo articolo A Mathematical Theory of Communication pubbli-
cato sulla rivista The Bell System Technical Journal getta le basi teoriche dell’informatica. Per prima volta
viene usato il termine bit come abbreviazione di binary digit, termine suggeritogli dal chimico e statistico J.
W. Tukey.
Il lavoro di Shannon diede l’avvio allo studio delle tecniche indispensabili per progettare in modo
sistematico tutti i circuiti logici di base necessari per realizzare i circuiti di calcolo dei futuri computer.
Da un punto di vista propriamente ”pratico“ invece, la nascita e lo sviluppo dei calcolatori elettronici
inizia nel 1938: il tedesco Konrad Zuse5 costruisce Z1, una macchina costruita e pensata in maniera com-
pletamente meccanica, tutta da migliorare, ma che può essere considerata come il primo calcolatore. Zuse
passa subito al progetto Z2, dove l’aritmetica meccanica è sostituita da relè elettromeccanici. L’inizio della
seconda guerra mondiale interrompe bruscamente il lavoro di Zuse, che viene chiamato alle armi, ma riesce
a persuadere l’Istituto di Ricerca Aerodinamica del Terzo Reich a continuare i suoi studi. Completa quindi la
costruzione dello Z2 e inizia a lavorare sullo Z3, che è il primo computer che Zuse costruisce per essere usato
e non per verificare le proprie idee. Lo Z3 ha non solo l’unità aritmetica ma anche la memoria realizzata con
relè elettromeccanici, ben 2600. Z3 fu la prima macchina di calcolo programmabile e venne usata dall’in-
dustria aerea per risolvere sistemi di equazioni e altri sistemi matematici ricavati da problemi di vibrazione
degli apparecchi aerei messi sotto stress.
2 Osserviamo che l’invenzione del telaio meccanico a schede, in cui il tipo di tessuto veniva scelto (o programmato) in base a delle
schede inserite nella macchina, è un precursore del progetto di Babbage.
3 Augusta Ada Lovelace (1815-1852) fu la figlia del famoso poeta Lord Byron. I genitori si separono subito dopo la sua nascita e
la bambina crebbe insieme alla madre (Lord Byron partì dall’Inghilterra senza farvi più ritorno e morì in Grecia quando Ada aveva otto
anni). Poichè la madre era appassionata di matematica e non voleva che la figlia seguisse la strada del padre, incoraggiò la figlia in questa
direzione, impartendole un’istruzione legata alla matematica e alla musica. Nel 1835 sposò William King, di dieci anni più anziano. Nel
1838 il marito ricevette il titolo nobiliare di Conte di Lovelace. Ebbero tre figli. La Lovelace morì di cancro a soli 37 anni.
4 Claude Shannon (1916-2002) fu fisico e matematico del MIT.
5 Konrad Zuse, ingegnere civile (1910-1995).

3
1. S TRUTTURA DELL’ ELABORATORE

Quando Zuse propose di passare all’uso di un computer basato su valvole elettroniche, la proposta fu
respinta perchè i tedeschi si consideravano così vicini alla vittoria della guerra che ulteriori sforzi nella ricerca
non apparivano necessari.
Il lavoro di Zuse, comunque, andò avanti con la costruzione dello Z4, di S1 e S2. E, soprattutto, fu
completamente indipendente dai lavori di John Eckert e John Mauchly negli Stati Uniti e di A. Turing in
Inghilterra.
In Inghilterrra, Turing6 si occupò di problematiche riguardanti un macchina di calcolo digitale astratta,
con una memoria senza limiti, mentre negli USA Eckert e Mauchly7 costruirono l’ENIAC (Electronic Inte-
grator and Computer). L’ENIAC fu costruito, con progetto di Eckert, in piena seconda guerra mondiale, a
partire dal 1943, presso il Ballistic Research Laboratory e fu completato nel febbraio del 1946. La macchina
era pensata per compiere operazioni di carattere generale, ma fu costruita con lo scopo preciso di compilare
tabelle per le traiettorie di bombe. L’ENIAC conteneva circa 18. 000 valvole termoioniche e misurava circa 2
metri e mezzo di altezza per 24 metri di lunghezza! La macchina era più di mille volte veloce di tutti i prede-
cessori elettromeccanici costruiti fino a quel momento e poteva eseguire 5000 addizioni al secondo. Le sue
operazioni erano controllate da un programma che veniva inserito dall’esterno mediante nastri perforati.
von Intanto, nel 1944 aveva iniziato a collaborare nella costruzione dell’ENIAC, John von Neumann8 . Egli si
Neumann accorse che l’architettura della macchina andava rivista e che la programmazione del computer mediante un
numero enorme di cavi e interruttori rendeva lenta e poco flessibile la programmazione stessa. Sostenne,
quindi, che il programma non dovesse essere rigidamente predisposto nell’hardware tramite interruttori e
cavi e neanche letto mediante nastri perforati, ma risiedesse in una memoria su cui poter scrivere e accedere
velocemente insieme ai dati da elaborare. Von Neumann per primo descrisse l’architettura dei calcolatori in
termini logico-funzionale, secondo uno schema astratto non legato ai dispositivi fisici utilizzati per le varie
operazioni. E il suo schema, sostanzialmente invariato, è l’architettura adottata dai calcolatori dei nostri
giorni!
Prima di von Neumann, il calcolatore veniva controllato mediante programmi non modificabili, registrati
su nastro perforato o cablati in una configurazione di cavetti e interruttori. Con von Neumann si presenta
un’architettura di riferimento precisa.
Il primo calcolatore costruito seguendo l’architettura di von Neumann entrò in funzione nel 1948
all’Università di Manchester e venne chiamato Manchester Mark I.
Inizia, in tal modo, una nuova fase per i calcolatori: i programmi che controllano le operazioni da svolgere
risiedono nella memoria del calcolatore insieme ai dati e possono essere modificati dinamicamente nel corso
dell’elaborazione.
Dal 1948 fino ai nostri giorni, lo sviluppo dei calcolatori elettronici ha avuto ritmi esponenziali: l’inven-
zione del circuito integrato (chip) alla fine degli anni cinquanta permise non solo di ridurre via via lo spazio
fisico occupato dai computer ma anche di ottenere computer sempre più potenti tanto che, in due suoi la-
vori, del 1965 e del 1975, Gordon Moore9 stabilì che il numero dei transistor inseribili su un chip raddoppia
approssimativamente ogni 24 mesi (legge di Moore). Nel 1971 tre ingegneri della Intel tra cui l’italiano Fe-
derico Faggin10 inventarono il microprocessore, vale a dire un’intera CPU in un singolo circuito integrato:
su una piastrina di 4 × 3 millimetri riuscirono a inserire 2250 transistor, che formavano il cuore di un inte-
ro computer: questo microprocessore fu chiamato Intel 4004 ed era capace di eseguire 60. 000 operazioni al
secondo.
6 Alan Turing (1912-1954), matematico inglese, si interessò di logica matematica e di teoria della probabilità. Introdusse il concetto
di una macchina astratta, detta macchina di Turing e pose questioni riguardanti l’intelligenza artificiale
7 John Presper Eckert (1919-1995) e John William Mauchly (1907-1980) lavorarono a quello che si può considerare il vero primo
calcolatore elettronico.
8 John von Neumann (1903-1957) ungherese, studiò prima a Berlino, poi a Zurigo e infine a Budapest, dove ricevette il dottorato in
matematica. Nel 1930 si trasferì alla Università di Princeton dove insegnò matematica. Il suo nome è legato a studi in diversi settori:
teoria dei giochi, matematica applicata, logica... Occupa un ruolo fondamentale nello sviluppo dei calcolatori elettronici. Ricevette
numerosi premi e riconoscimenti in tutto il mondo.
9 Gordon Moore è nato nel 1929 in California. Di lui basti ricordare che ha stabilito la legge di Moore, è co-fondatore della Intel
Corporation e nel 2008 ha ricevuto la medaglia d’onore dell’IEEE per il suo pioneristico contributo nei processi dei circuiti integra-
ti, e per la leadership nello sviluppo della memoria del MOS (semiconduttore metal-ossido), del microprocessore e dell’industria dei
semiconduttori.
10 Federico Faggin è nato nel 1940 a Vicenza e si è laureato in fisica all’Università di Padova. Nel 1968 si è trasferito prima a Palo Alto
presso la Fairchild Semiconductor e poi nel 1970 nella Intel. Oggi è presidente e CEO (Chief Executive Officer) della Foveon.

4
1.4. Architettura del Computer

Se pensiamo che il processore Intel Pentium 4 introdotto nel 2000 ha 42. 000. 000 processori e l’Intel Ita-
nium 2 (con 9MB di cache) introdotto nel 2004 ha 592. 000. 000 transistors, ci accorgiamo di come la legge di
Moore, dal 1968 ad oggi, sia stata rispettata.

1.4 Architettura del Computer

L’architettura del Computer si può riassumere in tre unità:


G il processore, che fornisce la capacità di elaborazione delle informazioni;
G la memoria (centrale e di massa)
G i dispositivi di input/output, che comunicano attraverso un canale detto BUS, costituito da un insieme
di linee elettriche digitali.
Il processore è composto da blocchi con funzionalità diverse:
G CPU (Central Processing Unit), unità centrale di elaborazione
G cache
G varie interfacce
Se il processore è integrato su un unico chip prende il nome di microprocessore. Sia la CPU sia gran parte
dei dispositivi che servono per l’attività della CPU sono realizzati con la tecnologia dei circuiti integrati, che
possono essere disposti in una singola scheda detta scheda madre. Questa scheda può essere dunque consi-
derata la parte più importante del computer. La CPU esegue tutte le operazioni di elaborazione numerica e
di controllo e rappresenta la parte centrale del computer.
A sua volta si suddivide in
G unità logico-aritmetica (ALU), che svolge tutti i calcoli logici ed aritmetici;
G unità floating-point (FPU) (Floating Point Unit), che consente di eseguire le operazioni su numeri reali;
G unità di controllo (CU), che sovrintende all’elaborazione dei dati e alle operazioni di input e output;
G registri, cioè memoria locale per memorizzare dati e lo stato di avanzamento delle istruzioni. Abbia-
mo, ad esempio, il registro di Program Counter, di Program Status Word, il registro Istruzioni, Indirizzi
Memoria. . .
Ogni elaboratore contiene un circuito di temporizzazione (clock) che genera un riferimento temporale
comune per tutti gli elementi del sistema.
Un ciclo-macchina è il tempo richiesto per svolgere un’operazione elementare (ed è un multiplo del pe-
riodo del clock). La velocità di elaborazione di un processore dipende dalla frequenza del clock. I processori
attuali hanno valori di frequenza del clock che variano tra gli 8 MHz e i 3500 MHz (1 MHz = 1 milione di
istruzioni al secondo).
La memoria serve per conservare le istruzioni da eseguire e per scrivere/leggere i dati elaborati. Si
suddivide in memoria principale e memoria secondaria.
La memoria principale (o di lavoro) è la memoria in grado di conservare dinamicamente dati e
programmi che il processore sta utilizzando. A sua volta la memoria principale può essere di due tipi:

5
1. S TRUTTURA DELL’ ELABORATORE

G memoria di sola lettura (read-only memory): ROM. Viene scritta una volta per tutte dal produttore del
sistema e contiene programmi e informazioni specifiche per il sistema; è utilizzata per memorizzare

G
parametri di configurazione del sistema, utili all’avvio del computer;
memoria per scrittura-lettura (random access memory): RAM. Serve alla CPU per lavorare con i
programmi inseriti dall’utente.
Poichè la RAM conserva i dati solo fino a quando il computer rimane acceso (infatti è detta memoria
di tipo volatile, perchè se ne perde il contenuto quando la macchina viene spenta), per conservare dati e
programmi per tempi lunghi e a sistema spento, si utilizza la memoria di massa (o secondaria) – dischi
RAM come l’Hard Disk, CDROM, DVD, pendrive USB. . . .
La RAM può essere pensata come una sequenza di celle (locazioni), ognuna identificata da un indirizzo e
capace di contenere informazioni binarie.
L’unità minima indirizzabile della memoria è detta parola (word) e può variare da macchina a macchina.
In genere una parola vale un byte, cioè 8 bit.

Bit è l’unità elementare di informazione.


Per esempio: 0/1, sì/no.
1 byte = 8 bit
1 Kilobyte (KB) = 210 byte = 1024 byte (circa 103 )
1 Megabyte (MB) = 220 byte (circa 106 )
1 Gigabyte (GB) ≈ 109 byte (un miliardo di byte)
1 Terabyte (TB) ≈ 1012 byte (mille miliardi di byte)
1 Petabyte (PB) ≈ 1015 byte (un milione di miliardi di byte)

Il computer scambia informazioni con il “mondo esterno” per mezzo delle periferiche di input/output
(monitor, mouse, stampante, web-cam,...).
Input è l’inserimento di dati nel computer per l’elaborazione. Output è il trasferimento di dati dal
computer a dispositivi che permettono all’utente di vedere/ascoltare i risultati dell’elaborazione.

1.5 Software e Sistema Operativo


Un software è una sequenza di istruzioni per eseguire le varie elaborazioni sui dati. Ci sono diverse
categorie di software: software per il sistema operativo, software di base, software di tipo applicativo.

6
1.5. Software e Sistema Operativo

Il sistema operativo è costituito dall’insieme dei programmi essenziali per far funzionare la macchina.
Esso utilizza piccoli programmi già presenti nel calcolatore per accedere ai singoli dispositivi fisici. Questi
programmi prendono il nome di Device Driver e sono memorizzati nel BIOS (Basic Input Output System).
Il BIOS si trova nella ROM del Computer.
Il sistema operativo, da una parte, permette di rendere fruibile all’utente le molteplici risorse del compu-
ter (gestione della memoria, della stampante, della tastiera,...); dall’altra rende il computer uno strumento
amichevole e utile per affrontare le molteplici attività che gli si richiedono.
I compiti affidati al sistema operativo sono molteplici:
G agire da intermediario tra l’utente e l’harware del computer
G controllare e coordinare l’utilizzo dell’hardware tra i programmi applicativi
G fornire gli strumenti per l’uso corretto delle risorse di tipo hardware e software del sistema
G nascondere i dettagli legati alla gestione delle risorse del sistema.
I primi sistemi operativi iniziarono a vedersi intorno alla metà degli anni cinquanta quando si cominciò
a individuare una serie di programmi standard di comune utilizzo indipendenti dall’applicazione specifica
richiesta al computer. Cenni storici
L’evoluzione dei sistemi operativi ha influenzato anche lo sviluppo dell’hardware in quanto per suppor-
tare certe funzioni del sistema operativo sono necessari meccanismi hardware ad hoc (basti pensare alla
gestione della memoria o delle interruzioni).
I primi computer come lo Z3 di Zuse o l’ENIAC non avevano sistema operativo. Per inserire un program-
ma (scritto in linguaggio macchina) bisognava azionare un gruppo di interruttori o modificare collegamenti
tramite opportuni cavi e spinotti. Ci rendiamo conto, quindi, di quanto fosse difficile usare il computer per
risolvere problemi mediante l’esecuzione di un programma perchè oltre alla competenza specifica del pro-
blema da risolvere, si richiedeva una grande conoscenza tecnica della macchina su cui si doveva lavorare. Il
programma doveva contenere non solo le istruzioni per la risoluzione del problema (per esempio un sistema
di equazioni) ma anche le istruzioni per gestire le unità di input e output e delle altre periferiche collegate al
computer. Infine, poteva essere eseguito un solo programma alla volta.
Considerando gli elevatissimi costi per la realizzazione e la gestione dei primi computer, il calcolo auto-
matico era una risorsa preziosa a disposizione di pochi utenti. Tutto ciò portò ad un ripensamento del modo
di utilizzare i computer e nacquero le prime idee di sistema operativo.
Per prima cosa si pensò di creare delle librerie con le istruzioni necessarie per eseguire le operazio-
ni più comuni legate alla gestione delle periferiche del computer (ingresso e uscita dei dati, accesso alla
memoria,...).
Ulteriori progressi si ebbero quando il sistema operativo iniziò a sfruttare anche il disco fisso ed ebbe
inizio la cosiddetta multiprogrammazione, in base alla quale nella memoria centrale venivano tenuti attivi
contemporaneamente alcuni processi e i loro dati pronti per essere eseguiti. Ad ogni momento, uno solo di

7
1. S TRUTTURA DELL’ ELABORATORE

questi processi veniva eseguito, tuttavia, quando il processo in esecuzione richiedeva un’istruzione di ingres-
so o di uscita, esso veniva sospeso attivando le unità periferiche necessarie per l’esecuzione dell’istruzione
data. Questa tecnica richiedeva una elevata capacità della memoria centrale e solo pochi sistemi potevano
funzionare in modo adeguato.
Uno dei primi sistemi che iniziò ad utilizzare la multiprogrammazione fu il sistema OS/360 realizzato per
i computer IBM 360. Questo sistema operativo fu importante per due motivi:
G si cercò di realizzare un sistema operativo uniforme e compatibile per macchine IBM molto diverse tra
loro per quando riguarda l’hardware sottostante: fino a quel momento ogni macchina aveva il proprio
sistema operativo, che cambiava da macchina a macchina!
G lo sviluppo di questo sistema operativo fu molto delicato e complesso e aprì lo studio delle
problematiche relative all’ingegneria del software.
Nonostante questi progressi, la multiprogrammazione non permetteva molta interattività tra utente e
computer: di fatto l’utente consegnava i dati e il programma da eseguire (un pacco di schede perforate) all’o-
peratore del computer e accedeva ai risultati dopo qualche ora se non addirittura dopo giorni e giorni, risul-
tati che riceveva in forma cartacea ad esecuzione avvenuta (non c’era ancora il monitor per la visualizzazione
su video dei risultati).
Per risolvere questo tipo di problemi, l’uso delle schede fu sostituito da appositi terminali sempre collegati
al computer e furono cambiate le modalità di gestione dell’unità centrale modificando i sistemi operativi
esistenti. Si arrivò all’interazione con il computer non più mediante schede perforate bensì tramite tastiera-
stampante o tramite tastiera-monitor.
Alla fine del 1950 si introdusse il concetto di time-sharing che permetteva l’esecuzione di più processi
in modo da poter soddisfare le esigenze di più utenti contemporaneamente. Con il time-sharing si assegna,
infatti, un piccolo intervallo di tempo a ciascun processo dando l’impressione che ciascun processo vada
avanti parallelamente agli altri.
Gli sviluppi del sistema operativo ottenuti da allora fino ad oggi si possono così riassumere: il sistema
operativo fornisce funzioni di base per la gestione delle risorse, quali:
G uso del processore (multitasking: l’uso della CPU è permesso ad un programma alla volta per brevi
intervalli di tempo, quindi l’utente può eseguire più programmi contemporaneamente)
G uso della memoria centrale (memoria virtuale)
G riconoscimento e gestione degli utenti (multiutenza)
G gestione delle periferiche (drivers)
G file system
Sul software G interfaccia grafico.
Il software di base (o general purpose) può avere funzioni varie: editor di testo, elaborazione di testi, fogli
elettronici, posta elettronica, internet.
Il software applicativo è costituito da programmi che hanno obiettivi specifici come intrattenimento,
Memoria controllo di sistemi, progettazione (CAD), risoluzione di problemi matematici.
cache Per migliorare le prestazioni di un computer si inserisce una memoria intermedia tra CPU e RAM, detta
cache. Si trova all’interno del processore. È più veloce della RAM ma anche più costosa.

1.5.1 Per capire meglio il sistema operativo


Immaginiamo un ristorante con un capo-cuoco, il suo aiutante, una cucina, i camerieri e i clienti. I clienti
scelgono un piatto dal menu, un cameriere prende l’ordine e lo porta al capo-cuoco. Il capo-cuoco riceve
l’ordine e assegna al suo aiutante il compito di preparare il piatto. L’aiutante si dedicherà alla preparazione
del piatto, compito che potrà richiedere più attività. Il capo-cuoco, intanto, supervisiona la preparazione dei
piatti e gestisce le risorse (limitate) dei posti nel ristorante.
G il capo-cuoco rappresenta il sistema operativo,
G i clienti sono gli utenti,
G le ricette associate ai piatti corrispondono ai programmi,
G gli ingredienti sono l’input del programma,
G il piatto è l’output del programma,
G il menu e il cameriere sono l’interfaccia verso il sistema operativo,

8
1.6. Il file system

G l’aiutante corrisponde al processore (CPU) (Se abbiamo più processori, ci sono più aiutanti),
G la cucina corrisponde al computer,
G pentole, fornelli etc, sono le parti che compongono il computer.
L’aiuto cuoco, quindi, rappresenta la CPU mentre il tavolo da lavoro, su cui appoggia gli ingredienti e la
ricetta per preparare il piatto, rappresenta la memoria centrale. Prima di iniziare a lavorare, il cuoco deve
svolgere alcune mansioni (sempre le stesse ogni volta: pulire il tavolo, controllare lo stato di pentole, tegami,
coltelli. . . , ricevere le ordinazioni). Supponiamo che queste mansioni siano incise su un pezzo del tavolo da
lavoro: corrispondono alla memoria ROM (quella che non può essere alterata). La RAM invece è la parte del
tavolo che può essere alterata a piacimento (spostare pentole, tegami, ingredienti).
Quando il ristorante chiude, il tavolo deve essere pulito e sgombro altrimenti si rovina tutto quello che vi
rimane, ad eccezione di ciò che vi è stato inciso. Perciò il cuoco conserva in dispense e frigoriferi i vari in-
gredienti rimasti e gli utensili da lavoro: le dispense e i frigoriferi rappresentano i dischi (Hard Disk, CDROM,
pen drive USB . . . ) per immagazzinare i dati.

1.6 Il file system


Il sistema operativo gestisce le informazioni su dispositivi di memoria secondaria (dischi).
La gestione delle informazioni avviene mediante file11 . Un file costituisce un insieme di informazioni
della stessa natura e logicamente correlate. In genere un file contiene un programma (programma sorgente
o programma eseguibile), oppure una sequenza di dati.
L’informazione è rappresentata da files, organizzati in maniera gerarchica (pensiamo ad una struttura ad
albero) in directories (cartelle). Una directory è un file che svolge il ruolo di ”raccoglitore“.
I files possono contenere dati (abbiamo i cosiddetti files di testo) oppure programmi (i files di
applicazioni).
Un file è caratterizzato da:

G posizione (path, o percorso): sequenza delle directories che portano al file


dir1 / dir2 / . . . / . . . /
G nome: individua univocamente il file all’interno della cartella (o directory)
G estensione: la parte del nome del file che segue l’ultimo punto . (dati.txt prova.f matrice.dat
welcome.html foto.jpeg )
G dimensione: quantità di informazione contenuta nel file
G altre informazioni (data di creazione, data di ultima modifica, permessi di scrittura, lettura. . . )
L’intera gestione dei file è a carico di un componente del sistema operativo detto file system.

1.7 Un po’ di storia sui sistemi operativi


Tra i numerosi sistemi operativi, il sistema Unix è quello che ha maggiormente influenzato questo set-
tore dell’informatica. Il sistem Unix venne sviluppato sul finire degli anni sessanta nei laboratori della AT &
T. La filosofia di base era di realizzare un sistema semplice rispetto agli altri in uso e adatto per la ricerca e
lo sviluppo. La prima versione fu scritta in linguaggio Assembly e dipendeva dal tipo di macchina su cui si
doveva applicare. Successivamente venne scritto in larga parte in un linguaggio di alto livello, il C, progettato
appositamente per il sistema Unix. In tal modo il sistema operativo diventava facilmente portabile su mac-
chine di tipo diverso senza dipendere eccessivamente dalle caratteristiche dell’hardware su cui veniva fatto
funzionare. Diversamente dalle abitudini del tempo, l’azienda AT & T distribuì Unix nelle università e rese
disponibili i codici sorgenti utilizzati per realizzarlo. Questo portò ad una sua ulteriore innovazione grazie a
tutti i ricercatori delle università che iniziarono a sperimentarlo.
Quando furono messi in commercio i primi microcomputer (a partire dal 1975), fu necessario sviluppa-
re sistemi operativi appositamente progettati per sfruttare le poche risorse disponibili essendo le risorse di
11 File in inglese significa archivio. Il termine compare nei primi anni cinquanta e inizialmente si riferisce a un pacco di schede
contenente informazioni omogenee. È il sistema operativo a realizzare il concetto astratto di file nella gestione dei dispositivi di memoria
di massa.

9
1. S TRUTTURA DELL’ ELABORATORE

calcolo di tali macchine molto limitate. Inoltre, queste macchine erano pensate più per gli appassionati che
per il personale tecnico esperto e quindi era importante creare un sistema operativo che fosse d’uso relativa-
mente semplice. In questo campo si distinsero Bill Gates e Paul Allen, che iniziarono la loro attività scrivendo
il linguaggio di programmazione Basic per il micromputer Altair. Nel 1975 crearono una ditta... la Microsoft.
Un altro microcomputer, popolare nei primi anni ottanta, fu l’Apple sviluppato da Steve Wozniak e Steve
Jobs. Per questa macchina svilupparono un sistema più semplice ed efficiente di quello usato per l’Altair, che
si ispirava vagamente al sistema Unix.
I sistemi operativi per i microcomputer dovevano essere più semplici di quelli impiegati per i grandi com-
puter, in quanto la macchina veniva utilizzata da un solo utente e le periferiche collegate erano poche e sem-
plici. Il problema maggiore ero quello di gestire i file su floppy disk (gli antenati dei CD-ROM e dei DVD, in
uso fino ad una decina di anni fa) o su nastri magnetici e mettere a disposizione dell’utente un linguaggio
di programmazione semplice, come il Basic. Tuttavia, il confine tra linguaggio di programmazione e sistema
operativo non era ancora ben definito e, una volta avviato, il sistema era pronto per ricevere sia comandi del
sistema operativo, sia istruzioni in linguaggio Basic.
I microcomputer iniziarono ad avere un grosso successo tanto che all’inizio degli anni ottanta, l’IBM pen-
sò di entrare in questo settore (prima si era solo occupata di grandi computer e di software), introducendo
il personal computer, IBM PC, realizzando in tal modo una macchina che servisse non solo per gli appas-
sionati e per giocare (uno dei fattori che aveva determinato il successo dei microcomputer) ma anche come
strumento di studio, per i professionisti e per la gestione di piccole aziende.
L’IBM incaricò Bill Gates di realizzare un sistema operativo per il nuovo personal computer. Il successo
dell’IBM PC portò al successo anche di Bill Gates: i profitti della Microsoft iniziarono a crescere in modo
esponenziale. Il sistema realizzato dalla Microsoft prese il nome di MS-Dos e divenne il sistema operativo
più diffuso al mondo grazie alla standardizzazione dei personal computer lanciato dall’IBM.
Il sistema MS-Dos non era facile da usare perchè l’utente interagiva con il computer solo attraverso
comandi testuali la cui sintassi non era così semplice da ricordare (qualche anno più tardi fu lanciata sul
mercato una versione più amichevole).
Nel 1984, invece, dalla Apple fu prodotto il personal computer Macintosh che adottava un tipo di inter-
faccia grafico progettato per interagire in modo semplice e intuitivo con l’utente. Il Macintosh utilizzava un
interfaccia grafico chiamato GUI (Graphic User Interface) composto da icone, finestre, menù... Gli oggetti
dell’ambiente operativo erano rappresentati con simboli grafici di facile intuizione senza dover comprende-
re a fondo tutti i tecnicismi informatici. L’interfaccia GUI non era un’invezione della Apple perchè era stata
già sperimentata nel corso degli anni settanta dalla Xerox, che però non aveva intuito le potenzialità di questo
lavoro, lasciandone invece la fortuna e il successo alla Apple che, insieme ad esso, introdusse il mouse.
Ovviamente, queste novità furono molto apprezzate e la Microsoft, per colmare questa lacuna, lanciò un
altro sistema operativo basato su interfaccia grafica: nel 1985 nacque il primo Windows 1.0 che trovò pochi
consensi perchè troppo lento e instabile. Nel 1986, con la comparsa di nuovi microprocessori, il sistema
Windows cominciò a funzionare in modo adeguato tanto che le versioni di Windows 3.1 e di Windows 95
portarono al sopravvento del sistema operativo Windows rispetto al Macintosh.
Accanto a questi sistemi operativi, e forse anche per ridurre lo strapotere della Microsoft, si deve vede-
re la strada percorsa da un informatico di Helsinki (data di nascita 1969), Linus Benedict Torvalds, che ha
introdotto il sistema Linux.
Durante gli studi universitari, Torvalds si era interessato di sistemi operativi e aveva studiato una versio-
ne semplificata di Unix, chiamata Minix. Questo sistema poteva funzionare su personal computer e veniva
distributo con i programmi sorgenti disponibili. Torvalds migliorò il sistema Minix, in modo da poterlo uti-
lizzare come alternativa a Windows, nella logica di non realizzare profitti (cioè non diventare milionario) ma
di realizzare un sistema utilizzabile gratuitamente da tutti e migliorabile con il contributo di tutti (la filosofia
dell’open source). Nel 1991 fu completata la prima versione del sistema, che fu chiamata Linux e venne mes-
sa a disposizione di tutti. Torvalds si riservò il compito di coordinare i diversi miglioramenti via via introdotti
dagli altri sviluppatori.
Tra le tante distribuzioni attualmente in uso ricordiamo: Debian, Ubuntu, Fedora, Gentoo, Slackware. . .
Linux si è dimostrato e si dimostra tuttora un valido sistema operativo, affidabile, sicuro e di buone
prestazioni, in grado di gestire situazioni multiutente e multitasking.
Ed è il sistema operativo di riferimento del corso di Calcolo Numerico.

10
1.8. Lavorare in ambiente Linux

1.8 Lavorare in ambiente Linux


Una volta entrati nel sistema (tramite login e password), si apre l’ambiente grafico e di qui possiamo
lavorare (per esempio, aprire una finestra di editor, lavorare in Office, navigare in Internet ....).
Per aprire nuove directories (cartelle), per spostare files, per eseguire programmi, ... è bene lavorare
tramite una finestra di terminale o shell.
La finestra di terminale (shell) mostra il prompt dei comandi.
Un esempio di prompt è la login dell’utente (ad esempio studente) + chiocciola + nome della macchina
su cui si sta lavorando (ad esempio george) + attuale directory di lavoro (se non compare nessun nome, è
perchè ci troviamo nella home directory, la directory principale dell’utente) + un simbolo (% o $, a seconda
della macchina):

studente@george:~ $

Vediamo ora alcuni comandi essenziali (comandi da scrivere dopo il prompt, in una finestra di terminale
– dopodichè si clicca il tasto di Invio):

G ls mostra l’elenco dei files e delle directories contenuti nella directory attuale ( ls sta per list):

Esempio:

studente@george:~ $ ls

Un volta cliccato Invio, compare l’elenco delle directories presenti nello spazio di lavoro disponibile per
l’utente studente sulla macchina george, ad esempio (i numeri a sinistra delle directories o files sono
indicatori dello spazio che occupano in memoria):

5 appunti/ 4 mail/
2 calcolonumerico/ 4 movies/
3 fortran/ 1 varie/
3 foto/ 57 prova.pdf

G Per cambiare directory, si deve digitare cd nome-directory


(cd sta per change directory). Esempio: per entrare nella directory foto, scriviamo
studente@george:~ $ cd foto
Una volta cliccato il tasto di Invio, si è entrati nella directory foto:
studente@george:~/foto $
G Il comando cd .. fa tornare nella directory precedente.
G Per creare una nuova directory: mkdir nomedirectory (mkdir sta per make directory).
G Per copiare un file dentro una directory: cp nomefile nomedirectory (cp sta per copy).
G Per trasferire un file in una directory mv nomefile nomedirectory (mv sta per move).
G Per rinominare un file (o una directory): mv nomevecchio nomenuovo .
G Per cancellare un file si usa il comando rm nomefile.
G Per cancellare una directory, dobbiamo prima cancellare tutti i files della directory e poi usare il
comando rmdir nomedirectory.
G Per sapere in quale directory ci troviamo, si usa il comando pwd. Esempio: siamo nella directory foto,
che è una sottodirectory della home di studente. Con il comando pwd si ha:
studente@george:~/foto $ pwd
studente@george:~/foto $ /home/studente/foto

11
1. S TRUTTURA DELL’ ELABORATORE

Esempio
Esempio 1.8.1 Abbiamo due directory chiamate uno e due e il file prova.f nella directory uno.
Vogliamo copiare il file dalla directory uno alla directory due.
Se ci troviamo nella home, cioè nell’ambiente di partenza, dobbiamo scrivere
cp uno/prova.f due

studente@george:~ $ cp uno/prova.f due

Se ora passiamo nella directory due e facciamo ls, vedremo il file prova.f

studente@george:~ $ cd due
studente@george:~/due $ ls
total 1
1 prova.f

Se siamo nella directory uno, dobbiamo scrivere


cp prova.f ../due per ottenere lo stesso risultato.
Se siamo nella directory due, dobbiamo scrivere
cp ../uno/prova.f . Il punto finale serve per copiare il file prova.f nella directory in
cui ci troviamo.
Con cp abbiamo due file identici, quello nella directory uno e quello copiato nella directory due.
Possiamo anche scrivere cp prova.f prova2.f: in questo modo creiamo il file prova2.f nella
stessa directory in cui si trova prova.f.
Se vogliamo trasferire il file dalla directory uno alla directory due (in questo modo avremo solo un
file alla fine del procedimento), dobbiamo usare il comando mv.

Riassumendo
G ls : lista dei files e delle directory
G cd : per cambiare directory
G mkdir: per creare una nuova directory
G cp: per copiare files
G mv: per trasferire o rinominare files
G rm: per cancellare files
G rmdir: per cancellare directories

1.9 Editor di testo


Se vogliamo scrivere su un file un documento di testo, abbiamo bisogno di un editor di testo. Sotto Linux
ne troviamo diversi: vi, emacs, kedit, gedit, nedit.... I più semplici da utilizzare sono gedit e nedit.
Sotto Linux esiste anche il pacchetto Office (del tutto simile all’equivalente Microsoft) per scrivere
documenti in word, creare tabelle, etc. . . . Anche il programma Gnumeric è molto utile per creare tabelle.
Per visualizzare grafici, invece, c’è il pacchetto Gnuplot.

12
C APITOLO 2
Richiami di analisi

La teoria attrae la pratica come il


magnete attrae il ferro.

Carl Friedrich Gauss

2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Identità trigonometriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Regole su funzione esponenziale e logaritmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Derivate e integrali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5 Teoremi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.1 Introduzione
Quando si descrivono teoremi, si danno definizioni o, semplicemente, si discute di matematica, è
abbastanza usuale prendere in prestito lettere dell’alfabeto greco.
È importante, quindi, saperle riconoscere e chiamarle in maniera corretta:

A α Alfa N ν Nu
B β Beta Ξ ξ Xi
Γ γ Gamma O o Omicron
∆ δ Delta Π π Pi
E ² Epsilon P ρ Rho
Z ζ Zeta Σ σ Sigma
H η Eta T τ Tau
Θ θ Theta Υ υ Upsilon
I ι Iota Φ φ Fi
K κ Kappa X χ Chi
Λ λ Lambda Ψ ψ Psi
M µ Mu Ω ω Omega

2.2 Identità trigonometriche


Nel seguito introduciamo alcune formule trigonometriche, con la notazione:
G sin (x) ≡ seno(x), cos (x)sin≡ coseno(x),
G tan (x) ≡ tangente(x) = cos(x) (x)
, sec (x) ≡ secante(x) =
1
cos (x)
,

13
2. R ICHIAMI DI ANALISI

cos (−θ) = cos (θ) sin (−θ) = − sin (θ)


cos ( π2 − θ) = sin (θ) sin ( π2 − θ) = cos (θ)
cos ( π2 + θ) = − sin (θ) sin ( π2 + θ) = cos (θ)
cos (π − θ) = − cos (θ) sin (π − θ) = sin (θ)
cos (π + θ) = − cos (θ) sin (π + θ) = − sin (θ)
cos (θ + φ) = cos (θ) cos (φ) − sin (θ) sin (φ) sin (θ + φ) = sin (θ) cos (φ) + cos (θ) sin (φ)
sin (2θ) = 2 sin (θ) cos (θ) cos (2θ) = cos2 (θ) − sin2 (θ)
sin2 (θ) + cos2 (θ) = 1 tan2 (θ) + 1 = sec2 (θ)

2.3 Regole su funzione esponenziale e logaritmica


Assumiano a, b ∈ R, con a > 0 e b > 0. Si ha:

1x = 1
a x+y = a x a y a x y = (a x ) y
a loga (x) = x a0 = 1
a x−y = a x /a y a x b x = (ab)x
loga (x y) = loga (x) + loga (y) loga (x/y) = loga (x) − loga (y)
loga (x y ) = y loga (x) loga (a x ) = x
loga (x)
logb (x) = b x = a x loga (b)
loga (b)

2.4 Derivate e integrali


Siano f e g due funzioni dipendenti dalla variabile reale x mentre c ∈ R sia una costante. Indichiamo la
df
derivata di f con il simbolo o mediante f 0 . Si ha:
dx
d (c f )
=cf 0 regola della costante
dx
d (f + g) d f d g
= + regola della somma
dx dx dx
0 0
d ( f /g ) f g − f g
= regola del quoziente
dx g2
d (f g)
= f g 0 + f 0g regola del prodotto
dx
r
df
= r f r −1 f 0 regola della potenza
dx

Tra le regole di integrazione, invece, ricordiamo quella di integrazione per parti:


Z Z
f g dx = f g − f 0 g dx
0

Diamo ora una tabella delle derivate e degli integrali delle funzioni più note (per gli integrali lasciamo
fuori la costante di integrazione), e con la simbologia arcsin(x) ≡ arcoseno(x), arccos(x) ≡ arcocoseno(x),
cot(x) ≡ cotangente (x), arctan(x) ≡ arcotangente(x), arccot(x) ≡, arcocotangente(x).

14
2.5. Teoremi utili

f f0 f f0
1
ln(x) ex ex
x
sin (x) cos (x) cos (x) − sin (x)
1 1
tan (x) (= sec2 (x)) cot (x) − 2
cos2 (x) sin (x)
1 1 1 1
tan (x) − cot (x)
cos (x) cos (x) sin (x) sin (x)
1 1
arcsin (x) p arccos (x) −p
1 − x2 1 − x2
1 1
arctan (x) arccot(x) −
1 + x2 1 + x2
R R
f fdx f fdx
x r +1
xr (r 6= 1) x −1 ln |x|
r +1

ex ex ln |x| x ln |x| − x
sin (x) − cos (x) cos (x) sin (x)
1
tan (x) ln | | cot (x) ln | sin (x)|
cos (x)

1 1 1 1
ln | + tan (x)| ln | + cot (x)|
cos (x) cos (x) sin (x) sin (x)

1 1
tan (x) − cot (x)
cos2 (x) sin2 (x)

tan (x) 1 cot (x) 1



cos (x) cos (x) sin (x) sin (x)
p p
arcsin (x) x arcsin (x) + 1 − x 2 arccos (x) x arccos (x) − 1 − x 2
1 1
arctan (x) x arctan (x) − ln (1 + x 2 ) arccot(x) xarccot(x) − ln (1 + x 2 )
2 2
1 1
p arcsin (x) arctan (x)
1 − x2 1 + x2

2.5 Teoremi utili


Richiamiamo, nel seguito, teoremi che trovano applicazione nel Calcolo Numerico. Per alcuni diamo
anche la dimostrazione. Notazioni
Utilizzeremo, inoltre, le seguenti notazioni per funzioni di una sola variabile definite in un insieme X ⊂ R. usate per le
funzioni
L’insieme delle funzioni continue in X verrà denotato con il simbolo C (X ). L’insieme delle funzioni continue continue
in X , che hanno le prime n derivate pure esse continue, sarà indicato con C n (X ).

Teorema 2.5.1 (Teorema di Rolle) a


Sia f ∈ C ([a, b]) e differenziabile in ]a, b[.
Se f (a) = f (b) = 0, allora esiste un punto ξ ∈]a, b[
tale che f 0 (ξ) = 0
a Michel Rolle (1652- 1719) fu un matematico francese. È
conosciuto per il teorema che porta il suo nome. Si deve a lui
p
la notazione della radice n-sima per mezzo del simbolo n x.

15
2. R ICHIAMI DI ANALISI

Teorema 2.5.2 (Teorema del Valor Medio)


Sia f ∈ C ([a, b]) e differenziabile in ]a, b[,
allora esiste un punto ξ ∈]a, b[ tale che
f (b) − f (a)
f 0 (ξ) =
b−a

Teorema 2.5.3 (Teorema del Valore Intermedio)


Sia f ∈ C ([a, b]) e sia K un valore compreso tra f (a)
e f (b). Allora esiste almeno un punto ξ ∈]a, b[ tale
che f (ξ) = K .

Quindi per funzioni continue, un valore compreso tra i due estremi dell’insieme di definizione, è un valore
assunto dalla funzione stessa (in uno o più punti).
Come conseguenza di questo teorema, se f (a) f (b) < 0 (la funzione assume segno opposto agli estre-
mi dell’intervallo [a, b]) allora esiste almeno un punto ξ tale che f (ξ) = 0, cioè esiste almeno una radice
dell’equazione f (x) = 0 nell’intervallo [a, b].

Teorema 2.5.4 (Esistenza del punto fisso) Data una funzione g definita in [a, b], continua e tale che a ≤
g (x) ≤ b per ogni x ∈ [a, b], allora g ammette almeno un punto fisso.

Dimostrazione. Dire che una funzione g ammette almeno un punto fisso, vuol dire che esiste almeno
un punto ξ nel suo insieme di definizione, tale che g (ξ) = ξ.
Dalle ipotesi del teorema, i valori della funzione g sono contenuti nell’intervallo [a, b] e, in particolare
a ≤ g (a) ≤ b e a ≤ g (b) ≤ b. Definiamo, perciò, la funzione continua Φ(x) mediante la relazione

Φ(x) = g (x) − x

Allora Φ(a) = g (a) − a > 0 e Φ(b) = g (b) − b < 0. Per il Teorema del Valore Intermedio esiste almeno un punto
ξ ∈]a, b[ tale che Φ(ξ) = 0, vale a dire g (ξ) − ξ = 0, cioè g (ξ) = ξ. Esiste almeno un punto fisso per la funzione
g. 4

Teorema 2.5.5 (Esistenza e unicità del punto fisso) Data una funzione g di classe C 1 in [a, b], con a ≤ g (x) ≤
b per ogni x ∈ [a, b], e con |g 0 (x)| ≤ m < 1 per ogni x ∈ [a, b] allora esiste ed è unico il punto fisso della g in tale
intervallo.

Dimostrazione. L’esistenza di almeno un punto fisso è assicurata dal teorema precedente (le ipotesi del
teorema precedente ci sono tutte). Supponiamo, allora, che esistano due punti fissi ξ e η, con ξ 6= η, per la
funzione g . Si ha

|ξ − η| = |g (ξ) − g (η)|

Applicando il teorema del Valor Medio, esiste un punto c compreso tra ξ e η per cui

|g (ξ) − g (η)| = |g 0 (c)(ξ − η)| ≤ |g 0 (c)||ξ − η|

16
2.5. Teoremi utili

Ma per ipotesi |g 0 (c)| ≤ m < 1 da cui

|ξ − η| ≤ m|ξ − η| < |ξ − η|

Si arriva ad una contraddizione. L’assurdo deriva dall’aver supposto ξ 6= η. Quindi ξ = η e il punto fisso è
unico. 4

Teorema 2.5.6 (Teorema del Valor Medio del Calcolo Integrale) Se f ∈ C ([a, b]) e g è integrabile in [a, b] e
g (x) non cambia segno in [a, b], allora esiste un punto ξ ∈]a, b[ tale che
Z b Z b
f (x)g (x) d x = f (ξ) g (x) d x
a a

Per g ≡ 1, questo teorema ci dà il valore medio della funzione f sull’intervallo [a, b], dato da f (ξ) =
1 Rb
f (x) d x
b−a a

Teorema 2.5.7 (Teorema di Rolle generalizzato) Sia f ∈ C ([a, b]) n volte differenziabile in ]a, b[. Se f si an-
nulla in n +1 punti distinti x 0 , x 1 , . . . , x n in ]a, b[, allora esiste un punto ξ ∈]a, b[ in cui la derivata n-sima della
f si annulla: f (n) (ξ) = 0.

Teorema 2.5.8 (Formula di Taylor) 1


Sia f ∈ C 2 ([a, b]) e sia x 0 un punto dell’intervallo [a, b]. Allora, per qualunque x ∈ [a, b] si può scrivere:

(x − x 0 )2 00
f (x) = f (x 0 ) + f 0 (x 0 )(x − x 0 ) + f (ξx )
2
dove ξx è un opportuno punto di [a, b] che si trova sul segmento individuato da x 0 e x.

La formula appena scritta si dice formula di Taylor di centro x 0 nel punto x.


La formula di Taylor appena scritta si può generalizzare se la funzione f è derivabile n + 1 volte. Si ha così
la formula polinomiale di Taylor di centro x 0 :

f 00 (x 0 ) f (n) (x 0 )
f (x) = f (x 0 ) + f 0 (x 0 )(x − x 0 ) + (x − x 0 )2 + . . . + (x − x 0 )n + R n
2! n!
dove

f (n+1) (ξx )
R n (x) = (x − x 0 )n+1
(n + 1)!

con ξx un opportuno punto di [a, b] che si trova sul segmento individuato da x 0 e x.

1 Brook Taylor (1685 - 1731) fu un matematico inglese che sviluppò quello che oggi è chiamato calcolo delle differenze finite.
L’importanza del suo lavoro e, soprattutto, della formula conosciuta oggi con il suo nome, venne riconosciuta solo nel 1772 da Lagrange.

17
C APITOLO 3
Rappresentazione dei numeri nel
calcolatore

Tutti noi ogni giorno usiamo la


matematica: per prevedere il tempo,
per dire l’ora, per contare il denaro.
Usiamo la matematica anche per
analizzare i crimini, comprendere
gli schemi, prevedere i
comportamenti. Usando i numeri,
possiamo svelare i più grandi
misteri della vita!

NUMB3RS

3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Aritmetica di macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 Conversione di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Rappresentazione IEEE dei numeri di macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5 Precisione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.6 Propagazione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.7 Instabilità e malcondizionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.7.1 Instabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.7.2 Malcondizionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.1 Introduzione
Molte volte, si pensa che i risultati numerici ottenuti da un calcolatore elettronico, specie se sono ottenuti
come output di un sofisticato software, non contengano errori e, se ne abbiano, siano da ritenersi trascurabili.
In realtà, quando si esegue un programma al calcolatore, bisogna prima di tutto aver verificato che sia stato
scritto correttamente (il programma deve, cioè, tradurre correttamente il problema matematico che si vuole
risolvere). Inoltre, bisogna tener conto che i risultati numerici sono sempre affetti da un certo tipo di errore,
che può essere, per esempio, di arrotondamento o di troncamento: π è un numero con infinite cifre decimali
ma il calcolatore lo può vedere solo come un numero con finite cifre decimali..., molte formule non possono
essere usate così come sono ma devono essere in qualche modo semplificate (basti pensare ad una somma di
infiniti termini). Non tenere conto di questi fattori può portare a risultati davvero disastrosi, come può essere
verificato andando a controllare la pagina web dedicata ai disastri dovuti a uno scorretto calcolo numerico:
http://www.ima.umn.edu/~arnold/disasters/disasters.html

19
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

La pagina web è del prof. Douglas N. Arnold, dell’Università del Minnesota, e viene introdotta con la
seguente frase (traducendo): Stai seguendo con attenzione il tuo corso di analisi numerica o di calcolo scienti-
fico? Se no, potrebbe essere un caro errore. Nel seguito, ci sono esempi dalla vita reale di ciò che può succedere
quando gli algoritmi numerici non sono applicati correttamente.
Vediamo alcuni di questi disastri numerici.

Esempio sul Il 25 febbraio 1991, durante la prima Guerra del Golfo, un missile Patriot fallì l’intercettazione di un
disastro del missile Scud iracheno. Questo errore costò la vita di 28 soldati, un centinaio di feriti e la distruzione di
missile
Patriot un capannone americano. La causa del disastro fu dovuto ad errori di arrotondamento nel sistema ope-
rativo del Patriot: ad ogni secondo che passava si introduceva un ritardo infinitesimo che comportava un
errore nella valutazione della traiettoria del missile Scud. Col passare delle ore il ritardo accumulato fu
tale da far intercettare una posizione del tutto diversa da quella in cui si trovava il missile da abbattere.
Difatti, il computer usato per controllare il missile Patriot era basato su
un’aritmetica a 24 bit. Per i calcoli, il tempo veniva registrato dall’orolo-
gio interno del sistema in decine di secondi e successivamente moltipli-
cato per 1/10 per ottenere i secondi, utilizzando 24 bit in virgola fissa. Il
numero 1/10 in base 2 ha infinite cifre decimali: la sua espansione bina-
ria è infatti 0.0001100110011001100110011001100 . . .. In 24 bit esso veni-
va registrato come 0.00011001100110011001100 introducendo un erro-
re di 0.0000000000000000000000011001100 . . ., che, in base 10, significa
circa 0.000000095.
Gli errori di arrotondamento nella conversione del tem-
po causarono un errore nel calcolo della traiettoria: il tem-
po di 100 ore calcolato in secondi diede il valore 359999.6567
Figura 3.1: Il disastro del missile invece di 360000, un errore di 0.3433 secondi che portò
Patriot il Patriot 687 metri fuori della traiettoria del missile Scud!

L’esplosione
dell’Ariane 5 Il 4 giugno 1996, dopo una spesa di 7 miliardi di dollari, e dopo appena 40
secondi dal suo lancio, esplose il razzo Ariane 5, nella Guiana Francese. Il razzo
e il suo carico erano valutati per oltre 500 milioni di dollari. Perciò il costo
totale della missione era stato di oltre 7 miliardi e mezzo di dollari. Fu scoperto
che l’errore era nel software e, in particolare, nella componente del Sistema di
Riferimento Inerziale, che era stato preso dal software dell’Ariane 4. Certe parti
del software dell’Ariane 5 erano state aggiornate rispetto al software dell’Ariane
4, ma non si era aggiornato quanto preso dal software dell’Ariane 4.
In particolare, il fallimento dell’Ariane 5 è dovuto ad un errore di con-
versione da un sistema a 64 bit a virgola mobile ad uno a 16 bit a virgola
fissa.
La velocità orizzontale del razzo rispetto alla piattaforma misurato in 64 bit
era un numero più grande del massimo consentito nell’aritmetica a 16 bit. Si
ebbe quindi un errore di overflow che causò l’arresto del software di controllo
del volo 37 secondi dopo il lancio del razzo. Dopo 3 secondi il razzo si distrusse.
Il disastro del
Mars Climate Il disastro, invece, del veicolo spaziale della missione Mars Climate Orbiter Figura 3.2: L’esplosione di
Orbiter
non si trova sulla pagina web del prof. Douglas, ma i dettagli della storia si Ariane 5
possono trovare, ad esempio, sul sito http://marsprogram.jpl.nasa.
gov/msp98/orbiter.
Il 23 settembre 1999 si perdono le tracce del veicolo spazia-
le Mars Climate Orbiter. Gli obiettivi di questa missione della NASA erano sia di monito-
raggio dei cambiamenti climatici sia di supporto per la missione Mars Polar Lander. I costi
della Climate Orbiter e della Polar Lander erano di un totale di oltre 320 milioni di dollari.

20
3.2. Aritmetica di macchina

Si era ipotizzato di entrare nell’atmosfera di Marte ad una al-


tezza di circa 150 km mentre il veicolo spaziale entrò ad una al-
tezza di circa 60 km. Per un errore di conversione delle unità di
misura, il velivolo entrò nell’atmosfera con una traiettoria infe-
riore rispetto a quella pianificata. La velocità del mezzo era molto
elevata e portò alla distruzione non solo del veicolo spaziale ma
anche della stessa Polar Lander.
Diversi furono i motivi che portarono al fallimento di questa
missione. Il principale è dovuto all’errore nel trasferimento di in-
formazioni tra il team che lavorava sul veicolo spaziale, che si tro-
vava in Colorado e il team della missione di navigazione, che la-
Figura 3.3: La Mars Climate Orbiter vorava in California. Un team usava le unità inglesi (inches, feet,
pounds) mentre l’altro usava le unità metriche. L’errore fu nel-
la mancata conversione delle unità di misura tra unità inglesi e
unità metriche!

3.2 Aritmetica di macchina


Un qualunque numero reale può essere rappresentato accuratamente da una sequenza di infinite cifre
decimali.
Ad esempio:

µ ¶
1 0 3 3 3 3
= 0.3333333 . . . = + + + + . . . × 100
3 100 101 102 103 104

µ ¶
3 1 4 1 5
π = 3.14159265358979 . . . = + + + + . . . × 100
100 101 102 103 104

Osserviamo che abbiamo scritto 1/3 e π in base 10, usando, quindi, le cifre 0, 1, 2, . . . , 9 per poterli
rappresentare.
In genere, un numero reale x può essere rappresentato in base N come

x = x m N m + x m−1 N m−1 + . . . + x 1 N + x 0 + x −1 N −1 + x −2 N −2 + . . . x −n N −n

| {z }| {z }
parte intera parte frazionaria

dove m e n sono interi naturali e x k , k = m, m − 1, . . . , −n sono interi naturali compresi tra 0 e N − 1.


Esempio
In base 10, il numero 726.625, scritto in forma estesa è dato dalla forma:

7 × 102 + 2 × 101 + 6 + 6 × 10−1 + 2 × 10−2 + 5 × 10−3

Tuttavia, i calcolatori hanno una memoria finita per poter rappresentare i numeri. Ciò significa che solo
una sequenza finita di cifre possono essere usate. Inoltre, i calcolatori lavorano in base binaria, quindi ogni
numero può essere rappresentato mediante una sequenza di 0 e 1.
Avendo in mente questi due fattori, possiamo ora capire la rappresentazione dei numeri al calcolatore,
per cui ad ogni numero reale x è associato il numero di macchina denotato come f l (x), in rappresentazione
floating point – virgola mobile.

21
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

3.3 Conversione di base


Nel seguito, non affronteremo gli aspetti teorici del passaggio da una base ad un altra per rappresentare
lo stesso numero, ma vedremo l’implementazione pratica per convertire un numero dalla base 10 alla base 2
e viceversa.
Il passaggio di un numero dalla rappresentazione in base 2 alla rappresentazione in base 10 è semplice, in
quanto si tratta di scrivere il numero come combinazione delle opportune potenze di 2. Vediamo un esempio.

Esempio
Esempio 3.3.1 Sia 10001000.010 il numero scritto in base 2.
Se lo scriviamo mediante le potenze di 2 si ha:

10001000.010 = 1 · 27 + 0 · 26 + 0 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 0 · 20 +

| {z }
parte intera

0 · 2−1 + 1 · 2−2 + 0 · 2−2

| {z }
parte frazionaria

= 27 + 23 + 2−2 = 128 + 8 + 0.25 = 136.25

Questo è quindi lo stesso numero ma rappresentato in base 10.

Il passaggio di un numero dalla rappresentazione in base 10 a quella in base 2 si effettua, invece, in due
passi.
G Si prende la parte intera del numero e la si divide per 2: se il resto della divisione è zero, allora la cor-
rispondente cifra binaria sarà 0; se il resto è diverso da zero, la corrispondente cifra binaria sarà 1. Si ripete
la procedura sul risultato avuto dalla divisione, fino a quando si arriva a 1. In tal modo, calcoliamo le cifre
binarie a partire da x 0 (il primo resto ottenuto) e andando avanti con indice crescente.
G Si prende la parte frazionaria del numero e la si moltiplica per 2. Se il risultato dell’operazione ha la
parte intera diversa da zero, allora la corrispondente cifra binaria vale 1, altrimenti vale 0. Si ripete la proce-
dura sulla parte frazionaria del risultato appena ottenuto e si continua fino a quando si arriva allo zero (o se
si vede che c’è una periodicità nei risultati). Le cifre binarie vengono costruite da x −1 con indice decrescente.

Esempio
Esempio 3.3.2 Vogliamo convertire il numero 725.625 dalla base 10 nella base 2.
Per la parte intera si ha:
Per la parte decimale si ha :
: 2 = quoziente resto
.625 × 2 = 1.250 x −1 = 1
725 362 1 x0
.250 × 2 = 0.50 x −2 = 0
362 181 0 x1
.5 × 2 = 1.0 x −3 = 1
181 90 1 x2
.0 × 2 = 0.0
90 45 0 x3
45 22 1 x4
22 11 0 x5
11 5 1 x6
5 2 1 x7
2 1 0 x8
1 0 1 x9
In base 2 il numero diventa 1011010101.101.
Osserviamo che un numero può avere una rappresentazione finita in base 10 e infinita in base 2. Vediamo
in dettaglio un esempio:

22
3.4. Rappresentazione IEEE dei numeri di macchina

Esempio
11
Esempio 3.3.3 Scriviamo il numero , che è 1.1 in base 10, nella base 2.
10
Per la parte intera:
Per la parte decimale:
: 2 = quoziente resto
.1 × 2 = 0.2 x −1 = 0
1 0 1 x0
.2 × 2 = 0.4 x −2 = 0
.4 × 2 = 0.8 x −3 = 0
.8 × 2 = 1.6 x −3 = 1
.6 × 2 = 1.2 x −4 = 1
.2 × 2 = 0.4 x −5 = 0
.4 × 2 = 0.8 x −6 = 0
.8 × 2 = 1.6 x −7 = 1
.6 × 2 = 1.2 x −8 = 1
.2 × 2 = 0.4 x −9 = 0
Osserviamo che nella parte decimale si ripetono all’infinito le cifre 0011. Il numero in base 2 si scrive
quindi come: 1.0 0011
| {z } 0011
| {z } . . .

3.4 Rappresentazione IEEE dei numeri di macchina


Lo sviluppo dei calcolatori ha promosso e sviluppato l’uso del sistema binario, in cui ciascun numero è
rappresentato da una successione di cifre binarie (0 e 1). Ma come avviene la rappresentazione di un nume-
ro nel calcolatore? Come rappresentare un numero a infinite cifre in maniera accurata utilizzando solo un
numero finito di cifre?
Lo standard IEEE (Institute of Electrical and Electronics Engineers), oggi utilizzato dalla maggior parte dei
calcolatori, è dato dalla rappresentazione in virgola mobile (floating point). Esiste anche un tipo di rappre-
sentazione in virgola fissa (fixed point), ma in genere è preferita quella in floating point, e noi ci soffermeremo
solo su questa.
1
Riprendiamo l’esempio proposto in Sezione 3.2, dove abbiamo scritto in base 10 come
3
µ ¶
1 0 3 3 3 3
= 0.3333333 . . . = + + + + . . . × 100
3 100 101 102 103 104

Questo è un esempio di numero scritto in virgola mobile: un qualunque numero x, in base 10, si può
scrivere sotto la forma x = f 10e dove f rappresenta la mantissa del numero e e è l’esponente (intero) della
base con cui stiamo rappresentando il numero stesso, che dà informazioni sulla parte intera del numero.
Ci sono diverse rappresentazioni in virgola mobile, tutte equivalenti tra loro. Per esempio 12.5 = 1.25 ×
101 = 0.125 × 102 = 0.000125 × 105 . Si parla di virgola mobile normalizzata quando la mantissa ha una singola
cifra di valore diverso da zero a sinistra della virgola, quindi, in base 2, la mantissa è del tipo 1.qual cosa.
La rappresentazione in virgola mobile normalizzata in base 2 è quella utilizzata nello standard IEEE: i
numeri si possono scrivere nella forma x = f 2e . Al calcolatore, tuttavia, non possiamo rappresentare numeri
con una mantissa a infinite cifre, perciò f = ±1. f −1 f −2 . . . f −n e e = ±e Ne−1 e Ne−2 . . . e 0 ., dove f −1 , f −2 , . . . , f −n ,
e e Ne−1 , e Ne−2 , . . . , e 0 sono le cifre che caratterizzano rispettivamente la mantissa e l’esponente del numero
in virgola mobile normalizzata in base 2, e quindi possono valere 1 o 0. Abbiamo n cifre per la mantissa (in
realtà sono n + 1 ma poichè la rappresentazione è normalizzata f 0 = 1) e Ne per l’esponente. Nel sistema
binario, le cifre vengono chiamate bits ( binary digits): quindi n bits sono riservati per la mantissa, Ne per
l’esponente.

23
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

Un numero in floating point nella rappresentazione IEEE viene scritto come

x = ±(1 + f −1 2−1 + f −2 2−2 + . . . + f −n 2−n ) × 2e

dove
G 1+ f 2 + f 2 +. . .+ f 2 è la mantissa, normalizzata, cui sono riservati
−1
−1
−2
−2
−n
−n

un numero n di bits,
G e è la potenza della base 2 cui sono riservati un numero Ne di bits ed è
limitato a variare in un determinato intervallo [L,U ].

Il primo 1 della mantissa (che corrisponde a f 0 ) non viene messo in memoria ma c’è. La rappresentazione
in virgola mobile può essere schematizzata nel modo seguente (s, e ed f rappresentano i bits riservati rispet-
tivamente per il segno della mantissa, e per le cifre dell’esponente e della mantissa – ogni celletta può avere
il valore 0 o 1):

s e e e e e ··· ··· e f f f f f ··· ··· f


|{z} | {z } | {z }
segno cifre dell’esponente cifre della mantissa

Abbiamo 1 bit riservato al segno (si ha 0 per il segno + e 1 per il segno −), un numero Ne di bits per
l’esponente 2e , e un numero n di bits per la mantissa.
La scelta del numero di bits da riservare all’esponente e alla mantissa si basa su un compromesso tra la
dimensione dell’esponente (e quindi il più piccolo e il più grande numero rappresentabile) e la dimensione
della mantissa (e quindi la precisione del numero rappresantibile, più o meno cifre decimali).
Nel sistema IEEE, la rappresentazione in singola precisione è a 32 bits mentre quella in doppia precisione
è a 64 bits. La suddivisione dei bits tra esponente e mantissa viene ripartita nel modo seguente:

s Ne n # totale bits
Singola precisione 1 8 23 32
Doppia precisione 1 11 52 64

Gli esponenti possono essere sia positivi sia negativi ma si preferisce memorizzarli come interi positivi
(senza segno). Abbiamo dunque bisogno di una tecnica che permetta di rappresentare esponenti negativi
come interi positivi. La tecnica utilizzata nello standard IEEE è chiamata di biasing (distorsione): un numero
positivo (detto bias) viene aggiunto all’esponente (sia esso positivo o negativo) in modo che il risultato finale
sia sempre positivo. Ed è questo valore che viene memorizzato per rappresentare l’esponente. L’esponente
viene quindi rappresentato in forma biased (parziale, influenzata da un altro numero): se e è l’esponente
2
effettivo, noi memorizziamo il valore b + e dove b è il bias dato b = 0111
| {z. . . 1}, vale a dire b = 1 + 2 + 2 + . . . +
Ne bits
Ne−1
1 − 2
2Ne−2 +0·2Ne−1 = = 2Ne−1 −1 (si veda la nota per capire perchè si ha questo risultato nella somma).
1−2
Per trovare il limite superiore e inferiore entro cui può variare e, dobbiamo tener conto del fatto che, nella
rappresentazione IEEE, due patterns di bits sono riservati per rappresentare numeri speciali quali lo zero,
infinito e il Not-a-Number, precisamente 0000 . . . 0 e 1111 . . . 1.
Quindi, b + e non può essere uguale nè a 0000 . . . 0, nè a 1111 . . . 1. Ciò significa che il massimo esponente
che si può rappresentare è dato sottraendo a 1111 . . . 1 il valore 1 in base 2, cioè da 1111 . . . 1 − 0000 . . . 01 =
1111 . . . 10.
Si ha b + e ≤ 1111 . . . 10, o equivalentemente, 0111 . . . 1 + e ≤ 1111 . . . 10, da cui ricaviamo

e ≤ 1111 . . . 10 − 0111 . . . 1 = 0111 . . . 1 = b

.
Il limite superiore U è proprio uguale a b.

24
3.4. Rappresentazione IEEE dei numeri di macchina

Per il limite inferiore abbiamo: 0000 . . . 0 < b + e cioè, equivalentemente,

−b < e ⇔ −b + 0000 . . . 01 ≤ e.

Osserviamo che siamo passati da una diseguaglianza in senso stretto (<) a una relazione con ≤. Quindi il
limite inferiore è L = −(b − 1).
| {z. . . 1}: in base 10 b = 12710 , da cui l’intervallo [L,U ] = [−126, 127].
In singola precisione, b = 0111
8 bits
In doppia precisione, invece, b = 102310 da cui [L,U ] = [−1022, 1023].
Per quanto riguarda la mantissa, sono ad essa riservati n bits. Considerando anche l’1 della
normalizzazione, la precisione è di n + 1 bits.
Il più grande numero che si può rappresentare è, quindi1
n 1 − 2−(n+1) U
1. |111{z. . . 1} ×2U = ( 2−k ) × 2U = 2 = (2 − 2−n )2U ≈ 2U +1
X
k=0 1 − 2−1
n bits
Il più piccolo numero positivo rappresentabile è dato, invece, da:

1. |000{z. . . 0} ×2L = 2L
n bits
Se si vuole rappresentare un numero al di fuori di questo intervallo si ha overflow o underflow.
In singola e doppia precisione abbiamo, per il più grande e il più piccolo numero positivo rappresentabile,
i seguenti valori:

Singola precisione Doppia precisione


Massimo ≈ 3.4 × 1038 ≈ 10308
Minimo ≈ 1.2 × 10−38 ≈ 2.2 × 10−308
(n+1)
1 È il risultato di una somma del tipo S = 1 + a + a 2 + . . . + a n e vale S = 1 − a 1
. In questo caso, a = = 2−1 . Osserviamo, inoltre,
1−a 2
che, dati n valori w 1 , w 2 , . . . , w n usiamo la seguente simbologia per indicare la loro somma:
n
X
wi = w1 + w2 + w3 + . . . wn
i =1
.

25
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

Esempio
Esempio 3.4.1 Vogliamo scrivere il numero 5.7510 in formato IEEE in singola precisione.
Effettuiamo prima la conversione in base 2:
Per la parte intera: Per la parte decimale:
5 2 1 x0 .75 × 2 = 1.50 x −1 = 1
2 1 0 x1 .5 × 2 = 1.0 x −2 = 1
1 0 1 x2 .0 × 2 = 0.0
Quindi 5.7510 = 101.112 = 1.0111 × 22 .
Memorizziamo ora il numero in singola precisione:
Per l’esponente, essendo p = 2, si ha:

(b + p)10 = (127 + 2)10 = 12910 = 100000012

Per la mantissa, m = 23 e si deve trascurare l’1 della normalizzazione, quindi memorizzeremo le cifre
0111 e poi avremo tutti 0.
0 1 1 1 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
Il segno è positivo, quindi s = 0
Perciò la memorizzazione, considerati i bits per il segno, l’esponente e la mantissa è:
0 1 0 0 0 0 0 0 1 0 1 1 1 0 ... 0 0 0 0 0
|{z} | {z } | {z }
s esponent e mant i ssa

Consideriamo, ora, la rappresentazione dei numeri speciali.


Per convenzione si pone uguale a 0 la rappresentazione che vede tutti zero sia nel segno, sia nell’espo-
nente che nella mantissa (non dimentichiamo che il valore 1 della normalizzazione non è messo in memoria
ma c’è e quindi non potremmo mai avere il valore 0, perciò lo si pone per convenzione).
Per i valori ±∞ si considerano tutti 1 nello spazio dedicato all’esponente, tutti 0 nello spazio dedicato alla
mantissa e 0 o 1 per il segno, a seconda che sia + o −∞.

0/1 1 1 1 ... 1 1 0 0 0 ... 0 0


|{z} | {z } | {z }
s esponente mantissa

I valori ±∞ si hanno se si fa una divisione per zero o si fa un calcolo che comporta overflow.
Si ha invece il Not-a-Number (NaN) come risultato di operazioni non definite, come 0/0 o log 0.
A seconda della macchina si ha:

NaNS, che produce un segnale di errore


0 1 1 1 ... 1 1 0 1 1 ... 1 1
|{z} | {z } | {z }
s esponente mantissa

NaNQ, con il quale il calcolo continua comunque...


0 1 1 1 ... 1 1 1 0 0 ... 0 0
|{z} | {z } | {z }
s esponente mantissa

3.5 Precisione numerica


p
Un numero può avere una rappresentazione finita o infinita. Basti pensare al valore di π o a 2 in base 10.
Abbiamo anche visto che un numero può avere rappresentazione finita in una base ma infinita in un’altra.
Quando rappresentiamo un numero al calcolatore è possibile memorizzare solo un certo numero di cifre:
in che modo lo esprimiamo?

26
3.6. Propagazione degli errori

Per lasciare maggiore generalità al discorso, consideriamo una base N .


Sia x = ±( ∞ x N −k )N p il numero esatto (può avere infinite cifre decimali e lo rappresentiamo come
P
k=0 −k
somma di infiniti termini).
Pt −1 ∗ −k p ∗
In floating-point esso sarà espresso come x ∗ = ±( k=0 x −k N )N , esso, cioè, sarà arrotondato (non
possiamo avere infinite cifre decimali e, difatti, la somma considera solo t termini).
Ci sono due modi per arrotondare un numero

G troncamento: x = t r onc(x), dove p = p e x = x per k = 0, . . . , t − 1. Le altre cifre, x , x


∗ ∗ ∗
−k −k −t −t −1 , . . .
sono ignorate.
G arrotondamento simmetrico: x = ar r (x) = t r onc(x + 21 N N ), aggiungiamo un’unità a x
∗ −t +1 p
−t +1 se
x −t ≥ N /2.
L’errore assoluto |x − x ∗ | che si commette approssimando il numero x con x ∗ sarà 2


N 1−t N p nel troncamento

|x − x | ≤ 1 1−t p
 N N nell’arrotondamento
2
|x − x ∗ |
Per l’errore relativo , invece, si ha:
|x|

1−t
|x − x ∗ | N nel troncamento
≤ 1 1−t
|x|  N nell’arrotondamento
2
1 1−t
Il valore N è il numero conosciuto come precisione di macchina.
2
Esempio
Nel caso della rappresentazione IEEE di un numero, si ha t −1 = n, (ricordiamo che nella rappresentazione
IEEE si memorizza il numero normalizzato), da cui l’errore di arrotondamento relativo che si commette è
|x − x ∗ |
≤ 2−(n+1) .
|x|
In singola precisione (n = 23), avremo

|x − x ∗ |
≤ 2−24 ≈ 5.96 × 10−8
|x|

ciò significa che avremo 8 cifre decimali corrette.


In doppia precisione (n = 52) avremo

|x − x ∗ |
≤ 2−53 ≈ 1.11 × 10−16
|x|

ciò significa che avremo 16 cifre decimali corrette.

3.6 Propagazione degli errori


Prima di vedere come si propagano gli errori nelle operazioni elementari di moltiplicazione, divisione,
addizione e sottrazione, vediamo il concetto di cifre significative.
Le cifre significative sono quelle che danno un’informazione effettiva sul valore del numero,
indipendentemente dalla parte esponenziale.
2 Evitiamo di effettuare tutti i passaggi che portano alle formule dell’errore assoluto e relativo, che sono il risultato di maggiorazioni
di serie geometriche.

27
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

Se scriviamo il numero in virgola mobile normalizzata, le cifre significative sono date dalle cifre della
parte frazionaria. La bontà delle cifre va diminuendo procedendo da sinistra verso destra e questo può por-
tare ad una perdita di cifre significative, come possiamo vedere studiando la propagazione degli errori nelle
operazioni elementari.
Supponiamo che i numeri su cui lavoriamo siano affetti da errore (di arrotondamento), mentre le ope-
razioni siano eseguite in modo esatto. Indichiamo con il simbolo o una qualunque delle operazioni ele-
mentari {×, /, +, −} e indichiamo con f l (x) il numero x rappresentato in floating point e arrotondato, quindi
f l (x) = x(1 + e x ) dove e x è l’errore di arrotondamento.
Allora f l (x o y) = f l (x) o f l (y) = x(1 + e x ) o y(1 + e y ).

G Moltiplicazione 3

x(1 + e x ) × y(1 + e y ) = (x × y)(1 + e x )(1 + e y ) ≈ (x × y)(1 + e x + e y )


Quindi l’errore nel prodotto è dato da e x y = e x + e y
G Divisione (con y 6= 0)4

x(1 + e x ) x x
= (1 + e x )(1 − e y + e 2y + . . .) ≈ (1 + e x − e y )
y(1 + e y ) y y
Si ha e x/y = e x − e y : gli errori si accumulano additivamente
G Addizione (e, analogamente, Sottrazione)
x y
x(1 + e x ) + y(1 + e y ) = x + y + xe x + ye y = (x + y)(1 + ex + ey)
x+y x+y
x y
L’errore è e x+y = ex + e y , una combinazione lineare che dipende da x e y.
x+y x+y
– x y > 0 =⇒ |e x+y | ≤ |e x | + |e y |
|x| |y|
– x y < 0 =⇒ e possono essere molto grandi e, in tal caso, ci sarà un’amplificazione
|x + y| |x + y|
notevole dell’errore. Si ha il fenomeno di cancellazione se non si fa attenzione al numero di cifre
significative dei numeri che vengono sommati.
Sulla cancel- Supponiamo di avere due numeri molto vicini tra loro, in cui le prime p + 2 cifre della parte frazionaria
lazione sono buone mentre le altre sono corrotte. Inoltre, le prime p cifre siano le stesse per entrambi i numeri
(usiamo i simboli v v v v v e w w w w w w per esprimere le cifre corrotte):

f l (x) = 1.d −1 d −2 . . . d −p b −(p+1) b −(p+2) v v v v × 2e


0
f l (y) = 1.d −1 d −2 . . . d −p b −(p+1) 0
b −(p+2) w w w w × 2e

Quando andiamo a fare la sottrazione le prime p cifre buone si annullano. Da p + 2 cifre buone, ne abbiamo
ora solo 2 e tutte le altre sono quelle corrotte. Con la normalizzazione il risultato diventa del tipo (ora q q q q q
sono le cifre corrotte):
00
f l (x − y) = 1.b −1 00
b −2 q q q q q q × 2e

Ricordiamo, infine, che in aritmetica di macchina non valgono più la proprietà distributiva o associativa
del prodotto.
3 Nei calcoli sono trascurabili le potenze maggiori o uguali a due per e
x e ey
4 Possiamo scrivere 1 1
= (1 − e y + e 2y + . . .) come risultato della formula polinomiale di Taylor della funzione f (e y ) = di
1 + ey 1 + ey
centro 0.

28
3.6. Propagazione degli errori

Esempio
Esempio 3.6.1 Sia x = 0.1103 e y = 0.009963. Se consideriamo un sistema decimale a 4 cifre,
normalizzando i numeri, abbiamo x = 1.103 · 10−1 e y = 9.963 · 10−3
Facendo la sottrazione di questi due numeri, abbiamo 1.103 · 10−1 − 9.963 · 10−3 = 0.1103 − 0.009963 =
0.100337. Facendo l’arrotondamento a 4 cifre abbiamo il valore 1.0034 · 10−1 .
|0.100337 − 0.10034|
L’errore relativo che commettiamo è: ≈ 2.99 × 10−5 . Questo errore è minore della
0.100337
1
precisione di macchina (considerata la base 10 e le 4 cifre) · 10−3 .
2
Tuttavia, se non teniamo conto delle cifre significative ma tronchiamo i numeri alle prime 4 cifre,
abbiamo la sottrazione di 0.1103 − 0.0099 = 0.1004.
|0.100337 − 0.1004|
Questa volta l’errore relativo è ≈ .63 × 10−3 . L’errore è maggiore della precisione di
0.100337
macchina.

Esempio
Esempio 3.6.2 Sia da risolvere l’equazione ax 2 + bx + c = 0 con a = 1, b = −56 e c = 1, quindi x 2 − 56x +
1 = 0, in una macchina a 4 cifre decimali p (normalizzata).
−b ± b 2 − 4ac p
Applicando la formula x 1/2 = abbiamo x 1/2 = 28 ± 783 = 28 ± 27.98213716 =
( 2a
0.01786284073
. L’arrotondamento delle due radici in virgola mobile normalizzata a 4 cifre decimali
55.98213716
dà: x 1 = 1.7863 · 10−2 e x 2 = 5.5982 · 101 .
Consideriamo ora la macchina a 4 cifre decimali per risolvere l’equazione:
p
x 1 = 28 − 783 = 2.8 · 101 − 2.7982 · 101 = 0.0018 · 101 = 0.018 = 1.8 · 10−2
p
x 2 = 28 + 783 = 2.8 · 101 + 2.7982 · 101 = 5.5982 · 101
La radice x 2 è arrotondata correttamente, mentre la variabile x 1 no, per effetto della cancellazione.
Per ricavare x 1 con l’arrotondamento corretto, applichiamo la formula x 1 x 2 = c/a, che, nel nostro caso,
vale x 1 x 2 = 1 da cui x 1 = 1/x 2 = 1/(5.5982 · 101 ) = 1.7863 · 10−2 . Abbiamo fatto un’operazione che non
risente del fenomeno di cancellazione numerica!

Esempio
Esempio 3.6.3 Vediamo come non valga più la relazione (a − b)2 = a 2 − 2ab + b 2 .
Sia a = 15.6 e b = 15.7 e la macchina sia a 3 cifre decimali (questa volta lavoriamo su una macchina non
normalizzata, per cui scriveremo la parte frazionaria come 0.qual cosa. Ripetere poi l’esempio lavoran-
do su una macchina a 2 cifre decimali normalizzata e su una macchina a 3 cifre decimali normalizzata.
Cosa si osserva?)
(a − b) = (a − b)∗ + e a−b . Abbiamo (a − b)∗ = 15.6 − 15.7 = −0.1.
Quindi (a − b)2 = +0.01 = 0.1 · 10−1 .
Consideriamo ora a 2 − 2ab + b 2 = 243.36 − 489.84 + 246.49 = 0.24336 · 103 − 0.48984 · 103 + 0.24649 · 103
Considerando la macchina a 3 cifre decimali, abbiamo: 0.243 · 103 − 0.490 · 103 + 0.246 · 103 = −0.1 · 101
I risultati sono completamente diversi!

29
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

Esempio
Esempio 3.6.4 Consideriamo il problema di approssimare la derivata della funzione f (x) = sin x nel
punto x = 1.2.
Supponiamo di non poter valutare direttamente la derivata della f e di volerla approssimare applicando
la formula polinomiale di Taylor:

h 2 00 h 3 000 h4 I V
f (x 0 + h) = f (x 0 ) + h f 0 (x 0 ) + f (x 0 ) + f (x 0 ) + f (x 0 ) + . . .
2 6 24
Allora

f (x 0 + h) − f (x 0 ) h h 2 000 h3 I V
f 0 (x 0 ) = − ( f 00 (x 0 ) + f (x 0 ) + f (x 0 ) + . . .)
h 2 6 24
f (x 0 + h) − f (x 0 )
Approssimiamo, quindi, la f 0 (x 0 ) calcolando .
h
L’errore, detto errore di discretizzazione, che si commette è

f (x 0 + h) − f (x 0 ) h h 2 000 h3 I V
| f 0 (x 0 ) − | = | f 00 (x 0 ) + f (x 0 ) + f (x 0 ) + . . . |
h 2 6 24
Supponendo di conoscere il valore della derivata seconda in x 0 , per piccoli valori di h possiamo dare una
stima dell’errore di discretizzazione,

f (x 0 + h) − f (x 0 ) h
| f 0 (x 0 ) − | ≈ | f 00 (x 0 )|
h 2

Ci aspettiamo, anche senza conoscere il valore di f 00 (x 0 ) (purchè diverso da 0) che l’errore di


discretizzazione diminuisca proporzionalmente con il passo h, al decrescere di h.
Nel nostro caso, in cui f (x) = sin (x), noi conosciamo il valore esatto della derivata in 1.2, cos (1.2) =
0.362357754476674... e possiamo dunque calcolare l’errore esatto che commettiamo approssimando la
derivata di sin x con la formula che abbiamo ricavato.
Per h = 0.1 non abbiamo un’approssimazione accurata. Ci aspettiamo che diminuendo il passo h l’errore
che commettiamo diminuisca.
Riportiamo gli errori della formula (in valore assoluto) e confrontiamoli con l’errore di discretizzazione
h 00
| f (x 0 )| (i conti sono fatti in singola precisione):
2
h 00
h errore | f (x 0 )|
2
1.e-1 4.7167e-2 4.6602e-2
1.e-2 4.6662e-3 4.6602e-3
1.e-3 4.6608e-4 4.6602e-4
1.e-4 4.6603e-5 4.6602e-5
1.e-5 4.6602e-6 4.6602e-6
1.e-6 4.6597e-7 4.6602e-7

h 00
L’errore commesso dall’algoritmo decresce come h e, in particolare, come | f (1.2)| = 0.46602h.
2
Possiamo pensare di ottenere un’accuratezza grande quanto vogliamo a condizione di prendere valori di
h sempre più piccoli. In realtà, per valori di h molto piccoli, gli errori iniziano ad aumentare!

30
3.7. Instabilità e malcondizionamento

h 00
h errore | f (x 0 )|
2
1.e-8 4.3611e-10 4.6602e-9
1.e-9 5.5947e-8 4.6602e-10
1.e-10 1.6697e-7 4.6602e-11
1.e-11 4.6603e-5 4.6602e-12
1.e-12 1.3006e-4 4.6602e-13
1.e-13 4.2505e-4 4.6602e-14
1.e-16 3.6236e-1 4.6602e-16
1.e-18 3.6236e-1 4.6602e-19

In Figura 3.4 vediamo come la curva dell’errore inizialmente segue la retta descritta dall’errore di di-
scretizzazione ma poi si allontana da essa. Perchè questo diverso comportamento per valori di h molto
piccoli? Dobbiamo tenere presente che l’errore che noi valutiamo non è semplicemente l’errore di di-
scretizzazione ma la somma dell’errore di discretizzazione e dell’errore di arrotondamento! Per valori
di h grandi, l’errore di discretizzazione descresce al diminuire di h e domina sull’errore di arrotonda-
mento. Ma quando l’errore di discretizzazione diventa molto piccolo, per valori di h minori di 10−8 ,
allora l’errore di arrotondamento inizia a dominare e ad aumentare sempre più al diminuire di h. Que-
sto è un motivo per cui si deve cercare di far prevalere l’errore di discretizzazione in un procedimento
numerico. Nell’errore di arrotondamento, per h via via più piccoli, si verifica un errore di cancella-
zione: f (x 0 + h) è praticamente uguale a f (x 0 ) per h molto piccoli! per cui l’errore che calcoliamo è
| f 0 (x 0 ) − 0| = f 0 (x 0 ) = 0.3623577544....
Una strategia per evitare la cancellazione è di scrivere diversamente la differenza f (x 0 + h) −
f (x 0 ). Nel caso di f (x) = sin (x) ricorriamo alla formula trigonometrica per cui sin (φ) − sin (ψ) =
φ+ψ φ−ψ
2 cos ( ) sin ( ).
2 2
Vediamo come migliorano le cose inserendo nel grafico 3.4 anche la curva dell’errore che otteniamo
utilizzando questa espressione trigonometrica. L’errore continua a diminuire anche quando la formu-
la precedente dà un errore crescente. Sempre in Figura 3.4, e in riferimento alla formula “non buona”,
abbiamo considerato la curva dell’errore di arrotondamento in modo da confrontare l’andamento ef-
fettivo dell’errore con un limite superiore teorico dell’errore computazionale totale dato dalla somme
degli errori di discretizzazione e di arrotondamento. La rappresentazione di f (x) è affetta da errore per
f (x 0 + h) − f (x 0 ) f ∗ (x 0 + h) − f ∗ (x 0 )
cui avremo: f (x) = f ∗ (x) + e x . L’errore di arrotondamento è = +
h h
e x0 +h − e x0
. Maggiorando e x con la precisione di macchina ², l’errore di arrotondamento è dato da
h
2²/h: per h piccoli è l’errore che predomina!

3.7 Instabilità e malcondizionamento

3.7.1 Instabilità
In generale è impossibile evitare un accumulo lineare degli errori di arrotondamento durante un calcolo,
ed è accettabile che ci sia una crescita lineare moderata, del tipo

E n ≈ c 0 nE 0

dove E n misura l’errore relativo dell’n-sima operazione dell’algoritmo5 e c 0 sia una costante non molto
grande.
Se invece avviene una crescita di tipo esponenziale

E n ≈ c 1n E 0
5 Per algoritmo intendiamo un procedimento di calcolo. Per una definizione più approfondita si veda pag. ?? al Capitolo ??.

31
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

Figura 3.4: In alto: errore di discretizzazione ed effettivo approssimando f 0 (x 0 ) con il rapporto incrementale
f (x 0 + h) − f (x 0 )
. In basso: errori di discretizzazione, di arrotondamento, ed errore effettivo approssiman-
h
f (x 0 + h) − f (x 0 )
do f 0 (x 0 ) con il rapporto incrementale , ed errore che si commette applicando la formula
h
trigonometrica per cui f (x 0 + h) − f (x 0 ) = sin (x 0 + h) − sin (x 0 ) = 2 cos (2x 0 + h/2) sin (h/2).

con c 1 > 1, allora l’algoritmo è instabile. Algoritmi del genere devono essere evitati!

Definizione 3.7.1 Un procedimento numerico si dice instabile se gli errori che vi sono associati non rimangono
limitati ma crescono fino a distruggere completamente la soluzione.

32
3.7. Instabilità e malcondizionamento

Esempio
Esempio 3.7.1 Consideriamo l’integrale
1 xn
Z
yn = dx
0 x + 10

per valori di n = 1, 2, . . . , 30. Osserviamo che, poichè x ∈ [0, 1], la funzione integranda varia pure essa
nell’intervallo [0, 1] per cui 0 < y n < 1.
Analiticamente, si ha:
1 x n + 10x n−1 1 x n−1 (x + 10) 1 1
Z Z Z
y n + 10y n−1 = dx = dx = x n−1 dx =
0 x + 10 0 x + 10 0 n

Vale anche la relazione


Z 1
1
y0 = dx = ln (11) − ln (10).
0 x + 10

Possiamo pensare, quindi, di calcolare numericamente il valore di y n attraverso il seguente algoritmo:


1. valutare y 0 = ln (11) − ln (10)
1
2. per n = 1, 2, . . . , 30 valutare y n = − 10y n−1
n
Questa formula ricorsiva darebbe l’esatto valore se non fossero presenti errori di arrotondamento che ci
allontanano completamente dalla soluzione vera. L’errore si moltiplica esponenzialmente. Infatti

y 1 = 1 − 10y 0
1 1
y 2 = − 10(1 − 10y 0 ) = − 10 + (−10)2 y 0
2 2
1 1
y 3 = − 10( − 10 + 102 y 0 ) = −103 y 0 + cost ant e
3 2
....
..
y n = (−10)n y 0 + cost ant e n

L’algoritmo quindi, considerati gli errori di arrotondamento, presenta un errore E n con crescita di tipo
esponenziale. Difatti otteniamo valori che via via si allontanano dall’intervallo di ammissibilità [0, 1].
I risultati che ricaviamo sono i seguenti (osserviamo che sono leggermente diversi a seconda dal
linguaggio usato, proprio per effetto dell’instabilità).
Da un programma in Fortran: Da un programma Matlab:

n yn n yn
0 9.5310e-2 0 9.5310e-2
1 4.6898e-2 1 4.6898e-2
2 3.1021e-2 2 3.1018e-2
3 2.3122e-2 3 2.3154e-2
4 1.8778e-2 4 1.8465e-2
... .... ... ....
7 -3.0229e-1 7 1.1481-2
8 3.1479e+0 8 1.0194e-2
9 -3.1368e+1 9 9.1673e-3
10 3.1378e+2 10 8.3270e-3
18 3.1377e+10 18 -9.1694e+1
27 -3.1377e+19 27 -9.1699e+9
30 3.1377e+22 30 -9.1699e+13
33
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

1 1
Se invece, consideriamo y n−1 = ( − y n ), partendo da un valore di n molto grande e andando a
10 n
ritroso, l’errore diminuisce. Perciò, dato un valore di accuratezza ² > 0 e fissato un intero n 1 è possi-
bile determinare l’intero n 0 tale che, partendo da y n0 = 0 e andando a ritroso, gli integrali y n saranno
valutati con un errore in valore assoluto minore di ² per 0 < n ≤ n 1 . Infatti:

y n0 = 0
1 1
y n0 −1 =
10 n 0
1 1 1 1 1
y n0 −2 = ( − )= + cost ant e
10 n 0 − 1 10 n 0 (−10)2 n 0
....
..
1
yn = n
+ cost ant e n0 −n
(−10) 0 −n n 0

1
L’errore al passo n dipende, quindi, (in valore assoluto) da . Se richiediamo una tolleranza
10n0 −n
² = 10 −6
, e fissiamo un valore n 1 , per calcolare n 0 dovrà essere

1
< ² cioè 10n1 −n0 < ²
10n0 −n1
Passando al logaritmo in base 10:

n 1 − n 0 < log ² =⇒ n 0 > n 1 − log ²

Fissato n 1 = 20 si ricava n 0 = 26.


Questa volta i calcoli danno gli stessi risultati sia in Matlab sia in Fortran:

n yn n yn
26 0.000000 11 7.62944e-3
25 3.84615e-3 10 8.32797e-3
24 3.61538e-3 9 9.16720e-3
23 3.80513e-3 8 1.01944e-2
22 3.96731e-3 7 1.14806e-2
21 4.14872e-3 6 1.31377e-2
20 4.34703e-3 5 1.53529e-2
19 4.56530e-3 4 1.84647e-2
18 4.80663e-3 3 2.31535e-2
17 5.07489e-3 2 3.10180e-2
16 5.37486e-3 1 4.68982e-2
15 5.71251e-3 0 9.53102e-2
14 6.09542e-3
13 6.53332e-3
12 7.03898e-3

Osserviamo come il valore y 0 coincida con il valore teorico noto.

L’esempio appena visto ci porta a dare alcune considerazioni sui criteri su cui si deve basare un algorit-
mo: un algoritmo deve essere accurato, efficiente e robusto, accurato nel senso che bisogna essere in grado
di sapere la grandezza dell’errore che si commette nell’algoritmo stesso; efficiente in termini di velocità di
esecuzione e di richiesta di spazio di memoria per le variabili utilizzate; robusto nel dare il risultato corretto

34
3.7. Instabilità e malcondizionamento

Figura 3.5: Esempio: malcondizionamento

entro un livello di tolleranza dell’errore che sia accettabile.

3.7.2 Malcondizionamento
Definizione 3.7.2 Un problema si dice malcondizionato se a piccole variazioni nei dati di input del problema
corrispondono forti variazioni nei dati di output.

Quando il problema è molto sensibile alle variazioni dei dati di input, producendo risultati molto diversi tra
loro, allora nessun algoritmo, per quanto robusto e stabile, potrà dare una soluzione robusta al problema
stesso.

Esempio
Esempio 3.7.2 Il problema del calcolo delle radici di un polinomio p(x) di grado n è un esempio di
problema malcondizionato.
Sia p(x) = a 0 + a 1 x + a 2 x 2 +. . .+ a n x n . I dati di input del problema sono i coefficienti a 0 , a 1 , . . . , a n . I dati
di output sono le radici del polinomio.
Si può provare che a piccole variazioni sui dati iniziali, corrispondono grandi variazioni sui risultati.
Vediamo il caso del polinomio p(x) = (x − 1)(x − 2) · · · (x − 10). Chiaramente, tale polinomio ha radici
1, 2, . . . , 10. Se perturbiamo il polinomio variando il coefficiente a 9 del valore di 0.00001, considerando
quindi il polinomio p(x) + 0.00001x 9 , le radici corrispondenti si discostano di poco da quelle del poli-
nomio di partenza, come si può notare in Figura 3.5. Ma se variamo il coefficiente a 9 del valore 0.0001,
considerando cioè il polinomio p(x) + 0.0001x 9 allora le radici corrispondenti a x 7 , x 8 , x 9 , x 10 non sa-
ranno più reali ma avranno anche una parte immaginaria. La piccola variazione sui dati di ingresso,
quindi, provoca una grande variazione sui dati in uscita, proprio perchè il problema è malcondizionato.

Una quantità che misura il grado di sensibilità di un problema – fornendoci indicazioni sul fatto che a

35
3. R APPRESENTAZIONE DEI NUMERI NEL CALCOLATORE

piccole variazioni sui dati di ingresso del problema ci possono essere piccole o grandi variazioni sui dati di
indice di uscita – si chiama indice di condizionamento (o numero di condizionamento) del problema.
condiziona- Diamo la definizione nel caso in cui il nostro problema si possa identificare come una funzione f : R −→
mento
R. Il valore y = f (x) è il valore di uscita del problema f . Vogliamo vedere cosa succede se il dato di ingresso
non è più x ma x + ∆x. ∆x rappresenta quindi una perturbazione sul dato iniziale. Assumiamo x 6= 0, y 6= 0.
Applichiamo la formula di Taylor di centro x. Si ha:

f (x + ∆x) = f (x) + f 0 (x)∆x + O(∆x 2 ) ≈ f (x) + f 0 (x)∆x

La variazione sul dato d’uscita è data dalla differenza f (x + ∆x) − f (x). Chiamiamo questa differenza con
∆y. Quindi ∆y = f (x + ∆x) − f (x) ≈ f 0 (x)∆x (utilizziamo il risultato ottenuto dalla formula di Taylor).
Se utilizziamo gli errori relativi, abbiamo (e sapendo che y = f (x)):

∆y f 0 (x)∆x

y f (x)
Moltiplico poi numeratore e denominatore a secondo membro per x
∆y x f 0 (x) ∆x

y f (x) x

Al limite per ∆x → 0, questa uguaglianza approssimata (abbiamo usato il simbolo ≈) diventa una vera
uguaglianza. Questo suggerisce di definire l’indice di condizionamento di f mediante la formula

¯ 0 ¯
¯ x f (x) ¯
(cond f )(x) = ¯¯ ¯
f (x) ¯

Questo numero ci dice quanto grandi sono le perturbazioni relative per y confrontate con le relative
perturbazioni di x.
∆x
Per x = 0 e y 6= 0, non ha senso considerare l’errore relativo , e si considera l’errore assoluto su x. In tal
x
caso, si definisce indice di condizionamento la quantità

¯ 0 ¯
¯ f (x) ¯
(cond f )(x) = ¯¯ ¯
f (x) ¯

Per x = y = 0 si considera invece l’errore assoluto sia per x che per y, dimodochè l’indice di
condizionamento diventa

(cond f )(x) = | f 0 (x)|

Esempio
Esempio 3.7.3 Sia f (x) = x 1/α , con x > 0 e α > 0. Calcoliamo l’indice di condizionamento applicando
la formula (poichè abbiamo supposto x > 0, si ha f (x) 6= 0). Risulta

¯ 0 ¯ ¯¯ x 1 x 1/α−1 ¯¯
¯ ¯
¯ x f (x) ¯ ¯ α ¯ 1
(cond f )(x) = ¯¯ ¯=¯ ¯=
f (x) ¯ ¯¯ x 1/α ¯¯ α

Per α grande, (cond f )(x) tende a zero, quindi abbiamo un problema bencondizionato. Se, invece α è
10
molto piccolo si ha un problema malcondizionato (se α = 10−10 , si ha f (x) = x 10 e (cond f )(x) = 1010 ,
un valore molto grande).

36
C APITOLO 4
Zeri di funzione

Non so come il mondo potrà


giudicarmi ma a me sembra
soltanto di essere un bambino che
gioca sulla spiaggia, e di essermi
divertito a trovare ogni tanto un
sasso o una conchiglia più bella del
solito, mentre l’oceano della verità
giaceva insondato davanti a me.

Isaac Newton

4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Metodo delle Bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3 Metodo del Punto Fisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.4 Il Metodo di Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.5 Convergenza di un metodo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6 Complessità computazionale di uno schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.7 Il metodo delle secanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.8 Confronto tra i metodi di Newton-Raphson e la Regula Falsi . . . . . . . . . . . . . . . . . . . . . . 50
4.9 Metodo di Newton-Raphson per radici multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.10 Controllo sugli scarti e grafici di convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.11 Osservazioni sull’ordine di convergenza di un metodo iterativo . . . . . . . . . . . . . . . . . . . . 54
4.12 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4.1 Introduzione
Il problema di calcolare la radice quadrata di un numero è un problema molto antico. Già p gli antichi
Babilonesi, intorno al 1700 a.C., se lo erano posto e avevano trovato la soluzione: per calcolare b, partivano
da un certo valore x che si avvicinava alla soluzione, dividevano b per questo numero, e facevano poi la
media, iterando il procedimento.p L’algoritmo si può schematizzare nel modo seguente:
G partire da x 0 prossimo a b;
G 1 b
considerare x 1 = (x 0 + );
2 x0
G 1
generalizzando: x n+1 = (x n +
2
b
xn
).

37
4. Z ERI DI FUNZIONE

p
Per esempio, per calcolare 2 ≈ 1.41421356237310, sapendo che il valore che dobbiamo approssimare è
compreso tra 1 e 2, possiamo partire da x 0 = 1.5, ottenendo:
x 0 = 1.5
2
x 1 = 12 (1.5 + ) = 1.41666667
1.5
2
x 2 = 12 (1.41666667 + ) = 1.41421569
1.41666667
2
x 3 = 12 (1.41421569 + ) = 1.41421356
1.41421569
Il metodo usato dai Babilonesi non è altro che il metodo di Newton-Raphson (che vedremo più avanti)
per trovare gli zeri della funzione f (x) = x 2 − b.
I metodi numerici discussi in questo Capitolo servono per trovare approssimazioni numeriche ad
equazioni del tipo f (x) = 0.

4.2 Metodo delle Bisezioni


Sia data una funzione f continua in un intervallo [a, b], con f (a) e f (b) che assumono valori di segno
opposto. Allora, per il teorema del Valore Intermedio (si veda il Teorema 2.5.3 con K = 0), esiste almeno un
punto ξ ∈]a, b[ tale che f (ξ) = 0.
Assumiamo, per semplicità che ci sia una sola radice ξ nell’intervallo ]a, b[ (nel caso ci sia più di una
radice, la procedura che ora descriviamo vale sempre, e ci permette di calcolare una di queste radici).
Il metodo delle bisezioni (detto anche metodo dicotomico) si chiama così perchè, ad ogni passo, viene
dimezzato l’intervallo precedente, cercando in tal modo di racchiudere la radice ξ in sottointervalli sempre
più piccoli.
G Si pone a 1 = a e b 1 = b. Si prende il punto medio dell’intervallo [a 1 , b 1 ], c 1 =
a1 + b1
.
G
2
Se f (c 1 ) = 0 allora abbiamo trovato la radice dell’equazione, altrimenti si va a controllare il segno di
f (c 1 ).
– Se f (c 1 ) e f (a 1 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ]c 1 , b 1 [ (applicando di nuovo
il teorema del Valore Intermedio). In tal caso porremo a 2 = c 1 e b 2 = b 1 .
– Se, invece, f (c 1 ) e f (b 1 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ]a 1 , c 1 [ In tal caso
porremo a 2 = a 1 e b 2 = c 1 .
G Riapplichiamo questa procedura appena descritta sul sottointervallo [a 2 , b 2 ]
G Fermiamo il procedimento ad una certa iterazione n, se f (c n ) = 0 o se l’ampiezza del sottointervallo
bn − an
è sufficientemente piccola, cioè ≤ t ol l dove t ol l è una certa tolleranza prefissata. In tal caso
2
assumiamo c n come approssimazione della radice ξ.
Osserviamo che, ad ogni passo, viene dimezzato l’intervallo in cui si trova la radice ξ, da cui

b−a
|ξ − c n | ≤ .
2n
Da questa relazione, si può determinare il numero di iterazioni n necessarie per calcolare un’approssimazio-
ne della radice ξ entro una certa tolleranza t ol l richiesta. Infatti

b−a
≤ t ol =⇒ |ξ − c n | ≤ t ol
2n
Ma
b−a
µ ¶
log
b−a b−a t ol
≤ t ol ⇐⇒ 2n ≥ =⇒ n ≥ .
2n t ol log(2)

L’algoritmo di bisezione può essere descritto nel modo seguente (sotto forma di pseudo-codice). Se il
metodo non converge (perchè, ad esempio, la funzione che abbiamo scelto non assume segno opposto agli

38
4.3. Metodo del Punto Fisso

Figura 4.1: Metodo delle Bisezioni

estremi dell’intervallo), il procedimento iterativo potrebbe entrare in stallo (pensiamo ad un programma da


fare eseguire al calcolatore) e quindi conviene introdurre un numero massimo di iterazioni, che viene indi-
cato con itmax.

Dati di input: a, b, t ol , i t max


Dati di output: soluzione approssimata c o messaggio di fallimento
1 verificare che f (a) f (b) < 0, altrimenti non si può implementare il metodo ;
2 n ←− 1 ;
3 c ←− (a + b)/2 ;
4 sc ar t o ←− |b − a|/2 ;
5 Fintantochè n ≤ i t max e ( f (c) 6= 0 e sc ar t o > t ol )
6 n ←− n + 1 (incrementa n) ;
7 Se f (a) f (c) > 0 allora
8 a ←− c
9 altrimenti
10 b ←− c
11 Fine-Se
12 aggiorna c ;
13 aggiorna sc ar t o ;
14 Fine-Fintantochè
15 Se f (c) = 0 o sc ar t o ≤ t ol allora
16 c è la soluzione approssimata
17 altrimenti
18 n > i t max ;
19 il metodo è fallito dopo i t max iterazioni ;
20 Fine-Se

4.3 Metodo del Punto Fisso


Il problema f (x) = 0 può essere reso equivalente alla ricerca del punto fisso di una opportuna funzione g
(vale a dire del problema g (x) = x).

39
4. Z ERI DI FUNZIONE

³ x ´2 ³ x ´2
Ad esempio, da f (x) = −sin (x) = 0, aggiungendo ad ambo i membri x, otteniamo −sin (x)+x = x
³ x ´22 2
da cui poniamo g (x) = − sin (x) + x. Le radici della f coincidono con i punti fissi della g .
2

Definizione 4.3.1 Data una funzione g , si definisce punto fisso della g , quel punto
ξ che soddisfa la relazione g (ξ) = ξ

Una funzione può ammettere uno o più punti fissi o non ammetterne affatto.
Un modo per calcolare un punto fisso di una funzione g è dato da iterazioni successive sulla funzione g
stessa.

Esempio
Esempio 4.3.1 Supponiamo che la funzione g sia g (x) = cos (x). Prendiamo come valore iniziale x 0 =
1. Con una calcolatrice, andiamo a calcolare (in modalità radianti!) il suo coseno: ricaviamo x 1 =
cos (x 0 ) = g (x 0 ) = 0.54030230. Successivamente, calcoliamo il coseno di x 1 , ottenendo x 2 = cos (x 1 ) =
0.857553216. Osserviamo che x 2 = cos (x 1 ) = cos (cos (x 0 )) e non cos2 (x 0 )! Abbiamo innescato, in questo
modo, un procedimento iterativo per cui x n+1 = cos (x n ) = g (x n ). Con la calcolatrice, basta digitare
sulla funzione cos ogni volta in modo da avere i nuovi valori della successione x n+1 . I primi numeri
che otteniamo non sono molto importanti. Quelli importanti sono quelli che si hanno dopo 15, 30 o 100
passi. Nel nostro caso, abbiamo

n xn
5 0.7013687746
11 0.7356047404
13 0.7414250866
14 0.7375068905
15 0.7401473356
29 0.7390893414
30 0.7390822985
56 0.7390851333
57 0.7390851332
58 0.7390851332

Perchè i valori di x tendono a 0.7390851332? Cosa ha di speciale questo numero? È un punto fisso per la
funzione cos (x).

Esempio
1
Esempio 4.3.2 Consideriamo la funzione g (x) = x + 2. Partendo da x 0 = 0 si ha
2
n xn
1 x 1 = 12 · 0 + 2 = 2
2 x 2 = 21 · 2 + 2 = 3
3 x 3 = 21 · 3 + 2 = 3.5
4 x 4 = 21 · 3.5 + 2 = 3.75
5 x 5 = 21 · 3.75 + 2 = 3.875
6 x 6 = 21 · 3.875 + 2 = 3.9375
I numeri 2, 3, 3.5, 3.75, 3.875, 3.9375 sembrano avvicinarsi a ξ = 4. Difatti, per valori crescenti di n, per
1 1 1
x n che tende a ξ, si ha, da una parte ξ = limn→∞ x n+1 = limn→∞ x n + 2 = ξ + 2 da cui, ξ = ξ + 2, cioè
2 2 2
ξ = 4.

Scopriamo quindi che se l’iterazione x n+1 = g (x n ) converge a ξ, ξ è punto fisso per la funzione g .

40
4.3. Metodo del Punto Fisso

Da un punto di vista geometrico, i grafici di y = x (bisettrice del primo e terzo quadrante) e di y = g (x) si
intersecano in ξ.
Tuttavia, non sempre questo schema iterativo, applicato a funzioni che ammettono uno o più punti fissi,
converge. Vediamo con un esempio.

Esempio
Esempio 4.3.3 Sia g (x) = x 2 . Analiticamente troviamo due punti fissi per questa funzione. Dovendo
essere ξ = ξ2 , si ricava ξ2 − ξ = 0, vale a dire ξ(ξ − 1) = 0: quindi ξ = 0 e ξ = 1 sono i due punti fissi per
questa funzione.
Partendo da x 0 = 0.5, si ha la successione di valori 0.25, 0.0625, 0.00390625, rapidamente il metodo
converge a ξ = 0
Se si prende come punto iniziale un valore x 0 ∈]−1, 1[, la successione converge a ξ = 0. Le sole successioni
che convergono a ξ = 1 solo le ovvie successioni generate da x 0 = ±1. Se si prende come punto iniziale x 0
tale che |x 0 | > 1 allora lo schema iterativo x n+1 = x n2 diverge a +∞. Partendo da x 0 = 2, si ha 4, 16, 256,
65536...
Questo esempio è significativo per capire come ciascun punto fisso ξ abbia un proprio bacino di attra-
zione: se si prende x 0 in questo bacino, allora i valori x n tendono a ξ. Un punto fisso può dunque attirare o
respingere i valori x n prodotti dallo schema iterativo.
Prima di passare a studiare quando lo schema di punto fisso converge, ricordiamo che una funzione può
ammettere più di un punto fisso, ammetterne uno solo o non ammetterne affatto. Ci sono due teoremi (2.5.4
e 2.5.5) che ci dicono quando una funzione può ammettere punti fissi. Il primo assicura l’esistenza di almeno
un punto fisso (ciò vuol dire che vi possono essere più punti fissi) quando la funzione g , definita e continua
in [a, b], è tale che a ≤ g (x) ≤ b per ogni x ∈ [a, b]. Il secondo teorema aggiunge, a queste ipotesi, quelle che g
sia di classe C 1 e, inoltre, |g 0 (x)| ≤ m < 1 per ogni x ∈ [a, b]: in tal caso esiste un unico punto fisso.
È importante osservare che, data una funzione che ammette punto fisso, le ipotesi dei due teoremi 2.5.4
e 2.5.5 possono essere rilassate dall’intervallo [a, b] ad un intorno del punto fisso.
Possiamo ora provare un teorema di convergenza per lo schema iterativo del punto fisso.

Teorema 4.3.1 A partire da un punto iniziale x 0 , lo schema iterativo x n+1 = g (x n ) converge al punto fisso ξ di
g se |g 0 (x)| < 1 in un intorno di ξ.

Dimostrazione. Dalle relazioni

ξ = g (ξ)
x n+1 = g (x n )

sottraendo membro a membro e, applicando il teorema del Valore Medio 2.5.2 (con ξn un opportuno punto
del segmento che congiunge ξ a x n ), otteniamo:

ξ − x n+1 = g (ξ) − g (x n ) = g 0 (ξn )(ξ − x n )

Possiamo scrivere questa relazione per n = 0, 1, . . . ottenendo

ξ − x 1 = g 0 (ξ0 )(ξ − x 0 )
ξ − x 2 = g 0 (ξ1 )(ξ − x 1 )
ξ − x 3 = g 0 (ξ2 )(ξ − x 2 )
.. ..
.=.
ξ − x n = g 0 (ξn−1 )(ξ − x n−1 )

Moltiplicando, ora, membro a membro e prendendo i valori assoluti, abbiamo:

|ξ − x 1 | · |ξ − x 2 | · . . . · |ξ − x n | =
|g 0 (ξ0 )| · |g 0 (ξ1 )| · |g 0 (ξ2 )| · . . . · |g 0 (ξn−1 )| · |ξ − x 0 | · |ξ − x 1 | · . . . · |ξ − x n−1 |

41
4. Z ERI DI FUNZIONE

1
Figura 4.2: Il metodo di punto fisso: esempi con g (x) = cos (x) (a sinistra), e g (x) = x + 2 (a destra)
2

La relazione appena trovata può essere semplificata, dividendo ambo i membri per |ξ − x 1 | · |ξ − x 2 | · . . . ·
|ξ − x n−1 | ottenendo:

|ξ − x n | = |g 0 (ξ0 )| · |g 0 (ξ1 )| · |g 0 (ξ2 )| · · . . . · |g 0 (ξn−1 )||ξ − x 0 |

Assumiamo, ora che |g 0 (x i )| ≤ m per i = 0, 1, . . . , n − 1. Abbiamo dunque una relazione che lega l’errore
assoluto al passo n con l’errore assoluto iniziale.

|ξ − x n | ≤ m n |ξ − x 0 |

Perchè il metodo converga, l’errore deve tendere a zero per n che tende all’infinito. Se m < 1 è assicurata la
convergenza (quindi, se in un intorno del punto fisso, la derivata prima è minore di 1, lo schema converge).
Se invece m > 1 in un intorno del punto fisso, lo schema non può convergere al punto fisso.
Se vale m = 1 nulla si può dire a priori, ma bisogna vedere caso per caso cosa succede nell’intorno del
punto fisso. 4
Negli esempi precedenti:

g (x) g 0 (x)
cos (x) − sin (x)
1 1
x +2
2 2
2
x 2x

Nel primo caso (esempio 4.3.1) − sin (0.7390851332) = −0.673612, perciò in un intorno del punto fisso la
derivata è minore di 1 in valore assoluto e si ha convergenza.
1
Nell’esempio 4.3.2 g 0 (x) = qualunque sia x: si ha convergenza.
2
Nel terzo caso (esempio 4.3.3), g 0 (x) = 2x da cui g 0 (0) = 0 e g 0 (1) = 2. In un intorno del primo punto fisso,
vale m < 1, in un intorno del secondo punto fisso m > 1 e non si potrà mai avere convergenza ad esso.
Il bacino di attrazione si ha quindi se vale m < 1.
Da un punto di vista grafico, le iterazioni dello schema di punto fisso si possono vedere sotto forma di
ragnatela. Le iterazioni, infatti, si muovono avanti e indietro tra il grafico della y = g (x) e il grafico della
bisettrice y = x. L’esempio 4.3.1, con g (x) = cos (x), è rappresentato in Figura 4.2 (a sinistra): partendo da
(x 0 , x 0 ) sulla retta y = x, applicando l’algoritmo si ha x 1 = g (x 0 ). Perciò:
G da (x 0 , x 0 ) si va su o giù fino a raggiungere (x 0 , x 1 ) sulla curva g ;
G da (x 0 , x 1 ) si arriva a (x 1 , x 1 ) sulla bisettrice y = x.
Questi due passi vengono ripetuti per tutte le altre iterazioni. Da x 1 si arriva sulla curva a g (x 1 ). Ora l’altezza
è x 2 . Da qui si va sulla bisettrice al punto (x 2 , x 2 ). E così via. Lo scopo delle iterazioni, infatti, è di arrivare al
punto (ξ, ξ) ≈ 0.7390851332 che è il punto di intersezione tra il grafico di g e la bisettrice y = x. Osserviamo

42
4.3. Metodo del Punto Fisso

Figura 4.3: Il metodo di punto fisso: esempio con g (x) = x 2 . Si noti la convergenza monotona a ξ = 0 (a
sinistra) e la divergenza monotona da ξ = 1 (a destra)

Figura 4.4: Il metodo di punto fisso: esempio con g (x) = x − sin (x). ξ = 0 e ξ = 2π sono punti fissi attrattivi, al
contrario di ξ = π in cui g 0 (ξ) = g 0 (π) = 2

che, per questo esempio, i valori della successione si avvicinano a ξ muovendosi a destra e a sinistra rispetto
ad esso. Si parla di convergenza oscillante.
Nell’esempio 4.3.2, si devono intersecare due linee rette. Notiamo, anche dalla Figura 4.2 (a destra), che i
valori delle iterazioni si trovano tutti da un lato rispetto al punto fisso: si parla di convergenza monotona.
In generale, quando 0 ≤ g 0 (x) < 1 in un intorno del punto fisso, si ha convergenza monotona. Se, invece,
−1 < g 0 (x) < 0 in un intorno del punto fisso, si ha convergenza oscillante.
Analogamente, in Figura 4.3, si possono osservare le conclusioni già viste per l’esempio 4.3.3, in cui g (x) =
x 2 : si ha convergenza monotona verso ξ = 0 partendo da un punto iniziale in valore assoluto minore di uno,
e divergenza monotona a infinito, partendo da |x 0 | > 1.

Esempio
Esempio 4.3.4 Consideriamo ora g (x) = x − sin (x) nell’intervallo [0, 2π]. Data la periodicità della fun-
zione seno, g ammette più di un punto fisso. Infatti da ξ = ξ − sin (ξ) si ha 0 = sin (ξ) da cui ξ = 0, ξ = π e
ξ = 2π.
Studiamo ora la derivata prima g 0 (x) = 1 − cos (x). Si ha g 0 (0) = 1 − 1 = 0, g 0 (π) = 1 − (−1) = 2 e g 0 (2π) =
1 − 1 = 0. Da queste informazioni, deduciamo che qualunque sia il punto iniziale x 0 la successione
generata dallo schema del punto fisso non potrà mai convergere a π, come si vede anche dalla Figura 4.4.

Nel caso in cui il metodo di punto fisso converge, si possono ricavare maggiorazioni per l’errore che si

43
4. Z ERI DI FUNZIONE

commette approssimando ξ mediante x n . Vale infatti la disuguaglianza


m
|ξ − x n | ≤ |x n − x n−1 |
1−m

dove m, come prima, è una maggiorazione di |g 0 (x)|.

Proviamo questo risultato, scrivendo l’errore all’iterazione n come ξ − x n = g (ξ) −


g (x n−1 ) Applicando il teorema del valor medio e considerando, come prima, |g 0 (x)| ≤
m < 1 in un intorno del punto fisso, si ha:

|ξ − x n | ≤ m|ξ − x n−1 | (4.1)

Possiamo scrivere ξ − x n−1 nel modo seguente aggiungendo e sottraendo x n :

ξ − x n−1 = ξ − x n + x n − x n−1
ξ − x n−1 = g (ξ) − g (x n−1 ) + x n − x n−1
|ξ − x n−1 | ≤ m|ξ − x n−1 | + |x n − x n−1 |
(1 − m)|ξ − x n−1 | ≤ |x n − x n−1 |
1
|ξ − x n−1 | ≤ |x n − x n−1 |
1−m
Andando a sostituire questa maggiorazione nella disuguaglianza (4.1), si ha
m
|ξ − x n | ≤ |x n − x n−1 |
1−m
Abbiamo una maggiorazione dell’errore che lega l’errore al passo n con il valore assoluto della differenza
tra due iterazioni successive |x n − x n−1 | (quest’ultima quantità prende il nome di scarto).
Generalmente, per vedere se il metodo di punto fisso converge al punto fisso entro una certa tolleranza
prestabilita, il controllo da fare è proprio sullo scarto d n = |x n − x n−1 |. Sfruttiamo questo fatto per vedere
come implementare l’algoritmo dello schema di punto fisso (sotto forma di pseudo-codice; per i dettagli
sull’implementazione in Fortran si vada a pag. ??):
Dati di input: x 0 , t ol , i t max
Dati di output: x n soluzione approssimata o messaggio di fallimento
1 n ←− 1 contatore delle iterazioni;
2 d n ←− 2t ol (una quantità iniziale > t ol ) ;
3 Fintantochè n ≤ i t max e d n > t ol
4 incrementa n di 1;
5 applicare l’algoritmo di punto fisso x n = g (x n−1 ) ;
6 aggiorna d n ;
7 Fine-Fintantochè
8 Se d n ≤ t ol allora
9 x n è la soluzione approssimata
10 altrimenti
11 n > i t max ;
12 il metodo è fallito dopo i t max iterazioni ;
13 Fine-Se

44
4.4. Il Metodo di Newton-Raphson

4.4 Il Metodo di Newton-Raphson


Il metodo di Newton-Raphson1 è uno dei metodi più potenti e più famosi per risolvere equazioni non li-
neari. Ci sono diversi approcci per introdurre questo metodo – tra questi c’è anche quello di vedere il metodo
di Newton-Raphson come un particolare schema di punto fisso, come vedremo in seguito.
Supponiamo ora che la derivata prima e seconda di f esistano e siano continue e assumiamo che la
derivata prima f 0 sia valutabile con sufficiente facilità.
Lo schema di Newton-Raphson è uno schema iterativo che produce una successione di approssimazioni
x 0 , x 1 , . . . , x n della radice della funzione f .
Sia x n l’iterata corrente. Applicando la formula di Taylor di centro x n si ha:

f (x) = f (x n ) + f 0 (x n )(x − x n ) + f 00 (ξx )(x − x n )2 /2

dove ξx è un punto (che non conosciamo) compreso tra x e x n .


Sia x = ξ, dove ξ è radice di f , f (ξ) = 0. Se f fosse lineare, avremmo f 00 ≡ 0 e quindi potremmo trovare la
radice risolvendo direttamente

0 = f (ξ) = f (x n ) + f 0 (x n )(ξ − x n )

Supponendo f 0 (x n ) 6= 0, otterremmo, con semplici passaggi,

f (x n )
ξ = xn −
f 0 (x n )

In questo caso, partendo da un qualunque valore iniziale x 0 , in una sola iterazione otterremo il valore della
radice ξ.
Per una funzione non lineare, il discorso da fare è molto simile.
La nuova approssimazione x n+1 vogliamo che sia uguale al valore x n più una certa quantità h che ci
permetta di arrivare alla soluzione desiderata.
Applicando la formula di Taylor di centro x n , deve essere

f (x n+1 ) = f (x n + h) = f (x n ) + f 0 (x n )h + f 00 (ξh )h 2 /2

Vogliamo che sia f (x n+1 ) = 0, da cui, trascurando il termine in h 2 e considerando f 0 (x n ) 6= 0, ricaviamo

f (x n )
h=−
f 0 (x n )

Utilizziamo questo valore di h per la nuova approssimazione x n+1 = x n + h ottenendo la formula

f (x n )
x n+1 = x n − , n = 0, 1, 2, . . . (4.2)
f 0 (x n )

L’interpretazione geometrica del metodo di Newton è che x n+1 è l’intercetta, sull’asse delle x, della
tangente della f a x n (vedi figura 4.5).
1 Il metodo fu descritto da Isaac Newton in due suoi scritti del 1669 e del 1671, anche se era riferito solo a polinomi (in particolare a
x 3 − 2x − 5 = 0). Il metodo di Newton fu pubblicato per la prima volta nel 1685. Nel 1690 Joseph Raphson ne pubblicò una descrizione
semplificata in termini di approssimazioni successive x n piuttosto che di sequenze di polinomi. Fu solo nel 1740 che Thomas Simpson
descrisse il metodo di Newton come un metodo iterativo per risolvere equazioni non lineari (e non solo polinomi) e diede una versione
generalizzata per sistemi di due equazioni.
Isaac Newton (1643-1727), inglese, fu fisico, matematico, astronomo, alchimista, inventore, filosofo naturalista. È visto come uno dei
più grandi scienzati nella storia dell’umanità.
Su Joseph Raphson (1648-1715) non si hanno molti dettagli. Pare che Newton stesso gli permettesse di vedere e studiare i suoi scritti
matematici. Il suo lavoro del 1690 Analysis aequationum universalis gli valse l’ingresso nella Royal Society, nel 1691 benchè fosse uno
studente (si laureò nel 1692) piuttosto anziano (aveva 43 anni).

45
4. Z ERI DI FUNZIONE

Figura 4.5: Il metodo di Newton-Raphson applicato alla funzione f (x) = (x/2)2 − sin (x) con x 0 = 1.3

Lo schema di Newton-Raphson si può vedere come un caso particolare dello schema del punto fisso ap-
plicato alla funzione g (x) = x − f (x)/ f 0 (x). Perchè lo schema del punto fisso converga, deve essere |g 0 (x)| < 1
in un intorno di ξ. Nel caso specifico abbiamo:

f 0 (x)2 − f (x) f 00 (x) f (x) f 00 (x)


|g 0 (x)| = |1 − | = | |
f 0 (x)2 f 0 (x)2

Supponendo f 0 (ξ) 6= 0 (che è il caso in cui la radice non è multipla), si ha |g 0 (ξ)| = 0, poichè al numeratore
f (ξ) = 0 (essendo ξ radice della f ). Per continuità, allora, vale |g 0 (x)| < 1 in un intorno di ξ. Pertanto il
metodo di Newton-Raphson è generalmente convergente. Cosa vuol dire quel generalmente? Vuol dire:
quasi sempre, tranne alcuni casi particolari (che vedremo in seguito).
Per vedere come si riduce l’errore via via che le approssimazioni si avvicinano a ξ, consideriamo l’errore
cambiato di segno ²n , per cui x n = ξ + ²n . Sostituendo in (4.2) abbiamo

f (ξ + ²n )
²n+1 + ξ = ²n + ξ −
f 0 (ξ + ²n )
f (ξ + ²n )
²n+1 = ²n − 0
f (ξ + ²n )

Applicando la formula polinomiale di Taylor sia su f sia su f 0 di centro ξ, si ha:

f (ξ) + ²n f 0 (ξ) + ²2n f 00 (ξ)/2 + . . .


²n+1 = ²n −
f 0 (ξ) + ²n f 00 (ξ) + . . .

Poichè f (ξ) = 0, raccogliendo i termini si ricava:

²n f 0 (ξ) + ²2n f 00 (ξ) − ²n f 0 (ξ) − ²2n f 00 (ξ)/2 + . . . ²2n f 00 (ξ)/2 + . . .


²n+1 = =
f 0 (ξ) + ²n f 00 (ξ) + . . . f 0 (ξ) + ²n f 00 (ξ) + . . .

Trascurando i termini ²n f 00 (ξ)+. . . al denominatore e le potenze maggiori o uguali a ²3n al numeratore si trova:

f 00 (ξ) 2 f 00 (ξ)
²n+1 = ² = A²2n ponendo A = .
2 f 0 (ξ) n 2 f 0 (ξ)

46
4.5. Convergenza di un metodo iterativo

L’ultima relazione che abbiamo ottenuto ci dice che l’errore al passo n + 1 è proporzionale, secondo il
fattore A, al quadrato dell’errore al passo precedente. Perciò se partiamo da un errore iniziale dell’ordine
di 10−2 , al passo successivo l’errore è proporzionale a 10−4 e poi a 10−8 fino a 10−16 in tre sole iterazioni.
Generalmente, quindi, il numero delle cifre significative raddoppia ad ogni passo del metodo. Si parla di
convergenza quadratica. Sulla
Nel caso in cui ξ sia una radice multipla, allora f 0 (ξ) = 0 e A = ∞: se il metodo converge, la convergenza convergenza

non sarà più quadratica ma avremo una convergenza di tipo lineare, come vedremo meglio in seguito.
Se in ξ vi è un punto di flesso, non orizzontale, per cui f (ξ) = 0, f 0 (ξ) 6= 0, f 00 (ξ) = 0, allora A = 0 e ci
aspettiamo una convergenza superiore a quella quadratica.

4.5 Convergenza di un metodo iterativo


Un metodo iterativo si dice:

G linearmente convergente se esiste una costante M < 1 tale che, per n sufficientemente grande, vale
|x n+1 − ξ| ≤ M |x n − ξ|

G a convergenza quadratica se esiste una costante M tale che, per n sufficientemente grande, vale
|x n+1 − ξ| ≤ M |x n − ξ|2

Ga convergenza superlineare se esiste una successione di costanti M n → 0 tale che, per n


sufficientemente grande, vale

|x n+1 − ξ| ≤ M n |x n − ξ|.

In generale un metodo ha ordine di convergenza p se si possono definire due costanti p ≥ 1 e M > 0 tali
che
|x n+1 − ξ|
lim =M
n→∞ |x n − ξ|p

La costante M prende il nome di costante asintotica dell’errore o fattore di convergenza.


Nel caso del metodo di Newton-Raphson, generalmente vale p = 2¯ e la costante asintotica dell’errore è
¯ f 00 (ξ ¯
¯
quella che abbiamo definito come A presa in valore assoluto, cioè M = ¯¯ 0 ¯¯.
2 f (ξ)
Nel metodo del punto fisso, la convergenza è lineare. Infatti, considerando l’errore cambiato di segno, la
relazione x n+1 = g (x n ) si può scrivere, in modo equivalente, come

ξ + ²n+1 = g (ξ + ²n ) e, applicando la formula (polinomiale) di Taylor si ha


ξ + ²n+1 = g (ξ) + ²n g 0 (ξ) + . . .
ξ + ²n+1 = ξ + ²n g 0 (ξ) + . . .
²n+1 = ²n g 0 (ξ) + . . . e, al limite per n → ∞
²n+1 = g 0 (ξ)²n

La costante asintotica per lo schema di punto fisso vale, dunque, M = |g 0 (ξ)|.


1
Il metodo delle bisezioni, invece, può essere visto come un metodo lineare, con M = (considerando
2
che, ad ogni passo, si riduce della metà l’intervallo in cui viene cercata l’approssimazione della radice).

47
4. Z ERI DI FUNZIONE

Esempio
Esempio 4.5.1 Consideriamo l’equazione f (x) = 2x − cos (x) + 1 = 0 che ammette come unica radice
ξ = 0. Poichè f 0 (x) = 2 + sin (x), il metodo di Newton-Raphson diventa:

2x n − cos (x n ) + 1
x n+1 = x n −
2 + sin (x n )

Partendo da x 0 = 0.5 e richiedendo una tolleranza pari a 10−10 nei risultati (interrompiamo l’algoritmo
quando d n < 10−10 ), si ha:

n xn dn
0 0.5
1 0.4730746270E-01 0.4526925E+00
2 0.5462695134E-03 0.4676119E-01
3 0.7458221874E-07 0.5461949E-03
4 0.1395426403E-14 0.7458222E-07
5 0.7647622253E-17 0.1387779E-14

I valori generati dall’algoritmo tendono a ξ = 0.


| f 00 (ξ)|
Considerando che f 00 (x) = cos (x) possiamo valutare la costante asintotica M = =
2| f 0 (ξ)|
| cos (ξ)| 1
= = 0.25
2(|2 + sin (ξ)|) 4
Da un punto di vista teorico, applicando il teorema del valor medio, si ha

f (ξ) − f (x n ) = f 0 (ξn )(ξ − x n )

dove ξn è un punto, che non conosciamo, compreso tra ξ e x n . Per x n vicino a ξ possiamo considerare
ξn ≈ x n , da cui ricaviamo (essendo f (ξ) = 0):

− f (x n ) ≈ f 0 (x n )(ξ − x n )

. Sostituendo questa espressione nell’iterazione di Newton-Raphson si ha:

f (x n )
x n+1 = x n − ≈ x n + (ξ − x n )
f 0 (x n )

vale a dire

x n+1 − x n = ξ − x n cioè d n+1 = ²n

Ma in condizioni di convergenza, d n+1 < d n da cui, per l’errore, vale la maggiorazione ²n < d n .
Perciò gli scarti sono molto vicini agli errori e possono essere utilizzati sia per controllare il numero di
iterazioni da effettuare per approssimare la radice entro una certa tolleranza sia per approssimare M .
Nel nostro esempio

d2 d3 d4 d5
= 0.2282 = 0.2498 = 0.2500 = 0.2495
(d 1 )2 (d 2 )2 (d 3 )2 (d 4 )2

4.6 Complessità computazionale di uno schema


Un altro elemento da considerare per valutare l’efficienza numerica di uno schema iterativo è la sua com-
plessità computazionale. Un metodo, infatti, può avere un elevato ordine di convergenza ma avere anche un

48
4.7. Il metodo delle secanti

costo computazionale molto elevato. Viceversa, un metodo può avere un basso ordine di convergenza ma
essere anche semplice computazionalmente e, quindi, molto vantaggioso da questo punto di vista.
Si definisce indice di efficienza E dello schema iterativo la quantità

E = p 1/s

dove s indica il numero di volte in cui bisogna calcolare la funzione e la sua derivata prima ad ogni iterazione
e p è l’ordine di convergenza del metodo.

4.7 Il metodo delle secanti


La conoscenza della derivata prima della f per applicare il metodo di Newton-Raphson potrebbe essere
semplice ma a volte potrebbe rivelarsi un’operazione molto costosa e alquanto complicata.
Il metodo delle secanti è una variante del metodo di Newton-Raphson dove, al posto della derivata prima,
si considera una sua approssimazione.
Scriviamo la formula ricorsiva
f (x n )
x n+1 = x n −
Cn
Per C n = f 0 (x n ) abbiamo la formula di Newton-Raphson, che possiamo anche chiamare della tangente
variabile perchè è il coefficiente angolare della retta tangente a (x n , f (x n )) che interseca l’asse delle x in x n+1 .
Vediamo altre scelte di C n :
G C n = f 0 (x 0 ): il valore di C n è costante e dà vita al metodo della tangente fissa.
G Cn =
f (x 1 ) − f (x 0 )
x1 − x0
: abbiamo sempre una costante che approssima la derivata f 0 (x 0 ) utilizzando i valori
di x 1 e x 0 . Lo schema è detto della secante fissa.
G Cn =
f (x n ) − f (x n−1 )
x n − x n−1
. La derivata f 0 (x n ) è approssimata utilizzando il rapporto incrementale della f
valutata in x n e x n−1 . Abbiamo il metodo delle secante variabile, che chiameremo nel seguito anche
metodo2 della Regula Falsi.
In forma estesa, l’iterazione n + 1 della Regula Falsi si scrive come:

f (x n )(x n − x n−1 )
x n+1 = x n −
f (x n ) − f (x n−1 )

Notiamo che, per innescare il metodo occorrono due valori iniziali, x 0 e x 1 . Ma è richiesta solo la
valutazione della funzione f a ciascun passo (nessuna conoscenza della derivata prima).
Da un punto di vista geometrico, nel metodo delle secanti il valore x n+1 è dato dall’intercetta sull’asse
delle x della retta passante per x n , f (x n ) e x n−1 , f (x n−1 ). Per quanto riguarda l’accumulo degli errori di arro-
tondamento, conviene utilizzare la formula così come è stata scritta in quanto è più sicura rispetto alla forma
compatta in cui vengono raccolti i termini, data da
x n−1 f (x n ) − x n f (x n−1 )
x n+1 =
f (x n ) − f (x n−1 )
in quanto in quest’ultima, si può avere il fenomeno della cancellazione numerica per x n ≈ x n−1 e
f (x n ) f (x n−1 ) > 0.
Per quanto riguarda l’ordine di convergenza si può dimostrare che si ha convergenza superlineare poichè
vale la relazione
p
p p
²
n+1 = M +1 ² n
2 Attenzione! In letteratura viene descritto un altro metodo (simile ma non lo stesso) con il nome della Regula Falsi o Falsa Posizione
che genera i valori x n+1 in modo che la radice ξ sia sempre compresa tra le iterazioni successive.

49
4. Z ERI DI FUNZIONE

Figura 4.6: Il metodo della Regula Falsi applicato alla funzione f (x) = (x/2)2 − sin (x) con x 0 = 1.3 e x 1 = 1.35

p
1+ 5
dove p = = 1.618 e A è la costante asitontica del metodo di Newton-Raphson, da cui
2

²n+1 = M 0.618 ²1.618


n

4.8 Confronto tra i metodi di Newton-Raphson e la Regula Falsi


Sebbene il metodo di Newton-Raphson abbia ordine di convergenza più elevato della Regula Falsi,
quest’ultimo è computazionalmente più efficiente. Si ha infatti

Metodo p s E
p
Newton-Raphson 2 2 2 ≈ 1.414
Regula Falsi 1.618 1 1.618

Vediamo ora come applicare i due metodi e le differenze che si hanno.

Esempio
Esempio 4.8.1 Consideriamo la funzione f (x) = 0 con f (x) = (x/2)2 − sin (x). La derivata prima è
f 0 (x) = (x/2) − cos (x) Consideriamo come x 0 = 1.3 per entrambi i metodi e x 1 = 1.35 per la Regula Falsi.
Come criterio di arresto, consideriamo una tolleranza t ol = 1.e −8, cioè andremo avanti con le iterazioni
fino a quando troveremo che lo scarto d n = |x n − x n−1 | sarà minore di t ol . Otteniamo i seguenti risultati
per il metodo di Newton-Raphson

n xn f (x n ) f 0 (x n ) dn 2
d n /d n−1
0 1.3 -5.410581854E-01 0.382501171
1 2.714526871831 1.427962127E+00 2.26744846 1.41452687E+00
2 2.084760792766 2.157545986E-01 1.53401376 6.29766079E-01 0.314743565
3 1.944113685369 1.377189572E-02 1.33676314 1.40647107E-01 0.354627390
4 1.933811265085 7.60156095E-05 1.32199993 1.03024203E-02 0.520808008
5 1.933753764621 2.37200355E-09 1.32191743 5.75004640E-05 0.541742396
6 1.933753762827 -1.00668172E-16 1.79436599E-09 0.542710632

50
4.8. Confronto tra i metodi di Newton-Raphson e la Regula Falsi

Per la Regula Falsi:


f (x n ) − f (x n−1 ) 1.618
n xn f (x n ) dn d n /d n−1
x n − x n−1
0 1.3 -5.41058185E-01
1 1.35 -5.20098358E-01 0.419196552
2 2.590702853065 1.15448972E+00 1.34970922 1.24070285E+00
3 1.735341043061 -2.33640901E-01 1.62285784 8.55361810E-01 0.603386215
4 1.879309845941 -6.98346071E-02 1.13779020 1.43968803E-01 0.185374473
5 1.940687248331 9.19996444E-03 1.28768192 6.13774024E-02 1.412310765
6 1.933542654410 -2.79035921E-03 1.32673746 7.14459392E-03 0.653100215
7 1.933752971771 -1.04570967E-06 1.32176540 2.10317362E-04 0.623935239
8 1.933753762918 1.19824825E-10 1.32191686 7.91146198E-07 0.704441455
9 1.933753762827 -1.00668172E-16 9.06448250E-11 0.676026603

Attraverso gli scarti, abbiamo fatto una stima della costante asintotica dell’errore, considerando che,
2
al limite per k → ∞, x n → ξ. Le ultime colonne delle tabelle, infatti, valutano i rapporti d n /d n−1 e
1.618
d n /d n−1 .
Diamo un’ulteriore stima di tali costanti facendo uso della definizione teorica e considerando ξ ≈ x n .
| f 00 (ξ)|
Per il metodo di Newton-Raphson dobbiamo calcolare M = mentre per la Regula Falsi
2| f 0 (ξ)|
dobbiamo considerare il valore M 0.618 .
Poichè f 00 (x) = 1/2 + sin (x), abbiamo, per ξ ≈ x 6 (di Newton-Raphson) o, equivalentemente per ξ ≈ x 9
(della Regula Falsi), in pratica ξ ≈ 1.933753762827, f 0 (ξ) = 1.32191743 e f 00 (ξ) = 1.4348509. Otteniamo
quindi: M ≈ 0.542715784 e M 0.618 ≈ 0.685434221

Esempio
(p
x per x ≥ 0
Esempio 4.8.2 Si consideri f (x) = p . La radice di questa funzione è ξ = 0.
− −x per x < 0
1

 p per x ≥ 0


Per la derivata prima, si ha f 0 (x) = 2 x .
1
 p per x < 0


2 −x p
x0
Se partiamo da x 0 > 0 abbiamo x 1 = x 0 − = x 0 − 2x 0 = −x 0 . Se partiamo da x 0 < 0 abbiamo
1
p
2 x0
p
− −x 0
x1 = x0 − = x 0 + 2(−x 0 ) = −x 0 .
1
p
2 −x 0
Il metodo di Newton applicato alla funzione f , diventa quindi:

x n+1 = −x n , n = 0, 1, 2, . . .

Qualunque sia il valore iniziale x 0 6= 0, si ha x 1 = −x 0 , x 2 = −x 1 = x 0 ... i valori generati dal metodo di


Newton-Raphsono si alternano tra x 0 e −x 0 e non si avrà mai convergenza alla radice ξ = 0.

Questo esempio ci permette di capire meglio il significato di metodo generalmente convergente.


Da un punto di vista pratico occorre prestare molta attenzione anche alla scelta del punto iniziale per il Quando
metodo di Newton-Raphson. Dal momento che la formula richiede una divisione per f 0 (x n ), occorre evitare Newton-
Raphson dà
di prendere un punto iniziale in cui la f abbia una tangente (e quindi f 0 ) con pendenza vicina allo zero. In tal risultati
caso, infatti, ci si può allontanare dalla radice e il metodo può non convergere. scarsi

51
4. Z ERI DI FUNZIONE

Figura 4.7: A sinistra: applicazione del metodo di Newton-Raphson nell’esempio in cui oscilla tra due valori.
A destra: la funzione f (x) = x 5 − 6

Esempio
Esempio 4.8.3 Consideriamo f (x) = x 5 − 6, per la quale f 0 (x) = 5x 4 , il cui grafico è in Figura 4.7 (a de-
stra). Se partiamo da un punto iniziale prossimo allo zero, poichè la tangente alla f è quasi orizzontale,
non si riesce ad avere convergenza se non dopo molte iterazioni: partendo da x 0 = 0.01 e richiedendo
una tolleranza 10−8 , sono necessarie 88 iterazioni per arrivare a ξ = 1.430969081115725849. Vediamo in
tabella, come cambia il numero delle iterazioni al variare di x 0 :
x0 0.05 0.1 0.5 0.8 1.0 1.4 1.5 2. 3. 10. 20. 100.
iterazioni 59 46 18 10 7 4 4 6 8 14 17 24

4.9 Metodo di Newton-Raphson per radici multiple


Definizione 4.9.1 Data un’equazione f (x) = 0, una radice ξ è multipla di molteplicità r se vale: f (ξ) = f 0 (ξ) =
. . . = f r −1 (ξ) = 0 e f r (ξ) 6= 0.

Quando si ha una radice multipla, il metodo di Newton-Raphson diventa un metodo del primo ordine in
quanto la formula che lega l’errore al passo n + 1 con l’errore al passo n diventa3 :
r −1
²n+1 = ²n
r
r −1
da cui la costante asintotica è M = . Per poter avere un metodo che sia di nuovo a convergenza
r
quadratica, occorre modificare l’algoritmo, ottenendo la formula di Newton-Raphson modificata, nel modo
seguente:

f (x n )
x n+1 = x n − r
f 0 (x n )

4.10 Controllo sugli scarti e grafici di convergenza


Da un punto di vista pratico, il controllo per verificare la convergenza o meno della successione x n ge-
nerata dallo schema iterativo viene effettuato sullo scarto d n = |x n − x n−1 | piuttosto che sull’errore (assolu-
3 Il procedimento da seguire è del tutto simile a quanto è stato fatto nell’ipotesi in cui f 0 (ξ) 6= 0. Come esercizio, si consiglia di provare
a ricavare questo risultato.

52
4.10. Controllo sugli scarti e grafici di convergenza

to) ²n = |ξ − x n |, poichè, se avessimo informazioni sull’errore, conosceremmo anche il valore di ξ (che, in


generale, non è noto).
Nel caso del metodo di Newton-Raphson, quando è di ordine 2, abbiamo visto che il controllo sullo scarto
va bene (si veda quanto detto a pag. 48).
Vediamo cosa succede per metodi lineari. Sia t ol l la tolleranza richiesta per approssimare ξ utilizzando
gli scarti. Sappiamo che, per n grande e se il metodo converge, vale la relazione

²n+1 ≈ M ²n

dove M < 1 è la costante asintotica.


Riscriviamo la precedente formula come:

|ξ − x n+1 | ≈ M |ξ − x n | = M |ξ − x n + x n+1 − x n+1 | ≤ M (|ξ − x n+1 | + |x n+1 − x n |)

Quindi

²n+1 ≤ M (²n+1 + d n+1 )


(1 − M )²n+1 ≤ Md n+1

Supponendo d n+1 ≤ t ol l , vale

M M
²n+1 ≤ d n+1 ≤ t ol l
1−M 1−M
M
Perciò, per < 1 (quindi per M < 1/2), se d n+1 ≤ t ol l anche ²n+1 ≤ t ol l . Se, invece, M ≥ 1/2, allora
1−M
l’errore può essere più grande della tolleranza richiesta.
Per quanto riguarda il metodo della secante variabile, poichè è superlineare, in base alla definizione,
²n+1 ≈ M n+1 ²n con M n+1 → 0, perciò si può vedere come un caso limite di convergenza lineare con fattore di
convergenza che tende a zero, e quindi il controllo dello scarto permette un buon controllo dell’errore.
Quando si implementa un metodo iterativo, si può fare il grafico semilogaritmico di convergenza del
metodo, ponendo sull’asse delle ascisse i valori delle iterazioni e sull’asse delle ordinate i logaritmi (in base
10) degli scarti.
Asintoticamente possiamo sostituire l’errore con lo scarto, nella definizione di ordine di convergenza di
p
un metodo, per cui d n ≈ Md n−1 .
Nel caso in cui p = 1, si ha:

d n ≈ Md n−1
d n−1 ≈ Md n−2
d n−2 ≈ Md n−3
....
..
d 2 ≈ Md 1
d 1 ≈ Md 0

Partendo dalla prima relazione abbiamo:

d n ≈ Md n−1 ≈ M 2 d n−2 ≈ M 3 d n−3 ≈ . . . ≈ M n d 0

Troviamo una relazione tra d n e d 0 . Passando ai logaritmi:

log10 (d n ) = n log10 (M ) + log10 (d 0 )

53
4. Z ERI DI FUNZIONE

Abbiamo un’equazione del tipo y = ax + b dove y = log10 (d n ) e x = n, che rappresenta l’equazione della retta
nel nostro grafico semilogaritmico, e la pendenza della retta vale a = log10 (M ). Dalla pendenza della retta
possiamo dunque risalire al valore della costante asintotica M .
Nel caso in cui p 6= 1 il discorso si fa più complicato (e non staremo qui ad analizzarlo nei dettagli). Per
esempio, per p = 2, si trova una curva che dipende da 2n .

Esempio
Esempio 4.10.1 In Figura 4.8, riportiamo un esempio di grafico con i profili di convergenza per i metodi
di Newton-Raphson, secante variabile e punto fisso per trovare lo zero della funzione f (x) = x + ln (x)
(applicando lo schema di punto fisso alla funzione g (x) = e −x ).

Figura 4.8: Profili di convergenza a confronto

4.11 Osservazioni sull’ordine di convergenza di un metodo iterativo


Abbiamo visto che, in generale, uno schema iterativo ha un certo ordine di convergenza, ma ci sono delle
eccezioni: ad esempio, il metodo di Newton-Raphson in genere è di ordine p = 2 ma se la radice è multipla
allora il metodo diventa lineare, e se la radice è un punto di flesso non orizzontale il metodo ha convergenza
cubica; analogamente nello schema di punto fisso, se g 0 (ξ) = 0 allora il metodo non è più lineare...
Se non abbiamo sufficienti informazioni sulla radice o sul punto fisso che vogliamo approssimare, come
facciamo a capire qual è l’ordine di convergenza del metodo iterativo? Una strada è vedere se l’approssima-
zione della costante asintotica usando gli scarti o la formula teorica che vale per l’ordine p che ci aspettiamo
abbia senso (cioè non tenda nè a zero nè a infinito ma ad un valore limite ben preciso – ciò che abbiamo
fatto negli esempi precedenti, si veda l’esempio 4.8.1). In tal casoa l’ordine p è effettivamente quello e le
formule utilizzate ci danno una stima della costante asintotica. Ma se l’approssimazione della costante asin-
totica fatta in questa maniera non va bene, c’è una strada più pratica da seguire per capire qual è l’ordine di
convergenza del metodo? Riprendiamo la definizione di ordine di convergenza di uno schema iterativo: se

54
4.11. Osservazioni sull’ordine di convergenza di un metodo iterativo

vale
|x n+1 − ξ|
lim =M
n→∞ |x n − ξ|p

con p ≥ 1 e M numero reale positivo allora p è l’ordine di convergenza e M la costante asintotica del metodo.
Utilizzando gli scarti come approssimazione dell’errore possiamo dire che, se p è l’ordine di convergenza,
allora, al limite per n che tende all’infinito, si ha

|x n+1 − x n | d n+1
→M ovvero → M.
|x n − x n−1 |p (d n )p
Partendo dall’iterazione 1 (lo scarto d 0 ha un significato fittizio e non lo usiamo) fino ad arrivare
all’iterazione n + 1, abbiamo le seguenti approssimazioni per M :

d2 d3 d4 dn d n+1
≈ M, ≈ M, ≈ M, ... ≈ M, ≈M
(d 1 )p (d 2 )p (d 3 )p (d n−1 )p (d n )p
Supponiamo di non conoscere quale sia il valore di p. Allora non possiamo andare a calcolare quei rapporti
tra gli scarti che abbiamo appena scritto! Sappiamo però che quei rapporti tendono allo stesso valore di M
(la costante asintotica). Perciò possiamo eguagliarli a due a due in modo da poter avere una relazione che ci
permetta di ricavare p:

d2 d3 d2 d3
≈M ≈ =⇒ ≈
(d 1 )p (d 2 )p (d 1 )p (d 2 )p
d3 d4 d3 d4
≈M ≈ =⇒ ≈
(d 2 )p (d 3 )p (d 2 )p (d 3 )p
....
..
dn d n+1 dn d n+1
≈M ≈ =⇒ ≈
(d n−1 )p (d n ) p (d n−1 ) p (d n )p
Da
d2 d3
p

(d 1 ) (d 2 )p
ricaviamo facilmente
µ ¶p
d 2 (d 1 )p d1
≈ =
d 3 (d 2 )p d2
e passando ai logaritmi si ha

d2
µ

log
d2 d1
µ ¶ µ ¶
d
log ≈ p log da cui p≈ µ 3¶
d3 d2 d1
log
d2
Lavorando allo stesso modo sugli altri rapporti che avevamo scritto abbiamo

d3 d n+1
µ ¶ µ ¶
log log
d d
p≈ µ 4 ¶, ... p ≈ µ n ¶
d2 dn
log log
d3 d n−1
Man mano che ci stiamo avvicinando a convergenza il valore di p tenderà ad un valore ben preciso, l’ordine
di convergenza del metodo. E, una volta trovato p, possiamo stimare M usando la formula del rapporto tra
gli scarti.

55
4. Z ERI DI FUNZIONE

Esempio
Esempio 4.11.1 Riprendiamo l’esempio 4.8.1 in cui abbiamo confrontato gli schemi di Newton-
Raphson e della Regula Falsi. Andiamo a rivedere i valori degli scarti e a stimare il valore di p usando la
formula appena scritta.

n d n (N-R) p (N-R) d n (R-F) p (R-F)


1 1.41452687E+00 5.E-02
2 6.29766079E-01 1.24070285E+00
3 1.40647107E-01 1.8526 8.55361810E-01 -0.11581
4 1.03024203E-02 1.7436 1.43968803E-01 4.7913
5 5.75004640E-05 1.9849 6.13774024E-02 0.47845
6 1.79436599E-09 1.9997 7.14459392E-03 2.5226
7 2.10317362E-04 1.6392
8 7.91146198E-07 1.5836
9 9.06448250E-11 1.6254

Osserviamo che per poter iniziare a stimare il valore approssimato ¶ di µp dobbiamo avere fatto almeno tre
d n+1 dn
µ ¶
iterazioni in modo da poter applicare la formula p ≈ log / log .
dn d n−1
Dalla tabella, osserviamo che, per il metodo di Newton Raphson, a parte un’iniziale oscillazione, il valore
di p tende a 2. Per il metodo della Regula Falsi invece si vede all’inizio un valore negativo (dovuto alla
scelta dei due valori iniziali x 0 e x 1 ), successivamente ci sono forti oscillazioni, infine, quando si sta
arrivando a convergenza, si hanno i valori di p = 1.6392, 1.5836, 1.6254. Ricordiamo che in questo caso
p = 1.618 e l’approssimazione finale che otteniamo è abbastanza buona.
Se, all’ultima iterazione, il valore dello scarto fosse zero o molto prossimo a zero (dell’ordine di 10−16 ,
la precisione di macchina) allora la stima dell’ordine di convergenza non si potrà fare usando questo
valore dello scarto (che altererebbe il risultato finale, dovendo praticamente fare una divisione per zero).
In tal caso ci si ferma alla stima al passo precendente.

4.12 Esercizi

Esercizio 4.12.1 Si vuole risolvere l’equazione x = g (x) con lo schema del punto fisso; sapendo che
g (x) = x 2 − 5x + 9
(a) calcolare analiticamente il valore del punto fisso;
(b) determinare il fattore di convergenza M dello schema del punto fisso;
(c) calcolare le approssimazioni x 1 , x 2 e x 3 partendo prima da x 0 = 1 e poi da x 0 = 2.5 e giustificandone
il diverso comportamento.

Svolgimento
(a) ξ è punto fisso della funzione g se verifica g (ξ) = ξ.
Imponiamo dunque la condizione g (ξ) = ξ. Ricaviamo ξ2 − 5ξ + 9 = ξ, ovvero ξ2 − 6ξ + 9 = 0, cioè
(ξ − 3)2 = 0, da cui ξ = 3 è punto fisso della g .
(b) Il fattore di convergenza è M = g 0 (ξ).
Poichè g 0 (x) = 2x − 5, si ha g 0 (ξ) = g 0 (3) = 1.
Osserviamo che, a priori, non si può dire se lo schema del punto fisso converge o meno proprio
perchè nel punto fisso la derivata prima vale esattamente 1, ma bisogna vedere caso per caso a seconda
del punto iniziale da cui si fa partire il metodo.

56
4.12. Esercizi

Figura 4.9: Esercizio sullo schema di punto fisso

Per x 0 = 1 si ha Per x 0 = 2.5 si ha


k x k g (x k ) k xk g (x k )
0 1 5 0 2.5 2.75
(c)
1 5 9 1 2.75 2.8125
2 9 45 2 2.8125 2.84765625
3 45 1809 3 2.84765625 2.870864868
Per x 0 = 1 il metodo non converge, mentre per x 0 = 2.5 il metodo converge. La diversità di com-
portamento si giustifica graficamente, come si può vedere dalla Figura 4.9, osservando che per x 0 = 1 i
valori ottenuti dallo schema si allontanano sempre più dal punto fisso. Nel secondo caso, al contrario,
i valori si avvicinano con monotonia al punto fisso.

Esercizio 4.12.2 Si vuole risolvere l’equazione f (x) = 0 con f (x) = (x − 1)2 + 3 ln (x), nell’intervallo [0.5, 2]
con gli schemi di Newton-Raphson e della Regula Falsi.
(a) Dimostrare esistenza e unicità della soluzione nell’intervallo considerato.
(b) Calcolare le approssimazioni x 1 , x 2 e x 3 con lo schema di Newton-Raphson, partendo da x 0 = 0.5;
(c) Calcolare le approssimazioni x 2 e x 3 con lo schema della Regula-Falsi partendo da x 0 = 0.5 e x 1
calcolato al punto b).
Stimare, inoltre il fattore di convergenza del metodo di Newton-Raphson assumendo ξ ≈ x 3 .

Svolgimento
(a) La funzione ammette valori opposti all’estremo dell’intervallo. Infatti f (0.5) = −1.82944154 e f (2) =
3.07944154. Quindi, per il teorema del valor intermedio, esiste almeno una radice. Inoltre f 0 (x) = 2(x −
3 2x 2 − 2x + 3
1) + = è sempre positivo nell’intervallo dato, (la parabola 2x 2 − 2x + 3 ha discriminante
x x
negativo e quindi è sempre positiva). Perciò, da f 0 (x) > 0 concludiamo che la f è crescente. Di qui
l’unicità della radice.
(b) Partendo da x 0 = 0.5, il metodo di Newton-Raphson fornisce i seguenti valori:

57
4. Z ERI DI FUNZIONE

k xk f (x k ) f 0 (x k )
0 0.50000000E+00 -0.18294415E+01 0.50000000E+01
1 0.86588831E+00 -0.41401211E+00 0.31964267E+01
2 0.99541173E+00 -0.13775443E-01 0.30046517E+01
3 0.99999643E+00
Dalla tabella sembra che i valori della successione tendano a 1. E, infatti, si vede facilmente che
f (1) = 0 e quindi 1 è il valore che stiamo cercando. Per stimare la costante asintotica dell’errore del
metodo di Newton-Raphson assumendo ξ ≈ x 3 , occorre usare la formula
| f 00 (x 3 )|
M≈
2| f 0 (x 3 )|
3 3
dove, nel caso specifico, vale f 0 (x) = 2(x − 1) + e f 00 (x) = 2 − 2 .
x x
Usando il valore trovato per x 3 si ricava M ≈ 0.16667004E + 00.
(c) Partendo da x 0 e x 1 del metodo di Newton-Raphson, la Regula Falsi dà:
f (x n ) − f (x n−1 )
k xk f (x k )
x n − x n−1
0 0.50000000E+00 -0.18294415E+01 -
1 0.86588831E+00 -0.41401211E+00 0.38684741E+01
2 0.97291038E+00 -0.81656072E-01 0.31054906E+01
3 0.99920448E+00

Esercizio 4.12.3 Provare, anche solo graficamente, che l’equazione


f (x) = sin (x) + x − 1 = 0
ammette una sola radice ξ nell’intervallo [0, 1].
(a) Dire se lo schema del punto fisso con g (x) = arcsin (1 − x) può convergere.
(b) Partendo da x 0 = 0.1 calcolare le approssimazioni x 1 , x 2 e x 3 con lo schema di Newton-Raphson;
(c) Dare una stima del fattore di convergenza.

Svolgimento
Graficamente, da f (x) = 0 si ha sin (x) = 1 − x. Se si studia l’intersezione delle due curve, sin (x) e 1 − x
nell’intervallo [0, 1], si può osservare una sola intersezione, cioè una sola radice della f (fare il grafico delle
due funzioni).
Analiticamente, la funzione f (x) assume valori di segno opposto agli estremi dell’intervallo dato:
f (0) = sin (0) + 0 − 1 = −1
f (1) = sin (1) + 1 − 1 = 0.8414709848
La derivata prima della f è f 0 = cos (x)+1: è funzione continua e sempre positiva nell’intervallo [0, 1]. Quindi
f è una funzione crescente e interseca l’asse delle x solo una volta in [0, 1], vale a dire ammette un’unica
radice.
(a) Da f (x) = 0 si ha sin (x) + x − 1 = 0 o, equivalentemente, sin (x) = 1 − x, da cui x = arcsin (1 − x).
Consideriamo perciò lo schema del punto fisso con g (x) data da g (x) = arcsin (1 − x). La derivata di
1
g (x) è g 0 (x) = p .
1 − (1 − x)2
Nell’intervallo [0, 1] valgono le seguenti disuguaglianze:
0 ≤ x ≤ 1 =⇒ 0 ≥ −x ≥ −1 =⇒ 1 ≥ 1 − x ≥ 0 =⇒
=⇒ 1 ≥ (1 − x)2 ≥ 0 =⇒ −1 ≤ −(1 − x)2 ≤ 0 =⇒ 0 ≤ 1 − (1 − x)2 ≤ 1 =⇒
p 1
=⇒ 0 ≤ 1 − (1 − x)2 ≤ 1 =⇒ 1 ≤ p
1 − (1 − x)2
Perciò g 0 (x) è sempre maggiore di 1 e lo schema del punto fisso non può convergere.

58
4.12. Esercizi

(b) Da f (x) = sin (x) + x − 1 si ha f 0 (x) = cos (x) + 1 e f 00 (x) = − sin (x). Il metodo di Newton-Raphson è:

sin (x) + x − 1
x k+1 = x k − .
cos (x) + 1

Utilizziamo la notazione M 1 e M 2 per indicare la stima della costante asintotica dell’errore mediante le
formule

|x k+1 − x k | | f 00 (x k )|
M1 = o M2 =
|x k − x k−1 |2 2| f 0 (x k )|

Partendo da x 0 = 0.1 si ottengono i seguenti valori:


k xk f (x k ) f 0 (x k ) |x k − x k−1 |
0 0.1 -0.80016658E+00 0.19950042E+01 -
1 0.50108517E+00 -0.18537249E-01 0.18770618E+01 0.40108517E+00
2 0.51096084E+00 -0.23565955E-04 0.18722750E+01 0.98756733E-02
3 0.51097343E+00 -0.38737166E-10 - 0.12586802E-04
(c) La stima del fattore di convergenza è dato da M 1 = 0.12905712E+00 o da M 2 = 0.13059731E+00, a
seconda della strada scelta per dare la stima.

Esercizio 4.12.4 Data l’equazione f (x) = ln (x) + x 2 − x = 0,


(a) si provi, anche solo graficamente, che l’equazione ammette l’unica radice ξ = 1 nell’intervallo
[0.7, 2.3];
(b) si applichino due iterazioni del metodo dicotomico (o delle bisezioni) a partire dall’intervallo dato,
chiamando con x 0 l’ultimo valore ottenuto con tale metodo;
(c) a partire da x 0 del punto (b) si calcoli l’approssimazione x 1 con il metodo di Newton-Raphson;
(d) a partire da x 0 e x 1 del punto (c) si calcolino le approssimazioni x 2 e x 3 con il metodo della Regula
Falsi;
(e) considerata la radice esatta ξ = 1, si calcoli la costante asintotica di convergenza del metodo della
Regula Falsi.

Svolgimento
(a) Da f (x) = 0 si ricava ln (x) = x − x 2 , per cui graficamente si può vedere che le due curve si intersecano
in un solo punto, che vale ξ = 1.
Analiticamente, invece, la funzione f (x) assume valori di segno opposto agli estremi dell’intervallo
dato:

f (0.7) = −0.566674943938732
f (2.3) = 3.8229091229351

Inoltre f è continua, quindi ammette almeno una radice nell’intervallo dato. La derivata prima è:
1 1 + 2x 2 − x
f 0 (x) = + 2x − 1, che possiamo anche scrivere come f 0 (x) = : numeratore e denominatore
x x
2
sono entrambi sempre positivi nell’intervallo dato, (la parabola 2x − x + 1 ha discriminante negativo
∆ = −7, di conseguenza, per ogni x reale si ha 2x 2 − x + 1 > 0). Da f 0 (x) > 0 per ogni x segue che f è
crescente e, quindi, ammette un’unica radice.
(b) Applichiamo il metodo delle bisezioni a partire dall’intervallo dato (utilizziamo la notazione x s per
indicare l’estremo sinistro dell’intervallo, x d per indicare l’estremo destro dell’intervallo, x c , il punto
medio dell’intervallo considerato):

59
4. Z ERI DI FUNZIONE

iter. x s f (x s ) segno xd f (x d ) segno xc f (x c )


1 0.7 -0.566674944 - 2.3 3.822909123 + 1.5 1.155465108
2 0.7 -0.566674944 - 1.5 1.155465108 + 1.1 0.205310180
Il valore x 0 è dunque x 0 = 1.1.
f (x k )
(c) Il metodo di Newton-Rapshon è x k+1 = x k − dove f 0 = 1/x +2x −1. Partendo da x 0 = 1.1, si ricava
f 0 (x k )
0.20531018
x 1 = 1.1 − = 1.002654656
2.1090909
(d) Applicando il metodo della Regula Falsi si ha:
f (x k ) − f (x k−1 )
k xk f (x k )
x k − x k−1
1 1.002654656 0.5312842078E-02 0.2054513650E+01
2 1.000068720 0.1374413812E-03 0.2001364094E+01
3 1.000000046
(e) Considerato che la radice esatta è ξ = 1, la costante asintotica di convergenza della Regula Falsi si cal-
f 00 (ξ) 1 1
cola utilizzando l’espressione M = | 0 |0.618 . Da f 0 (x) = + 2x − 1 segue f 0 (1) = 2 e f 00 (x) = − 2 + 2,
2 f (ξ) x x
1 0.618
da cui f 00 (1) = 1, per cui M = = 0.4245481.
4

60
C APITOLO 5
Interpolazione

Non vi è alcuna incompatibilità fra


l’esatto e il poetico. Il numero è
nell’arte come nella scienza.
L’algebra è nell’astronomia e
l’astronomia confina con la poesia.
L’anima dell’uomo ha tre chiavi che
aprono tutto: la cifra, la lettera, la
nota. Sapere, pensare, sognare.

Victor Hugo

5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.1 Funzioni base monomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.2 Polinomi di Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.3.3 Formula dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.3.4 Differenze divise e formula di Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.4 Considerazioni sull’interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4.1 Fenomeno di Runge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4.2 Malcondizionamento nell’interpolazione con funzioni base monomiali . . . . . . . . . . 73
5.5 Interpolazione polinomiale a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.1 Interpolazione lineare a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.5.2 Interpolazione spline cubica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.5.3 Curve parametriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

5.1 Introduzione
Il censimento della popolazione italiana, dall’unità d’Italia al 2001, ha visto un incremento della
popolazione, come si può vedere in Tabella 5.1. Gli stessi dati sono riportati in Figura 5.1.
Ci si può chiedere se questi dati possono essere utili (considerandoli tutti o solo una parte) per dare una
ragionevole stima della popolazione nel 1975 o nel 1995 o per predire a quanto ammonterà nel 2015. Per far
ciò, possiamo seguire due strade:
G cercare una funzione che passi esattamente per i dati assegnati (detti anche punti di appoggio): questo
procedimento prende il nome di interpolazione ed è il soggetto di questo Capitolo;
G cercare una funzione che, “in qualche modo” passi vicino ai dati assegnati: si parla di approssimazione
(che vedremo nel prossimo Capitolo).

61
5. I NTERPOLAZIONE

Anno 1861 1871 1881 1901 1911 1921 1931


Popolazione 22176 27300 28952 32963 35842 39397 41043

Anno 1936 1951 1961 1971 1981 1991 2001


Popolazione 42398 47516 50624 54137 56557 56778 56996
Tabella 5.1: Dati forniti dall’ISTAT, tratti da http://dawinci.istat.it/daWinci/jsp/dawinci.
jsp: popolazione residente dell’Italia ai confini ai confini attuali ai censimenti dal 1861 al 2001. Popolazione
in migliaia.

Figura 5.1: Censimento della popolazione residente in Italia.

In particolare, dato l’insieme dei punti (x i , y i ), i = 0, 1, . . . , n, dove y i è il valore assunto da una funzione f
in x i o il valore di un dato sperimentale, cerchiamo una funzione v(x) che, in maniera ragionevole si addica
all’insieme dei dati. Se i dati sono accurati, ha senso richiedere che la funzione interpoli i dati (cioè passi
esattamente per le coppie di punti): v(x i ) = y i . Nell’approssimazione, invece, si cerca una funzione più
semplice v(x) che sia vicina ad una funzione più complicata f (x) o ad una serie di dati.

5.2 Interpolazione
Una funzione di interpolazione v(x) serve per vari scopi.
G Possiamo usare la v(x) per trovare valori approssimati y in punti x diversi da quelli assegnati
x 0 , x 1 , . . . x n . Se x si trova all’interno dell’intervallo che contiene le ascisse dei dati assegnati si parla
di interpolazione. Se invece x si trova all’esterno dell’intervallo si ha estrapolazione. Nell’esempio della
popolazione italiana, si interpolano i dati per stimare la popolazione nel 1975 o nel 1995, si applica
invece un procedimento di estrapolazione se si vuole stimare la popolazione del 2012.
G
Se le coppie di dati assegnati si riferiscono ad una funzione f (x), la funzione di interpolazione può
essere utile per approssimare le derivate o gli integrali della f .
Assumiamo che la funzione v di interpolazione sia una combinazione lineare di funzioni base di un
qualche appropriato spazio di funzioni, cioè si possa scrivere come

v(x) = c 0 φ0 (x) + . . . + c n φn (x)

62
5.3. Interpolazione polinomiale

dove c i , i = 0, 1, . . . , n sono i coefficienti incogniti (o parametri) da determinare in base ai dati in possesso,


mentre φi sono le funzioni base che assumiamo linearmente indipendenti1 .
Esempi di interpolazione sono dati dall’interpolazione polinomiale, dall’interpolazione polinomiale a
tratti, dall’interpolazione trigonometrica. Noi ci limitiamo a studiare l’interpolazione polinomiale: date n + 1
coppie di punti (x i , y i ), per i = 0, 1, . . . , n, andremo a cercare un polinomio p(x) di grado n per cui p(x i ) = y i .
Parleremo, dunque, di polinomio di interpolazione p(x) (v(x) ≡ p(x)).
Il processo di interpolazione si basa su due stadi:
G costruire la funzione interpolante, cioè determinare i coefficienti c 0 , c 1 , . . . , c n per un’assegnata base
φ0 , φ1 , . . . , φn ;
G valutare la funzione interpolante in un assegnato punto x.
Il primo punto è fatto una volta per tutte, una volta fissata la base e noto l’insieme dei punti da interpolare. Il
secondo punto può essere applicato tutte le volte che si vuole valutare la funzione interpolante.

5.3 Interpolazione polinomiale


L’interpolazione polinomiale è il tipo di interpolazione più semplice. I polinomi, infatti, sono facili da
costruire e da valutare, sono facili da sommare e moltiplicare (e il risultato è sempre un polinomio) e sono
altrettanto facili da differenziare e integrare (e il risultato è sempre un polinomio).
Sia p(x) = p n (x) un polinomio di grado n dato da

p n (x) = c 0 + c 1 x + . . . + c n x n

Date n + 1 coppie di punti (x 0 , y 0 ), (x 1 , y 1 ), . . ., (x n , y n ), vogliamo trovare gli n + 1 coefficienti c 0 , c 1 , . . . c n


tali che p(x i ) = y i , i = 0, . . . , n.
Ricordiamo che, un polinomio di grado n ha n+1 coefficienti e che, date n+1 coppie di punti, il polinomio
interpolatore sarà di grado n.
Assumiamo, inoltre, che le ascisse delle coppie dei punti siano distinte, cioè x i 6= x j , per i 6= j .

5.3.1 Funzioni base monomiali


Utilizziamo come funzioni base i monomi x 0 , x 1 , x 2 , . . . , x n .

Esempio
Esempio 5.3.1 Sia n + 1 = 2: abbiamo quindi due coppie di dati

xi 1 2
yi 1 3

Cerchiamo quindi un polinomio di primo grado (una retta) che passi per i punti assegnati, della forma
p(x) = p 1 (x) = c 0 + c 1 x.
Le condizioni di interpolazione diventano:

p 1 (x 0 ) = y 0 ⇐⇒ c 0 + 1c 1 = 1
p 1 (x 1 ) = y 1 ⇐⇒ c 0 + 2c 1 = 3

Abbiamo due equazioni in due incognite c 0 e c 1 . Risolvendo il sistema 2 × 2 otteniamo c 1 = 2 e c 0 = −1,


quindi p 1 (x) = 2x − 1.

1 Le funzioni φ , φ , . . . , φ si dicono linearmente indipendenti se vale: c φ (x) + . . . c φ (x) ≡ 0 per ogni x se e solo se tutti i
0 1 n 0 0 n n
coefficienti sono nulli c 0 = . . . = c n = 0.

63
5. I NTERPOLAZIONE

Figura 5.2: Interpolazione lineare e quadratica

Esempio
Esempio 5.3.2 Consideriamo adesso un ulteriore coppia di punti per cui i dati che abbiamo sono n+1 =
3e
xi 1 2 4
yi 1 3 3

Il problema è ora diverso rispetto a quello appena risolto, perchè la terza coppia di punti specifica una
valore y 2 ben diverso da quello predetto da p 1 in x 2 = 4. Difatti p 1 (x 2 ) = 7, nell’esempio precedente,
mentre ora al valore di x 2 = 4 deve corrispondere y 2 = 3.
Cerchiamo il polinomio di grado 2, quindi, della forma p 2 (x) = c 0 + c 1 x + c 2 x 2 che passa attraverso i
punti dati.
Le condizioni di interpolazione adesso sono:

p 2 (x 0 ) = c 0 + 1c 1 + 1c 2 = 1

p 2 (x 1 ) = c 0 + 2c 1 + 4c 2 = 3

p 2 (x 2 ) = c 0 + 4c 1 + 16c 2 = 3

Abbiamo un sistema lineare di 3 equazioni in 3 incognite, la cui soluzione è:

7 2
c 0 = − , c 1 = 4, c 2 = − .
3 3
11
Il polinomio è p 2 (x) = (−2x 2 + 12x − 7)/3. Per x = 3 si ha p 2 (3) =
= 3.666666667, valore ben diverso
3
da p 1 (3) = 5. Del resto le curve che abbiamo ottenuto coincidono solo nei punti d’appoggio comuni a
entrambe, una è una retta, l’altra è un polinomio di secondo grado (si veda Figura 5.2).

Generalizzando gli esempi precedenti, date n + 1 coppie di punti, il polinomio di interpolazione di grado

64
5.3. Interpolazione polinomiale

n sarà costruito risolvendo un sistema lineare di n equazioni nelle n incognite c 0 , c 1 , . . . , c n :



p n (x 0 ) = y 0 ⇐⇒ c 0 + c 1 x 0 + c 2 x 02 + . . . + c n x 0n = y 0


p (x ) = y 1 ⇐⇒ c 0 + c 1 x 1 + c 2 x 12 + . . . + c n x 1n = y 1


 n 1



p n (x 2 ) = y 2 ⇐⇒ c 0 + c 1 x 2 + c 2 x 22 + . . . + c n x 2n = y 2

 ..
.





p (x ) = y ⇐⇒ c + c x + c x 2 + . . . + c x n = y

n n n 0 1 n 2 n n n n

In forma compatta, sotto forma matriciale2 le equazioni del sistema si possono scrivere come

1 x 0 x 02 . . . x 0n    
 
c0 y0
1 x
 1 x 12 . . . x 1n 
 c   y 
1 x x 22 . . . x 2n   1  1
 2  .  =  . 
 ..   .. 
. .. .. ..  
   
.
. . . . 
cn yn
1 x n x n2 . . . x nn

La matrice dei coefficienti è una matrice ben nota in letteratura e prende il nome di matrice di Van-
dermonde.3 È una matrice con determinante diverso da zero, e quindi il sistema ammette una ed una sola
soluzione. Osserviamo che la prima colonna ha tutti gli elementi uguali a 1, la seconda colonna ha le ascisse
dei punti di appoggio, la terza colonna ha i quadrati di esse, e così via.

Perciò, date n+1 coppie di punti di appoggio (x i , y i ), i = 0, . . . , n, con ascisse distinte


x i , esiste un unico polinomio interpolatore p(x) di grado al più n tale che p(x i ) = y i ,
i = 0, . . . , n.

Tuttavia, la matrice di Vandermonde non ha buone proprietà: difatti è una matrice malcondizionata, e
questo lo si osserva al crescere di n in quanto la soluzione del sistema diventa inaccurata4 , qualunque metodo
venga utilizzato per risolverlo.
Questo approccio ci è servito per dimostrare che il polinomio di interpolazione esiste ed è unico, ma
non è utile nella pratica a causa del malcondizionamento. Sarebbe preferibile, quindi, poter usare funzioni
base diverse dai monomi in modo da evitare il malcondizionamento, avere meno operazioni dal punto di
vista computazionale e poter manipolare in maniera più efficiente le funzioni basi φi in vista di una loro
applicazione nella differenziazione e integrazione numerica.

5.3.2 Polinomi di Lagrange


Scriviamo il polinomio p(x) con i coefficienti c i uguali alle ordinate dei punti d’appoggio y i , c i ≡ y i :

p(x) = p n (x) = y 0 φ0 (x) + . . . y n φn (x)

Una base di funzioni che ci permette una simile rappresentazione è data dai polinomi di Lagrange.5
I polinomi di Lagrange L j (x), per j = 0, 1, . . . , n sono polinomi di grado n che, nei nodi x i , soddisfano la
relazione
(
0 se i 6= j
L j (x i ) =
1 se i = j
2 Questo argomento verrà approfondito nel Capitolo 7, dove rimandiamo per i dettagli.
3 Alexandre-Theophile Vandermonde, (1735-1796), abbandonò una carriera da violinista per dedicarsi alla matematica quando
aveva 35 anni. Si occupò di vari problemi di algebra, di topologia, calcolo combinatoriale, e teoria dei determinanti.
4 Una matrice A è malcondizionata quando, a piccole variazioni sui coefficienti della matrice, corrispondono grandi variazioni nella
soluzione del sistema lineare Ax = b
5 Joseph Louis Lagrange (1736-1813) nacque a Torino (come Giuseppe Luigi Lagrangia) e si trasferì in Francia, a Parigi, dove diven-
ne cittadino francese adottando la traduzione francese del suo nome. Matematico e astronomo, diede un importante contributo alla
meccanica classica e celeste e alla teoria dei numeri.

65
5. I NTERPOLAZIONE

Allora il polinomio p n (x) = nj=0 L j (x) · y j è tale che p n (x i ) = y i cioè soddisfa la condizione di
P

interpolazione, per ogni i = 0, . . . , n.


I polinomi di Lagrange sono definiti dalla relazione:6
n (x − x )
Y k
L j (x) =
k=0 (x j − x k)
k6= j

In forma estesa abbiamo


(x − x 0 ) · · · (x − x j −1 )(x − x j +1 ) · · · (x − x n ) n x −x
Y k
L j (x) = =
(x j − x 0 ) · · · (x j − x j −1 )(x j − x j +1 ) · · · (x j − x n ) k=0 x j − x k
k6= j

Esempio
Esempio 5.3.3 Siano date le tre coppie di punti dell’esempio precedente (1, 1), (2, 3), (4, 3). I polinomi di
Lagrange sono:

(x − 2)(x − 4) (x − 2)(x − 4)
L 0 (x) = =
(1 − 2)(1 − 4) 3
(x − 1)(x − 4) (x − 1)(x − 4)
L 1 (x) = =−
(2 − 1)(2 − 4) 2
(x − 1)(x − 2) (x − 1)(x − 2)
L 2 (x) = =
(4 − 1)(4 − 2) 6

Il polinomio si scrive, quindi, come


1 3 3
p 2 (x) = L 0 (x) · 1 + L 1 (x) · 3 + L 2 (x) · 3 = (x − 2)(x − 4) − (x − 1)(x − 4) + (x − 1)(x − 2)
3 2 6

Raccogliendo i termini ritroviamo p 2 (x) = (−2x 2 + 12x − 7)/3, lo stesso polinomio ottenuto con le
funzioni base monomiali, e ciò è dovuto all’unicità del polinomio interpolatore.

5.3.3 Formula dell’errore


Formula
dell’errore Supponiamo, ora, che le ordinate y i siano i valori di una funzione f continua in un intervallo [a, b] (e
con le derivate fino all’ordine n + 1 continue) valutata nei punti di appoggio x i . Per ipotesi, i punti x i siano
distinti tra loro. Conosciamo, quindi, una funzione f e di questa funzione vogliamo fare l’interpolazione
sostituendola mediante un polinomio di grado n tale che p(x i ) = f (x i ) = y i , i = 0, . . . , n.
In queste ipotesi, l’errore che si commette interpolando la funzione f con un polinomio p(x) di grado n
vale

f (n+1) (ξ(x)) Y
n
f (x) − p(x) = (x − x i )
(n + 1)! i =0

dove ξ(x) è un punto, che non conosciamo e che dipende da x, che si trova all’interno dell’intervallo [a, b].
6 Ricordiamo che, dati n valori w , w , . . . , w usiamo la seguente simbologia per indicare la loro somma e il loro prodotto, rispetti-
1 2 n
vamente:
n
X n
Y
wi = w1 + w2 + w3 + . . . + wn wi = w1 · w2 · w3 · . . . · wn
i =1 i =1
.

66
5.3. Interpolazione polinomiale

Figura 5.3: Polinomi di Lagrange L 0 (x), L 1 (x), L 2 (x), con x 0 = 1, x 1 = 2, x 2 = 4.

Proviamo questo risultato introducendo il polinomio F (x) di grado n +1 che si annulla


nelle n + 1 ascisse dei dati assegnati.

n
Y
F (x) = (x − x k )
k=0

Consideriamo, inoltre, un punto t distinto dai punti di appoggio e compreso nel-


l’intervallo I individuato dai valori minimo e massimo delle ascisse dei punti di
appoggio.
f (t ) − p(t )
Definiamo la quantità S che dipende da t , data da S = e la funzione G(x) = f (x) − p(x) −
F (t )
SF (x).
La funzione G si annulla non solo negli n +1 punti d’appoggio poichè G(x i ) = f (x i )− p(x i )−SF (x i ) = 0
per i = 0, . . . , n ma anche in t a causa di come è stato definito S. Si annulla, quindi, in n + 2 punti.
Per il teorema di Rolle, la derivata prima si annulla n+1 volte in I . Applicando ripetutamente il teorema
di Rolle sulle derivate successive, si arriva alla derivata n +1-sima di G, che si annulla almeno 1 volta in
I . Sia ξ il punto in cui G (n+1) (ξ) = 0. Maa

G (n+1) (ξ) = f (n+1) (ξ) − S(n + 1)!

Si ha perciò:

f (t ) − p(t ) f (n+1) (ξ)


f (n+1) (ξ) − S(n + 1)! = 0 ovvero =S =
F (t ) (n + 1)!

Considerando, ora, x al posto di t , e scrivendo ξ come funzione di x (in quanto il valore di ξ dipende
da x) e scrivendo in forma estesa il polinomio F (x), otteniamo

f (n+1) (ξ(x)) Y
n
f (x) − p(x) = (x − x i )
(n + 1)! i =0
a La derivata n + 1-sima di un polinomio di grado n è una quantità nulla, mentre la derivata n + 1-sima di un polinomio di
grado n + 1, quale è F (x), vale (n + 1)!.
67
5. I NTERPOLAZIONE

Abbiamo quindi una formula per l’errore, detta anche formula del resto. Il resto normalmente è incognito
ma se conosciamo la f e una maggiorazione della f (n+1) , allora possiamo maggiorare il resto.
Allo stesso modo, possiamo limitare l’errore di interpolazione se troviamo un limite superiore per |F (x)|.

5.3.4 Differenze divise e formula di Newton


Differenze
divise e Uno dei punti forti della rappresentazione di Lagrange è che se alcuni dati cambiano (ad esempio il valore
formula di
Newton di y j per un certo j ) allora il cambiamento è immediatamente visibile nell’intero polinomio di interpolazione.
Uno dei punti deboli, invece, è la procedura per valutare p n (x). Con la formula di Newton abbiamo un utile
compromesso.
Le funzioni base che ora consideriamo sono
jY
−1
φ j (x) = (x − x i ) j = 0, 1, . . . , n
i =0

Quindi vogliamo scrivere il polinomio di interpolazione come:

p(x) = c 0 + c 1 (x − x 0 ) + c 2 (x − x 0 )(x − x 1 ) + . . . + c n (x − x 0 )(x − x 1 ) · . . . (x − x n−1 )

dove c 0 , c 1 . . . c n sono delle costanti da definire in modo opportuno.

Esempio
Esempio 5.3.4 Consideriamo sempre le tre coppie di punti degli esempi precedenti, (1, 1), (2, 3) e (4, 3).
Per costruire p 2 (x) abbiamo bisogno di φ0 , φ1 e φ2 :

φ0 (x) = 1
φ1 (x) = (x − x 0 ) = (x − 1)
φ2 (x) = (x − x 0 )(x − x 1 ) = (x − 1)(x − 2)

La condizione di interpolazione in x 0 = 1 porta a:

f (x 0 ) = 1 = p 2 (x 0 ) = p 2 (1) = c 0 φ0 (1) + c 1 φ1 (1) + c 2 φ2 (1) = c 0 · 1 + c 1 · 0 + c 2 · 0

Quindi c 1 = 1 = f (x 0 ).
In x 1 = 2 abbiamo:

f (x 1 ) = 3 = p 2 (x 1 ) = p 2 (3) = f (x 0 ) + c 1 φ1 (2) + c 2 φ2 (2) = f (x 0 ) + c 1 · 1 + c 2 · 0

f (x 1 ) − f (x 0 ) 3−1
Ricaviamo quindi c 1 = = = 2. Chiamiamo questa quantità differenza divisa del
x1 − x0 2−1
primo ordine tra x 0 e x 1 e la indichiamo con f [x 0 , x 1 ]. Quindi

f (x 1 ) − f (x 0 )
f [x 0 , x 1 ] =
x1 − x0

Infine,

f (x 2 ) = 3 = p 2 (x 2 ) = p 2 (4) = f (x 0 ) + f [x 0 , x 1 ]φ1 (4) + c 2 φ2 (4)


= f (x 0 ) + f [x 0 , x 1 ](4 − 1) + c 2 (4 − 1)(4 − 2)

Per ottenere una formula per c 2 che abbia carattere generale, riscriviamo l’equazione precedente
utilizzando i simboli x 0 , x 1 , x 2 per le ascisse.

68
5.3. Interpolazione polinomiale

In x 1 si ha f (x 1 ) = p 2 (x 1 ) = f (x 0 ) + f [x 0 , x 1 ](x 1 − x 0 ).
In x 2 si ha f (x 2 ) = p 2 (x 2 ) = f (x 0 ) + f [x 0 , x 1 ](x 2 − x 0 ) + c 2 (x 2 − x 0 )(x 2 − x 1 ).
Sottraendo membro a membro la prima equazione dalla seconda si ricava:

f (x 2 ) − f (x 1 ) = f [x 0 , x 1 ](x 2 − x 0 − x 1 + x 0 ) + c 2 (x 2 − x 0 )(x 2 − x 1 )
f (x 2 ) − f (x 1 ) = f [x 0 , x 1 ](x 2 − x 1 ) + c 2 (x 2 − x 0 )(x 2 − x 1 )

Quindi

f (x 2 ) − f (x 1 ) − f [x 0 , x 1 ](x 2 − x 1 ) = c 2 (x 2 − x 0 )(x 2 − x 1 )
f (x 2 ) − f (x 1 ) x2 − x1
− f [x 0 , x 1 ] = c 2 (x 2 − x 0 )
x2 − x1 x2 − x1
f (x 2 ) − f (x 1 )
− f [x 0 , x 1 ] = c 2 (x 2 − x 0 )
x2 − x1

f (x 2 ) − f (x 1 )
Ma = f [x 1 , x 2 ] è la differenza divisa del primo ordine tra x 1 e x 2 da cui
x2 − x1

f [x 1 , x 2 ] − f [x 0 , x 1 ]
f [x 1 , x 2 ] − f [x 0 , x 1 ] = c 2 (x 2 − x 0 ) =⇒ c 2 =
x2 − x0

La quantità chiamata c 2 prende il nome di differenza divisa del secondo ordine e si indica con

f [x 1 , x 2 ] − f [x 0 , x 1 ]
f [x 0 , x 1 , x 2 ] = .
x2 − x0

4 2
Facendo le opportune sostituzioni si ricava c 2 = − = − . Quindi, p 2 (x) = f (x 0 ) + f [x 0 , x 1 ](x − x 0 ) +
6 3
2
f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ) Nell’esempio considerato: p 2 (x) = 1 + 2(x − 1) − (x − 1)(x − 2)
3
Date le stesse coppie di punti, abbiamo visto come cambia la rappresentazione (usando come funzioni
base i monomi, poi i polinomi di Lagrange e ora la formulazione di Newton) ma il polinomio finale è sempre
lo stesso essendo unico il polinomio interpolatore.
Da questo esempio, si può vedere come la rappresentazione secondo Newton sia di tipo ricorsivo: il po-
linomio p 1 (x) = f (x 0 ) + f [x 0 , x 1 ](x − x 0 ) (che si ha arrestandosi ai primi due passi del procedimento appena
effettuato) è un polinomio, in tal caso una retta, che interpola i dati (x 0 , y 0 ), e (x 1 , y 1 ). Il polinomio p 2 (x) è da-
to dalla somma di p 1 (x) e del termine f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ). Quindi, una volta determinato il polinomio
p n−1 che interpola i primi n dati, possiamo usare questa rappresentazione per costruire p n che interpola i
dati precedenti cui si aggiunge la coppia (x n , y n ).
Il coefficiente c j del polinomio interpolatore di Newton si chiama differenza divisa di ordine j e viene
indicata con f [x 0 , x 1 , . . . , x j ].
Perciò:

f [x 0 ] = c 0 , f [x 0 , x 1 ] = c 1 , . . . , f [x 0 , x 1 , . . . , x n ] = c n

La notazione utilizzata ci permette di capire anche da quali coppie di punti dipende il coefficiente c j .

69
5. I NTERPOLAZIONE

Dati i punti x 0 , x 1 , . . . , x n , per indici i e j arbitrari con 0 ≤ i ≤ j ≤ n, si ha

f [x i ] = f (x i )
f [x i +1 , . . . x j ] − f [x i , . . . , x j −1 ]
f [x i , . . . , x j ] =
x j − xi

La formula interpolatoria alle differenze divise di Newton è dunque data da

p n (x) = f [x 0 ] + f [x 0 , x 1 ](x − x 0 ) + f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ) + . . .


+ f [x 0 , x 1 , . . . , x n ](x − x 0 )(x − x 1 ) · · · (x − x n−1 )

Da un punto di vista computazionale i coefficienti si ricavano mediante la tabella delle differenze di-
vise, tenendo presente che per calcolare f [x 0 , x 1 , . . . , x n ] dobbiamo aver calcolato tutte le differenze divise
f [x j −k , . . . , x j ], con 0 ≤ k ≤ j ≤ n.

xi f [·] f [·, ·] f [·, ·, ·] f [·, ·, ·, ·] f [·, ·, ·, ·, ·]


x0 f (x 0 )

f [x 1 ] − f [x 0 ]
f [x 0 , x 1 ] =
x1 − x0

x1 f (x 1 ) f [x 0 , x 1 , x 2 ] =
f [x 1 , x 2 ] − f [x 0 , x 1 ]
=
x2 − x0

f [x 2 ] − f [x 1 ]
f [x 1 , x 2 ] = f [x 0 , x 1 , x 2 , x 3 ] =
x2 − x1
f [x 1 ,x 2 ,x 3 ]− f [x 0 ,x 1 ,x 2 ]
= x 3 −x 0
x2 f (x 2 ) f [x 1 , x 2 , x 3 ] = f [x 0 , x 1 , x 2 , x 3 , x 4 ] =
f [x 2 , x 3 ] − f [x 1 , x 2 ] f [x 1 ,x 2 ,x 3 ,x 4 ]− f [x 0 ,x 1 ,x 2 ,x 3 ]
= = x 4 −x 0
x3 − x1

f [x 3 ] − f [x 2 ]
f [x 2 , x 3 ] = f [x 1 , x 2 , x 3 , x 4 ] =
x3 − x2
f [x 2 ,x 3 ,x 4 ]− f [x 1 ,x 2 ,x 3 ]
= x 4 −x 1
..
x3 f (x 3 ) f [x 2 , x 3 , x 4 ] = .
f [x 3 , x 4 ] − f [x 2 , x 3 ]
=
x4 − x2

f [x 4 ] − f [x 3 ] ..
f [x 3 , x 4 ] = .
x4 − x3

..
x4 f (x 4 ) .
..
.
.. ..
. .

I coefficienti della diagonale principale sono i coefficienti c j del polinomio interpolatore di Newton.

70
5.3. Interpolazione polinomiale

Esempio
Esempio 5.3.5 Costruiamo la tabella delle differenze divise per i dati (1, 1), (2, 3) e (4, 3).

xi f [·] f [·, ·] f [·, ·, ·]


1 1
3−1
=2
2−1
0−2 2
2 3 =−
4−1 3
3−3
=0
4−2
4 3

2
Il polinomio p 2 (x) si scrive: p 2 (x) = 1 + 2(x − 1) − (x − 1)(x − 2).
3
Se vogliamo aggiungere altri dati, per esempio, la coppia (5, 4), dobbiamo aggiungere una riga alla ta-
bella della differenza divisa e un termine al polinomio che abbiamo già ricavato per ottenere quello di
grado superiore interpolante tutti i dati che abbiamo a disposizione.

xi f [·] f [·, ·] f [·, ·, ·] f [·, ·, ·, ·]


1 1
3−1
=2
2−1
0−2 2
2 3 =−
4−1 3
1 −2
3−3 −
=0 3 3 =1
4−2 5−1 4
1−0 1
4 3 =
5−2 3
4−3
=1
5−4
5 4

1
Il polinomio p 3 (x) è p 3 (x) = p 2 (x) + (x − 1)(x − 2)(x − 4).
4
Il concetto di differenza divisa può essere visto come un’estensione del concetto di derivata di una fun-
zione. Si ha, infatti, che, per f derivabile, la diffenza divisa del primo ordine f [x 0 , x 1 ] può essere vista come
un rapporto incrementale e quindi, al limite per x 1 → x 0 , si ha f 0 (x 0 ).
La differenza divisa k-sima e la derivata k-sima di f sono legate tra loro. Si può provare, infatti, per k ≥ 1 Derivata
che vale la relazione k-sima della
f
f (k) (ξ)
f [x 0 , x 1 , . . . , x k ] =
k!
dove ξ è un punto appartente all’interno dell’intervallo individuato dagli estremi di x 0 , . . . , x k . Quando i punti
coincidono, si ha
f (k) (x 0 )
f [x|0 ,x{z
0 ,...,x 0 ] =
} k!
k+1 volte

Questa formula serve per calcolare il polinomio di interpolazione che interpola non solo una certa funzione
f ma anche le sue derivate in alcuni punti assegnati (si veda l’esercizio 5.6.3 a fine Capitolo).
Se al polinomio p n (x) aggiungiamo la coppia di dati (x, f (x)) si ha p n+1 (x) = f (x) = p n (x) + Formula
f [x 0 , x 1 , . . . , x n , x](x − x 0 )(x − x 1 ) · . . . (x − x n ). L’ultima differenza divisa non si può calcolare, poichè dipende dell’errore

da x (che è la nostra variabile), ma ci è utile per capire quanto vale l’errore che commettiamo nell’approssi-
mare f (x) mediante il polinomio interpolatore, applicando la rappresentazione di Newton. Inoltre, dato che

71
5. I NTERPOLAZIONE

il polinomio interpolatore è unico (fissate le coppie di dati del problema), anche l’errore che si commette è lo
stesso, qualunque sia la strategia utilizzata per arrivare ad esso. Quindi possiamo eguagliare l’errore trovato
utilizzando i polinomi di Lagrange con l’errore trovato nella rappresentazione di Newton, ottenendo:

f (n+1) (ξ(x)) Y
n Y n
(x − x i ) = f [x 0 , x 1 , . . . , x n , x] (x − x i )
(n + 1)! i =0 i =0

5.4 Considerazioni sull’interpolazione polinomiale

5.4.1 Fenomeno di Runge


Data una funzione f , si pensa che il polinomio di interpolazione possa approssimare bene la funzione,
soprattutto se si aumenta il numero dei punti di appoggio. In realtà questo non è sempre vero e un semplice
1
Fenomeno di e famoso esempio ce lo fa capire. Sia data la funzione di Runge7 f (x) = e consideriamo il polino-
Runge 1 + x2
mio di interpolazione di questa funzione per valori crescenti di n prendendo punti di appoggio equidistanti
nell’intervallo [−5, 5]. Partiamo da n + 1 = 2 con i punti equidistanti x 0 = −5, x 1 = 0 e x 2 = 5. Si ha la tabella

xi −5 0 5
y i = f (x i ) 3.846154e − 2 1. 3.846154e − 2

Costruiamo quindi il polinomio di interpolazione p 2 (x) (utilizzando l’approccio di Lagrange o di Newton, i


risultati non cambiano). Raddoppiamo il numero dei punti aggiungendo un punto tra x 0 e x 1 e uno tra x 1 e

Figura 5.4: Funzione di Runge e polinomi interpolanti di grado 2, 4 e 8.

x 2 . Abbiamo n + 1 = 5 e i valori della tabella

xi −5 −2.5 0 2.5 5
y i = f (x i ) 3.846154e − 2 1.379310e − 1 1. 1.379310e − 1 3.846154e − 2

Con lo stesso procedimento, costruiamo i polinomi di interpolazione di grado 8 e 16. In Figura 5.4 sono ri-
portati i grafici della funzione di Runge (in nero) e dei polinomi interpolanti di grado 2, 4 e 8. Si può osservare
7 Carl Runge (1856-1927) fu un matematico tedesco. Fu studente di Weierstrass, Kirchhoff, Helmholtz. Iniziò poi a collaborare con
Kronecker e poi si dedicò in particolare allo studio della soluzione numerica di equazioni algebriche e alla spettroscopia.

72
5.4. Considerazioni sull’interpolazione polinomiale

che solo in un sottointervallo di [−5, 5] al crescere di n, i polinomi convergono alla funzione. Agli estremi
dell’intervallo [−5, 5] si hanno oscillazioni che aumentano sempre più al crescere di n. Infatti in Figura 5.5
(a sinistra) non si riesce più a distinguere il profilo della funzione di Runge perchè il polinomio di interpo-
lazione di grado 16 ha delle oscillazioni molto alte. Tuttavia, se restringiamo questo grafico in un intorno
dell’origine, possiamo vedere come il polinomio p 16 si avvicini bene alla funzione – si veda la Figura 5.5 (a
destra)! L’esempio di Runge è utile per capire che la scelta dei nodi equidistanti non si rivela sempre la scel-

Figura 5.5: Funzione di Runge e polinomio interpolante di grado 16 su tutto l’intervallo [−5, 5] (a sinistra) e in
un sottointervallo (a destra)

ta giusta e che occorrono altre strategie nella scelta dei nodi per ottenere migliori risultati. Nell’esempio di
f (n+1) (ξ(x))
Runge, infatti, il rapporto , che compare nella formula dell’errore, cresce, al crescere di n, agli
(n + 1)!
estremi dell’intervallo di interpolazione, perciò aumentando il grado del polinomio di interpolazione, au-
menta l’errore! Per indagare ulteriormente su questo problema, si rimanda alla letteratura specializzata del
settore.

5.4.2 Malcondizionamento nell’interpolazione con funzioni base monomiali


All’inizio di questo Capitolo, abbiamo introdotto il polinomio di interpolazione mediante funzioni ba-
se monomiali: il problema dell’interpolazione veniva risolto mediante un sistema lineare la cui matrice, di
Vandermonde, è malcondizionata.
Vediamo di capire questo malcondizionamento mediante un esempio. Si voglia studiare l’interpolazione
dei seguenti dati

xi 1010.5 1011.5 1012.5 1013 1014 1015


yi 4 2.5 2.5 2 2 0

Confrontando i vari algoritmi di interpolazione, osserveremo che gli algoritmi di Lagrange e delle diffe-
renze divise di Newton danno buoni risultati. Al contrario, il metodo che porta alla costruzione della matrice
di Vandermonde dà risultati disastrosi, come si può vedere in Figura 5.6. Eppure, dal punto di vista teorico i
risultati dovrebbero essere identici.
Perchè si hanno questi risultati? Bisogna tener conto di tre aspetti: il calcolo della matrice di Vandermon-
de; la soluzione del sistema lineare per ricavare i coefficienti del polinomio con funzioni base monomiali; il
calcolo dei valori del polinomio.
La matrice di Vandermonde consiste di colonne che crescono di colonna in colonna - 1, x i , x i2 , x i3 , . . .,
x i . Per questo caso test, si va da 1 a elementi dell’ordine di 1015 . La matrice è molto mal condizionata.
5

Perciò la soluzione del sistema lineare non può dare risultati affidabili e il vettore che fornisce i coefficienti del

73
5. I NTERPOLAZIONE

Figura 5.6: Effetti del malcondizionamento

polinomio interpolatore è completamente errato. Ciò porta anche al fenomeno della cancellazione numerica
nel calcolo del polinomio di interpolazione, per cui si ha una significativa perdita di accuratezza e il grafico
risultante presenta un profilo altamente oscillante.

5.5 Interpolazione polinomiale a tratti


Abbiamo visto, nell’esempio di Runge, che l’interpolazione polinomiale con nodi equidistanti non porta
a una buona interpolazione, in quanto l’errore, che dipende dalla derivata f n+1 (x), aumenta al crescere di n.
Nel caso dell’esempio di Runge, una diversa scelta di nodi può portare a buoni risultati, ma resta il fatto che
f n+1
se il rapporto aumenta al crescere di n, anche l’errore rimane elevato.
(n + 1)!
Aumentando il numero dei punti di appoggio, il polinomio di interpolazione porta forti e irragionevoli
oscillazioni al di fuori dell’intervallo dei nodi, come si può vedere in Figura 5.7

Figura 5.7: Interpolazione della funzione f (x) = exp(x) con n = 20 (sinistra) e n = 40 (destra). I nodi di
interpolazione sono nell’intervallo [0, 1].

A volte, se la funzione da interpolare è continua a tratti, il termine dell’errore può essere ancora grande.
In Figura 5.8, sono messi a confronto il polinomio di interpolazione di grado n = 5 che interpola la funzione

74
5.5. Interpolazione polinomiale a tratti

p
f (x) = |x| + 1 prendendo 6 punti equidistanti nell’intervallo [−1, 1] e il polinomio di interpolazione della
funzione f (x) = e x nello stesso intervallo e con gli stessi punti. Mentre nel caso della funzione f (x) = e x il
polinomio di interpolazione, nell’intervallo dei nodi, si sovrappone alla funzione interpolata, per la funzione
p
f (x) = |x| + 1 l’errore è ben evidente.

p
Figura 5.8: Interpolazione della funzione f (x) = |x| + 1 (a sinistra) e della funzione f (x) = e x (a destra) con
n = 5 nell’intervallo [−1, 1]

Se, in alcuni casi, la scelta dei nodi, fatta in maniera opportuna, può risolvere determinati problemi che
si incontrano nell’interpolazione, altre volte il polinomio di interpolazione produce risultati comunque non
buoni, indipendentemente dalla scelta dei nodi.
La domanda, allora, è la seguente: come possiamo ridurre il termine dell’errore senza aumentare
il grado n nell’interpolazione e, tuttavia, mantenendo un numero elevato di nodi? La risposta viene
dall’interpolazione polinomiale a tratti.
Supponiamo di voler costruire una curva che interpola dei dati che si trovano all’interno di un certo in-
tervallo [a, b]. Prenderemo dei punti all’interno di questo intervallo, in modo che il primo e l’ultimo punto
coincidano con a e b rispettivamente: a = x 1 < x 2 < . . . < x m = b. Chiamiamo questi punti nodi. Come si
può notare, abbiamo cambiato la numerazione dei nodi (non più da x 0 a x n ma da x 1 a x m ) per evitare con-
fusioni con quanto detto prima sull’interpolazione polinomiale. A ciascun nodo è associato il valore y i da
interpolare. In questo modo abbiamo m nodi in [a, b] e possiamo considerare gli m − 1 sottointervalli dati
da [x 1 , x 2 ], [x 2 , x 3 ], . . . fino ad arrivare a [x n−1 , x m ] (da cui il generico sottointervallo è dato da [x i , x i +1 ] con
i = 1, 2, . . . , m − 1). Su ciascun sottointervallo andremo a costruire un polinomio di interpolazione di grado
basso (considereremo n = 1 e n = 3), che chiamamo s i (x). La funzione di interpolazione globale sarà una
curva v(x) continua (in alcuni casi anche di classe C 1 o C 2 ) che soddisfa la relazione

v(x) = s i (x), x i ≤ x ≤ x i +1 , i = 1, 2, . . . , m − 1.

Ci sono diversi tipi di interpolazione polinomiale a tratti. Noi ne consideriamo solamente due:
l’interpolazione lineare a tratti e le spline cubiche.

5.5.1 Interpolazione lineare a tratti


Il caso più semplice da considerare è prendere, su ciascun sottointervallo [x i , x i +1 ] un polinomio di in-
terpolazione lineare (grado n = 1), quindi una retta. Allora la funzione v(x) sarà continua (ma non avrà le
derivate continue) in tutto l’intervallo.
Nell’intervallo [x i , x i +1 ], il polinomio di interpolazione s i (x) si può costruire facilmente applicando, ad
esempio, la formula delle differenze divise di Newton, da cui s i (x) = y i + f [x i , x i +1 ](x − x i ).
Globalmente avremo v(x) tale che

v(x) = s i (x) = y i + f [x i , x i +1 ](x − x i ), x i ≤ x ≤ x i +1 , i = 1, 2, . . . , m − 1.

Un esempio di interpolazione lineare a tratti si ha in Figura 5.9. Il grande vantaggio di usare questo tipo
di interpolazione è la sua semplicità e facilità. Tuttavia spesso questo tipo di interpolazione non è sufficiente

75
5. I NTERPOLAZIONE

Figura 5.9: Esempio di interpolazione lineare a tratti

perchè non è abbastanza regolare (c’è discontinuità nelle derivate ai punti di appoggio) e in molte applica-
zioni, invece, serve che ci sia continuità anche nelle derivate. Per avere maggiore continuità, vogliamo ad
esempio che la funzione di interpolazione v(x) sia di classe C 1 o C 2 , si deve aumentare il grado del polinomio
s i (x) su ciascun sottointervallo. La scelta più diffusa è quella di usare polinomi cubici. Tra i polinomi cubi-
ci c’è l’interpolazione cubica di Hermite a tratti (che non descriviamo) e l’interpolazione spline cubica (che
vedremo più nei dettagli).

5.5.2 Interpolazione spline cubica


Su ciascun sottointervallo, consideriamo un polinomio di terzo grado (n = 3), da cui la funzione globale
v(x) sarà:

v(x) = s i (x) = a i + b i (x − x i ) + c i (x − x i )2 + d i (x − x i )3 , x i ≤ x ≤ x i +1 , i = 1, 2, . . . m − 1

Quindi su ciascun sottointervallo abbiamo un polinomio cubico, che dipende da quattro coefficienti
(a i , b i , c i , d i ). Per ora, questi coefficienti sono incogniti, e poichè abbiamo 4 incognite su m − 1 sottointer-
valli, abbiamo un totale di 4(m − 1) incognite. Come determinare queste incognite? Imponendo non solo le
condizioni di interpolazione (ricordiamo che noi abbiamo non solo le ascisse x i ma anche le ordinate y i e
la condizione di interpolazione si legge come v(x i ) = y i ), ma anche la continuità della derivata prima e del-
la derivata seconda nei punti di raccordo tra un sottointervallo e il successivo. Abbiamo quindi le seguenti
condizioni da imporre:

s i (x i ) = y i , i = 1, 2, . . . , m − 1
s i (x i +1 ) = y i +1 , i = 1, 2, . . . , m − 1
s i0 (x i +1 ) = s i0 +1 (x i +1 ), i = 1, 2, . . . , m − 2
s i00 (x i +1 ) = s i00+1 (x i +1 ), i = 1, 2, . . . , m − 2

Osserviamo che le condizioni di continuità delle derivate prime e seconde le possiamo imporre solo nei
punti interni, e non in x 1 e x m , il primo e l’ultimo punto. Le condizioni che abbiamo appena scritto sono
2(m − 1) + 2(m − 2) = 4(m − 1) − 2. Abbiamo 2 condizioni in meno rispetto alle 4(m − 1) incognite che dob-
biamo determinare! Le due condizioni che mancano vengono imposte su punti finali x 1 e x m e, in base alle
condizioni imposte si hanno le cosiddette spline naturali, complete e not-a-knot. Nelle spline naturali si
richiede s 100 (x 1 ) = s m−1
00
(x m ) = 0. Nelle spline complete, vengono specificati i valori delle derivate prime per
0 0
s 1 (x 1 ) e per s m−1 (x m ). Invece per le spline not-a-knot si richiede la continuità della derivata terza di s 1 e di

76
5.5. Interpolazione polinomiale a tratti

s m−1 in x 2 e in x m−1 rispettivamente: poichè la derivata terza è una costante (stiamo lavorando con polinomi
cubici), questa condizione fa sì che s 1 = s 2 e che s m−2 = s m−1 e, in questo modo, il primo e l’ultimo nodo non
sono attivi.
Nel seguito, tratteremo solamente il caso delle spline cubiche naturali, per la loro semplicità di imple-
mentazione. Da un punto di visto storico, il termine spline deriva da un sottile e flessibile strumento per
disegnare curve, fatto di legno o metallo, utilizzato prima dell’avvento dei computer, soprattutto nell’indu-
stria navale. Per poter passare per determinati punti, la spline era tenuta ferma da alcuni pesi, mentre alle
estremità non aveva costrizioni (quindi derivata seconda nulla, come accade nelle spline naturali). La spline
naturale minimizza l’energia di tensione tra tutte le funzioni che sono costrette a passare per quei punti e con
la stessa continuità.

Figura 5.10: Esempio di interpolazione spline cubica

Passiamo ora a capire come si ricavano i coefficienti incogniti.


Per semplicità poniamo h i = x i +1 − x i , i = 1, . . . , m − 1: è l’ampiezza del sottointervallo i -simo [x i , x i +1 ].
Dalla relazione di interpolazione s i (x i ) = y i si ricava facilmente

ai = y i , i = 1, 2, . . . , m − 1

Dall’altra relazione di interpolazione s i (x i +1 ) = y i +1 si ricava

a i + b i h i + c i h i2 + d i h i3 = y i +1

cioè (sostituendo il valore per a i ):

y i + b i h i + c i h i2 + d i h i3 = y i +1 , i = 1, 2, . . . , m − 1 (5.1)

Useremo l’equazione (5.1) successivamente.


Per usare le altre relazioni, scriviamo la derivata prima e seconda di s i . Si ha, per i = 1, 2, . . . , m − 1

s i0 (x) = b i + 2c i (x − x i ) + 3d i (x − x i )2
s i00 (x) = 2c i + 6d i (x − x i )

A questo punto, dalla relazione s i0 (x i +1 ) = s i0 +1 (x i +1 ), i = 1, 2, . . . , m − 2 ricaviamo (osserviamo che a destra


dobbiamo valutare s i0 +1 (x i +1 ):

b i + 2c i h i + 3d i h i2 = b i +1 , i = 1, 2, . . . , m − 2 (5.2)

77
5. I NTERPOLAZIONE

Dalla relazione s i00 (x i +1 ) = s i00+1 (x i +1 ), i = 1, 2, . . . , m − 2 ricaviamo

2c i + 6d i h i = 2c i +1 , i = 1, 2, . . . , m − 2
che si semplifica in
c i + 3d i h i = c i +1 , i = 1, 2, . . . , m − 2

Da quest’ultima relazione otteniamo


c i +1 − c i
di = , i = 1, 2, . . . , m − 2 (5.3)
3h i

Adesso i coefficienti d i sono in funzione dei coefficienti c i . Sostituiamo il valore di d i appena ricavato
nell’equazione (5.1) e ricaviamo b i in funzione dei coefficienti c i . abbiamo

y i + b i h i + c i h i2 + d i h i3 = y i +1
c i +1 − c i 3
b i h i + c i h i2 + ( )h i = y i +1 − y i
3h i
dividiamo tutto per h i e per compattare i termini utlizziamo le differenze divise dove servono
c i +1 − c i
bi + ci hi + ( )h i = f [x i , x i +1 ]
3

Otteniamo, per b i , la relazione

(2c i + c i +1 )h i
b i = f [x i , x i +1 ] − , i = 1, . . . , m − 1 (5.4)
3
Sostituiamo ora i valori per b i e per d i nell’equazione (5.2):

b i + 2c i h i + 3d i h i2 = b i +1 , i = 1, 2, . . . , m − 2
(2c i + c i +1 )h i c i +1 − c i 2 (2c i +1 + c i +2 )h i +1
f [x i , x i +1 ] − + 2c i h i + 3 h i = f [x i +1 , x i +2 ] −
3 3h i 3
raccogliendo i termini in h i a sinistra
(c i + 2c i +1 )h i (2c i +1 + c i +2 )h i +1
f [x i , x i +1 ] + = f [x i +1 , x i +2 ] −
3 3
moltiplichiamo ambo i membri per 3 e portiamo le differenze divise a destra

c i h i + 2c i +1 (h i + h i +1 ) + c i +2 h i +1 = 3( f [x i +1 , x i +2 ] − f [x i , x i +1 ]), i = 1, . . . , m − 2 (5.5)

Abbiamo adesso un sistema di m − 2 equazioni, ma le incognite c i che abbiamo introdotto sono m:


c 1 , c 2 , . . . , c m . Aggiungiamo, allora, le condizioni per le spline naturali: deve essere s 100 (x 1 ) = s m−1
00
(x m ) = 0.
Si ha

s 100 (x 1 ) = 2c 1 = 0
00
s m−1 (x m ) = 2c m−1 + 6d m−1 h m−1 =0

c m−1
da cui c 1 = 0 e, d m−1 = − . Di conseguenza, ponendo c m = 0 possiamo estendere all’indice i = m − 1 la
3h m−1
c m − c m−1
relazione (5.3) per i coefficienti d i : d m−1 = .
3h m−1

78
5.5. Interpolazione polinomiale a tratti

Osserviamo che, dalla relazione s i00 (x i ) = 2c i si ricava il significato geometrico dei coefficienti c i =
s i00 (x i )
. Inoltre, con la posizione c 1 = c m = 0 le equazioni (5.5), per i = 1 e per i = m − 2 si semplificano,
2
rispettivamente, in

2c 2 (h 1 + h 2 ) + c 3 h 2 =3( f [x 2 , x 3 ] − f [x 1 , x 2 ]), (5.6)


c m−2 h m−2 + 2c m−1 (h m−2 + h m−1 ) =3( f [x m−1 , x m ] − f [x m−2 , x m−1 ]), (5.7)

Perciò il sistema da risolvere per trovare i coefficienti c 2 , c 3 , . . . , c m−1 , mettendo insieme le equazioni (5.5),
(5.6),(5.7), è dato da Ac = β dove

2(h 1 + h 2 ) h2 0 ··· 0
 
 .. 

 h2 2(h 2 + h 3 ) h3 0 . 


 0 h3 2(h 3 + h 4 ) h4 ... 

A= .. .. ..

0 . . . 0
 
 
..
 
 
 . h m−3 2(h m−3 + h m−2 ) h m−2 
0 ··· 0 h m−2 2(h m−2 + h m−1 )

   
c2 3( f [x 2 , x 3 ] − f [x 1 , x 2 ])
 c3   3( f [x 3 , x 4 ] − f [x 2 , x 3 ]) 
β=
   
c = ..   .. 
. .
  
   
c m−1 3( f [x m−1 , x m ] − f [x m−2 , x m−1 ])

Una volta ricavati i coefficienti c i , usando le equazioni (5.3) e (5.4), per i = 1, . . . , m − 1, si trovano tutti i
coefficienti delle cubiche s i .

Ricapitolando, per trovare i coefficienti delle spline cubiche naturali si deve:


1. risolvere il sistema Ac = ψ che, risolto, fornisce i coefficienti c 2 , c 3 , . . . , c m−1
delle spline;
2. aggiungere al vettore c, i valori c 1 = c m = 0
3. applicare, per i = 1, . . . , m − 1 le relazioni

ai = y i
(2c i + c i +1 )h i
b i = f [x i , x i +1 ] −
3
c i +1 − c i
di =
3h i

5.5.3 Curve parametriche


Supponiamo di avere un insieme di punti in cui le ascisse possono ripetersi e in cui si vuole che i punti
vengano messi insieme per formare una particolare curva. In Figura 5.11 vediamo un esempio di punti e
di curva che vogliamo ottenere: in questo caso andiamo a unire i punti nell’ordine considerato mediante
segmenti di retta. Questa curva, tuttavia, non può essere espressa come funzione di x o di y perchè non è una
funzione (ad ogni valore di x non corrisponde un solo valore sull’asse delle ordinate, come deve accadere
per funzioni del tipo y = f (x)). Ci troviamo di fronte ad un esempio di curva. Possiamo pensare alla curva
come il percorso di una particella che si muove in funzione del tempo t e, di conseguenza, le coordinate della
particella sono funzioni di t (x = x(t ), y = y(t )). Abbiamo le cosiddette equazioni parametriche di una curva.

79
5. I NTERPOLAZIONE

Figura 5.11: Esempio di curva parametrica.

Per poter costruire la curva di interpolazione, come nell’esempio proposto, dobbiamo, quindi,
parametrizzare le coordinate (x i , y i ), i = 1, 2, . . . , m.
Dobbiamo cercare, quindi dei valori t 1 , t 2 , . . . t m tali che x i è il risultato di una certa funzione x al tem-
po t i mentre y i è il risultato di una certa funzione y allo stesso tempo t i . Dobbiamo dunque avere una
rappresentazione del tipo:

(t 1 , x 1 ), (t 2 , x 2 ) . . . (t m , x m )
(t 1 , y 1 ), (t 2 , y 2 ) . . . (t m , y m )

In tal caso, possiamo approssimare la curva x mediante le condizioni di interpolazione x(t i ) = x i mentre la
curva y dovrà verificare y(t i ) = y i .
Se abbiamo m punti a disposizione, possiamo fissare i valori t i come t i = i , per i = 1, 2, . . . , m (si può anche
i
scegliere t i = ): l’importante è avere dei valori crescenti per la variabile t .
m
La curva in forma parametrica è dunque espressa da (x(t ), y(t )). Per costruire x(t ) e y(t ) usiamo le tec-
niche di interpolazione a tratti (per esempio di interpolazione lineare a tratti o di spline cubiche a tratti) in
modo da ottenere il risultato finale. In figura 5.12 vediamo un esempio di interpolazione lineare a tratti con
gli stessi nodi usati per ottenere la curva di figura 5.11.

Figura 5.12: Esempio di curva parametrica con interpolazione spline cubica a tratti (stessi nodi della
figura 5.11.

80
5.6. Esercizi

5.6 Esercizi

Esercizio 5.6.1 Sia data la tabella seguente:

xi -1 0 2 3 4
f (x i ) 9 0 0 15 84

(a) Scrivere la tabella delle differenze divise.


(b) Trovare il polinomio interpolatore (con la formula di Newton) di grado non superiore a 4.

Svolgimento
(a) La tabella delle differenza divise è:

xi f (x i ) f (·, ·) f (·, ·, ·) f (·, ·, ·, ·) f (·, ·, ·, ·, ·)


-1 9
0−9
0 0 = −9
0 − (−1)

0−0 0+9
2 0 =0 = 3
2−0 2 − (−1)

15 − 0 15 − 0 5−3
3 15 = 15 =5 = 0.5
3−2 3−0 3 − (−1)

84 − 15 69 − 15 27 − 5 11 11/2 − 1/2
4 84 = 69 = 27 = =1
4−3 4−2 4−0 2 4 − (−1)

(b) Il polinomio di Newton di grado 4 che interpola i dati assegnati è dunque (prendendo i valori della
diagonale principale della tabella)

p(x) = 9 − 9(x + 1) + 3(x + 1)x + 0.5(x + 1)x(x − 2) + (x + 1)x(x − 2)(x − 3) =


= x 4 − 3.5x 3 + 3.5x 2 − x

Esercizio 5.6.2 Sia data la tabella seguente:

xi 0 0.1 0.8 1.2


f (x i ) 1 0.48 1.32 5.32

(a) Scrivere la tabella delle differenze divise.


(b) Usando i quattro punti in successione, scrivere i polinomi interpolanti (di Newton) p n (x) di grado
non superiore ad n (con n=0,1,2,3); commentare il risultato.
(c) Usando p n (x) stimare, per ogni n, f (0.6) e f 0 (0.6).
(d) scrivere il polinomio p 2 (x) con la formula di Lagrange.

Svolgimento

81
5. I NTERPOLAZIONE

xi f (x i ) f (·, ·) f (·, ·, ·) f (·, ·, ·, ·)


0 1
0.48 − 1
0.1 0.48 = −5.2
0.1
1.32 − 0.48 1.2 + 5.2
0.8 1.32 = 1.2 =8
0.7 0.8
5.32 − 1.32 10 − 1.2 8−8
1.2 5.32 = 10 =8 =0
0.4 1.1 1.2

(a) La tabella delle differenza divise è:


(b) I polinomi di Newton di grado 0,1,2 e 3 sono:

p 0 (x) = 1
p 1 (x) = 1 − 5.2x
p 2 (x) = 1 − 5.2x + 8x(x − 0.1) = 8x 2 − 6x + 1
p 3 (x) = 1 − 5.2x + 8x(x − 0.1) + 0x(x − 0.1)(x − 0.8) = 1 − 5.2x + 8x(x − 0.1) = p 2 (x)

Il polinomio p 3 (x) coincide con p 2 (x) in quanto p 2 (x 3 ) = p 2 (1.2) = f (1.2) = f (x 3 ) cioè il polinomio
di grado 2 interpola non solo i dati (x 0 , f (x 0 )), (x 1 , f (x 1 )) e (x 2 , f (x 2 )) ma anche (x 3 , f (x 3 )).
(c) Per le derivate di p n (x), n = 0,1,2 si ha

p 00 (x) = 0
p 10 (x) = −5.2
p 20 (x) = 16x − 6

La stima di f (0.6) e f 0 (0.6) è:


n p n (0.6) p n0 (0.6)
0 1 0
1 -2.12 -5.2
2 0.28 3.6
(d) I polimoni di Lagrange per ricavare il polinomio p 2 sono dati considerando i valori x 0 , x 1 e x 2 :

(x − 0.1)(x − 0.8) x 2 − 0.9x + 0.08


L 0 (x) = =
(−0.1)(−0.8) 0.08
x(x − 0.8) x 2 − 0.8x
L 1 (x) = =
0.1(0.1 − 0.8) −0.07
2
x(x − 0.1) x − 0.1x
L 2 (x) = =
0.8(0.8 − 0.1) 0.56

Il polinomio è:

p 2 (x) = 1L 0 (x) + 0.48L 1 (x) + 1.32L 2 (x)


x 2 − 0.9x + 0.08 x 2 − 0.8x x 2 − 0.1x
= − 0.48 + 1.32
0.08 0.07 0.56
= 12.5(x 2 − 0.9x + 0.08) − 6.857142857(x 2 − 0.8x) + 2.357142857(x 2 − 0.1x)

82
5.6. Esercizi

e raccogliendo i termini

p 2 (x) = 8x 2 − 6x + 1

Esercizio 5.6.3 Trovare il polinomio di grado non superiore a 4 che interpola i dati seguenti: f (0) =
2, f 0 (0) = 7, f 00 (0) = 18, f (1) = 27 f 0 (1) = 60. Stimare f (0.2) e f 0 (0.2).

Svolgimento
Costruiamo la tabella delle differenze divise tenendo presente che le derivate di una funzione f si possono
avere come limite delle differenze divise:

f 00 (0)
f [0, 0] = f 0 (0) = 7 f [0, 0, 0] = =9 f [1, 1] = f 0 (1) = 60
2!
Tenendo conto di queste relazioni tra differenze divise e derivate, nella tabella delle differenzi divise,
dobbiamo ripetere per tre volte l’ascissa 0 e due volte l’ascissa 1. Si ottiene:

0 2
f 0 (0)=7
0 2 f 00 (0)/2=9
18 − 9
f 0 (0)=7 =9
1−0
25 − 7 17 − 9
0 2 =18 =8
1−0 1−0
27 − 2 35 − 18
=25 =17
1−0 1−0
60 − 25
1 27 =35
1−0
f 0 (1)= 60
1 27

Il polinomio è dunque p(x) = 2 + 7x + 9x 2 + 9x 3 + 8x 3 (x − 1), vale a dire

p(x) = 8x 4 + x 3 + 9x 2 + 7x + 2.

La stima di f (0.2) è data da: f (0.2) ≈ p(0.2) = 3.7808.


Per stimare f 0 (0.2) dobbiamo prima calcolare la derivata prima di p. Si ha

p 0 (x) = 32x 3 + 3x 2 + 18x + 7,

da cui f 0 (0.2) ≈ p 0 (0.2) = 12.056.

83
C APITOLO 6
Approssimazione

I numeri governano il mondo.

Platone

6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2 Retta di regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3 Approssimazione polinomiale ai minimi quadrati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4 Approssimazioni di tipo esponenziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

6.1 Introduzione
La legge di Hooke stabilisce che l’allungamento subito da una molla, costruita con materiale uniforme,
è direttamente proporzionale alla forza applicata: F (x) = kx dove k è la costante di proporzionalità, detta
costante elastica, e x rappresenta l’allungamento della molla.
Supponiamo di voler determinare k per una molla che, quando è a riposo, esercita una forza di
1.4724811N . Se applichiamo una forza pari a 2.418165N si misura un allungamento pari a 0.042m. Siano
effettuate diverse misure, ricavando i dati di Tabella 6.1. I dati raccolti non giacciono esattamente su una

x 0.00000 0.04200 0.08000 0.11800 0.15600


F 1.472481 2.418165 3.363849 4.309533 5.255217
Tabella 6.1: Dati sperimentali per la legge di Hooke

linea retta. Per approssimare la costante elastica k, potremmo prendere una qualunque coppia di dati e fare
il rapporto tra la forza e l’allungamento. In questo modo, tuttavia, non terremmo conto di tutte le misure
effettuate. È più ragionevole trovare la linea retta che meglio approssima tutti i dati sperimentali e utilizzarla
per approssimare il valore di k. Questo tipo di approssimazione sarà l’argomento di questo Capitolo.
A differenza dell’interpolazione, in cui si cerca una funzione che passi esattamente per i dati assegnati,
nell’approssimazione si cerca una funzione (più semplice di quella data, se vi è una funzione di partenza) che
approssimi al meglio i dati assegnati, senza passare esattamente per questi.
Alcuni dei motivi che spingono a cercare una funzione di approssimazione piuttosto che di interpolazione
sono questi:
G i dati a disposizione sono affetti da errore;
G siamo interessati a vedere l’andamento dei dati su lunga scala, in una visione globale1
1 Se si hanno a disposizione n = 100 dati, anche molto accurati, una funzione interpolante può dare una buona idea localmente,
mentre una funzione approssimante data da una retta fornisce una migliore idea del comportamento su lunga scala dei dati.

85
6. A PPROSSIMAZIONE

Figura 6.1: Legge di Hooke: i dati sperimentali

xi 1 2 3 4 5 6 7 8 9 10
yi 1.2 2.3 4.5 5.1 7 8.5 10.2 13.1 12.5 16.5
Tabella 6.2: Dati sperimentali

G vogliamo che la funzione dipenda da pochi parametri, sebbene questi siano determinati considerando
tutti i dati a disposizione.
Nel seguito studieremo l’approssimazione ai minimi quadrati.

6.2 Retta di regressione lineare


Supponiamo di avere i 10 dati sperimentali della Tabella 6.2 (quindi n + 1 = 10). La Figura 6.2 (a sinistra)
mostra il grafico delle coppie di punti: appare evidente che la relazione tra x e y è di tipo lineare. Il motivo
per cui i dati non sono esattamente su una retta è dovuto ad errori nei dati. Non ha senso, quindi, cercare una
funzione che passi esattamente per i dati assegnati (come accade nell’interpolazione), perchè una funzione
del genere introdurrebbe oscillazioni prive di significato fisico: lo vediamo andando a costruire il polinomio
di interpolazione di grado 9 che passa esattamente per i dati e che vediamo in Figura 6.2 (a destra). Cerchiamo
allora una retta (funzione lineare, poichè abbiamo visto che i dati hanno una relazione di tipo lineare) che
meglio approssima i dati senza dover coincidere con essi. Sia p 1 (x) = a 0 + a 1 x la retta che andiamo cercando
(dobbiamo quindi capire come trovare i due coefficienti a 0 e a 1 ). Allora p 1 (x i ) = a 0 + a 1 x i , per i = 0, 1, . . . , n
rappresenta il valore sulla retta che deve approssimare il valore y i dato dal problema. Per ogni dato sperimen-
tale, per i = 0, 1, . . . , n, possiamo misurare lo scarto che scaturisce dall’approssimare y i mediante a 0 + a 1 x i .
Nell’approccio ai minimi quadrati, si cerca di minimizzare la somma dei quadrati delle differenze tra i valori
dati y i e i valori corrispondenti p 1 (x i ) sulla retta; si cerca, cioè, di minimizzare la somma dei quadrati degli
scarti. Introduciamo, quindi la funzione che dipende dai coefficienti incogniti a 0 e a 1 .
n £
X ¤2
S(a 0 , a 1 ) = (a 0 + a 1 x i ) − y i
i =0

86
6.2. Retta di regressione lineare

Figura 6.2: Dati sperimentali (a sinistra) della Tabella 6.2 e polinomio di interpolazione (a destra).

Per minimizzare questa funzione, occorre porre le derivate parziali della S rispetto ad a 0 e a 1 uguali a zero.2
Si pone dunque
∂S(a 0 , a 1 ) ∂ X n £ ¤2 X n £ ¤
0= = (a 0 + a 1 x i ) − y i = 2 (a 0 + a 1 x i ) − y i
∂a 0 ∂a 0 i =0 i =0
∂S(a 0 , a 1 ) ∂ X n £ ¤2 X n £ ¤
0= = (a 0 + a 1 x i ) − y i = 2 (a 0 + a 1 x i ) − y i x i
∂a 1 ∂a 1 i =0 i =0

Queste equazioni si semplificano nel sistema delle cosiddette equazioni normali:


(
(n + 1)a 0 + a 1 ni=0 x i = ni=0 y i
P P

a 0 ni=0 x i + a 1 ni=0 x i2 = ni=0 x i y i


P P P

Introducendo la notazione A 12 = ni=0 x i , A 22 = ni=0 x i2 , b 1 = ni=0 y i e b 2 = ni=0 x i y i e osservando che la


P P P P

matrice del sistema è simmetrica (A 12 = A 21 ), la soluzione è data da:


A 22 b 1 − A 12 b 2 (n + 1)b 2 − A 12 b 1
a0 = a1 =
(n + 1)A 22 − A 212 (n + 1)A 22 − A 212

Nell’esempio proposto, per calcolare la retta di approssimazione ai minimi quadrati, dobbiamo calcolare
i coefficienti delle equazioni normali. In Tabella 6.3 poniamo i valori che servono per risolvere il sistema: la
soluzione è a 0 = −0.87333333 e a 1 = 1.62969697. La retta è rappresentata in Figura 6.3.
La retta che abbiamo appena costruito è la retta che minimizza gli scarti verticali, supponendo affetti
da errore le ordinate delle coppie di punti a disposizione. Essa prende pure il nome di retta di regressione
lineare sugli scarti verticali.
Osserviamo che il baricentro dei punti assegnati giace sulla retta ai minimi quadrati, in quanto conside- Sul
rando la prima equazione del sistema si ha, per X = ni=0 x i /(n + 1) e Y = ni=0 y i /(n + 1) (le coordinate del baricentro
P P

baricentro dei punti assegnati):

a0 + a1 X = Y

Se invece sono affetti da errore le ascisse delle coppie di punti, si può cercare la retta che minimizza gli
scarti orizzontali, detta anche retta di regressione lineare sugli scarti orizzontali, (basta scambiare il ruolo
delle x con quello delle y per ricavare, con lo stesso procedimento, la retta p 1 (y) = b 0 + b 1 y). Il baricentro dei
punti assegnati giace anche su questa retta, da cui possiamo concludere che esso è il punto di intersezione
delle due rette che minimizzano gli scarti verticali e orizzontali.
2 Per funzioni f (x) di una variabile reale, i punti di massimo o minimo si trovano tra i punti critici della f , per i quali f 0 (x) = 0,
studiando il segno della f 00 . Analogo procedimento si segue per funzioni di due variabili. Per la funzione S(a 0 , a 1 ) che stiamo studiando,
si può provare che i valori (a 0 , a 1 ) che annullano le derivate parziali della S rappresentano i valori che minimizzano la S stessa. Questo
argomento viene approfondito nei corsi di Analisi Matematica.

87
6. A PPROSSIMAZIONE

xi yi x i2 xi y i
1 1.2 1 1.2
2 2.3 4 4.6
3 4.5 9 13.5
4 5.1 16 20.4
5 7 25 35
6 8.5 36 51
7 10.2 49 71.4
8 13.1 64 104.8
9 12.5 81 112.5
10 16.5 100 165
A 12 = 55 b 1 = 80.9 A 22 = 385 b 2 = 579.4
Tabella 6.3: Tabella per il calcolo della retta di approssimazione ai minimi quadrati

Figura 6.3: Retta di approssimazione sugli scarti verticali.

6.3 Approssimazione polinomiale ai minimi quadrati


In generale, avendo a disposizione n+1 coppie di punti, il problema di approssimazione si può ricondurre
alla ricerca di un polinomio di approssimazione di grado m, p m (x) = a 0 + a 1 x + a 2 x 2 + . . . + a m x m con m < n.
Quando n = m il polinomio d’approssimazione coincide con quello d’interpolazione.
La funzione da minimizzare è
n £ ¤2
(a 0 + a 1 x i + a 2 x i2 + . . . + a m x im ) − y i
X
S(a 0 , a 1 , . . . , a m ) =
i =0

La procedura seguita per la retta viene generalizzata. Questa volta bisogna porre uguali a zero le m+1 derivate
parziali della S rispetto ai coefficienti del polinomio p m .

∂S
=0 j = 0, 1, . . . , m
∂a j

88
6.4. Approssimazioni di tipo esponenziale

Ricaviamo, quindi
n
j
(a 0 + a 1 x i + . . . + a m x im − y i )x i = 0
X
2 per j = 0, 1, . . . , m
i =0

In forma estesa possiamo scrivere


n n n n
X j X j +1 X j +m X j
a0 xi + a1 xi + . . . + am xi = xi y i per j = 0, 1, . . . , m
i =0 i =0 i =0 i =0

Poichè queste equazioni si hanno per j = 0, 1 . . . , m, si ha da risolvere un sistema, che, scritto in forma
matriciale, è:

A T Aa = A T b

dove A è una matrice rettangolare (n + 1) × (m + 1), data da

1 x 0 x 02 . . . x 0m
 
1 x
 1 x 12 . . . x 1m 

A= .. . .. .. 
. .
. . . 

2 m
1 xn xn . . . xn

Le equazioni del sistema sono dette equazioni normali. Si può provare che la matrice Q = A T A è
simmetrica, definita positiva3 ed è non singolare, quindi il sistema ammette soluzione.

6.4 Approssimazioni di tipo esponenziale


Può capitare che i dati sperimentali abbiano un andamento di tipo esponenziale o ricordino una funzione
potenza della variabile x. Allora si può richiedere che la funzione approssimante abbia una delle due forme
seguenti (e, a seconda della rappresentazione, si ha un diverso modello):

y(x) = ae bx modello esponenziale


b
y(x) = ax modello potenza

con a e b opportune costanti. Per ricavare a e b si passa ai logaritmi ricavando l’equazione di una retta i cui
coefficienti sono ottenuti con la procedura di minimizzazione ai minimi quadrati. Da questi, si ritorna poi ai
coefficienti delle funzioni di partenza. Vediamo come.
G Nel caso del modello esponenziale, passando ai logaritmi (in base naturale) si ha:
ln (y) = ln (a) + bx

Ponendo X = x, Y = ln (y), a 0 = ln (a) e a 1 = b, si ha un’equazione del tipo Y = a 0 + a 1 X .


Quindi, dalle coppie di dati (x i , y i ) i = 0, 1, . . . , n, si deve passare alle coppie (X i = x i , Yi = ln (y i ))
e su queste coppie si costruisce la retta di approssimazione ai minimi quadrati con la procedura che
abbiamo studiato in Sezione 9.3. Una volta ricavati i coefficienti a 0 e a 1 , si ha a = e a0 e b = a 1 .
G Nel caso del modello potenza, passando ai logaritmi (qualunque sia la base usata, il risultato non
cambia) si ha:

log (y) = log (a) + b log (x)

Ponendo X = log (x), Y = log (y), a 0 = log (a) e a 1 = b, si ha un’equazione del tipo Y = a 0 + a 1 X .
Quindi, dalle coppie di dati (x i , y i ) i = 0, 1, . . . , n, si deve passare alle coppie (X i = log (x i ), Yi =
log (y i )) e su queste coppie si costruisce la retta di approssimazione ai minimi quadrati. Una volta
ricavati i coefficienti a 0 e a 1 , si ha b = a 1 mentre, con gli opportuni passaggi, si trova il valore di a.
3 Le definizioni di matrice simmetrica e matrice definita positiva sono date nel Capitolo 7.

89
6. A PPROSSIMAZIONE

6.5 Esercizi

Esercizio 6.5.1 Sia data la tabella seguente:

xi -1 0 2 3 4
f (x i ) 9 0 0 15 84

(a) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati degli scarti verticali.
(b) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati degli scarti orizzontali.
(c) Calcolare il punto di intersezione delle due rette e dire di che punto si tratta.

Svolgimento
(a) Il sistema da risolvere per ottenere la retta di approssimazione ai minimi quadrati è:
(
(n + 1)a 0 + ni=0 x i a 1 = ni=0 y i
P P
Pn Pn 2 Pn
i =0 x i a 0 + i =0 x i a 1 = i =0 x i y i
P4 P4 2 P4 P4
dove n + 1 = 5. Poichè i =0 x i = 8, i =0 x i = 30, i =0 y i = 108 e i =0 x i y i = 372, si ha il sistema
(
5a 0 + 8a 1 = 108
8a 0 + 30a 1 = 372

La soluzione è a 0 = 3.069767442, a 1 = 11.581395349. La retta ai minimi quadrati che minimizza gli


scarti verticali è: y = 3.069767442 + 11.581395349x.
(b) Ricaviamo la retta di approssimazione che minimizza gli scarti orizzontali.
(
(n + 1)b 0 + ni=0 y i b 1 = ni=0 x i
P P
Pn Pn 2 Pn
i =0 y i b 0 + i =0 y i b 1 = i =0 y i x i
P4 P4 2 P4 P4
dove n + 1 = 5. Poichè i =0 y i = 108, i =0 y i = 7362, i =0 x i =8e i =0 x i y i = 372, si ha il sistema
(
5b 0 + 108b 1 = 8
108b 0 + 7362b 1 = 372

La soluzione è b 0 = 0.744452398, b 1 = 0.03960868528. La retta ai minimi quadrati che minimizza gli


scarti orizzontali è: x = 0.744452398 + 0.03960868528y.
(c) Troviamo il punto di intersezione delle due rette:
(
y = 3.069767442 + 11.581395349x
x = 0.744452398 + 0.03960868528y

Ricaviamo x = 1.6 e y = 21.6


Se calcoliamo il baricentro dei punti assegnati, troviamo
P4 P4
i =0 x i −1 + 2 + 3 + 4 i =0 y i 9 + 15 + 84
X= = = 1.6 Y = = ) = 21.6
5 5 5 5
Il punto di intersezione delle due rette è il baricentro dei punti assegnati.

90
6.5. Esercizi

Esercizio 6.5.2 Sono assegnati i seguenti dati sperimentali

xi 4.0 4.2 4.5 4.7 5.1 5.5 5.9 6.3 6.8 7.1
yi 102.56 113.18 131.2 142 168 196.2 225 256.8 299.51 325.6

Costruire la curva di approssimazione ai minimi quadrati della forma ax b .

Svolgimento Per trovare la curva di approssimazione del tipo y = ax b , dobbiamo prima passare ai logaritmi:

log(y) = log(ax b ) = log(a) + b log(x)

In questo modo ci riconduciamo ad una retta di approssimazione ai minimi quadrati sui logaritmi dei punti
assegnati. Consideriamo il logaritmo naturale (ma i risultati non cambiano con i logaritmi in un’altra base).
I dati su cui lavorare sono dunque:

log(x i ) log(y i )
1.386294361 4.630447993
1.435084525 4.728979472
1.504077397 4.876722876
1.547562509 4.955827058
3.931825633 5.123963980
1.704748092 5.279134547
1.774952351 5.416100402
1.840549633 5.548297572
1.916922612 5.702147806
1.960094784 5.785669634

Calcoliamo la retta di approssimazione ai minimi quadrati, ponendo X i = log(x i ) e Yi = log(y i ). Il sistema


da risolvere è
(
(n + 1)a 0 + ni=0 X i a 1 = ni=0 Yi
P P
Pn Pn 2 Pn
i =0 X i a 0 + i =0 X i a 1 = i =0 X i Yi

dove n + 1 = 10.
Si ha ni=0 X i = 16.6995268, ni=0 X i2 = 28.2537116, ni=0 Yi = 52.0472913, ni=0 X i Yi = 87.6541085
P P P P

Il sistema da risolvere diventa


(
10a 0 + 16.6995268a 1 = 52.0472913
16.6995268a 0 + 28.2537116a 1 = 87.6541085

che ha come soluzione a 0 = 1.84197978 e a 1 = 2.013679425.


Ora a 0 = log(a) da cui a = e a0 = 6.30901637 Invece a 1 = b. Il modello y = ax b diventa quindi y =
6.30901637x 2.013679425 .

91
C APITOLO 7
Metodi diretti per la soluzione di sistemi
lineari

All’inizio e alla fine abbiamo il


mistero. Potremmo dire che
abbiamo il disegno di Dio. A questo
mistero la matematica si avvicina,
senza penetrarlo.

Ennio De Giorgi

7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.2 Elementi di Algebra Lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.3 Metodo di eliminazione di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3.1 Sostituzione all’indietro e in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3.2 Eliminazione di Gauss: esempio particolare . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.3.3 Eliminazione di Gauss: caso generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.4 Strategie di pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7.5 Fattorizzazione triangolare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.5.1 Fattorizzazione LDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.5.2 Fattorizzazione di Gauss senza pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.5.3 Fattorizzazione di Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

7.1 Introduzione
Si consideri la capacità C di un conduttore. Dall’elettrostatica, sappiamo che vale q = C φ dove q rappre-
senta la carica del conduttore e φ il suo potenziale elettrostatico, quando il conduttore è isolato. Nel caso in
cui il conduttore non sia isolato, la situazione cambia. Supponiamo di avere 4 conduttori in equilibrio elet-
trostatico all’interno di una cavità collegata a terra (a terra il potenziale elettrostatico vale zero). Supponendo
di collegare i conduttori 2, 3 e 4 a terra, si ha φ2 = φ3 = φ4 = 0 e φ1 6= 0. Il conduttore 1 induce carica sugli altri
conduttori, per cui, per ciascun conduttore vale, rispettivamente:

q 1 = C 11 φ1
q 2 = C 21 φ1
q 3 = C 31 φ1
q 4 = C 41 φ1

93
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

Si ripete lo stesso discorso supponendo φ2 6= 0 e tutti gli altri potenziali nulli. Poi sia φ3 6= 0 e gli altri potenziali
nulli. Infine φ4 6= 0 e tutti gli altri nulli.
La sovrapposizione dei 4 stati considerati corrisponde alla situazione in cui φ1 , φ2 , φ3 , φ4 sono tutti diversi
da zero. Si ha perciò:

q 1 = C 11 φ1 +C 12 φ2 +C 13 φ3 +C 14 φ4
q 2 = C 21 φ1 +C 22 φ2 +C 23 φ3 +C 24 φ4
q 3 = C 31 φ1 +C 32 φ2 +C 33 φ3 +C 34 φ4
q 4 = C 41 φ1 +C 42 φ2 +C 43 φ3 +C 44 φ4

I coefficienti C i i si chiamano coefficienti di capacità, mentre i coefficienti C i j , con j 6= i si chiamano


coefficienti di induzione.
Si può presentare il problema inverso: note le cariche q i , si vuole determinare il valore dei φi . Si deve
quindi risolvere un sistema lineare di 4 equazioni in 4 incognite.
In questo Capitolo studieremo metodi diretti per la soluzione di sistemi lineari del tipo



 a 11 x 1 + a 12 x 2 + . . . + a 1n x n = b 1

a 21 x 1 + a 22 x 2 + . . . + a 2n x n = b 2




a 31 x 1 + a 32 x 2 + . . . + a 3n x n = b 3 (7.1)

 .. ..
. =.






a x + a x + . . . + a x
n1 1 n2 2 nn n = b n

dove a i j , per i , j = 1, 2, . . . , n e b i , per i = 1, 2, . . . , n sono assegnati e le incognite da determinare so-


no x 1 , x 2 , . . . , x n . I metodi diretti sono metodi che risolvono il problema in un numero fissato di passi,
introducendo un errore dovuto solo all’arrotondamento.

7.2 Elementi di Algebra Lineare


Sia dato un sistema lineare come in (7.1). Per poterlo semplificare, possiamo eseguire le seguenti
operazioni (trasformazioni elementari) :

G L’i -sima equazione del sistema può essere moltiplicata per una qualunque costante λ 6= 0 e l’equazione
risultante può essere usata al posto di quella di partenza: la soluzione del sistema non cambia.
G L’equazione j -sima, moltiplicata per una qualunque costante λ 6= 0 e sommata all’equazione i -sima,
può essere usata al posto dell’equazione i -sima di partenza: la soluzione del sistema non cambia.
G equazioni i -sima e j -sima possono essere scambiate: la soluzione del sistema non cambia.
Le
In questa maniera, un sistema lineare può essere trasformato in uno di più facile soluzione, come
vedremo nell’algoritmo di eliminazione di Gauss.
Poichè le operazioni da fare coinvolgono i coefficienti a i j e b i , conviene scrivere il sistema di equazioni
lineari utilizzando una forma compatta mediante matrici e vettori.
Matrice
Definizione 7.2.1 Una matrice n × m è una griglia rettangolare (o array) di elementi disposti su n righe e m
colonne.

Generalmente, una matrice si denota con una lettera maiuscola, per esempio A, mentre i suoi valori si
indicano con la corrispondente lettera minuscola e i pedici che si riferiscono alla riga e colonna in cui si trova
quel valore, per esempio a i j si riferisce all’elemento di riga i e colonna j della matrice A.

94
7.2. Elementi di Algebra Lineare

 
a 11 a 12 a 13 ... a 1n
a a 22 a 23 ... a 2n 
 21 
£ ¤ a a 32 a 33 ... a 3n 
A = ai j =  31 
 . .. .. .. 
 . 
 . . . ... . 
a n1 a n2 a n3 ... a nn

Esempio
Esempio 7.2.1
µ ¶
2 10 5
A=
3 1 0

è una matrice 2 × 3 con elementi a 11 = 2, a 12 = 10, a 13 = 5, a 21 = 3, a 22 = 1 e a 23 = 0.

Per indicare che una matrice A ha n righe e m colonne, diremo che A ha dimensione n × m. Quando
lavoreremo con matrici quadrate di n righe e n colonne, parleremo di dimensione n della matrice per indicare
che il numero di righe è uguale al numero di colonne e vale n.
I vettori si possono vedere come un caso particolare delle matrici. Si parla di vettore riga se ci riferiamo a Vettori
una matrice 1 × n e si parla di vettore colonna se ci si riferisce a una matrice n × 1.
Per indicare un vettore colonna e un vettore riga si usa, rispettivamente, la notazione
 
x1
x 
 2
x  ¡ ¢
x= 3 x = x1 x2 x3 ... xn
 . 
 . 
 . 
xn

Vediamo, nel seguito, alcune importanti definizioni e proprietà delle matrici.

G Due matrici A e B , di dimensione n × m, sono uguali se hanno lo stesso numero di righe e di colonne,
e, inoltre, vale, a = b per i , = 1, 2, . . . , n e j = 1, 2, . . . , m.
G Date due matrici A e B , entrambe n × m, si definisce la matrice somma di A e B la matrice n × m A + B
ij ij

i cui elementi sono dati da a + b , per i , = 1, 2, . . . , n e j = 1, 2, . . . , m.


G Se A è una matrice n ×m e λ è un numero reale, la moltiplicazione scalare di λ per A, denotata con λA,
ij ij

è una matrice n × m i cui elementi sono λa per i , = 1, 2, . . . , n e j = 1, 2, . . . , m.


G Indichiamo con O la matrice i cui elementi sono tutti uguali a zero.
ij

G Data la matrice A, n × m, indichiamo con −A la matrice i cui elementi sono −a . ij

Teorema 7.2.1 Date A, B e C tre matrici n × m, e λ e µ due numeri reali, valgono le seguenti proprietà:

GA + B = B + A G(A + B ) +C = A + (B +C )
GA + O = O + A = A G A + (−A) = −A + A = O
Gλ(A + B ) = λA + λB G(λ + µ)A = λA + µA
Gλ(µA) = (λµ)A G1A = A

95
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

G Date due matrici A di dimensione n ×m e B di dimensione m ×p, la matrice prodotto di A e B , denotata


Matrice con C = AB , è una matrice i cui elementi c i j sono dati da:
prodotto
m
X
ci j = ai k bk j = ai 1 b1 j + ai 2 b2 j + . . . + ai m bm j
k=1
per i = 1, 2, . . . , n e j = 1, 2, . . . , p.

G Data una matrice A di dimensione n e un vettore colonna x di lunghezza n, si definisce il vettore y = Ax


Prodotto prodotto della matrice A per il vettore x, il vettore le cui componenti sono date da
matrice-
vettore n
X
yi = a i j x j per i = 2, . . . , n
j =1

Prodotto G Dati due vettori x e y si definisce prodotto scalare x y = P x y . T n

G In generale, AB 6= B A.
i =1 i i
scalare tra
vettori

Matrice
G Una matrice D si dice diagonale se è quadrata con d = 0 per i 6= j . Gli elementi diversi da zero si
ij
trovano quindi sulla diagonale (detta diagonale principale) che si può tracciare partendo dall’elemento
diagonale
in alto a sinistra (di posto 11) e arrivando all’elemento in basso a destra (di posto nn).
Esempio:

1 0 0 0
 
0 2 0 0
D =
0

0 5 0
0 0 0 −1

Matrice
Identità
G Si chiama matrice identità e si indica con I , una matrice diagonale i cui elementi diagonali valgono 1.
Esempio:

1 0 0 0
 
0 1 0 0
I =
0

0 1 0
0 0 0 1

Matrice
tridiagonale
G Una matrice si dice tridiagonale se gli elementi non nulli si trovano sulla diagonale principale e sugli
elementi delle diagonali che si trovano sopra e sotto la diagonale principale.
Esempio:

−2 1 0 0 0
 
1 −2 1 0 0
 
0
A= 1 −2 1 0 
0 0 1 −2 1
0 0 0 1 −2

G Una matrice si dice triangolare se ha tutti gli elementi nulli ad eccezione di quelli che si trovano tutti
sopra (o tutti sotto) la diagonale principale.
Matrice – Si definisce matrice triangolare superiore U (U sta per upper) di dimensione n, la matrice per la
triangolare quale, per j = 1, 2, . . . , n, si ha
superiore

u i j = 0 per i = j + 1, j + 2, . . . , n

Matrice – Si definisce matrice triangolare inferiore L (L sta per lower) di dimensione n, la matrice per la
triangolare quale, per i = 1, 2, . . . , n, si ha
inferiore

l i j = 0 per j = i + 1, i + 2, . . . , n

96
7.2. Elementi di Algebra Lineare

Esempi
   
1 −2 5.3 1 0 0
U = 0 3.2 −4  L= 2 −21 0
0 0 10 −3.4 5.7 −4

Teorema 7.2.2 Date A matrice n × m, B matrice m × s, C matrice s × p, D matrice m × s, I m e I s le matrici


identità, rispettivamente di dimensione m e s, e λ e µ due numeri reali, valgono le seguenti proprietà:

G A(BC ) = (AB )C G A(B + D) = AB + AD


GI B = B B I = B Gλ(AB ) = (λA)B = A(λB ).
m s

A questo punto, il sistema lineare (7.1) può essere scritto in forma matriciale come

Ax = b

Collegata alla soluzione di un sistema lineare è l’inversa di una matrice.

Definizione 7.2.2 Data una matrice A di dimensione n, A si dice nonsingolare (o invertibile o regolare) se Matrice
esiste una matrice, che indichiamo come A −1 di dimensione n tale che inversa

A A −1 = A −1 A = I

La matrice A −1 si chiama matrice inversa della A. Una matrice che non ha inversa si dice, invece, singolare (o
non invertibile).

Teorema 7.2.3 Per ogni matrice A di dimensione n nonsingolare si ha:


G A −1 è unica
G A −1 è nonsigolare e (A −1 )−1 = A
G Se B è non singolare, di dimensione n, allora (AB )−1 = B −1 A −1

Dato il sistema Ax = b, se A è nonsingolare, si ha x = A −1 b.


Un’altra importante matrice associata ad un’assegnata matrice A è la sua trasposta.

Definizione 7.2.3 La trasposta di una matrice A di dimensione n × m è la matrice indicata con A T , di di- Trasposta di
mensione m × n, per la quale la colonna i della trasposta coincide con la riga i della matrice A di partenza: una matrice

a iTj = a j i .

Esempio:
 
µ ¶ 1 2
1 2 3
A= A T = 2 5
2 5 6
3 6

Legata alla trasposta di una matrice è la seguente definizione.

Definizione 7.2.4 Una matrice quadrata si dice simmetrica se A = A T .

Esempio:
   
1 4 8 1 4 8
A = 4 2 6 A T = 4 2 6
8 6 5 8 6 5

Teorema 7.2.4 Valgono le seguenti proprietà (per matrici per cui è possibile eseguire le seguenti operazioni):

97
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

G(A ) T T
=A G(A + B ) = A + B
T T T

G(AB ) T
= B T AT GSe esiste A allora (A
−1 −1 T
) = (A T )−1

Il determinante di una matrice permette di stabilire esistenza e unicità della soluzione nei sistemi lineari.
Data una matrice quadrata A, il suo determinante si indica mediante la notazione d et (A) o |A|.

G Se A = [a] è una matrice 1 × 1, allora d et (A) = a.


G Se A è una matrice di dimensione n, si definisce minore M il determinante della sottomatrice di
ij
dimensione n − 1 ottenuta cancellando la i -sima riga e la j -sima colonna da A.
G Il determinante di A è dato dalla formula
Determinante
di una
matrice
n
(−1)i + j a i j M i j
X
d et (A) = (fissato un qualunque i = 1, 2, . . . , n)
j =1
n
(−1)i + j a i j M i j
X
d et (A) = (fissato un qualunque j = 1, 2, . . . , n)
i =1

Il calcolo del determinante di una matrice di dimensione n richiede O (n!) moltiplicazioni. Quindi, anche per
valori piccoli di n, le operazioni da fare diventanto proibitive.

Teorema 7.2.5 Sia assegnata A una matrice quadrata di dimensione n.


G
Se una riga o una colonna di A ha elementi tutti nulli, allora d et (A) = 0.
G
Se A ha due righe o due colonne con gli stessi elementi, allora d et (A) = 0.
G
Denotata con à la matrice ottenuta scambiando due righe di A, si ha d et ( Ã) = −d et (A).
G
Denotata con à la matrice ottenuta da A moltiplicando una sua riga per un numero reale λ, si ha
d et ( Ã) = λd et (A).
G
Denotata con à la matrice ottenuta da A sommando una sua riga per un’altra che è stata moltiplicata
per λ, si ha d et ( Ã) = d et (A).
G
Se B è un’altra matrice di dimensione n, si ha d et (AB ) = d et (A)d et (B )
G
d et (A T ) = d et (A)
G
Se esiste A −1 , si ha d et (A −1 ) =
1

G
d et (A)
Se A è una matrice triangolare superiore o triangolare inferiore o diagonale, allora d et (A) = ni=1 a i i
Q

7.3 Metodo di eliminazione di Gauss


Ritorniamo al sistema di equazioni (7.1), che possiamo scrivere in forma matriciale come Ax = b.
Nel metodo di eliminazione di Gauss1 il sistema lineare di partenza viene trasformato in uno equivalente
di più facile soluzione in quanto la matrice del nuovo sistema ha forma triangolare (superiore o inferiore) e
può essere risolto facilmente mediante sostituzione (all’indietro o in avanti).
Vediamo nel dettaglio come si risolve un sistema lineare con queste tecniche.

7.3.1 Sostituzione all’indietro e in avanti


La matrice A sia nonsingolare e triangolare superiore, cioè
 
a 11 a 12 . . . a 1n
 .. 

a 22 . a 2n 
A=
 
.. .. 
.
 
 . 
a nn
1 Carl Friedrich Gauss fu un matematico e fisico tedesco (1777-1855) che ha dato il suo contribuito in maniera significativa in
numerosi campi: teoria dei numeri, analisi, geometria differenziale, geodesia, magnetismo, astronomia, ottica. Al pari di Eulero, Newton
e Archimede è considerato uno dei più grandi matematici della storia.
In suo onore è stato dato il suo nome a una nave di ricerca tedesca, a una montagna (Gaussberg) in Antartide, a un cratere sulla luna,
e all’unità di misura della densità di flusso magnetico o di induzione magnetica.

98
7.3. Metodo di eliminazione di Gauss

La soluzione del sistema Ax = b può dunque procedere dal basso verso l’alto, a partire dall’ultima riga. Le
equazioni, infatti, sono

a 11 x 1 + a 12 x 2 + a 13 x 3 + . . . a 1n x n = b 1
a 22 x 2 + a 23 x 3 + . . . a 2n x n = b 2
a 33 x 3 + . . . a 3n x n = b 2
.. .
. = ..
a nn x n = b n

L’ultima riga si legge come a nn x n = b n . Quindi possiamo ricavare x n = b n /a nn .


Noto il valore di x n , possiamo ricavare x n−1 dalla riga n − 1 del sistema:
1
a n−1 n−1 x n−1 + a n−1 n x n = b n−1 . Si ha x n−1 = (b n−1 − a n−1 n x n ).
a n−1 n−1
Si procede a ritroso in questo modo arrivando fino alla prima equazione che ci permette di calcolare il va-
lore di x 1 . Osserviamo che tutte le divisioni per i coefficienti a i i sono possibili in quanto stiamo supponendo
A non singolare e, poichè det (A) = ni=1 a i i 6= 0, necessariamente ciascun a i i 6= 0.
Q

Possiamo dunque scrivere l’algoritmo di sostituzione all’indietro:

Per i = n fino a i = 1, procedendo all’indietro con passo −1

b i − nj=i +1 a i j x j
P
xi =
ai i

Un analogo algoritmo si ricava quando la matrice è triangolare inferiore. In tal caso, si parte dalla prima
equazione per ricavare x 1 e poi si va avanti nell’equazione successiva.
Si ha l’algoritmo di sostituzione in avanti:

Per i = 1 fino a i = n, procedendo in avanti con passo 1


Pi −1
bi − j =1 a i j x j
xi =
ai i

7.3.2 Eliminazione di Gauss: esempio particolare


Il metodo di eliminazione di Gauss trasforma il sistema di partenza in uno ad esso equivalente ma più
facile da risolvere, perchè la matrice del sistema è di forma triangolare superiore, in modo da poter applicare
il metodo di sostituzione all’indietro.
Per capire come si applica questo metodo consideriamo un semplice esempio di sistema di 3 equazioni
in 3 incognite, Ax = b dove
   
2 1 2 10
A=  4 1 2  b = 12

1 2 5 20
Le equazioni del sistema sono, dunque,

2x 1 + x 2 + 2x 3 = 10
4x 1 + x 2 + 2x 3 = 12
x 1 + 2x 2 + 5x 3 = 20

99
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

G Al primo passo del metodo, cerchiamo di annullare tutti i coefficienti dell’incognita x1 nella seconda e
terza equazione.
– Dividiamo il coefficiente 4 che moltiplica x 1 nella seconda equazione con il coefficiente 2 che
4
moltiplica x 1 nella prima equazione. Otteniamo il valore = 2. Adesso moltiplichiamo per questo
2
valore (2) la prima equazione, ricavando

2 (2x 1 + x 2 + 2x 3 = 10) =⇒ 4x 1 + 2x 2 + 4x 3 = 20

Se ora facciamo la sottrazione tra la seconda equazione del sistema e questa che abbiamo ricavato
otteniamo

4x 1 + x 2 + 2x 3 = 12 −
4x 1 + 2x 2 + 4x 3 = 20 =

−x 2 − 2x 3 = −8

Sostituiamo questa equazione alla seconda del sistema (il sistema rimane equivalente), ricavando

2x 1 + x 2 + 2x 3 = 10
−x 2 − 2x 3 = −8
x 1 + 2x 2 + 5x 3 = 20

Abbiamo eliminato, in questo modo, il coefficiente di x 1 nella seconda equazione.


– Alla stessa maniera, dividiamo il coefficiente di x 1 nella terza equazione (che vale 1) con il coeffi-
1 1
ciente di x 1 nella prima equazione: abbiamo . Moltiplichiamo la prima equazione per e poi
2 2
1
facciamo la sottrazione tra la terza equazione e la prima moltiplicata per :
2

x 1 + 2x 2 + 5x 3 = 20 −
1 1
(2x 1 + x 2 + 2x 3 = 10) ⇐⇒x 1 + x 2 + x 3 = 5 =
2 2

3
x 2 + 4x 3 = 15
2
Sostituiamo questa equazione alla terza del sistema.
– A questo punto il sistema è

2x 1 + x 2 + 2x 3 = 10
−x 2 − 2x 3 = −8
3
x 2 + 4x 3 = 15
2

Nella seconda e terza equazione non c’è più l’incognita x 1 .


G Per poter arrivare ad un sistema di equazioni triangolare inferiore, dobbiamo eliminare il coefficiente di
x 2 nella terza equazione del sistema. Ripetiamo il ragionamento appena fatto, lavorando sulla seconda
e terza equazione.
3
– Consideriamo il coefficiente di x 2 della terza equazione ( ) e lo dividiamo per il coefficiente
2
di x 2 della seconda equazione ( che vale −1). Moltiplichiamo la seconda equazione per questo

100
7.3. Metodo di eliminazione di Gauss

3 3
coefficiente (cioè per − ) e poi sottraiamo la terza equazione dalla seconda moltiplicata per − :
2 2
3
x 2 + 4x 3 = 15 −
2
3 3
− (−x 2 − 2x 3 = −8) ⇐⇒ x 2 + 3x 3 = 12 =
2 2
x3 = 3

– Sostituiamo questa equazione alla terza del sistema, ricavando il sistema equivalente

2x 1 + x 2 + 2x 3 = 10
−x 2 − 2x 3 = −8
x3 = 3

Con tutte le trasformazioni effettuate, abbiamo trasformato il sistema di partenza in uno equivalente, che
si può risolvere facilmente mediante sostituzioni all’indietro. Dall’ultima equazione abbiamo x 3 = 3. Sosti-
tuendo questo valore nella seconda equazione otteniamo −x 2 − 6 = −8 da cui x 2 = 2. Infine, sostituendo i
valori di x 3 e x 2 nella prima equazione abbiamo 2x 1 + 2 + 6 = 10 da cui x 1 = 1.

7.3.3 Eliminazione di Gauss: caso generale


Sia dato un sistema di n equazioni, in cui la matrice A è piena (o densa, cioè abbia quasi tutti gli elementi
non nulli). Applichiamo trasformazioni elementari per riga in modo da ridurre il sistema di partenza in uno
equivalente di forma triangolare superiore, che potremo risolvere mediante sostituzione all’indietro.
La soluzione del problema Ax = b, infatti, non cambia se moltiplichiamo una riga per una costante, se
sottraiamo il multiplo di una riga da un’altra riga o se facciamo scambi di righe, come abbiamo detto all’inizio
della Sezione 7.2.
Supponiamo, per il momento, che tutti gli elementi della diagonale principale di A siano non nulli.
G Al primo passo vogliamo eliminare gli elementi della prima colonna al di sotto della diagonale
principale:
a 21
– sottraiamo la prima equazione moltiplicata per dalla seconda equazione:
a 11
a 21 x 1 + a 22 x 2 + a 23 x 3 + . . . + a 2n x n = b 2 −
a 21 a 21
(a 11 x 1 + a 12 x 2 + a 13 x 3 + . . . + a 1n x n ) = b1 =
a 11 a 11

a 21 a 21 a 21 a 21
(a 22 − a 12 )x 2 + (a 23 − a 13 )x 3 + . . . + (a 2n − a 1n )x n = b 2 − b1
a 11 a 11 a 11 a 11

a 31
– sottraiamo la prima equazione moltiplicata per dalla terza equazione.
– ... a 11
a n1
– sottraiamo la prima equazione moltiplicata per dalla n-sima equazione.
a 11
Come risultato di questa operazione avremo una nuova matrice con gli elementi della prima
colonna, eccetto quello di posto 11, tutti uguali a zero.

    
a 11 a 12 ... a 1n x1 b1
(1) (1)     (1) 
 0
 a 22 ... a 2n   x 2  b 2 
 .  =  . 
 . .. ..     
 .
 . . ... .   ..   .. 
(1) (1)
0 a n2 ... a nn xn b n(1)

101
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

G Al secondo passo, consideriamo il sistema ridotto che si ha ignorando la prima equazione del sistema
e la prima colonna della nuova matrice che abbiamo ottenuta (che ha tutti 0 al di sotto dell’elemento
diagonale).
A questa sottomatrice applichiamo lo stesso procedimento di prima, sottraendo, quindi, la prima
a (1)
equazione della sottomatrice moltiplicata per 32 (1)
dalla seconda equazione della sottomatrice, e così
a 22
via.
Dopo questo passo, il sistema sarà equivalente a:

a 11 a 12 ... ... a 1n  x   b 1 
 
(1) (1) (1)  1
 0 a 22 a 23 ... a 2n  x2  b (1) 

 . 
   2 
 . (2) (2)   x 3  b (2) 
  
 . 0 a 33 ... a 3n    3 =
 .   . 
 .. .. .. ..   . .

 . . . ... .  .   . 
0 0 (2)
a n3 ... a (2) x n b n(1)
nn

G Dopo aver applicato questo procedimento n − 1 volte, avremo un sistema triangolare superiore
semplice da risolvere utilizzando l’algoritmo di sostituzione all’indietro.

a 11 a 12 ... ... a 1n  x   b 1 
 
(1) (1) (1)  1
 0 a 22 a 23 ... a 2n  x2   b (1) 

 . 
   2 
 . (2) (2)   x 3   b (2) 
  
 . 0 a 33 ... a 3n   =  3 
 .   . 
 .. .. ..   .   . 

 . . ... ... .  . .
x (n−1)
0 0 ... 0 a (n−1) n bn
nn

7.4 Strategie di pivoting

Gli elementi diagonali generati ad ogni passo del metodo di eliminazione a i(k) i
sono detti elementi
pivotali.
Nel descrivere il metodo di eliminazione di Gauss abbiamo supposto, per semplicità, che tutti gli elemen-
ti diagonali fossero diversi da zero. Ma una matrice può essere non singolare senza che gli elementi della
diagonale principale siano tutti diversi da zero.
Inoltre, andando avanti nel procedimento di eliminazione, può succedere che un elemento pivotale di-
venti nullo – e quindi la corrispondente incognita non può essere eliminata attraverso quella equazione nel
procedimento di sostituzione all’indietro.
C’è, infine, da considerare il fatto che si possono avere grossi errori numerici quando un elemento
pivotale è molto piccolo.
Cosa fare in queste circostanze? In che modo applicare l’eliminazione di Gauss?
Si hanno le cosiddette strategie di pivoting:
G pivoting parziale
Mano mano che si va avanti nell’eliminazione, per i = 1, 2, . . . , n −1 a ciascuno stadio si sceglie il più
piccolo intero q tale che
(i −1)
|a qi | = max |a (ij i−1) |
i ≤ j ≤n

e si scambiano le righe i e q.
Si opera, dunque, un controllo sulla colonna i -sima dalla posizione i fino alla posizione n, andando
a cercare il coefficiente massimo in modulo.
G pivoting totale
Nel pivoting totale, invece, la ricerca dell’elemento più grande avviene in tutta la sottomatrice che
si ha considerando le colonne e le righe rispettivamente a destra e sotto l’elemento diagonale i -simo.

102
7.4. Strategie di pivoting

Si vanno quindi a cercare i più piccoli interi q e r tali che


(i −1)
|a qr | = max |a (ij k−1) |
i ≤k, j ≤n

Si opera, quindi, uno scambio non solo di righe ma anche di colonne in modo da portare l’ele-
mento pivotale dalla riga e colonna qr al posto i i . Di questo scambio di colonne bisogna conservare
traccia perchè vengono scambiate anche le componenti del vettore soluzione, in modo da effettuare lo
scambio inverso una volta risolto il sistema.
Il maggiore sforzo computazionale garantisce maggiore accuratezza e stabilità nei risultati, nel senso che
gli errori di arrotondamento non sono così amplificati come potrebbe succedere senza l’adozione di una
tecnica di pivoting.

Esempio
Esempio 7.4.1 Consideriamo il sistema

x 1 + x 2 +x 3 = 1
x 1 + 1.0001x 2 + 2x 3 = 2
x 1 + 2x 2 + 2x 3 = 1

L’esatta soluzione, corretta a 4 cifre decimali, è x = (1, −1.0001, 1.0001)T .


L’eliminazione di Gauss senza pivoting porta al sistema

x 1 + x 2 +x 3 = 1
0.0001x 2 + 1x 3 = 1
1x 2 + 1x 3 = 0

e, infine, a

x 1 + x 2 +x 3 = 1
0.0001x 2 + 1x 3 = 1
−9999x 3 = −10000

Se usiamo un’aritmetica in base 10 con 3 cifre decimali, allora la sostituzione all’indietro ci darà

−10000 1−1
x3 = = 1.000, x2 = = 0, x 1 = 0.
−9999 0.0001
La soluzione è completamente sbagliata.
Se, invece, facciamo lo scambio della seconda e terza riga adottando il pivoting parziale, allora avremo
il sistema:

x 1 + x 2 +x 3 = 1
1x 2 + 1x 3 = 0
0.0001x 2 + 1x 3 = 1

103
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

e, infine,

x 1 + x 2 +x 3 = 1
1x 2 + 1x 3 = 0
0.9999x 3 = 1

Questa volta si ha (sempre lavorando con 3 cifre decimali) x 3 = 1.000, x 2 = −1.000, x 1 = 1.000, che è la
soluzione corretta a 3 cifre decimali.

7.5 Fattorizzazione triangolare

Il metodo di eliminazione di Gauss, visto in forma matriciale, decompone la matrice


A nel prodotto LU di due matrici L, triangolare inferiore, e U , triangolare superiore.
Basta considerare, ad ogni passo, la matrice
 
1
0 1 
 
. 
.
. 0 1


 .. ..
 

. . 0 1 
 
(k−1)
.
. .. .. a k+1 k


. . . − 1 
(k) (k−1)
M = a kk
 

 (k−1) 
.
. .. .. a k+2 k .. 
. . . − . 
(k−1)


 a kk 

. .. .. .. .. 
. .
. . . .


a (k−1)
 
. .. ..
 ..

. . − n(k−1)
k
1
a kk

Si considera quindi la matrice A (k) = M (k) A (k−1) = M (k) M (k−1) . . . M (1) A e il vettore
b(k) = M (k) b(k−1) = M (k) M (k−1) · · · M (1) b.
Dopo n − 1 passi, avremo

U = A (n−1) = M (n−1) . . . M (2) M (1) A

con U matrice triangolare superiore. Otteniamo quindi A = LU , con

L = (M (n−1) · · · M (2) M (1) )−1 = [M (1) ]−1 · · · [M (n−2) ]−1 [M (n−1) ]−1

L è triangolare inferiore con elementi dati dal prodotto delle matrici M (k) generate durante
l’eliminazione di Gauss.

7.5.1 Fattorizzazione LDU


L’eliminazione di Gauss è un caso particolare di fattorizzazione LDU , nella quale la matrice A viene de-
composta nel prodotto di 3 matrici, la L che è triangolare inferiore con elementi sulla diagonale principale

104
7.5. Fattorizzazione triangolare

(elementi diagonali) uguali a 1, la D che è una matrice diagonale e la U che è una triangolare superiore con
elementi diagonali uguali a 1.
Nell’eliminazione di Gauss vista prima, nella U abbiamo inglobato anche la matrice D, per cui abbiamo
una fattorizzazione LU .
La decomposizione LDU è assicurata dal teorema LDU . Prima di vedere il teorema, definiamo i minori
principali di una matrice A.

Definizione 7.5.1 Data una matrice A si definisce minore principale di dimensione k (con 1 ≤ k ≤ n), la Minore
sottomatrice che si ha prendendo le prime k righe e k colonne di A. principale

a 11 ... a 1k
 
 .. .. 
 . . 
a k1 ... a kk

Teorema 7.5.1 (LDU ) Nell’ipotesi che tutti i minori principali di A, (per i = 1, 2, . . . , n) siano non-singolari,
allora la matrice A è decomponibile in maniera univoca nel prodotto A = LDU

Qualsiasi matrice non singolare può essere condotta sotto una forma tale da soddisfare il teorema LDU
mediante opportuni scambi di righe e di colonne (abbiamo visto cosa fare quando un elemento pivotale è
nullo). Fare uno scambio di righe o di colonne significa moltiplicare la matrice A con un’opportuna matrice
di permutazione.
Una matrice di permutazione P è una matrice ottenuta dalla matrice identità operando scambi di righe o
di colonne in modo che la matrice risultante abbia esattamente un unico valore diverso da zero su ogni riga
e colonna, e tale valore sia uguale a 1. Matrice di
permutazio-
ne
Esempio
Esempio 7.5.1 Si consideri la matrice di permutazione P di dimensione 3 data da
 
1 0 0
P = 0 0 1
0 1 0

Qualunque sia la matrice A, di dimensione 3, moltiplicandola a sinistra per P si ottiene lo scambio della
seconda e terza riga di A; invece, moltiplicandola a destra per P si ottiene lo scambio della seconda e
terza colonna di A:

    
1 0 0 a 11 a 12 a 13 a 11 a 12 a 13
P A = 0 0 1 a 21 a 22 a 23  = a 31 a 32 a 33 
0 1 0 a 31 a 32 a 33 a 21 a 22 a 23

    
a 11 a 12 a 13 1 0 0 a 11 a 13 a 12
AP = a 21 a 22 a 23  0 0 1 = a 21 a 23 a 22 
a 31 a 32 a 33 0 1 0 a 31 a 33 a 32

Quindi, il teorema LDU si può applicare alla matrice A o ad un’opportuna matrice P A, se si effettua il
pivoting parziale, o a P AQ se si effettua il pivoting totale (e quindi si considerano due matrici di permutazioni
P e Q).
In genere, la matrice D viene inglobata nella L o nella U (post-moltiplicando o pre-moltiplicando le L e le
U definite prima per la D).

G Nel caso in cui la matrice D viene inglobata nella matrice L, la L ha elementi diagonali l ii 6= 0, mentre
la U ha elementi diagonali unitari. Si parla di fattorizzazione di Crout.

105
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

G Nel caso in cui la matrice D viene inglobata nella matrice U , la U ha elementi diagonali u ii 6= 0, mentre
la L ha elementi diagonali unitari. Si parla di fattorizzazione di Doolittle.
Scriviamo in forma estesa il prodotto tra matrici, nell’ipotesi di operare la fattorizzazione di Crout:
    
a 11 a 12 . . . a 1n l 11 0 ... 0 1 u 12 . . . u 1n
a
 21 a 22 . . . a 2n   l 21 l 22 . . . 0  0 1 . . . u 2n 
  

 .
 . .. ..  =  ..
  .. ..   ..
  .. .. 
 . . .   . . . . . . 

a n1 a n2 ... a nn l n1 l n2 ... l nn 0 0 ... 1

Moltiplichiamo la prima riga di L per le colonne di U ed eguagliamo i termini con gli elementi della prima
riga di A. Otteniamo:
l 11 · 1 = a 11
l 11 · u 1k = a 1k , k = 2, . . . , n
Quindi: l 11 = a 11 e u 1k = a 1k /l 11 . Abbiamo ricavato gli elementi della prima riga di L e U .
Moltiplicando le successive righe di L per le colonne di U ed uguagliando i termini ai corrispondenti
termini di A, abbiamo:
jX
−1
l i j = ai j − l i m um j i = 1, 2, . . . n j = 1, 2, . . . , i
m=1

1 iX
−1
ui j = (a i j − l i m um j ) i = 1, 2, . . . , n − 1 j = i + 1, . . . n
li i m=1

Si calcolano prima gli elementi della riga i -sima di L e poi quelli della riga i -sima di U , per i = 1, 2, . . . , n.
Trovate le matrici L e U , il sistema di partenza Ax = b è equivalente a LU x = b.
Si pone, dunque, y = U x, ottenendo il sistema Ly = b. Si ricava facilmente y mediante sostituzione in
avanti e da U x = y si ricava x mediante sostituzione all’indietro.
Lo sforzo computazionale maggiore è quindi quello per il calcolo dei coefficienti di L e U .
Nell’eliminazione di Gauss noi ricaviamo espressamente solo la U mentre le modifiche operate sulla
colonna dei termini noti è equivalente al prodotto L −1 b (quindi da LU x = b risolviamo U x = L −1 b).

7.5.2 Fattorizzazione di Gauss senza pivoting


Abbiamo visto che, a volte, il metodo di eliminazione di Gauss richiede scambi di righe per evitare divisio-
ni per zero. Allo stesso modo, il teorema di fattorizzazione LDU vale su matrici A non singolari o su matrici
ottenute da A mediante moltiplicazioni a sinistra o a destra con opportune matrici di permutazione.
Ci chiediamo se esistono matrici per le quali il metodo di eliminazione di Gauss possa essere implementa-
to senza scambi di righe e per le quali l’algoritmo di eliminazione di Gauss sia stabile rispetto ad una crescita
di errori di arrotondamento.
Vediamo, nel seguito, alcune speciali classi di matrici per cui valgono le nostre richieste.
Matrice dia- Una matrice A di dimensione n si dice diagonalmente dominante in senso stretto per righe se vale la
gonalmente relazione
dominante in
senso stretto n
X
per righe |a i i | > |a i j | per ogni i = 1, 2, . . . , n.
j =0
j 6=i

Matrice dia- Una matrice A di dimensione n si dice diagonalmente dominante in senso stretto per colonne se vale la
gonalmente relazione
dominante in
senso stretto n
X
per colonne |a j j | > |a i j | per ogni j = 1, 2, . . . , n.
i =0
i 6= j

106
7.5. Fattorizzazione triangolare

Esempio
Esempio 7.5.2
 
7 3 1
A = 2 10 −2
5 0 6

A è una matrice diagonalmente dominante in senso stretto per righe poichè vale:|7| > |3| + |1| = 4, |10| >
|2|+|−2| = 4 e |6| > |5|+|0|. Non è diagonalmente dominante in senso stretto per colonne in quanto sulla
prima colonna si ha |7| = |2| + |5|.

Esempio
Esempio 7.5.3
 
6 3 −4
A= 3 9 5
−4 5 11

A non è diagonalmente dominante in senso stretto per righe poichè, sulla prima riga si ha |6| < |3|+|−4| =
7. Essendo simmetrica, la matrice non può essere neanche diagonalmente dominante in senso stretto per
colonne, perchè la relazione che abbiamo sulla prima riga vale sulla prima colonna.

Le definizioni appena date si possono rilassare, definendo le matrici diagonalmente dominanti.


Una matrice A di dimensione n si dice diagonalmente dominante per righe se vale la relazione
n
X
|a i i | ≥ |a i j | per ogni i = 1, 2, . . . , n.
j =0
j 6=i
Matrice dia-
Analoga è la definizione di matrice diagonalmente dominante per colonne (basta applicare la definizione gonalmente
dominante
di matrice diagonalmente dominante per righe sulla matrice A T )
Si hanno i seguenti teoremi.

Teorema 7.5.2 Se A è una matrice diagonalmente dominante e non singolare, allora il metodo di eliminazione
di Gauss può essere implementato senza alcuno scambio di righe e di colonne e i calcoli sono stabili rispetto
alla crescita degli errori di arrotondamento.

Teorema 7.5.3 Se A è una matrice diagonalmente dominante in senso stretto (per righe o per colonne), allora
A è non singolare. In questo caso il metodo di eliminazione di Gauss può essere implementato senza alcuno
scambio di righe e di colonne e i calcoli sono stabili rispetto alla crescita degli errori di arrotondamento.

Un’altra importante classe di matrici è data dalle matrici definite positive.


Una matrice A di dimensione n si dice
G definita positiva se è simmetrica e vale xT Ax > 0 qualunque sia il vettore x 6= 0
G
Matrice
semidefinita positiva se xT Ax ≥ 0 qualunque sia il vettore x, definita

G indefinita altrimenti.2
positiva

Si ha un’analoga definizione per matrici definite negative e semidefinite negative. Una matrice A di
dimensione n si dice
G definita negativa se è simmetrica e vale xT Ax < 0 qualunque sia il vettore x 6= 0,
G
Matrice
semidefinita negativa se xT Ax ≤ 0 qualunque sia il vettore x. definita
negativa
2 Osserviamo che non tutti gli autori richiedono la simmetria per definire una matrice definita positiva, e distinguono tra matrici
definite positive e matrici simmetriche definite positive.

107
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

Dalla definizione di matrice definita positiva, deve essere xT Ax > 0 qualunque sia il vettore x, vale a dire:
  
a 11 a 12 . . . a 1n x1
¢  a 21 a 22 . . . a 2n   x 2 
  
¡
x1 x2 . . . xm   .. .. .. 
 . 
 
 . . ... .   .. 
a n1 a n2 . . . a nn x m
 Pn
j =1 a 1 j x j

P n
¢  j =1 a 2 j x j  X
  n n
¡ X
= x1 x2 ... xm  . = ai j xi x j > 0

 .
.

 i =1 j =1
Pn
j =1 a n j x j

Basarsi sulla definizione per verificare che una matrice sia o meno definita positiva può essere molto
difficile. Fortunatamente, ci sono molti criteri che ci permettono di dire se una matrice è definita positiva
oppure no.
IL seguente risultato ci permette di eliminare certe matrici dalla classe delle matrici definite positive, se
non soddisfano certi requisiti.

Teorema 7.5.4 Se una matrice A di dimensione n è definita positiva, allora


G A ammette la matrice inversa;
G a i i > 0 per ogni i = 1, 2, . . . , n

Quindi se una matrice ha elementi a i i ≤ 0, non è una matrice definita positiva, perché, se lo fosse, in base al
teorema avrebbe elementi diagonali tutti positivi.
Vediamo ora una condizione necessaria e sufficiente per matrici definite positive.

Teorema 7.5.5 Una matrice A simmetrica di dimensione n è definita positiva se e solo se tutti i suoi minori
principali hanno determinante positivo.

Teorema 7.5.6 Una matrice A simmetrica di dimensione n con elementi diagonali tutti positivi e
diagonalmente dominante è definita positiva.

Anche per matrici simmetriche definite positive, si può applicare il metodo di eliminazione di Gauss
senza operare scambi di righe e di colonne e i calcoli rimangono stabili rispetto alla crescita degli errori di
arrotondamento. Questo risultato ci serve per la fattorizzazione di Cholesky.

7.5.3 Fattorizzazione di Cholesky


Nel caso in cui la matrice A sia simmetrica, il teorema LDU si presenta nel seguente modo

Teorema 7.5.7 (LDU per matrici simmetriche) Se A è una matrice simmetrica e nessuno dei suoi minori
principali è singolare, allora A si può decomporre nel prodotto A = LDL T , dove L è triangolare inferiore con
elementi diagonali unitari ed è univocamente determinata, L T è la sua trasposta e D è matrice diagonale.

Dimostrazione. Intanto valgono le ipotesi del teorema LDU e quindi si può scrivere in maniera univoca
A = LDU con L matrice triangolare inferiore, D diagonale e U triangolare superiore. Inoltre, poichè A è
simmetrica, e quindi A = A T , si ha pure LDU = (LDU )T vale a dire LDU = U T D T L T = U T DL T . Si deduce,
dall’uguaglianza, che U = L T e la decomposizione diventa A = LDL T . 4
Nel caso particolare in cui A sia simmetrica e definita positiva, da xT Ax > 0 vale pure

xT Ax = xT LDL T x = (L T x)T DL T x = yT Dy > 0 con y = L T x per ogni x > 0.

Essendo A è definita positiva, risulta anche D definita positiva. Perciò gli elementi di D (che è una matrice
diagonale) devono necessariamente essere tutti positivi. In tal caso, si considera la matrice D 1/2 che è la

108
7.6. Esercizi

matrice diagonale con elementi dati dalle radici quadrate degli elementi diagonali di D (si prende il valore
positivo della radice quadrata, e il risultato è un numero reale in virtù del fatto che gli elementi diagonali di
D sono tutti positivi). Si pone, quindi, M = LD 1/2 e si ottiene A = M M T : abbiamo il prodotto di una matrice
triangolare inferiore con coefficienti tutti reali per la sua trasposta. Se D non fosse definita positiva (ma avesse
qualche elemento negativo), allora neanche A sarebbe definita positiva e la matrice M sarebbe non reale.
Quindi se A è simmetrica, si ha la decomposizione nel prodotto LL T (chiamiamo di nuovo con L la
matrice M ) con L reale se e solo se A è definita positiva.
I coefficienti della matrice L si trovano facendo il prodotto righe per colonne ed eguagliando i termini ai
corrispondenti elementi di A.
Si ricava:

p
l 11 = a 11
l i 1 = a i 1 /l 11 i = 2, 3, . . . , n
v
iX
−1
u
u
l i i = t(a i i − l i2k ) i = 2, 3, . . . , n
k=1
jX
−1
1
li j = (a i j − li k l j k ) j = 2, . . . , n i = j + 1, . . . , n
li i k=1

Tale fattorizzazione prende il nome di fattorizzazione di Cholesky 3 .

7.6 Esercizi

Esercizio 7.6.1
 Sia data
 la matrice
1 0 2
A = 0 4 8 
2 8 29
Provare che verifica le condizioni del teorema LDU e trovare i fattori L e L T tali che A = LL T .

µ ¶
1 0
Svolgimento La matrice A è simmetrica e soddisfa le ipotesi del teorema LDU ( infatti |a 11 | = 1, d et =
0 4
T
4 e d et (A) = 116 − 16 − 64 = 36) per cui è possibile scrivere la matrice A come A = LL . Si ha, quindi:
    2 
l 11 0 0 l 11 l 21 l 31 l 11 l 11 l 21 l 11 l 31
l 21 l 22 0   0 l 22 l 32  = l 21 l 11 l2 +l2 l 21 l 31 + l 22 l 32 
21 22
2 2 2
l 31 l 32 l 33 0 0 l 33 l 31 l 11 l 31 l 21 + l 32 l 22 l 31 + l 32 + l 33

Devono quindi valere le relazioni:


2
l 11 = 1 =⇒ l 11 = 1
l 21 l 11 = 0 =⇒ l 21 = 0
l 31 l 11 = 2 =⇒ l 31 = 2
2 2
p
l 21 + l 22 = 4 =⇒ l 22 = 4 − 0 = 2
l 21 l 31 + l 22 l 32 = 8 =⇒ l 32 = 8/2 = 4
2 2 2
p p p
l 31 + l 32 + l 33 = 29 =⇒ l 33 = 29 − 22 − 42 = 29 − 4 − 16 = 9 = 3
3 André-Louis Cholesky (1875-1918) fu un matematico francese. Fu ufficiale ingegnere e morì alla fine della prima guerra mondiale.

109
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

La matrice L è dunque
 
1 0 0
0 2 0
2 4 3

Esercizio 7.6.2
 Data la matrice

0.2 1 0.2
A =  1 6.5 1.75
0 2 2.25
(a) verificare che A soddisfa le condizioni del teorema LDU ;
(b) fattorizzare secondo Crout A = LU (prendendo u i i = 1);
(c) usare la fattorizzazione per calcolare det (A −2 );
(d) usare la fattorizzazione per risolvere il sistema Ax = b, con bT = (2.8 19.25 10.75)T .

Svolgimento
(a) La matrice verifica le condizioni del teorema LDU in quanto i minori principali costruiti a partire
dall’angolo superiore sinistro hanno tutti determinante diverso da zero:
µ ¶
0.2 1
a 11 = 0.2 6= 0 det = 0.3 6= 0 det A = 0.375 6= 0
1 6.5

(b) La fattorizzazione di A come A = LU si costruisce imponendo:


    
0.2 1 0.2 l 11 0 0 1 u 12 u 13
A= 1 6.5 1.75 = LU = l 21 l 22 0  0 1 u 23 
0 2 2.25 l 31 l 32 l 33 0 0 1

Usando le formule di pag. 106, si ottiene

l 11 = 0.2
0.2u 12 = 1 =⇒ u 12 = 5
0.2u 13 = 0.2 =⇒ u 13 = 1
l 21 = 1
1 · 5 + l 22 = 6.5 =⇒ l 22 = 1.5
1 · 1 + 1.5u 23 = 1.75 =⇒ u 23 = 0.5
l 31 = 0
0 · 5 + l 32 = 2 =⇒ l 32 = 2
0 · 1 + 2 · 0.5 + l 33 = 2.25 =⇒ l 33 = 1.25

Le matrici L e U sono:
   
0.2 0 0 1 5 1
L= 1 1.5 0  U = 0 1 0.5
0 2 1.25 0 0 1

(c) Si ha det A = det LU = det L detU = det L = 0.375. Quindi det (A −2 ) = det (A)−2 = 0.375−2 = 7.11111111.

110
7.6. Esercizi

(d) Da Ax = b si ha LU x = b.
Si pone U x = y e si hanno i due sistemi da risolvere per sostituzione in avanti e all’indietro: Ly = b e
U x = y.


 y 1 = 2.8/0.2 = 14
    
0.2 0 0 y1 2.8 
1 1.5 0   y 2  = 19.25 =⇒ y 2 = (19.25 − 14)/1.5 = 3.5
0 2 1.25 y 3 10.75

y 3 = (10.75 − 2 · 3.5)1.25 = 3


x 3 = 3
    
1 5 1 x1 14 
0 1 0.5 x 2  = 3.5 =⇒ x 2 = 3.5 − 3 · 0.5 = 2
0 0 1 x3 3

x 1 = 14 − 3 − 5 · 2 = 1

Quindi x = (1, 2, 3)T .

Esercizio 7.6.3
 È dato il sistema
 lineare
 Ax =  b dove:
16 −8 4 20
A = −8 20 4  b =  28 
4 4 12.25 28.25
(a) Provare che la matrice è definita positiva.
(b) Fattorizzare la matrice secondo Cholesky: A = LL T .
(c) Usare la fattorizzazione per risolvere il sistema Ax = b e per calcolare det(A 3 ).

Soluzione
(a) La matrice è simmetrica, definita positiva in quanto gli elementi della diagonale principale sono tutti
positivi e la matrice è diagonalmente dominante in senso stretto:

16 > | − 8| + |4| = 12
20 > | − 8| + |4| = 12
12.25 > |4| + |4| = 8

(b) Ponendo A = LL T si ricava:


2
l 11 = 16 =⇒ l 11 = 4
l 21 l 11 = −8 =⇒ l 21 = −2
l 31 l 11 = 4 =⇒ l 31 = 1
2 2
p
l 21 + l 22 = 20 =⇒ l 22 = 20 − 4 = 4
l 21 l 31 + l 22 l 32 = 4 =⇒ l 32 = (4 + 2)/4 = 1.5
2 2 2
p p
l 31 + l 32 + l 33 = 12.25 =⇒ l 33 = 12.25 − 1 − 2.25 = 9 = 3

La matrice L è dunque
 
4 0 0
L = −2 4 0
1 1.5 3

111
7. M ETODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI

(c) Per risolvere il sistema Ax = b, adoperiamo il metodo di sostituzione in avanti e all’indietro risolvendo
i sistemi: Ly = b e poi L T x = y.
Il primo sistema dà:
    
4 0 0 y1 20
−2 4 0  y 2  =  28 
1 1.5 3 y3 28.25

e otteniamo y 1 = 20/4 = 5, y 2 = (28 + 10)/4 = 9.5, y 3 = (28.25 − 5 − 14.25)/3 = 3.


Nel risolvere il sistema L T x = y si ha
    
4 −2 1 x1 5
0 4 1.5 x 2  = 9.5
0 0 3 x3 3

da cui x 3 = 1, x 2 = (9.5 − 1.5)/4 = 2, x 1 = (5 − 1 + 4)/4 = 2, quindi x = (2, 2, 1).


Inoltre, da det(A) = det(LL T ) = det(L)2 = (4 · 4 · 3)2 = 482 = 2304 e da det(A 3 ) = (det(A))3 si ha
det(A 3 ) = 23043 = 12230590464.

112
C APITOLO 8
Metodi Iterativi per la soluzione di sistemi
lineari

Mi spiace ammettere che la materia


che mi è piaciuta di meno è stata la
matematica. Ci ho pensato su, e
credo che la ragione sia che la
matematica non lascia spazio alle
discussioni. Se fai un errore, non
puoi scamparla.

Malcom X

8.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113


8.2 Metodi iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.3 Norme di vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.4 Norme di matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.5 Autovalori e autovettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.6 Metodi classici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
8.6.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
8.6.2 Controllo della convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
8.6.3 I metodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.6.4 Convergenza dei metodi di Jacobi, Gauss-Seidel, rilassamento . . . . . . . . . . . . . . . . 125
8.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

8.1 Introduzione
L’equazione che governa la conduzione del calore in una piastra metallica piana, omogenea e isotropa
prende il nome di equazione di Poisson e si scrive come

∂2 T ∂2 T f (x, y)
+ =
∂x 2 ∂y 2 ρcK H

Si tratta di un’equazione alle derivate parziali dove T [ o C ] è la temperatura, K H [m 2 /s] è il coefficiente di dif-
fusività termica, ρ [K g /m 2 ] è la densità della piastra, c [C al /K g o C ] è il calore specifico, f (x, y) [C al /m 2 s] è il
calore aggiunto o sottratto alla piastra per unità di tempo e di area. In letteratura diverse tecniche numeriche
permettono di risolvere il problema (ricordiamo i metodi alle differenze finite e i metodi agli elementi finiti),
in determinati punti (detti nodi) della piastra. Qualunque sia il metodo utilizzato, si arriva ad un sistema di
equazioni lineari del tipo

HT = q

113
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

dove H rappresenta la matrice di discretizzazione del metodo, T rappresenta il vettore delle temperature nei
nodi e q è il vettore dei termini noti che deriva dal metodo applicato.
La matrice H puó avere una dimensione molto elevata ma ha la caratteristica di essere sparsa, cioè di
avere pochi elementi diversi da zero per ogni riga.
Per risolvere sistemi lineari di questo tipo, si preferisce usare metodi iterativi piuttosto che diretti. In
questo Capitolo presentiamo alcuni dei metodi iterativi per la risoluzione di sistemi lineari.

8.2 Metodi iterativi


Per risolvere un sistema di equazioni lineari Ax = b, applicando un metodo diretto, e trascurando gli
errori di arrotondamento, si ottiene la soluzione esatta del problema in un numero finito (e noto a prio-
ri) di operazioni. Nei metodi iterativi, invece, si parte da un’approssimazione iniziale che viene migliorata,
mediante un procedimento iterativo, fino ad ottenere una approssimazione sufficientemente accurata della
soluzione. L’idea di risolvere sistemi lineri con metodi iterativi risale ai tempi di Gauss (1823), ma solo con
l’avvento dei computers (negli anni cinquanta) si può osservare il loro sviluppo, visto che diventa possibile
risolvere sistemi lineari dove la matrice A è sparsa e di grandi dimensioni – un particolare tipo di proble-
ma improponibile per i metodi diretti. Difatti, nei metodi diretti, il processo di eliminazione di Gauss (o la
decomposizione della matrice di partenza nel prodotto LU con L triangolare inferiore e U triangolare supe-
riore) porta all’introduzione del cosiddetto fill-in, cioè a matrici L e U con elementi diversi da zero là dove
la matrice di partenza A ha elementi nulli. I metodi diretti diventano quindi proibitivi perchè troppo costosi
per quanto riguarda il numero di operazioni aritmetiche e l’occupazione di dati che devono essere salvati per
l’implementazione numerica del metodo stesso. I metodi iterativi, al contrario, lavorano direttamente sulla
matrice A e, dal momento che A viene coinvolta solo in termini di prodotti matrice-vettore, non c’è neanche
bisogno di memorizzare tutta la matrice (in genere, quando la matrice è sparsa, si lavora su memorizzazio-
ni in forma compatta delle matrici, memorizzando solo gli elementi non nulli che servono per il prodotto
matrice-vettore).
Quando abbiamo studiato gli zeri di funzione nel Capitolo 4, data un’approssimazione iniziale, si pro-
cedeva nell’algoritmo iterativo fino a quando lo scarto tra due approssimazioni successive non diventava
minore di una prefissata tolleranza.
Nel caso dei sistemi lineari, l’approccio è simile. Si parte da un vettore iniziale che approssima la solu-
zione del sistema e, mediante un certo procedimento ricorsivo, si calcola una nuova approssimazione (un
vettore). Dobbiamo dunque essere capaci di misurare lo scarto tra due vettori in modo da capire quando la
successione dei vettori generati dall’algoritmo tende al vettore soluzione del sistema lineare.
Abbiamo perciò bisogno di definire le norme di vettori e di matrici. Nel seguito, tratteremo solo norme di
matrici e vettori definite nello spazio dei numeri reali (e non complessi).

8.3 Norme di vettori


Il concetto di norma generalizza quello di valore assoluto (o modulo) di un numero reale (o complesso).
n n
Norma Sia R lo spazio dei vettori colonna di lunghezza n. La norma di un vettore x ∈ R è una funzione, k · k,
n
definita in R e a valori in R, che gode delle seguenti proprietà:
G kxk > 0 per ogni x 6= 0
G kxk = 0 se e solo se x = 0
G kαxk = |α|kxk dove α è un reale (o complesso) arbitrario
G kx + yk ≤ kxk + kyk
Le principali norme vettoriali sono:
G
Norme 1, ∞,
2 Norma assoluta (o norma l 1 ), indicata con k · k1 : kxk1 = ni=1 |x i |
P

G Norma massima (o norma infinito, l ∞ ), indicata con k · k∞ : kxk∞q= max1≤i ≤n |x i |


G p
Norma euclidea (o norma l 2 ), indicata con k · k2 : kxk2 = xT x =
Pn
i =1 |x i |
2

114
8.4. Norme di matrici

2
Figura 8.1: Vettori in R con norma unitaria nelle norme 1, ∞ e 2.

Tra le norme 1, ∞ e 2 valgono le seguenti relazioni (che pongono un’equivalenza tra esse). Dato un vettore
n
x∈R :
p
kxk∞ ≤ kxk2 ≤ nkxk∞
kxk∞ ≤ kxk1 ≤ nkxk∞

Esempio
Esempio 8.3.1 Il vettore x = (1, 5, −20)T ha norme:

kxk1 = |1| + |5| + | − 20| = 26


kxk∞ = max (|1|, |5|, | − 20|) = 20
p p
kxk2 = (12 + 52 + (−20)2 ) = 426 = 20.639767441

Per la norma euclidea vale la diseguaglianza di Cauchy-Schwarz: Diseguaglianza


di Cauchy-
Schwarz

xT y ≤ kxk2 kyk2
n
Dati due vettori x e y ∈ R , si definisce distanza tra i due vettori la norma della differenza tra i vettori. Distanza tra
Quindi: vettori

n
X
kx − yk1 = |x i − y i |
i =1
kx − yk∞ = max |x i − y i |
1≤i ≤n
s
Xn
kx − yk2 = |x i − y i |2
i =1

Il concetto di distanza serve per definire il limite di una successione di vettori.


n
Data una successione di vettori in R , x(k) , per k = 1, 2, . . . , ∞, si dice che la successione converge ad un
n
vettore x di R e si scrive limk→∞ x(k) = x se, per ogni ² > 0, esiste un intero m tale che Limite di una
successione
kx(k) − xk < ² per tutti gli indici k ≥ m di vettori

8.4 Norme di matrici


Analogamente alla definizione di norma vettoriale, la norma di matrici quadrate di dimensione n è una
funzione, che indichiamo con k · k che, per tutte le matrici A e B di dimensione n e per tutti i numeri reali (o
complessi) α, soddisfa le seguenti proprietà:
G kAk > 0 per ogni A 6= 0

115
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

G kAk = 0 se e solo se A = 0
G kαAk = |α|kAk
G kA + B k ≤ kAk + kB k
G kAB k ≤ kAkkB k
Una proprietà importante che si richiede alle norme su matrici è che siano compatibili con norme vet-
toriali: la norma kAk di una matrice A si dice compatibile con la norma kxk di un vettore x se vale la
Norma relazione
compatibile
kAxk ≤ kAkkxk

Alcune norme su matrici sono generate da norme su vettori: si parla allora di norma naturale o indotta
n
Norma dalla norma di vettori. In particolare, se k · k è una norma su vettori in R , allora kAk = maxkxk=1 kAxk è la
naturale norma naturale o indotta dalla norma k · k su vettori.
Le norme di matrici indotte dalla norma 1 e dalla norma infinito su vettori sono:
G Norma 1: kAk1 = max j ni=1 |a i j | (data dal massimo sulla somma delle colonne)
P

G Norma infinito: kAk∞ = maxi nj=1 |a i j | (data dal massimo sulla somma delle righe)
P

La norma di matrice indotta dalla norma 2 è più complicata e vedremo in seguito come è definita.
È facile vedere che le norme naturali sono norme compatibili con la norma di vettori da cui sono costruite.
Una norma di matrici, che non è indotta, ma compatibile con la norma 2 è la cosiddetta norma euclidea
traccia di una (o di Frobenius). Tenendo presente che, data una matrice A, si chiama traccia della matrice o t r (A) la somma
matrice degli elementi della diagonale principale di A, la norma euclidea è data da

G N (A) = pt r (A T A) =
p
t r (A A T ) =
rP
n 2
i =1 |a i j | .
j =1

8.5 Autovalori e autovettori


Data una matrice quadrata A di ordine n, se esiste un numero (reale o complesso) λ e un vettore x 6= 0 tali
che

Ax = λx

Autovalore e allora λ è un autovalore e x il corrispondente autovettore della matrice A.


autovettore Scritta in maniera equivalente, la relazione definisce il sistema lineare

(A − λI )x = 0

Poichè x 6= 0 e il termine noto del sistema è il vettore di tutti zeri, il determinante della matrice del sistema
deve necessariamente essere uguale a zero, cioè det (A − λI ) = 0.
Lo sviluppo del determinante porta a un polinomio di grado n nell’incognita λ:

λn − t r (A)λn−1 + . . . + (−1)n det (A) = 0

Polinomio Questo polinomio si chiama polinomio caratteristico. Le sue n radici, che chiamiamo λ1 , λ2 , . . . , λn , sono gli
caratteristico n autovalori della matrice A.
Per le proprietà dei polinomi vale:
n n
λi = t r (A) = a 11 + a 22 + . . . + a nn λi = det (A)
X Y
e
i =1 i =1

Alcune proprietà sugli autovalori e autovettori sono le seguenti:

G Se λ è autovalore della matrice A, allora λ è autovalore della matrice potenza A (cioè A · A · · · A k


k k

volte).
G Se λ è autovalore della matrice A, e A è regolare, allora λ è autovalore della matrice inversa A .
−1 −1

116
8.5. Autovalori e autovettori

Figura 8.2: Autovalori e autovettori

G Gli autovalori di una matrice A e della sua trasposta A sono gli stessi (ma gli autovettori sono, in
T

G Se A e B sono due matrici arbitrarie regolari, allora gli autovalori di AB sono gli stessi di B A.
genere, diversi).

Se x è un autovettore associato alla matrice A, allora Ax = λx: la matrice A trasforma il vettore x in un


vettore le cui componenti sono moltiplicate per λ: se λ > 1, allora A ha l’effetto di allungare x di un fattore λ;
se invece 0 < λ < 1, allora x si restringe di un fattore λ; gli effetti sono simili, ma il verso del vettore risultante
Ax è opposto, quando λ < 0. I quattro casi che si possono presentare sono illustrati in Figura 8.2.
Altre proprietà da tenere presenti sono le seguenti:
G Se tutti gli n autovalori di una matrice A sono distinti, allora gli n autovettori u(1) , u(2) , . . . u(n) sono
linearmente indipendenti.1
G Se A è una matrice simmetrica reale definita positiva, allora i suoi autovalori sono tutti reali e positivi.
Introduciamo ora il raggio spettrale di una matrice A . Raggio
spettrale
Definizione 8.5.1 Il raggio spettrale ρ(A) di una matrice A è definito da

ρ(A) = max |λ|


λ autovalore di A

Quindi il raggio spettrale pè il massimo, inpmodulo, degli autovalori di A (ricordiamo che se λ è un


complesso, λ = α + i β, con i = −1, si ha |λ| = α2 + β2 ).
Possiamo ora definire la norma 2 su matrici indotta dalla norma 2 su vettori. Si può, infatti, provare che Norma 2 su
matrici

G kAk =
q
2 ρ(A T A).
Inoltre, per ogni norma naturale, vale il risultato

ρ(A) ≤ kAk

Nello studiare i metodi iterativi per risolvere i sistemi lineari, sarà di particolare importanza sapere quan-
do le potenze di una matrice tendono alla matrice nulla. Matrici A, per cui (A k )i j → 0 per k → ∞, qualunque
sia i , j = 1, 2, . . . , n, (consideriamo A · A · · · A k volte e gli elementi della matrice risultante tendono a zero per
k → ∞) si dicono matrici convergenti. Diciamo che una matrice A di dimensione n è convergente se Matrice
convergente
lim (A k )i j = 0, i , j = 1, 2, . . . , n
k→∞

Si ha il seguente teorema.

Teorema 8.5.1 Data una matrice A di dimensione n, sono equivalenti le seguenti proposizioni
1. A è una matrice convergente.
2. limk→∞ kA k k = 0, per qualche norma naturale.
3. limk→∞ kA k k = 0, per tutte le norme naturali.
4. ρ(A) < 1.
5. limk→∞ A k x = 0, qualunque sia il vettore x.
1 Dati n vettori linearmente indipendenti di Rn Rn
, u(1) , u(2) , . . . u(n) , ogni vettore di si può scrivere come una loro combinazione
lineare. Quindi esistono n coefficienti α1 , α2 , . . . , αn per cui x = α1 u(1) +α2 u(2) +. . .+αn u(n) . Inoltre, per vettori linearmente indipendenti
vale il risultato: α1 u(1) + α2 u(2) + . . . + αn u(n) = 0 se e solo se tutti i coefficienti αi sono uguali a zero, per i = 1, 2, . . . , n.

117
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

8.6 Metodi classici


I metodi iterativi classici per la risoluzione di un sistema di equazioni lineari del tipo Ax = b si basano su
un’idea molto semplice.
G Si parte da un’approssimazione iniziale x(0) , commettendo un’errore e(0) = x − x(0) . L’errore e(0) è solu-
zione del sistema Ae(0) = b − Ax(0) = r(0) , dove r(0) è il residuo (ciò che resta fuori, ci dice di quanto il
vettore Ax(0) si discosta da b).
G Successivamente si definisce il passo x(1) come x(1) = x(0) + p(0) , dove ora p(0) è soluzione del sistema
M p(0) = r0 , in cui la matrice M è più semplice della A e, allo stesso tempo, M −1 approssima in qualche
modo A −1 .
G Il procedimento viene iterato fino a convergenza.
Da queste richieste tra loro contradditorie, si sviluppa una strategia che porta alla soluzione esatta x come
limite della successione dei valori approssimati x(k) .
Il processo iterativo si legge, infatti, come:

x(k+1) = x(k) + M −1 (b − Ax(k) ) k = 0, 1, . . . .

O, equivalentemente,
x(k+1) = (I − M −1 A)x(k) + M −1 b k = 0, 1, . . .
Notiamo che, ad ogni passo, non dobbiamo calcolare esplicitamente M −1 , perchè risolviamo problemi del
tipo M p(k) = r(k) = b − Ax(k) in modo da porre x(k+1) = x(k) + p(k) . La matrice E = I − M −1 A è detta matrice di
iterazione del metodo. Nel seguito, per semplicità, poniamo q = M −1 b.
Lo schema iterativo appena descritto è un metodo stazionario (cioè non dipende dall’iterazione k) e
può essere visto come caso particolare di uno schema di punto fisso per equazioni nonlineari: la funzio-
ne g tale che x(k+1) = g (x(k) ) converga alla soluzione del sistema Ax = b, è data da g (x) = x + M −1 (b − Ax) o
equivalentemente da g (x) = E x(k) + q.

8.6.1 Convergenza
Per studiare la convergenza di un metodo iterativo, consideriamo, per ogni vettore x(k) , il residuo r(k) =
b − Ax(k) e l’errore e(k) = x − x(k) . Osserviamo che si ha la relazione r(k) = Ae(k) . Infatti

Ae(k) = A(x − x(k) ) = Ax − Ax(k) = b − Ax(k) = r(k)

Lo schema converge quando la successione x(k) converge alla soluzione x per k → ∞, ovvero quando
limk→∞ e(k) = 0 qualunque sia il vettore iniziale x(0) .
Consideriamo lo schema iterativo x(k+1) = E x(k) + q.
È facile vedere che per la soluzione esatta x vale la relazione x = E x + q.
Consideriamo x − x(k) . Si ha

x = Ex+q
x(k)
= E xk−1 + q
e sottraendo si ricava
(k)
e = E e(k−1)

La relazione appena trovata vale, alla stessa maniera, tra l’errore e(k−1) e l’errore e(k−2) per cui possiamo
scrivere e(k−1) = E e(k−2) .
Scriviamo queste relazioni dall’iterazione k fino ad arrivare all’iterazione 0.

118
8.6. Metodi classici

e(k) = E e(k−1)
e(k−1) = E e(k−2)
e(k−2) = E e(k−3)
.. ..
.=.
e(2) = E e(1)
e(1) = E e(0)
Partendo, ora, dalla prima relazione e, andando a sostituire, ogni volta, a secondo membro, la relazione
successiva, si ha:
e(k) = E e(k−1) = E (E e(k−2) ) = E 2 e(k−2) = E 2 (E e(k−3) ) = E 3 e(k−3) = . . . = E k e(0)
Osserviamo che E k rappresenta la potenza k della matrice E , cioè la E · E · · · E k volte.
Il metodo converge se e(k) → 0 per k → ∞. Poichè l’errore iniziale è arbitrario, si ha che limk→∞ e(k) =
limk→∞ E k e(0) = 0 se e solo se limk→∞ E k = 0.
Per il teorema sulla convergenza di matrici (si veda pag. 117), questo si ha se e solo se ρ(E ) < 1. Si può
dunque stabilire il seguente teorema.

Teorema 8.6.1 Lo schema iterativo


x(k+1) = E x(k) + q k ≥0
converge qualunque sia il vettore iniziale x0 al vettore x = E x + q = A −1 b se e solo se ρ(E ) < 1.

Questo risultato lo si può provare facilmente, nel caso in cui la matrice di iterazione E abbia n autovalori
distinti e, quindi, possieda n autovettori linearmente indipendenti, per cui l’errore iniziale e(0) si può scrivere
come e(0) = α1 u(1) + α2 u(2) + . . . + αn u(n) , dove α1 , α2 , . . . , αn sono delle costanti, mentre u(1) , u(2) . . . u(n) sono
gli autovettori associati, rispettivamente, a λ1 , λ2 , . . . , λn . Supponiamo che gli autovalori siano in ordine de-
crescente in modulo, cioè: |λ1 | > |λ2 | > . . . > |λn |, per cui ρ(E ) = |λ1 |. In tal caso si può scrivere (ricordando
che, se λ è un autovalore associato alla matrice A, con u un autovettore ad esso associato, si ha A k u = λk u)
e(k) = E k e(0) = E k (α1 u(1) + α2 u(2) + . . . + αn u(n) )
= α1 E k u(1) + α2 E k u(2) + . . . + αn E k u(n)
= α1 λk1 u(1) + α2 λk2 u(2) + . . . + αn λkn u(n)
mettiamo in evidenza λk1
λk2 (2)
à !
k (1) λkn (n)
= λ1 α1 u + α2 k u + . . . + αn k u
λ1 λ1
λki
per k → ∞ si ha → 0 per i = 2, 3, . . . , n
λk1
≈ λk1 α1 u(1)

Perciò limk→∞ e(k) = limk→∞ λk1 α1 u(1) = 0 se e solo se λk1 → 0 e questo si ha se e solo se |λ1 | < 1. Ma |λ1 | = ρ(E ):
ritroviamo il risultato visto prima.

8.6.2 Controllo della convergenza


Oltre a sapere che lo schema iterativo converge, è importante conoscere quanto velocemente lo schema
converge. A tal proposito osserviamo che, in condizioni asintotiche (per k → +∞) vale il seguente risultato2
ke(k) k ≈ ρ(E )k ke(0) k (8.1)
2 Questa relazione vale anche per matrici con autovalori non distinti tra loro.

119
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

Scrivendo l’equazione (8.1) per l’iterazione k − 1 e facendo il rapporto tra le norme degli errori a due passi
successivi si ha:
ke(k) k
≈ ρ(E )
ke(k−1) k
Ricaviamo, quindi, che il metodo iterativo ha convergenza lineare con costante asintotica uguale al raggio
spettrale della matrice di iterazione.
La relazione appena trovata è utile per stabilire quanto veloce è il metodo iterativo per approssimare la
soluzione del sistema con una certa accuratezza. Ad esempio, vogliamo stabilire a priori quante iterazioni
occorrono per ridurre la norma dell’errore iniziale di un certo fattore, ad esempio 10 (il che vuol dire ridurre
l’errore di un ordine di grandezza). Vogliamo dunque capire quale deve essere il valore di k per cui ke(k) k =
ke(0) k
. Ma ke(k) k ≈ ρ(E )k ke(0) k da cui
10
ke(0) k 1
ρ(E )k ke(0) k ≈ =⇒ ρ(E )k ≈
10 10
Applicando il logaritmo in base 10 ad ambo i membri si ha
1
k log10 (ρ(E )) ≈ −1 =⇒ k ≈ −
log10 (ρ(E ))
cioè occorrono k iterazioni con k dato dal più piccolo intero che soddisfa la relazione appena scritta. Meno
iterazioni occorrono fare, più veloce è il metodo.
Velocità Si definisce perciò velocità asintotica di convergenza
asintotica di
convergenza − log10 (ρ(E k ))
R = − log10 (ρ(E )) =
k
Osserviamo che, essendo ρ(E ) < 1, nelle ipotesi in cui il metodo converge, log10 (ρ(E )) < 0 e, di conseguenza,
R > 0. Se vogliamo ridurre l’errore iniziale di una certa quantità ², rifacendo i conti come prima, da una parte
vogliamo che sia ke(k) k ≤ ²ke(0) k, dall’altra sappiamo che ke(k) k ≈ ρ(E )k ke(0) k. Uguagliando i termini abbiamo

ρ(E )k ke(0) k ≤ ²ke(0) k =⇒ ρ(E )k ≤ ²

Passando ai logaritmi (di quantità minori di uno) si ha


− log10 (²)
k log10 (ρ(E )) ≤ log10 (²) =⇒ −k log10 (ρ(E )) ≥ − log10 (²) =⇒ k ≥
R
Troviamo in questo modo quante iterazioni (il primo intero k che verifica la relazione precedente) occorre
fare per poter ridurre l’errore iniziale di ².
Se si traccia un grafico semilogaritmico del profilo di convergenza dello schema iterativo, ponendo sul-
l’asse delle ascisse il numero delle iterazioni e sull’asse delle ordinate la norma dell’errore, si può vedere che
la velocità asintotica di convergenza è legata alla pendenza della retta. Infatti, riconducendoci, per semplici-
tà, al caso in cui la matrice di iterazione abbia n autovalori distinti tra loro e ordinati in senso crescente, dalla
relazione (vista a pag. 119)

e(k) ≈ λk1 α1 u(1)

passando alle norme e ai logaritmi in base 10 si ha

log10 ke(k) k ≈ k log10 |λ1 | + costante

La pendenza del grafico è l’opposto della velocità asintotica di convergenza R.


Nel caso in cui non è nota la soluzione esatta x, poichè ke(k) k ≈ kx(k) − x(k−1) k = kd(k) k (valgono le stesse
considerazioni viste per gli schemi iterativi per funzioni non lineari a pag. 52), ritroviamo lo stesso risultato
sul profilo di convergenza semilogaritmico in cui si pone sull’asse delle ascisse il numero delle iterazioni e
sull’asse delle ordinate la norma degli scarti.

120
8.6. Metodi classici

Figura 8.3: La matrice A come somma delle matrici L, D e U .

8.6.3 I metodi
Si scriva la matrice A come somma della matrice che ha i soli elementi diagonali di A (che chiamiamo
D), della matrice costituita dai soli elementi della parte triangolare bassa di A (che chiamiamo L) e dai soli
elementi della parte triangolare alta di A (che denotiamo con U ),

A = L + D +U

In questo modo è facile ricavare i metodi iterativi di Jacobi, Gauss-Seidel e di rilassamento, che sono i metodi
iterativi classici per la soluzione di sistemi lineari.
L’ipotesi da fare è che A abbia elementi diagonali diversi da zero (a i i 6= 0 per i = 1, 2, . . . , n, n, da cui la
matrice diagonale D è invertibile).
Se la matrice A è simmetrica, definita positiva, necessariamente a i i 6= 0. Altrimenti, poichè A è non singo-
lare (se così non fosse non potremmo risolvere il sistema), le equazioni del sistema possono essere riordinate
in modo da avere la matrice risultante con elementi diagonali diversi da zero.

Il metodo di Jacobi

Il metodo di Jacobi3 (o degli spostamenti simultanei - o rilassamento simultaneo) si ha ponendo M = D


da cui la matrice di iterazione diventa E J = I − D −1 A = I − D −1 (L + D +U ) = −D −1 (L +U ).
Scrivendo lo schema iterativo per Jacobi, si ha, in forma matriciale:

x(k+1) = E J x(k) + D −1 b
x(k+1) = −D −1 (L +U )x(k) + D −1 b

Per ricavare questo schema, si può partire dal sistema lineare Ax = b e scrivere la matrice A come L+D+U .
Si ha

(L + D +U )x = b
si porta a secondo membro (L +U )x
Dx = −(L +U )x + b
si moltiplicano ambo i membri per l’inversa della matrice D
x = −D −1 (L +U )x + D −1 b
si innesca il metodo iterativo considerando il vettore x a primo membro dell’equazione
all’iterazione k + 1 e quello a destra all’iterazione k
(k+1)
x = −D −1 (L +U )x(k) + D −1 b

3 Carl Gustav Jacob Jacobi (1804-1851) fu un grande matematico tedesco. Tra i suoi numerosi studi ricordiamo quelli sulle funzioni
ellittiche, sulla teoria dei numeri e sulla meccanica celeste.

121
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

Componente per componente, il metodo di Jacobi si scrive, per i = 1, 2, . . . , n, come


 
(D −1 )i i ((L+U )x(k) )i
1  n
x i(k+1) = a i j x (k)
X 
b i − 
ai i  j 
j =1, j 6=i

o, equivalentemente,

(Lx(k) )i
 
(D −1 )i i (U x(k) )i
1  iX
−1 n
x i(k+1) = a i j x (k) a i j x (k)
X 
b i − −  per i = 1, . . . , n
ai i  j j 
j =1 j =i +1

⇑ ⇑

La formula la si può ricavare direttamente, scrivendo, equazione per equazione, il sistema da risolvere
Ax = b:

a 11 x 1 + a 12 x 2 + a 13 x 3 + . . . + a 1n x n = b 1
a 21 x 1 + a 22 x 2 + a 23 x 3 + . . . + a 2n x n = b 2
.. .
. = ..
ai 1 x1 + ai 2 x2 + ai 3 x3 + . . . + ai n xn = bi
.. .
. = ..
a n1 x 1 + a n2 x 2 + a n3 x 3 + . . . + a nn x n = b n

Dalla prima equazione “isoliamo” la prima incognita rispetto a tutte le altre; dalla seconda equazione
“isoliamo” la seconda incognita e così via per le altre equazioni, ottenendo:

a 11 x 1 = b 1 − (a 12 x 2 + a 13 x 3 + . . . + a 1n x n )
a 22 x 2 = b 2 − (a 21 x 1 + a 23 x 3 + . . . + a 2n x n )
.. ..
.= .
a i i x i = b i − (a i 1 x 1 + a i 2 x 2 + . . . + a i i −1 x i −1 + a i i +1 x i +1 + . . . + a i n x n )
.. ..
.= .
a nn x n = b n − (a n1 x 1 + a n2 x 2 + a n3 x 3 + . . . + a nn−1 x n−1 )

Dividendo l’i -sima equazione per il coefficiente a i i , per i = 1, 2, . . . , n, ricaviamo

1
x1 = [b 1 − (a 12 x 2 + a 13 x 3 + . . . + a 1n x n )]
a 11
1
x2 = [b 2 − (a 21 x 1 + a 23 x 3 + . . . + a 2n x n )]
a 22
.. ..
.= .
1
xi = [b i − (a i 1 x 1 + a i 2 x 2 + . . . + a i i −1 x i −1 + a i i +1 x i +1 + . . . + a i n x n )]
ai i
.. ..
.= .
1
xn = [b n − (a n1 x 1 + a n2 x 2 + a n3 x 3 + . . . + a nn−1 x n−1 )]
a nn

122
8.6. Metodi classici

Se pensiamo di partire da un vettore inziale x(0) , il vettore x(1) si ottiene dalle equazioni precedenti, po-
nendo a secondo membro di ciascuna equazione le componenti del vettore x(0) . Si ricava, in tal modo, la
formula ricorsiva dello schema di Jacobi:

1 h ³ ´i
x 1(k+1) = b 1 − a 12 x 2(k) + a 13 x 3(k) + . . . + a 1n x n(k)
a 11
1 h ³ ´i
x 2(k+1) = b 2 − a 21 x 1(k) + a 23 x 3(k) + . . . + a 2n x n(k)
a 22
.. ..
.= .
1 h ³ ´i
x i(k+1) = b i − a i 1 x 1(k) + a i 2 x 2(k) + . . . + a i i −1 x i(k)
−1
+ a i i +1 x i(k)
+1
+ . . . + a i n x n(k)
ai i
.. ..
.= .
1 h ³ ´i
x n(k+1) = b n − a n1 x 1(k) + a n2 x 2(k) + a n3 x 3(k) + . . . + a nn−1 x n−1 (k)
a nn

Ritroviamo, dunque, la formula scritta prima in forma compatta.


La formula in funzione del residuo r(k) = b − Ax(k) è data invece da x(k+1) = x(k) + D −1 r(k) .

Il Metodo di Gauss-Seidel

Nell’algoritmo di Gauss-Seidel4 si pone M = D + L ottenendo la matrice E S = I − (D + L)−1 A = I − (D +


L) (L + D +U ) = −(D + L)−1U . Lo schema iterativo è:
−1

x(k+1) = E S x(k) + (D + L)−1 b

Lo schema di Gauss-Seidel si può ricavare a partire dal sistema lineare Ax = b nel modo seguente:

Ax = b
(L + D +U )x = b
si porta a secondo membro U x
(D + L)x = −U x + b
si moltiplicano ambo i membri per l’inversa della matrice (D + L)
x = −(D + L)−1U x + (D + L)−1 b
si innesca il metodo iterativo considerando il vettore x a primo membro dell’equazione
all’iterazione k + 1 e quello a destra all’iterazione k
(k+1)
x = −(D + L)−1U x(k) + (D + L)−1 b

Moltiplicando ambo i membri per (D + L) si ha

(D + L)x(k+1) = b −U x(k)
Dx(k+1) = b − Lx(k+1) −U x(k)

da cui
³ ´
x(k+1) = D −1 b − Lx(k+1) −U x(k)

Componente per componente si ha


4 Philipp Ludwig von Seidel (1821-1896) fu un matematico tedesco. Il suo lavoro più importante riguarda le aberrazioni ottiche.

123
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

" #
1 iX−1 n
x i(k+1) (k+1) (k)
X
= bi − ai j x j − ai j x j per i = 1, . . . , n
ai i j =1 j =i +1

Il metodo è detto anche degli spostamenti successivi, in quanto il calcolo delle componenti del vettore
x(k+1) è fatto utilizzando le componenti già calcolate del vettore stesso. Infatti, per i > 1, è ragionevole pensare
che i valori già calcolati x 1(k+1) , x 2(k+1) , . . . , x i(k+1)
−1
possano essere utilizzati per dare una migliore approssimazio-
ne del valore x i(k+1) . Dalle equazioni del sistema, ragionando come per il metodo di Jacobi, possiamo quindi
scrivere:
³ ´
a 11 x 1(k+1) = b 1 − a 12 x 2(k) + a 13 x 3(k) + . . . + a 1n x n(k)
³ ´
a 22 x 2(k+1) = b 2 − a 21 x 1(k+1) + a 23 x 3(k) + . . . + a 2n x n(k)
.. ..
.= .
³ ´
a i i x i(k+1) = b i − a i 1 x 1(k+1) + a i 2 x 2(k+1) + . . . + a i i −1 x i(k+1)
−1
+ a i i +1 x i(k)
+1
+ . . . + a i n x n(k)
.. ..
.= .
³ ´
a nn x n(k+1) = b n − a n1 x 1(k+1) + a n2 x 2(k+1) + a n3 x 3(k+1) + . . . + a nn−1 x n−1
(k+1)

Dividendo ambo i membri dell’equazione i -sima per a i i (per i = 1, 2, . . . , n) si ha:

1 h ³ ´i
x 1(k+1) = b 1 − a 12 x 2(k) + a 13 x 3(k) + . . . + a 1n x n(k)
a 11
1 h ³ ´i
x 2(k+1) = b 2 − a 21 x 1(k+1) + a 23 x 3(k) + . . . + a 2n x n(k)
a 22
.. ..
.= .
1 h ³ ´i
x i(k+1) = b i − a i 1 x 1(k+1) + a i 2 x 2(k+1) + . . . a i i −1 x i(k+1)
−1
+ a i i +1 x (k)
i +1
+ . . . + a i n x (k)
n
ai i
.. ..
.= .
1 h ³ ´i
x n(k+1) = b n − a n1 x 1(k+1) + a n2 x 2(k+1) + a n3 x 3(k+1) + . . . + a nn−1 x n−1 (k+1)
a nn

Usando il residuo, lo schema di Gauss-Seidel si scrive come

x(k+1) = x(k) + (D + L)−1 r(k)

Il metodo di rilassamento

Ciascuno dei metodi di Jacobi e Gauss-Seidel può essere anche rilassato tramite un fattore ω in modo che
la nuova approssimazione x(k+1) sia ottenuta come una combinazione di x(k+1) e x(k) mediante il fattore ω. In
pratica:

x(k+1) ←− (1 − ω)x(k) + ωx(k+1)

Questa operazione viene fatta direttamente nel momento in cui si stabilisce il metodo iterativo con
rilassamento.
Si può osservare che il metodo di Jacobi rilassato non produce effettivi miglioramenti rispetto al metodo
non rilassato. Invece, il metodo di Gauss-Seidel rilassato può produrre un metodo molto più veloce in termini

124
8.6. Metodi classici

di convergenza e, quindi, preferibile rispetto al metodo senza rilassamento. Come metodo di rilassamento,
dunque, consideriamo il metodo di rilassamento ottenuto da Gauss-Seidel. Per scelte di ω nell’intervallo
]0, 1[ si parla di metodo Sotto-Rilassato, o Under-Relaxation (e in genere è usato per ottenere convergenza
nella soluzione di sistemi che non convergono con il metodo di Gauss-Seidel). Per valori di ω nell’intervallo
[1, 2[ si ha, invece, il metodo noto come metodo di sovra-rilassamento o SOR (Successive Over-Relaxation) –
usato per accelerare la convergenza in sistemi che sono convergenti con il metodo di Gauss-Seidel.
Lo schema di rilassamento, applicato al metodo di Gauss-Seidel, è dato da

" #
ω iX−1 n
x i(k+1) = (1 − ω)x i(k) + (k+1) (k)
X
bi − ai j x j − ai j x j per i = 1, . . . , n
ai i j =1 j =i +1

La matrice di iterazione del metodo di rilassamento si ricava scrivendo in forma matriciale l’algoritmo
appena descritto
³ ´
x(k+1) = (1 − ω)x(k) + ωD −1 b − Lx(k+1) −U x(k)

x(k+1) = (1 − ω)I − ωD −1U x(k) − ωD −1 Lx(k+1) + ωD −1 b


£ ¤

(I + ωD −1 L)x(k+1) = (1 − ω)I − ωD −1U x(k) + ωD −1 b


£ ¤

Moltiplicando ambo i membri per D, si ricava

(D + ωL)x(k+1) = [(1 − ω)D − ωU ] x(k) + ωb

La matrice di iterazione del metodo è dunque

E = (D + ωL)−1 [(1 − ω)D − ωU ]


= (D + ωL)−1 [(1 − ω)D − ω(A − D − L)]
= (D + ωL)−1 [(D + ωL) − ωA]
= I − ω(D + ωL)−1 A
£ ¤

A questo punto, ci si può chiedere quale sia l’ω ottimale nel metodo di rilassamento. L’ω ottimale è quello
che fa sì che il metodo di rilassamento converga nel minor numero di iterazioni (quindi, l’ω ottimale rende
minimo il raggio spettrale della matrice di iterazione). Vedremo, per particolari matrici A, quando è possibile
stabilire a priori quale sia l’ω ottimale per risolvere il sistema lineare Ax = b.

8.6.4 Convergenza dei metodi di Jacobi, Gauss-Seidel, rilassamento


Le matrici di iterazione dei tre metodi appena descritti sono scritte in Tabella 8.6.4 Perchè ci sia

metodo matrice
Jacobi E J = I − D −1 A = −D −1 (L +U )
Gauss-Seidel E S = I − (D + L)−1 A = −(D + L)−1U
rilassamento E ω = I − ω(D + ωL)−1 A
Tabella 8.1: Matrici di iterazione dei metodi di Jacobi, Gauss-Seidel, rilassamento

convergenza, il raggio spettrale della matrice di iterazione deve essere minore di uno.
Per i metodi di Jacobi e di Gauss-Seidel si può provare la convergenza del metodo, se la matrice A ha una
delle seguenti caratteristiche:
G A è diagonalmente dominante in senso stretto

125
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

G A è a diagonalmente dominante (per righe o per colonne) ed è irriducibile . 5

Si ha inoltre, questo risultato:


G se A è simmetrica non singolare con elementi principali reali e positivi, allora il metodo di Gauss-Seidel
è convergente se e solo se A è definita positiva.
Per quanto riguarda il metodo di rilassamento, condizione necessaria per la convergenza è |ω − 1| < 1, cioè
ω deve appartenere all’intervallo [0, 2] ( per 0 < ω < 1 si ha sotto-rilassamento e per 1 ≤ ω < 2 si ha sovra-
rilassamento).
Difatti il determinante della matrice di iterazione del metodo di rilassamento vale6 det E ω = (1 − ω)n e,
poichè il prodotto degli autovalori di una matrice è uguale al determinante della matrice stessa, segue 7 la
relazione ρ(E ω ) ≥ |1 − ω|. Quindi, se |1 − ω| > 1, sicuramente il metodo di rilassamento non convergerà.
Perciò, condizione necessaria per la convergenza è |1 − ω| < 1.
Si ha questo importante teorema.

Teorema 8.6.2 (Ostrowski-Reich) Se A è definita positiva e ω è un numero reale nell’intervallo ]0, 2[, allora il
metodo di rilassamento è convergente.

G La convergenza del metodo di rilassamento si ha, inoltre, per A simmetrica con elementi diagonali
positivi ed elementi extra-diagonali negativi o nulli, se e solo se A è definita positiva.
Un altro interessante teorema mette in relazione il metodo di rilassamento con i metodi di Jacobi e di Gauss-
Seidel, sia per quanto riguarda la convergenza, sia per quanto riguarda il valore ottimale del parametro ω, in
corrispondenza di matrici A che godono della cosidetta proprietà A e che siano coerentemente ordinate.

Definizione 8.6.1 Una matrice A, di dimensione n, si dice che ha proprietà A se esiste una matrice di
permutazione P tale che la matrice P AP T abbia la forma
µ ¶
D1 A1
P AP T =
A2 D2

dove D 1 e D 2 sono matrici diagonali.

Una matrice con proprietà A si dice biciclica.


Equivalentemente, una matrice A, di dimensione n, ha proprietà A se l’insieme dei numeri naturali
{1, 2, . . . , n} può essere scomposto in due sottoinsiemi non vuoti e complementari8 S e T in modo tale che
i coefficienti non nulli a i j 6= 0 si hanno per i = j oppure per i ∈ S e j ∈ T oppure per i ∈ T e j ∈ S.
µ ¶
5 cioè non può essere messa sotto la forma P Q
; R
6 Dalla definizione di E si ha det E = det [(D + ωL)−1 ((1 − ω)D − ωU )]. Poichè il determinante del prodotto di due matrici è uguale
ω ω
al prodotto dei determinanti delle matrici stesse, si ha det E ω = det [(D + ωL)−1 ] det [(1 − ω)D − ωU )] = det D −1 (1 − ω)n det D. Si arriva
a questo risultato, tenendo presente il fatto che il determinante di una matrice triangolare è uguale al prodotto degli elementi della
diagonale principale.
7 Infatti, considerando λ autovalore della matrice E , per i = 1, 2, . . . , n e ρ(E ) il raggio spettrale, si ha det E = Qn λ ≤
Qn i ω ω ω i =1 i
i =1
ρ(E ω ) = ρ(E ω )n da cui segue (1 − ω)n ≤ ρ(E ω )n , cioè ρ(E ω ) ≥ |1 − ω|.
8 Due insiemi S e T non vuoti si dicono complementari di V = {1, 2, . . . , n} se S 6= ;, T 6= ;, S ∪ T = V e, inoltre, se i ∈ S, i 6∈ T e,
viceversa, se j ∈ T, j 6∈ S

126
8.6. Metodi classici

Esempio
Esempio 8.6.1 La matrice tridiagonale

2 −1 0 0
 
−1 2 −1 0
A=
0

−1 2 −1
0 0 −1 2

ha proprietà A (o è biciclica): permutando la prima e quarta riga e la prima e quarta colonna, mediante
0 0 0 1
 
0 1 0 0 
la matrice di permutazione P =  0 0 1 0 si ha

1 0 0 0

2 0 −1 0
 
µ ¶
0 2 −1  =⇒ D 1 = D 2 = 2
−1 0
P AP T = 

−1 −1 2 0 0 2
0 −1 0 2

Possiamo scegliere S = {1, 3} e T = {2, 4}.

Definizione 8.6.2 Una matrice si dice coerentemente ordinata in relazione ad un vettore di ordinamento q, di
lunghezza n, se per ogni coefficiente a i j non nullo, con i 6= j , si verifica:
G se j > i allora q j − q i = 1
G se j < i allora q j − q i = −1

Un’altra definizione di matrice con coerente ordinamento considera la matrice A data non dalla scompo-
sizione A = L + D +U che abbiamo visto fino ad ora ma come A = D(L A + I +U A ), (osserviamo che, rispetto
alla prima scomposizione, abbiamo messo in evidenza la matrice diagonale D e quindi le matrici triango-
lari superiore e inferiore sono L A = D −1 L e U A = D −1U ). Sia D non singolare. Allora la matrice A è detta
coerentemente ordinata se gli autovalori della matrice J (α) = αL A + α−1U A , con α 6= 0 sono indipendenti dal
parametro α. µ ¶
D 1 A1
Le matrici con proprietà A (o bicicliche) nella forma A = (P = I nella definizione di proprietà
A2 D 2
A) sono coerentemente ordinate.
Le matrici tridiagonali sono un esempio di matrici bicicliche e coerentemente ordinate.
Per il metodo di rilassamento si può provare il seguente risultato.

Teorema 8.6.3 (Young) Se A è una matrice con proprietà A e coerente ordinamento e 0 < ω < 2, allora:
G se µ è autovalore della matrice di iterazione di Jacobi E J , ogni λ che verifica la relazione (λ + ω − 1)2 =
λω2 µ2 è autovalore di E ω ;
G se λ è autovalore non nullo di E ω , allora ogni µ che verifica la relazione precedente è autovalore di E J ;
G se gli autovalori di E J sono reali e il metodo di Jacobi converge (ρ(E J ) < 1), esiste uno ed uno solo ωopt
che rende ottimale il metodo di rilassamento, tale cioè che ρ(ωopt ) = min0<ω<2 ρ(E ω ). Risulta

2
ωopt = e ρ(E ωopt ) = ωopt − 1
1 − ρ(E J )2
p
1+

Per ω = 1 il metodo di rilassamento coincide con il metodo di Gauss-Seidel. Allora, per matrici con pro-
prietà A e coerentemente ordinate, nelle ipotesi del teorema di Young, valendo la relazione (λ + ω − 1)2 =
λω2 µ2 , si trova, per ω = 1, λ2 = λµ2 da cui ρ(E S ) = ρ(E J )2 . Come conseguenza, si ha che il metodo di
Gauss-Seidel ha velocità doppia rispetto al metodo di Jacobi.

127
8. M ETODI I TERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI

8.7 Esercizi

Esercizio 8.7.1
 Sia dato
 il sistema
  lineare Ax = b, dove
8 2 6 30
A = 7 5 0 b = 34
1 0 5 7
(a) Provare che gli schemi di Jacobi e di Seidel convergono e calcolare la velocità asintontica di
convergenza di entrambi gli schemi.
(b) A partire dallo stesso vettore iniziale x(0) = (0 0 0)T , calcolare le approssimazioni x(1) e x(2) che si
ottengono applicando lo schema di Jacobi e lo schema di Seidel.

Svolgimento
(a) La matrice A non è diagonalmente dominante nè per righe nè per colonne (vedasi la seconda riga e
la terza colonna). Non possiamo usare il criterio di matrice diagonalmente dominante per provare la
convergenza dei due metodi. La matrice µ ¶A è biciclica e coerentemente ordinata (si veda lo schema a
5 0
croce che individua D 1 = (8) e D 2 = ):
0 5
8 2 6
7 5 0
1 0 5
Quindi se proviamo che lo schema di Jacobi converge, cioè che l’autovalore di massimo modulo della
matrice di Jacobi è reale e in modulo minore di 1, allora, poichè per matrici bicicliche e coerentemen-
te ordinate vale ρ(E J )2 = ρ(E S ), allora anche il metodo di Gauss-Seidel convergerà alla soluzione (da
ρ(E J ) < 1 segue ρ(E S ) < 1). La matrice di Jacobi è E J = I − D −1 A cioè
   
0 −2/8 −6/8 0 −1/4 −3/4
E J = −7/5 0 0  = −7/5 0 0 
−1/5 0 0 −1/5 0 0

Troviamo gli autovalori della matrice E J imponendo det (E J − µI ) = 0.

¯ ¯
¯ −µ −1/4 −3/4¯¯
3 1 1 7
0 ¯¯ = −µ3 + · µ + · µ = 0
¯
¯−7/5 −µ
¯ 4 5 4 5
¯−1/5 0 −µ ¯

3 7
Si ha: 0 = det (E J − µI ) = −µ3 + ( + )µ,
20 20 p p
Una radice è µ = 0, e le altre due sono µ = ± 1/2 = ± 0.5 = 0.707106781.
Gli autovalori sono tutti reali e quello di massimo modulo è µ = 0.707106781 < 1.
C’è, dunque, convergenza per i metodi di Jacobi e di Gauss-Seidel (ρ(E S ) = ρ(E J )2 = 0.5). Le velocità
di convergenza valgono

R J = − log10 (ρ(E J )) = 0.1505149


R S = − log10 (ρ(E S )) = 0.301029995 = − log10 (ρ(E J )2 ) = 2R J

128
8.7. Esercizi

Lo schema di Jacobi è:
1 Partendo dal vettore x (0) con com-

(k+1) (k) (k)
x = (30 − 2x − 6x )


 1

 8 2 3 ponenti tutte nulle, abbiamo
1 2 3

k x (k) x (k) x (k)



(b) 
 1
x 2(k+1) = (34 − 7x 1(k) ) 0 0 0 0


 5 1 3.75 6.8 1.4


 2 1.0 1.55 0.65
1


x (k+1) = (7 − x (k) )


3 1
5
Lo schema di Seidel è:
1 Partendo dal vettore x (0) con com-

x 1(k+1) = (30 − 2x 2(k) − 6x 3(k) )


8 ponenti tutte nulle, abbiamo



x 1(k) x 2(k) x 3(k)

k




 1 0 0 0 0
x 2(k+1) = (34 − 7x 1(k+1) )


 5 1 3.75 1.55 0.65

2 2.875 2.775 0.825


 (k+1) 1


x (k+1)

3 = (7 − x 1 )
5

Esercizio 8.7.2
 Dato il sistema Ax = b con
5 0 10
A = 0 3 15
2 1 α
(a) dire per quali valori di α il metodo di Jacobi converge.
(b) trovare il valore di α in corrispondenza del quale il metodo SOR ha un valore di omega ottimo ωopt =
3/2. Per tale valore trovare la velocità asintotica di convergenza del metodo SOR.

Svolgimento
(a) La matrice dipende dal parametro α quindi a priori non possiamo dire se Jacobi converge o meno.
Scriviamo la matrice di iterazione del metodo di Jacobi come
    
1/5 0 0 0 0 10 0 0 −2
E J = −D −1 (L +U ) = −  0 1/3 0  0 0 15 =  0 0 −5
0 0 1/α 2 1 0 −2/α −1/α 0
Gli autovalori si calcolano imponendo det (E J − µI ) = 0, vale a dire
¯ ¯
¯ −µ 0 −2 ¯¯

−5 ¯¯ = 0 vale a dire − µ3 +
¯
¯ 0 −µ =0
¯
¯−2/α −1/α −µ¯ α

3
Ricaviamo gli autovalori µ = 0 e µ = ± p .
α
3 p
Perchè ci sia convergenza deve dunque essere p < 1 ovvero 3 < α. Ricaviamo la relazione α > 9.
α
2
(b) Dalla relazione dell’ωopt , ωopt = , valida perchè la matrice è biciclica e coerentemente
1 + 1 − ρ(E J )2
p

ordinata, si ha:
2 3 1 p −8 9 81
p = =⇒ = 1 − 9/α =⇒ = − =⇒ α = = 10.125
1 + 1 − 9/α 2 3 9 α 8
3
Da ωopt = = 1.5 segue λopt = ωopt − 1 = 0.5, da cui R = − log10 (λopt ) = 0.3010299957.
2

129
C APITOLO 9
Problemi non lineari in più variabili

Ho affermato che le matematiche


sono molto utili per abituare la
mente a un raziocinio esatto e
ordinato; con ciò non è che io creda
necessario che tutti gli uomini
diventino dei matematici, ma
quando con questo studio hanno
acquisito il buon metodo di
ragionare, essi lo possono usare in
tutte le altri parti delle nostre
conoscenze.

John Locke

9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131


9.2 Metodo di Newton per sistemi di equazioni in più variabili . . . . . . . . . . . . . . . . . . . . . . . 132
9.3 Minimi quadrati non lineari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

9.1 Introduzione
Diversi problemi che si incontrano nei più svariati campi dell’ingegneria sono molto più complicati degli
argomenti trattati fino ad ora. In questo capitolo cercheremo di utlizzare le conoscenze già fatte e di allargarle
per risolvere questo tipo di problemi.

G In ingegneria chimica, l’analisi dei processi chimici di separazione, di miscelazione e dei reattori chi-
mici (un esempio: la cattura di anidride carbonica con l’utilizzo di sorbenti solidi in un reattore di as-
sorbimento) si basa sulle equazioni di bilancio di materia e di energia totale, cioè la somma dell’energia
interna e dell’energia meccanica. Da un punto di vista matematico, questi bilanci sono rappresentati
da un sistema di equazioni alle derivate ordinarie, in cui la variabile indipendente è data dal tempo. In
condizioni di stazionarietà (eliminando quindi la dipendenza dal tempo), queste equazioni diventano
un sistema algebrico di equazioni non lineari in più variabili. Come risolverlo? Una strada è utilizzare
il metodo di Newton per sistemi di più variabili. Ed è quello che faremo noi!
G In ingegneria aerospaziale, un problema molto attuale è legato alla misura della posizione di un punto
rispetto a un sistema di riferimento implicitamente definito dalle coordinate di un certo numero n di
punti noti (pensiamo al sistema GPS, basato su un certo numero di satelliti, per poter determinare la
posizione di un punto). Una tecnica utilizzata in questo ambiti è data dall’intersezione inversa e dai
minimi quadrati, che vengono applicati mediante una linearizzazione, come vedremo nel seguito.
Vediamo, dunque, che si tratta di allargare il campo delle conoscenze già fatte:

131
9. P ROBLEMI NON LINEARI IN PIÙ VARIABILI

G come usare il metodo di Newton-Raphson studiato per trovare gli zeri di una funzione se ora abbiamo
più funzioni e queste dipendono da più variabili?
G come applicare la tecnica di approssimazione ai minimi quadrati su un problema più complicato della
retta di approssimazione, che abbiamo già visto?
In questo capitolo, cercheremo di rispondere a queste due domande.

9.2 Metodo di Newton per sistemi di equazioni in più variabili


Consideriamo, per semplicità, un sistema di due equazioni in due incognite
(
f 1 (x 1 , x 2 ) = 0
f 2 (x 1 , x 2 ) = 0

Questo stesso sistema si può scrivere in forma vettoriale come f(x) = 0 dove x = (x 1 , x 2 )T e f(x) = ( f 1 (x), f 2 )(x)T .

Esempio
Esempio 9.2.1 Consideriamo il sistema di equazioni in cui f 1 (x 1 , x 2 ) = 9x 12 + 4x 22 − 36 e f 2 (x 1 , x 2 ) = x 12 −
x 2 − 1. L’equazione f 1 (x 1 , x 2 ) = 0 rappresenta l’equazione di un’ellisse, mentre l’equazione f 2 (x 1 , x 2 ) =
0 descrive la parabola x 2 = x 12 − 1 Dalla figura 9.1, si vede come la parabola e l’ellisse si intersecano
in due punti, ξ1 e ξ2 di coordinate date, in maniera approssimata, dai valori ξ1 ≈ (1.65, 1.71) e ξ2 ≈
(−1.65, 1.71). D’altra parte, abbiamo scelto questo esempio, perchè non è difficile trovare in maniera
analitica le radici del sistema
(
9x 12 + 4x 22 − 36 = 0
x 12 − x 2 − 1 =0

Basta scrivere x 2 in funzione di x 1 nella secondasequazione e sostituire nella prima. Si ricava facilmente
p
−1 + 513
che le soluzioni reali per x 1 sono date da x 1 = ± = ±1.64504951695277, da cui x 2 = x 12 − 1 =
8
1.70618791322653. Le radici del sistema corrispondono ai punti di intersezione delle due curve. Non
sempre, però, si riesce a trovare una soluzione analitica! Ed è per questo che ci serve un metodo per
trovarle numericamente.
Vediamo, quindi, come possiamo generalizzare il metodo di Newton-Raphson. Nel seguito assumiamo
che la funzione vettoriale f ammetta derivate parziali e che siano limitate almeno fino all’ordine due1 .
Seguendo una strada del tutto analoga a quella percorsa per il metodo di Newton-Raphson per trovare le
radici di un’equazione (in una sola variabile), e come abbiamo fatto per i metodi iterativi per sistemi lineari,
cercheremo di costruire un metodo iterativo che, partendo da un vettore iniziale x(0) generi una successione
di vettori x(k) che converga alla soluzione x∗ del nostro problema, che soddisfa, cioè, la relazione f(x∗ ) =
0. Il caso che stiamo studiando, per semplicità, ha dimensione 2 (la funzione vettoriale e i vettori sono di
dimensione 2), ma il discorso vale anche per problemi non lineari di dimensione maggiore.
Quando abbiamo ricavato lo schema di Newton-Raphson per funzioni scalari, abbiamo utilizzato la for-
mula di Taylor. Ci serve, allora, l’analoga formula per funzioni vettoriali (ci limitiamo a considerare la formula
per il caso particolare che stiamo esaminando).
1 Ricordiamo che, data una funzione di due variabili f (x , x ) la derivata parziale di f rispetto alla variabile x in un punto (x ∗ , x ∗ ),
1 2 1 1 2
∂ f (x 1∗ , x 2∗ ) ∗ ∗
che denotiamo come , altro non è che la derivata della funzione g (x 1 ) = f (x 1 , x 2 ) nel punto x 1 (consideriamo fissata la
∂x 1
variabile x 2 = x 2∗ e facciamo variare solo la x 1 ). Allo stesso modo la derivata parziale della f rispetto alla variabile x 2 nel punto (x 1∗ , x 2∗ ),
∂ f (x 1∗ , x 2∗ )
che chiamiamo , è la derivata della funzione h(x 2 ) = f (x 1∗ , x 2 ) nel punto x 2∗ . Nel caso di una funzione vettoriale come f =
∂x 2
( f 1 , f 2 ) l’ipotesi che chiediamo sia soddisfatta è che ciascuna delle funzioni di cui è composta, f 1 e f 2 , ammetta derivate parziali prime
e seconde e queste derivate siano continue e limitate.

132
9.2. Metodo di Newton per sistemi di equazioni in più variabili

Figura 9.1: L’intersezione di un’ellisse e di una parabola.

Sia data, quindi, una funzione vettoriale f = ( f 1 , f 2 )T , dove f 1 e f 2 sono funzioni che dipendono dalle va-
riabili (x 1 , x 2 ), che possiamo scrivere come vettore x = (x 1 , x 2 ). Assumiamo che la funzione f abbia le derivate
continue e limitate almeno fino all’ordine 2. Allora, dati i vettori x(0) = (x 1(0) , x 2(0) ) e x = x(0) +p, dove p = (p 1 , p 2 )
è un vettore di direzione, la formula di Taylor di centro x(0) in x si può scrivere come

f(x(0) + p) = f(x(0) ) + J (x(0) )p + termini che dipendono dakpk2 .

dove k · k è una norma su vettori mentre J (x(0) ) è la cosiddetta matrice Jacobiana della funzione f in x(0) , i cui
elementi sono dati dalle derivate parziali prime delle componenti di f in x(0) :

∂ f 1 (x 1(0) , x 2(0) ) ∂ f 1 (x 1(0) , x 2(0) )


 

∂x 1 ∂x 2
 
J (x(0) ) = 
 
 ∂ f 2 (x 1(0) , x 2(0) ) ∂ f 2 (x 1(0) , x 2(0) ) 

∂x 1 ∂x 2

Componente per componente, la formula di Taylor diventa

∂ f 1 (x 1(0) , x 2(0) ) ∂ f 1 (x 1(0) , x 2(0) )


f 1 (x 1(0) + p 1 , x 2(0) + p 2 ) = f 1 (x 1(0) , x 2(0) ) + p1 + p 2 + termini di ordine superiore
∂x 1 ∂x 2
∂ f 2 (x 1(0) , x 2(0) ) ∂ f 2 (x 1(0) , x 2(0) )
f 2 (x 1(0) + p 1 , x 2(0) + p 2 ) = f 2 (x 1(0) , x 2(0) ) + p1 + p 2 + termini di ordine superiore
∂x 1 ∂x 2

Per capire la formula di Taylor in due dimensioni e, successivamente, il metodo di Newton, conviene
2
pensare al vettore x(0) come ad un punto dello spazio R e a p come ad un vettore di direzione. Quando ci
muoviamo dal punto x(0) nella direzione data da p, arriviamo al punto x(0) + p (si veda figura 9.2).
A questo punto, possiamo ricavare il metodo di Newton. Come nel caso scalare, partiamo da un punto
2
iniziale (questo volta in R ) x(0) e generiamo una successione di punti x(1) , x(2) , . . ., x(k) , . . . dove il valore x(k+1)

133
9. P ROBLEMI NON LINEARI IN PIÙ VARIABILI

Figura 9.2: Il vettore x(0) , visto come punto, la direzione data da p e il vettore x(0) + p, visto come punto.

si ottiene applicando la formula di Taylor di centro x(k) e secondo una direzione p scelta in questo modo: se
da x(k) volessimo arrivare in un solo passo alla soluzione esatta x∗ , (dove vale f(x∗ ) = 0), basterebbe scegliere
come direzione p la differenza tra x∗ e x(k) : p = x∗ − x(k) . In tal caso 0 = f(x∗ ) = f(x(k) + p). Applicando la
formula di Taylor, avremmo

0 = f(x(k) + p) = f(x(k) ) + J (x(k) )p + termini di ordine superiore

Tuttavia, noi non conosciamo la soluzione esatta e quindi neanche sappiamo la direzione p da considerare.
Usiamo, però, la relazione precedente per definire una direzione p(k) che ci permetta di costruire la nuova
approssimazione x(k+1) . Trascurando i termini di ordine superiore e richiedendo

f(x(k) ) + J (x(k) )p(k) = 0

possiamo trovare la direzione p(k) in modo tale che la nuova approssimazione sia il vettore dato da x(k+1) =
x(k) + p(k) .
Il ragionamento che abbiamo fatto è stato molto simile a quello per il metodo di Newton-Raphson per
funzioni scalari. Solo che ora stiamo lavorando con vettori e per trovare la nuova direzione p(k) dobbia-
mo risolvere un sistema (questa volta lineare perchè i coefficienti della matrice J sono valutati in un vettore
assegnato)

J (x(k) )p(k) = −f(x(k) )

Osserviamo subito che non è assicurato che la matrice Jacobiana sia sempre non singolare, per qualunque
scelta di x(k) (e quindi non è detto che possiamo sempre risolvere il sistema precedente). Tuttavia, nelle radici
della funzione e in un intorno di esse, il determinante è diverso da zero: ciò assicura che possiamo utilizzare
questo metodo localmente.
L’algoritmo di Newton per trovare le radici di sistemi non lineari diventa quindi

G Partire da un’approssimazione iniziale x (0)

G Per k = 0, 1, 2, . . . fino a convergenza


– Risolvere il sistema J (x(k) )p(k) = −f(x(k) )
– Porre la nuova approssimazione x(k+1) = x(k) + p(k)

134
9.3. Minimi quadrati non lineari

La convergenza è basata sul controllo della norma degli scarti tra due approssimazioni successive, vale a dire
sulla norma della direzione p(k) . Si può anche aggiungere un controllo sulla norma di f(x(k) ).

Esempio
Esempio 9.2.2 Riprendiamo l’esempio 9.2.1. La matrice jacobiana è data da
µ ¶
18x 1 8x 2
J (x) =
2x 1 −1

Se consideriamo x(0) = (0, 0)T , la matrice jacobiana ha determinante uguale a zero, quindi non possiamo
applicare il metodo partendo da questo punto.
Partiamo invece da x(0) = (1, 1)T : il metodo converge alla soluzione ξ1 . Ecco i valori che troviamo, per
ogni iterazione, della norma euclidea di p(k) e di f(x(k) ) e delle componenti del vettore x(k) .

k p(k) kf(x(k) )k2 x 1(k) x 2(k)


0 2.000000e-10 2.302173e+01 1.0000000000000000 1.0000000000000000
1 1.228623e+00 1.022848e+01 1.9117647058823530 1.8235294117647058
2 2.729148e-01 6.073071e-01 1.6642652418726938 1.7085228106205075
3 1.924654e-02 3.326709e-03 1.6451607390354450 1.7061888752349927
4 1.112225e-04 1.120144e-07 1.6450495207124343 1.7061879132266946
5 3.759668e-09 7.108896e-15 1.6450495169527666 1.7061879132265310
6 2.633315e-16 0.000000e+00 1.6450495169527668 1.7061879132265312

Partiamo da x(0) = (−0.5, 1)T , il metodo converge a ξ2 , come possiamo vedere dai valori seguenti:

k p(k) kf(x(k) )k2 x 1(k) x 2(k)


0 2.000000e-10 2.980143e+01 -0.5000000000000000 1.0000000000000000
1 2.702083e+00 6.267123e+01 -3.0735294117647061 1.8235294117647058
2 1.102160e+00 1.093291e+01 -1.9773856415813829 1.7085228106205077
3 3.044172e-01 8.391335e-01 -1.6729773676003774 1.7061888752349932
4 2.769474e-02 6.945470e-03 -1.6452826237649281 1.7061879132266946
5 2.330903e-04 4.919889e-07 -1.6450495334662778 1.7061879132265312
6 1.651351e-08 0.000000e+00 -1.6450495169527668 1.7061879132265312

Si può dimostrare che, se in un intorno di una radice semplice x∗ , la matrice Jacobiana J (x) ha inversa
limitata e le derivate continue, allora il metodo di Newton converge quadraticamente, cioè esiste una costante
M ∈ R tale che

kx∗ − x(k+1) k ≤ M kx∗ − x(k) k2

in un intorno di x∗ , quindi per kx∗ − x(k) k sufficientemente piccoli.


Nell’esempio che abbiamo visto, se, invece degli errori, consideriamo il vettore degli scarti (che, ri-
cordiamo, si identifica con la direzione p(k) ), ritroviamo la stessa relazione e riconosciamo convergenza
quadratica.

9.3 Minimi quadrati non lineari


Il problema dell’approssimazione ai minimi quadrati, che abbiamo visto brevemente al Capitolo 6, è mol-
to vasto e richiederebbe un approfondimento che non può essere fatto in un semplice corso di Calcolo Nu-
merico. Proprio per questo, ora affronteremo solo un aspetto dei minimi quadrati non lineari, applicandolo
direttamente al problema che vogliamo affrontare.

135
9. P ROBLEMI NON LINEARI IN PIÙ VARIABILI

Il sistema GPS (Global Positioning System) è un metodo per determinare la posizione di distanze misurate
rispetto a punti dalle coordinate note. Questi punti dalle coordinate note sono i satelliti, che trasmettono un
segnale in direzione della terra.
Un ricevitore GPS può misurare il tempo richiesto da un segnale per propagarsi da un satellite GPS fino
al ricevitore stesso. Poichè il segnale viaggia alla velocità della luce, l’intervallo di tempo può essere converti-
to in distanza moltiplicandolo per la velocità della luce stessa. In assenza di errori (quindi sincronizzazione
perfetta tra l’orologio presente nel ricevitore e quello nel satellite, mancanza di ionosfera e troposfera, che,
invece, rallentano l’arrivo del segnale, ...), una misura di questo tipo ci permette di avere informazioni sul-
la posizione del ricevitore: esso deve trovarsi in qualche punto della sfera centrata nel satellite e con raggio
uguale alla distanza misurata. Chiamiamo questa distanza d 1 . Se, contemporaneamente, un secondo satelli-
te invia un segnale allo stesso ricevitore, allora il ricevitore deve trovarsi anche da qualche parte sulla sfera che
ha centro nel secondo satellite e raggio dato dalla distanza misurata, d 2 . Le due sfere, quindi, si intersecano e
sul cerchio generato dall’intersezione delle due sfere si troverà il nostro ricevitore. Un terza e simultanea mi-
sura, d 3 , data da un terzo satellite, dà una terza sfera che interseca le altre due in soli due punti: uno di questi
punti può essere eliminato subito perchè non si trova sulla terra e rimane quindi un solo punto, che permette
di identificare la posizione del ricevitore. Quanto abbiamo appena detto vale in linea teorica, in condizioni
ideali. Infatti, in genere, l’orologio atomico presente nel ricevitore GPS e gli orologi presenti nei satelliti non
sono sincronizzati. Gli stessi orologi nei satelliti sono sincronizzati l’uno con l’altro con un certo errore che,
per quanto piccolo (un millisecondo) esiste. Gli intervalli di misura del ricevitore sono affetti, quindi, da er-
rori e, per questo motivo, sono chiamati pseudoranges. Un errore di tempo in termini di millisecondi può
dare un errore nella posizione di circa 300 chilometri e questo, chiaramente, è un errore troppo grande!
Le misure osservate, inoltre, sono affette da errori anche di altra natura, come gli effetti della ionosfera e
troposfera, l’errore di misura del ricevitore stesso, errori di orbita ... Perciò, date delle misure affette da errore,
dobbiamo cercare di capire le coordinate del ricevitore. Semplifichiamo il problema applicandolo allo spazio
R2 .
Sono date delle misure d i tra un punto incognito P 0 di coordinate (x 0 , y 0 ) (il ricevitore) ed n punti noti
P i (x i , y i ) (i satelliti GPS). La distanza osservata è affetta da errore di misura ²i . Quindi abbiamo la relazione
tra distanza osservata, distanza esatta ed errore data da
q
d i = (x i − x 0 )2 + (y i − y 0 )2 + ²i , i = 1, 2, . . . , n

Abbiamo n equazioni non lineari in due incognite (x 0 , y 0 ). Per risolvere questo problema si minimizza la
somma dei quadrati delle differenze tra il valore della distanza misurata e il valore della distanza esatta, vale
a dire
n q n
S(x 0 , y 0 ) = (d i − (x i − x 0 )2 + (y i − y 0 )2 )2 (= ²2i )
X X
i =1 i =1

Questa funzione assomiglia alla funzione S(a 0 , a 1 ) che avevamo costruito per ottenere la retta di regressione
lineare ai minimi quadrati. Una differenza fondamentale, ptuttavia, è che S(x 0 , y 0 ) è non lineare.
Andiamo allora a considerare la funzione δ i (x, y) = (x i − x)2 + (y i − y)2 , per i = 1, 2, . . . , n. Osserviamo
che δi (x 0 , y 0 ) = (x i − x 0 ) + (y i − y 0 ) : è la distanza esatta tra il punto P 0 e il punto P i , da cui d i = δi (x 0 , y 0 )+
p
2 2

²i .
Consideriamo un valore provvisorio noto di coordinate (x, y) vicino a (x 0 , y 0 ) in modo da poter lineariz-
zare la funzione δi (x, y). Applichiamo la formula di Taylor di centro (x, y), trascurando i termini di ordine
superiore (rivediamo la formula di Taylor per funzioni vettoriali, applicandola però ad un’unica funzione che
dipende da due variabili). Si ha

∂δi (x, y) ∂δi (x, y)


δi (x, y) = δi (x, y) + (x − x) + (y − y)
∂x ∂y

Allora
∂δi (x, y) ∂δi (x, y)
δi (x 0 , y 0 ) = δi (x, y) + (x 0 − x) + (y 0 − y)
∂x ∂y

136
9.3. Minimi quadrati non lineari

Per i = 1, . . . , n, la differenza b i = d i − δi (x, y) è data da

b i = d i − δi (x, y) = δ(x 0 , y 0 ) + ²i − δi (x, y)


∂δ(x, y) ∂δ(x, y)
= δ(x, y) + (x 0 − x) + (y 0 − y) + ²i − δi (x, y)
∂x ∂y
∂δ(x, y) ∂δ(x, y)
= (x 0 − x) + (y 0 − y) + ²i (9.1)
∂x ∂y

Le derivate parziali sono, per i = 1, . . . , n:

∂δi (x, y) ∂ (x i − x)2 + (y i − y)2 ¯¯


p
(x i − x) (x i − x)
= (x,y)=(x,y) = − p =−
∂x ∂x 2
(x i − x) + (y i − y) 2 δi (x, y)
∂δi (x, y) ∂ (x i − x) + (y i − y) ¯¯
p
2 2 (y i − y) (y i − y)
= (x,y)=(x,y) = − p =−
∂y ∂y 2
(x i − x) + (y i − y) 2 δ i (x, y)

Consideriamo, ora, il vettore b = (b 1 , b 2 , . . . , b n )T , il vettore ² = (²1 , ²2 , . . . , ²n )T e la matrice A di n righe e 2


colonne data da
∂δ1 (x, y) ∂δ1 (x, y)
 
 ∂x ∂y 
 ∂δ2 (x, y) ∂δ2 (x, y) 
 
 
A=  ∂x ∂y 

 ... 
 ∂δn (x, y) ∂δn (x, y) 
 

∂x ∂y

Dalla relazione (9.1), introducendo il vettore ξ = (x 0 − x, y 0 − y)T abbiamo

Aξ + ² = b o, quivalentemente, ² = b − Aξ
Pn 2
Se andiamo a riprendere la funzione S(x 0 , y 0 ) da minimizzare, abbiamo S(x 0 , y 0 ) = i =1 ²i . In termini
vettoriali, S si può anche scrivere come S = ²T ², vale a dire come funzione del vettore ξ:

S(ξ) = (b − Aξ)T (b − Aξ)

Sviluppando abbiamo

S(ξ) = bT b − bT Aξ − ξT A T b + ξT A T Aξ

La quantità bT Aξ è scalare e, quindi, coincide con la sua trasposta, da cui bT Aξ = (bT Aξ)T = ξT A T b. Perciò

S(ξ) = bT b − 2ξT A T b + ξT A T Aξ

Per trovare il minimo di S dobbiamo imporre uguale a zero la sua derivata rispetto al vettore ξ, vale a dire
rispetto a ciascuna componente di ξ. Poichè bT b è uno scalare che non dipende da ξ, la sua derivata vale zero;
quando deriviamo ξT A T b, si ha A T b, mentre la derivata di ξT A T Aξ vale 2ξT A T A = 2(ξT A T A)T = 2A T Aξ, da
cui2
2 Per ricavare queste derivate consideriamo un vettore di dimensione m, y che è funzione di un altro vettore di dimensione n, x,
∂y
mediante la relazione y = ψ(x). Per definizione, la derivata è data dalla matrice che ha come elemento di posto (i , j ) la derivata
∂x
∂y i
parziale (i = 1, . . . , m, j = 1, . . . , n).
∂x j
Data una matrice A, di dimensione m × n

137
9. P ROBLEMI NON LINEARI IN PIÙ VARIABILI

Figura 9.3: Esempio di minimi quadrati non lineari: in blu i punti noti, il puntino in rosso è il punto
provvisorio, il puntino in nero è il punto incognito che si ricava mediante il procedimento ai minimi quadrati.

∂S(ξ)
= −2A T b + 2A T Aξ
∂ξ
Poniamo questa derivata uguale a zero

∂S(ξ)
= 0 ⇒ 2A T Aξ = 2A T b ⇒ A T Aξ = A T b
∂ξ

Per ricavare il vettore ξ che minimizza S, dobbiamo dunque risolvere questo sistema dove la matrice A T A è
una matrice 2 × 2. Dal vettore ξ possiamo ricavare i valori x 0 e y 0 (le coordinate del ricevitore GPS). Perchè

G se y = Ax si ha
∂y
∂x
=A
Pn ∂y i
Si prova questo risultato considerando che y i = a x da cui
j =1 i j j
= a i j , per i = 1, . . . , m e j = 1, . . . , n da cui otteniamo
∂x j
la matrice A.

G se α = yT Ax si ha
∂α
∂x
= yT A

Infatti, se poniamo wT = yT A, wT può essere visto come una matrice di dimensione 1 × n, da cui α = wT x e, per il caso
∂α
precendente, si ha = wT = yT A.
∂x

G se α = xT Ax, con A matrice n × n, allora


∂α
∂x
= xT (A + A T ) Infatti α = n
P Pn
a x x Quindi
i =1 j =1 i j i j

∂α Xn X n
= a ki x i + ajk xj , per k = 1, 2, . . . , n
∂x k i =1 j =1

In forma compatta, ciò significa


∂α
= xT A T + xT A = xT (A T + A)
∂x

G se A è simmetrica, la derivata di α = xT Ax diventa, di conseguenza,


∂α
∂x
= 2xT A

138
9.3. Minimi quadrati non lineari

il sistema abbia soluzione, la matrice deve essere non singolare: questa condizione è assicurata se le osser-
vazioni fatte sono linearmente indipendenti, cioè i punti (x i , y i ), i = 1, . . . , n non si trovano lungo una stessa
retta passante per il punto (x 0 , y 0 ).

Esempio
Esempio 9.3.1 In figura 9.3 sono evidenziati in blu n = 6 punti noti (che corrispondono alle coordinate
dei satelliti, anche se ora stiamo lavorando in due dimensioni). Il puntino rosso rappresenta il punto
provvisorio (x, y), grazie al quale possiamo calcolare le distanze effettive rispetto agli n punti precedenti.
Gli n punti hanno coordinate (esprimiamo tutto in metri) date, rispettivamente, da

(7, 9), (2, 7), (1, 4), (10, 15), (−5, 8), (−20, −15)

Il punto (x, y) ha coordinate (4.04, 4.96). Le distanze osservate dagli n punti rispetto al punto incognito
(x 0 , y 0 ) sono date dai valori

5, 2.83, 3.16, 11.66, 7.5, 9.48, 31.24

Con questi dati a disposizione, siamo in grado di calcolare le distanze δi (x, y) e successivamente la ma-
trice A. Applicando il metodo ai minimi quadrati linearizzato, si ottiene come matrice A T A la matrice
data da
µ ¶
3.50953 0.89221
AT A =
0.89221 2.49047

Il vettore A T b ha componenti (−0.111826, 0.065088)T , da cui, risolvendo il sistema, si ricava


ξ = (−0.042366, 0.041313)T . Le coordinate (x 0 , y 0 ) sono dunque date da (ξ1 + x, ξ2 + y) cioè da
(3.997634, 5.001312).

139
C APITOLO 10
Integrazione numerica

Dio non si preoccupa delle nostre


difficoltà matematiche. Lui integra
empiricamente.

Albert Einstein

10.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141


10.2 Formula dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
10.3 Formule di Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.3.1 Formula di Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
10.3.2 Sull’errore della formula di Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . 147
10.4 Formule composte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
10.4.1 Formula composta dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
10.4.2 Confronti tra la formula dei trapezi e di Cavalieri-Simpson . . . . . . . . . . . . . . . . . . 152
10.5 Estrapolazione di Richardson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.6 Approssimazione di Romberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.7 Introduzione alle formule di quadratura di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
10.7.1 Proprietà delle formule di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10.7.2 Formule di Gauss-Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10.7.3 Altre formule di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
10.7.4 Applicazione delle formule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10.7.5 Sulla funzione peso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10.8 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

10.1 Introduzione
Un’automobile effettua il giro di una pista in 84 secondi. La velocità dell’auto viene misurata ogni 6 se-
condi usando un’apparecchiatura radar per il controllo della velocità, ricavando i valori che si trovano in
Tabella 10.1.
In base ai dati in possesso, quanto è lunga la pista?

Tempo 0 6 12 18 24 30 36 42 48 54 60 66 72 78 84
Velocità 38 41 45 48 45 41 37 33 30 26 24 27 32 35 37
Tabella 10.1: Dati della velocità misurati ogni 6 secondi. Il tempo è espresso in secondi e la velocità è data in
metri al secondo.

141
10. I NTEGRAZIONE NUMERICA

ds
Sapendo che la velocità v è data da v(t ) = (dove s rappresenta lo spostamento e t il tempo), per calco-
dt
lare la lunghezza della pista (data dallo spostamento effettuato dall’auto), dobbiamo integrare la velocità tra
il tempo iniziale e quello finale.
Z 84 Z s(84) ds
Z s(84)
v(t )d t = dt = ds
0 s(0) dt s(0)

Essendo s(0) = 0 e s(84) = L la lunghezza della pista, si ha


Z 84 Z s(84)
v(t )d t = ds = L
0 s(0)

Quindi, se riusciamo a risolvere l’integrale in cui la funzione integranda è la velocità, per le uguaglianze
date, sapremo dire quanto vale L, essendo
Z 84
v(t )d t = L
0

Sfruttando i dati della velocità misurati ogni 6 secondi, dobbiamo essere in grado di poter risolvere
numericamente questo integrale.
In questo Capitolo studieremo come fare. Ci occuperemo, infatti, di approssimare l’integrale definito
Z b
I= f (x)d x
a

dove f è una funzione definita nell’intervallo [a, b] (e f può essere nota oppure data su determinati punti
dell’intervallo, come nell’esempio appena visto).
Una formula di integrazione numerica (detta anche formula di quadratura numerica) approssima
Rb
l’integrale esatto I = a f (x)d x mediante nj=0 a j f (x j ):
P

Z b n
X
I= f (x)d x ≈ a j f (x j )
a j =0

dove x j , j = 0, . . . , n sono le ascisse o punti di appoggio della formula di quadratura e a j sono i pesi della
formula.

10.2 Formula dei trapezi


Consideriamo la retta che interpola la f negli estremi dell’intervallo di integrazione. Per semplicità,
seguiamo l’approccio di interpolazione mediante la tabella delle differenze divise:

a f (a)
f (b) − f (a)
b f (b)
b−a
Il polinomio di interpolazione (retta) che interpola la f in a e in b (gli estremi dell’intervallo di integrazione)
è dato da
f (b) − f (a)
p(x) = f (a) + (x − a)
b−a
L’errore di interpolazione, utilizzando l’espressione del resto di Lagrange è dato da

f 00 (ξx )
E (x) = (x − a)(x − b)
2

142
10.3. Formule di Newton-Cotes

dove ξx è un punto dell’intervallo [a, b]. Per quanto abbiamo studiato sull’interpolazione, sappiamo che la
funzione f (x) si può scrivere come somma del polinomio e dell’errore: f (x) = p(x) + E (x). Nel nostro caso,
abbiamo

f (b) − f (a) f 00 (ξx )


f (x) = f (a) + (x − a) + (x − a)(x − b)
b−a 2
Dovendo integrare la f tra a e b e valendo l’uguaglianza precedente, integrando ambo i membri,
otteniamo:

f 00 (ξx )
Z b Z bµ Z b
f (b) − f (a)

f (x)d x = f (a) + (x − a) d x + (x − a)(x − b) dx
a a b−a a 2
ovvero
Z b f (a) + f (b) 1
Z b
f (x)d x = (b − a) + (x − a)(x − b) f 00 (ξx ))d x
a 2 2 a

Poichè il prodotto (x −a)(x −b) ha segno costante in [a, b], per il teorema del Valor Medio del calcolo integrale
(si veda il Teorema 2.5.6) si ha

1 b 1 00 b 1 (b − a)3
Z Z
(x − a)(x − b) f 00 (ξx ))d x = f (ξ) (x − a)(x − b)d x = − f 00 (ξ)
2 a 2 a 2 3!

dove ξ è un punto interno all’intervallo [a, b].


1 (b − a)3 1
La quantità E i nt = − f 00 (ξ) = − f 00 (ξ)(b − a)3 rappresenta l’errore che si commette approssi-
2 3! 12
mando l’integrale di f in [a, b] mediante l’integrale della retta passante per f (a) e f (b), vale a dire, mediante
l’area del trapezio sottesa dalla corda passante per f (a) e f (b).
Indicando con M = maxa≤x≤b | f 00 (x)| possiamo maggiorare l’errore con la relazione

(b − a)3
|E i nt | ≤ M
12

La formula dei trapezi approssima l’integrale di f in [a, b] come I t r ap dato da

b−a
I t r ap = [ f (a) + f (b)]
2

10.3 Formule di Newton-Cotes


Se, al posto di una retta, prendiamo come funzione interpolante la f un polinomio di grado più elevato,
otterremo altre formule di quadrature.
Supponiamo di poter valutare la f in n + 1 punti x 0 , x 1 , . . . , x n e costruiamo il polinomio interpolatore di
grado n utilizzando la formula di Lagrange.
Avremo p n (x) = ni=0 f (x i )L i (x), dove i polinomi di Lagrange sono dati dalla nota formula
P

n x −x
Y j
L i (x) =
j =0 xi − x j
j 6=i

Se i nodi sono equidistanti con passo h, possiamo scrivere x j = x 0 + j h, con j = 0, 1, . . . , n e per un generico
punto x compreso tra x 0 e x n vale x = x 0 + sh con 0 ≤ s ≤ n, s numero reale.

143
10. I NTEGRAZIONE NUMERICA

Figura 10.1: Formula dei trapezi: l’integrale della funzione f (zona tratteggiata in blu) viene approssimata
mediante l’area del trapezio sotteso alla retta di interpolazione per f (a) e f (b) (zona verde).

Quindi x − x j = x 0 + sh − (x 0 + j h) = (s − j )h e x i − x j = (i − j )h, da cui il polinomio di Lagrange si può


scrivere come
Y n s−j
L i (x) = = L i (s)
j =0 i − j
j 6=i

Da f (x) = p n (x) + E (x) dove E (x) è l’errore della formula di interpolazione, passando all’integrale,
abbiamo
Z b Z b Z b
f (x)d x = p n (x)d x + E (x)d x
a a a

Il primo integrale a secondo membro rappresenta la formula che approssima l’integrale della f mentre il
secondo integrale rappresenta l’errore della formula di quadratura.
La formula di quadratura è quindi data dal valore dell’integrale di p n :
Z b Z n
bX n
X Z b
I= f (x)d x ≈ f (x i )L i (x)d x = f (x i ) L i (x)d x
a a i =0 i =0 a

Rb
La formula di quadratura ha dunque come nodi i punti x i e come pesi gli integrali a L i (x)d x.
Sia x 0 = a e x n = b, tenendo presente che L i (x) = L i (s) con x = x 0 + sh, da cui d x = hd s abbiamo
Z b Z xn Z n Z n
L i (x)d x = L i (x)d x = L i (s)hd s = h L i (s)d s
a x0 0 0

Allora
Z b n
X Z n
I= f (x)d x ≈ h f (x i ) L i (s)d s
a i =0 0

144
10.3. Formule di Newton-Cotes

Definiamo coefficienti di Newton-Cotes1 le espressioni

1 n
Z
C i(n) = L i (s)d s i = 0, 1, . . . , n
n 0
La formula precedente si scrive, quindi, come
Z b n n
f (x i )C i(n) = (x n − x 0 ) f (x i )C i(n)
X X
I= f (x)d x ≈ nh (10.1)
a i =0 i =0

L’errore della formula di quadratura è dato da


b b f (n+1) (ξx )
Z Z
E i nt = E (x)d x = (x − x 0 )(x − x 1 ) · · · (x − x n )d x
a a (n + 1)!
Dato un polinomio di interpolazione di grado n mediante il procedimento di Lagrange è dunque possibile
ricavare una formula di quadratura numerica che prende il nome di formula di Newton-Cotes. Per quanto
riguarda l’errore si può osservare che le formule ottenute con un valore n dispari (cui corrisponde un numero
n + 1 pari di punti di appoggio) è solo leggermente inferiore alle formule di ordine pari che le precedono
immediatamente (cui corrisponde un numero dispari di punti di appoggio).
Per questo motivo le formule di ordine pari sono le più usate.
Osserviamo che per f (x) ≡ 1, qualunque sia il grado del polinomio utilizzato nelle formule di Newton-
Cotes, l’errore di integrazione sarà zero. Nell’intervallo [a, b] ≡ [0, 1], applicando l’equazione (10.1) si ha
Z 1 n
C i(n)
X
1= dx =
0 i =0

Troviamo che la somma dei coefficienti di Newton-Cotes vale 1.


Per n = 1 (si hanno quindi due punti di appoggio, x 0 e x 1 ) i coefficienti di Cotes sono quelli già ricavati
della formula dei trapezi Formula dei
trapezi

1 1
Z 1
(s − 1) 1
Z
C 0(1) = L 0 (s)d s = ds =
1 0 0 −1 2
Z 1 Z 1
1 s 1
C 1(1) = L 1 (s)d s = ds =
1 0 0 1 2

e la formula di integrazione diventa


Z b 1 f (x 0 ) + f (x 1 )
f (x i )C i(1) = (x 1 − x 0 )
X
I= f (x)d x ≈ h
a i =0 2

10.3.1 Formula di Cavalieri-Simpson


a +b
Considerando n = 2 (quindi 3 punti di appoggio nell’intervallo [a, b], x 0 = a, x 1 = e x 2 = b, i due
2
estremi dell’intervallo e il punto centrale) la formula di quadratura prende il nome di formula di Cavalieri-
Simpson2
1 Roger Cotes (1682-1716) fu un matematico inglese che lavorò molto con Isaac Newton, in particolare per la correzione del suo
famoso libro Principia. Egli inventò le formule di quadratura che prendono il suo nome e per primo introdussse quella che oggi
conosciamo come formula di Eulero, per cui e x = cos (x) + i sin (x) nel campo complesso.
2 Bonaventura Francesco Cavalieri (1598-1647) fu un matematico italiano. Studiò teologia e geometria. Lavorò su problemi di ottica
e di cinematica. È famoso soprattutto per il cosiddetto principio di Cavalieri.
Thomas Simpson (1710-1761) fu un matematico britannico, inventore della formula di quadratura per il calcolo di integrali definiti,
sebbene questa formula fosse stata già scoperta 200 anni prima da Keplero e pare fosse usata anche da Cavalieri nel 1639 e poi riscoperta
da James Gregory. I suoi studi riguardano anche l’astrologia.

145
10. I NTEGRAZIONE NUMERICA

Figura 10.2: Formula di Cavalieri-Simpson: l’integrale della funzione f (zona tratteggiata in blu) viene
approssimata mediante l’area della regione sottesa alla parabola passante per f (a), f (c) e f (b) (zona verde).

1 2 1 2 (s − 1)(s − 2) 1
Z Z
C 0(2) = L 0 (s)d s = ds =
2 0 2 0 (−1)(−2) 6
1 2 1 2 (s)(s − 2) 4
Z Z
C 1(2) = L 1 (s)d s = ds =
2 0 2 0 (1)(−1) 6
Z 2
1 1 2 (s)(s − 1) 1
Z
C 2(2) = L 2 (s)d s = ds =
2 0 2 0 (2)(1) 6

La formula di Cavalieri-Simpson approssima l’integrale della f considerando come nodi x 0 =


a +b 1 4 1
a, x 1 = c = e x 2 = b e come pesi i coefficienti di Cotes C 0(2) = , C 1(2) = , C 2(2) = , ottenendo:
2 6 6 6
Z b 2 f (a) 4 f (c) f (b)
f (x i )C i(2) = (b − a)(
X
I= f (x)d x ≈ (x 2 − x 0 ) + + )
a i =0 6 6 6
b−a
= ( f (a) + 4 f (c) + f (b))
6

Con la formula di Cavalieri-Simpson, dunque, l’integrale della f viene approssimato con l’integrale della
parabola passante per i due estremi a e b e per il punto centrale dell’intervallo.
Per quanto riguarda l’errore che si commette approssimando l’integrale della f con la formula di
Cavalieri-Simpson, consideriamo, seguendo l’approccio visto per la formula dei trapezi, l’integrale dell’errore
del polinomio di interpolazione di Lagrange.
f 000 (ξx )
Per il polinomio di secondo grado p 2 che interpola la f , l’errore è dato da E (x) = (x−a)(x−c)(x−b).
3!

146
10.3. Formule di Newton-Cotes

Quando facciamo l’integrale, l’errore nell’approssimare l’integrale esatto con la formula di Cavalieri-
Simpson è dunque dato da
b f 000 (ξx )
Z
E i nt = (x − a)(x − c)(x − b)d x
a 3!

Questa volta, la funzione (x − a)(x − c)(x − b) cambia segno all’interno dell’intervallo [a, b] e non possiamo
più applicare il teorema del Valor Medio come nella formula dei trapezi. In maniera più laboriosa, tuttavia, si
ricava per l’errore la seguente formula:

f I V (u) b − a 5 f I V (u)
µ ¶
E i nt = − =− (b − a)5
90 2 2880

dove u è un opportuno punto dell’intervallo ]a, b[.


Osservando i valori dei coefficienti di Newton-Cotes per n = 1 e per n = 2 si può vedere come i coefficienti
siano simmetrici e la loro somma vale 1. Questo risultato si può generalizzare per ogni n.

10.3.2 Sull’errore della formula di Cavalieri-Simpson


Per capire l’errore che si ha nella formula di Cavalieri-Simpson, deduciamo la stessa formula seguendo
un’altra strada.
Per semplificare il discorso, scegliamo l’intervallo [a, b] simmetrico rispetto all’origine, quindi del tipo
[−t , t ] con t ∈ R, sapendo che, se non fosse così, basta applicare una traslazione dell’asse x per ricondursi a
questo caso. Scriviamo il polinomio di interpolazione che passa per i punti −t , 0 e t e che interpola anche la
derivata prima della f in 0.
Mediante la tabella delle differenza divise, il punto 0 va contato due volte e si ha:
−t f (−t )
f (0) − f (−t )
0 f (0)
t
f (0) − f (−t )
f 0 (0) −
0 t t f 0 (0) − f (0) + f (−t )
0 f (0) f (0) =
t t2
f (t ) − f (0)
− f 0 (0)
f (t ) − f (0) t f (t ) − f (0) − t f 0 (0) f (t ) − 2t f 0 (0) − f (−t )
t f (t ) = 2
t t t 2t 3
Il polinomio di interpolazione è, dunque

f (0) − f (−t ) t f 0 (0) − f (0) + f (−t ) f (t ) − 2t f 0 (0) − f (−t )


p(x) = f (−t ) + (x + t ) + (x + t )x + (x + t )x 2
t t2 2t 3
L’errore di interpolazione per questo polinomio di grado 3 vale

f (I V ) (ξx )
E (x) = (x + t )x 2 (x − t )
4!
Quindi da f (x) = p(x) + E (x), andando a integrare tra −t e t si ha:
Z t Z t Z t
f (x)d x = p(x)d x + E (x)d x
−t −t −t

Nell’integrazione del polinomio p(x) è facile vedere che i termini che dipendono da f 0 (0) portano un
contributo nullo. Infatti

x3
Z tµ 0
f 0 (0)
Z t 0
f (0) f (0) 2
¶ µ ¶
(x + t )x − 2 (x + t )x 2 d x = x +tx − − x2 d x
−t t t −t t t
0 · 2 4 ¸t
f (0) x x
= t − =0
t 2 4t −t

147
10. I NTEGRAZIONE NUMERICA

Gli integrali degli altri termini del polinomio p(x) portano alla formula di Cavalieri-Simpson. Infatti
(omettendo i passaggi matematici) si ha

Z t µ
f (0) − f (−t ) f (−t ) − f (0) f (t ) − f (−t )

2
f (−t ) + (x + t ) + (x + t )x + (x + t )x d x =
−t t t2 2t 3
2t
= ( f (−t ) + 4 f (0) + f (t ))
6
Allora l’errore della formula di Cavalieri-Simpson coincide con l’integrale di E (x).
R t f (I V ) (ξx )
Quindi E i nt = −t (x + t )x 2 (x − t )d x
4!
La funzione (x + t )x 2 (x − t ) = (x 2 − t 2 )x 2 non cambia mai segno all’interno dell’intervallo [−t , t ], quindi si
può applicare il teorema del Valore Medio del calcolo integrale, per cui

¸t
f (I V ) (ξ) t f (I V ) (ξ) x 5 x3 f (I V ) (ξ) 5
Z ·
E i nt = (x 2 − t 2 )x 2 d x = − t2 =− t
24 −t 24 5 3 −t 90

Considerando che l’ampiezza dell’intervallo è h = 2t si ha

f (I V ) (ξ) h 5 f (I V ) (ξ) 5
E i nt = − ( ) =− h
90 2 2880
Troviamo la formula dell’errore per Cavalieri-Simpson.

10.4 Formule composte


Le formule di Newton-Cotes non vanno bene su intervalli molto ampi perchè per avere risultati più ac-
curati dovremmo utilizzare formule di grado elevato (in modo da utilizzare un numero elevato di punti di
appoggio). Ci sono vari motivi che sconsigliano questa procedura:
G i valori dei coefficienti in formule di grado elevato sono difficili da ottenere;
G le formule di Newton-Cotes, essendo basate su polinomi di interpolazione con nodi equidistanti,
danno risultati inaccurati su intervalli ampi a causa della natura oscillatoria dei polinomi di grado
elevato.
Conviene dunque utilizzare formule di grado basso ma scomponendo l’intervallo di integrazione in più
sottointervalli e, in ciascuno di essi, applicare la stessa formula.
Sfruttiamo il fatto che se l’intervallo [a, b] viene diviso in n sottointervalli in modo che [a, b] = [a, x 1 ] ∪
[x 1 , x 2 ] ∪ [x 2 , x 3 ] ∪ . . . ∪ [x n−1 , b], allora
Z b Z x1 Z x2 Z x3 Z b
f (x)d x = f (x)d x + f (x)d x + f (x)d x + . . . + f (x)d x
a a x1 x2 x n−1

Su ciascuno intervallo [x i −1 , x i ] per i = 1, 2, . . . , n, approssimiamo l’integrale della f mediante una formula


di quadratura più semplice, utilizzando pochi punti.

10.4.1 Formula composta dei trapezi


Suddividiamo l’intervallo [a, b] in n sottointervalli definiti dai punti d’appoggio x 0 , x 1 , . . . , x n (per sem-
b−a
plicità supponiamo i punti equidistanti con passo h = , in modo che x 0 = a e x n = b, x i = x 0 + i h,
n
i = 0, . . . , n).
L’integrale su [a, b] si può dunque ottenere come somma degli integrali su tali sottointervalli:
Z b n Z
X xi
f (x)d x = f (x)d x
a i =1 x i −1

148
10.4. Formule composte

Figura 10.3: Formula composta dei trapezi, utilizzando 3 sottointervalli (4 punti).

Ciascuno degli integrali su [x i −1 , x i ] viene approssimato utilizzando la formula dei trapezi:


n Z xi n x −x n h
X X i i −1 X
f (x)d x ≈ [ f (x i −1 ) + f (x i )] = [ f (x i −1 ) + f (x i )]
i =1 x i −1 i =1 2 i =1 2

In forma estesa abbiamo


h
I≈ [ f (x 0 ) + 2 f (x 1 ) + 2 f (x 2 ) + . . . + 2 f (x n−1 ) + f (x n )]
2
f (a) + f (b)
= h[ + f (x 1 ) + f (x 2 ) + . . . f (x n−1 )]
2

L’errore che si commette è dato dalla somma degli errori commessi sui singoli sottointervalli
n h3
− f 00 (ξi )
X
E i nt =
i =1 12

Supponendo che la derivata seconda della f sia continua e limitata in [a, b] e chiamando con m e M
rispettivamente il minimo e il massimo di f 00 in [a, b], si ha:

m ≤ f 00 (ξi ) ≤ M i = 1, . . . , n

Considerando la somma di queste diseguaglianze, per i = 1, . . . , n si ricava


Pn
n f 00 (ξi )
f (ξi ) ≤ nM =⇒ m ≤ i =1
00
X
nm ≤ ≤M
i =1 n
Pn
f 00 (ξi )
Per il teorema del Valor Intermedio (teorema 2.5.3), i =1 è un valore assunto dalla funzione in
n
qualche punto u di [a, b].
b−a
Applicando la relazione h = , l’errore diventa
n
n h3 h3 f 00 (ξ) f 00 (ξ) (b − a)3
− f 00 (ξi ) = −n f 00 (ξ) (b − a)h 2 = −
X
E i nt = =−
i =1 12 12 12 12 n2

149
10. I NTEGRAZIONE NUMERICA

1
Quindi per n → ∞ l’errore tende a zero come h 2 o, equivalentemente, come .
n2

Formula composta di Cavalieri-Simpson

Suddividiamo l’intervallo [a, b] in n sottointervalli di ampiezza costante uguale a h e su ciascuno di questi


sottointervalli applichiamo la formula di Cavalieri-Simpson. Abbiamo, in questo modo, la formula composta
di Cavalieri-Simpson.
Su ogni intervallino, quindi, dobbiamo considerare gli estremi dell’intervallino e il punto centrale di esso.
ai + bi
Siano a i e b i gli estremi di ciascuna suddivisione e sia c i = il punto medio di ciascuna suddivisione
2
(quindi per i = 1, . . . , n). L’estremo superiore b i di ciascun intervallino, con i = 1, n − 1 coincide con l’estremo
inferiore dell’intervallino successivo: b i = a i +1 . In tal modo, seguendo lo stesso ragionamento fatto per i
trapezi si ha:
Z b Z b1 Z b2 Z bn
f (x)d x = f (x)d x + f (x)d x + . . . + f (x)d x
a a1 a2 an

Applicando la formula di Cavalieri-Simpson su ciascun intervallino risulta:


Z bi bi − ai ¡ ¢ h¡ ¢
f (x)d x ≈ f (a i ) + 4 f (c i ) + f (b i ) = f (a i ) + 4 f (c i ) + f (b i )
ai 6 6

In tal modo
Z b X n h¡ ¢
f (x)d x ≈ f (a i ) + 4 f (c i ) + f (b i )
a i =1 6

Si ha la formula composta di Cavalieri-Simpson.

Figura 10.4: Formula composta di Cavalieri-Simpson, utilizzando 3 sottointervalli (7 punti).

150
10.4. Formule composte

Possiamo vedere la formula composta di Cavalieri-Simpson anche in una forma com-


patta. Considerando che, su ogni sottointervallo, dobbiamo prendere il punto medio,
facciamo una numerazione progressiva dei punti di integrazione nel modo seguente:

x0 = a
x 2i = x 0 + i h i = 0, . . . n nodi estremi dei sottointervalli
1
x 2i +1 = x 0 + (i + )h i = 0, . . . , n − 1 nodi centrali dei sottointervalli
2

Quindi i nodi pari corrispondono agli estremi dei sottointervalli, mentre i nodi dispari
sono i punti centrali di ogni sottointervallo. Per la formula di quadratura otteniamo
Z b n−1
X Z x2i +2
I= f (x)d x = f (x)d x
a i =0 x 2i
n−1
X h
≈ [ f (x 2i ) + 4 f (x 2i +1 ) + f (x 2i +2 )]
i =0 6
h
= [ f (x 0 ) + 4 f (x 1 ) + 2 f (x 2 ) + 4 f (x 3 ) + . . . + 2 f (x 2n−2 ) + 4 f (x 2n−1 ) + f (x 2n )]
6
h n−1
X n−1
X
= [ f (x 0 ) + 4 f (x 2i +1 ) + 2 f (x 2i ) + f (x 2n )]
6 i =0 i =0

Per quanto riguarda l’errore, facendo la somma degli errori di integrazione sugli n sottointervalli,
nell’ipotesi che la derivata quarta sia continua e limitata, si ha3 :

1 h 5 IV
µ ¶
E i nt =− ( f (ξ1 ) + f I V (ξ2 ) + . . . + f I V (ξn ))
90 2
h 5 n−1
X IV (b − a)5 n−1 X IV
=− f (ξi ) = − 5
f (ξi )
2880 i =0 2880n i =0

Si considera quindi il punto ξ tale che4

1X n
f I V (ξ) = f I V (ξi )
n i =1

(b − a)5 I V (b − a)h 4 I V
E i nt = − f (ξ) = − f (ξ)
2880n 4 2880
1
Quindi per n → ∞ l’errore tende a zero come 4 o, equivalentemente, come h 4 . Nella formula dei trape-
n
1
zi l’errore invece decresce come 2 . Ci aspettiamo quindi che il maggiore sforzo computazionale dia una
n
maggiore accuratezza nei risultati quando si applica la formula di Cavalieri-Simpson rispetto alla formula dei
trapezi.

3 Ricordiamo che h = b − a .
n
4 Si ripete lo stesso ragionamento fatto sulla derivata seconda nella formula composta dei trapezi, questa volta però sulla derivata
quarta. Per esercizio, si consiglia di ripetere tutti i passaggi per arrivare al risultato.

151
10. I NTEGRAZIONE NUMERICA

10.4.2 Confronti tra la formula dei trapezi e di Cavalieri-Simpson

Esempio
Esempio 10.4.1 Consideriamo f (x) = e x . Sia a = 0 e b = 1.
Allora, per l’integrale esatto e per le formule dei trapezi e di Cavalieri-Simpson, si ha, rispettivamente:
Z 1 £ ¤1
I= e x d x = e x 0 = e − 1 = 1.718281828
0
1
I t r ap = (1 + e) = 1.859140914
2
1 1
IC −S = (1 + 4e 1/2 + e) = (1 + 6.594885083 + 2.718281828) = 1.718861152
6 6
La formula di Cavalieri-Simpson dà il risultato migliore.
Sia ancora f (x) = e x ma gli estremi di integrazione siano a = 0.9 e b = 1. Allora
Z 1
I= e x d x = e − e 0.9 = 0.2586787173
0.9
0.1 0.9
I − I t r ap = I − (e + e) = −2.2 × 10−4
2
0.1 0.9
I − IC −S = I − (e + 4e 0.95 + e) = −9.0 × 10−9
6
Ora la formula di Cavalieri-Simpson si rivela particolarmente accurata. Ciò non deve sorprendere se si
va a vedere la formula dell’errore, con l’ampiezza dell’intervallo che da 1 si è ridotta a 0.1, per cui (b −a)5
da 1 vale ora 10−5 .
Considerato che f 00 = f e f I V = f , queste derivate possono essere maggiorate dal valore assunto nell’e-
stremo superiore dell’intervallo, cioè e. Quindi gli errori delle formule dei trapezi e di Cavalieri-Simpson
sono maggiorate da
e
|E t r ap | ≤ (b − a)3 = 2.265 × 10−1 (b − a)3
12
e
|EC −S | ≤ (b − a)5 = 9.438 × 10−4 (b − a)5
2880

Perciò per a = 0 e b = 1 gli errori sono maggiorati da

|E t r ap | = 2.265 × 10−1
|EC −S | = 9.438 × 10−4

Invece per a = 0.9 e b = 1, poichè b − a = 0.1 = 10−1 , abbiamo

|E t r ap | = 2.265 × 10−1 · 10−3 = 2.265 × 10−4


|EC −S | = 9.438 × 10−4 · 10−5 = 9.438 × 10−9

152
10.4. Formule composte

Esempio
Esempio 10.4.2 Si voglia approssimare l’integrale a
Z 1 2
e −x d x ≈ 0.746824.
0

Suddividiamo l’intervallo [0, 1] in 4 sottointervalli. Sia h = 1/4 = 0.25. Per la formula composta dei
trapezi abbiamo

h 0 2 2 2 2
I t r ap = [e + 2e −h + 2e −(2h) + 2e −(3h) + e −(4h) ]
2
2 2 2
= 0.125[1 + 2e −0.125 + 2e −0.5 + 2e −0.75 + e −1 ]
= 0.742984

Applichiamo ora la formula di Cavalieri-Simpson su soli 2 sottointervalli, in modo da valutare la


funzione negli stessi punti precedenti. L’ampiezza di ciascun sottointervallo è dunque h = 0.5.

h 0 2 2 3 2 2
IC −S = [e + 4e −(h/2) + 2e −(h) + 4e −( 2 h) + e −(2h) ]
6
0.25 2 2 2
= [1 + 4e −0.125 + 2e −0.5 + 4e −0.75 + e −1 ]
3
= 0.746855

A parità di punti (e non di sottointervalli) la formula di Cavalieri-Simpson è più accurata di quella dei
trapezi.
Invece considerando 4 sottointervalli nella formula di Cavalieri-Simpson dobbiamo considerare anche
i punti interni di ascisse 0.125, 0.375, 0.625, 0.875 e il risultato che otteniamo è 0.746826, evidentemente
maggiormente accurato.
a È un integrale che non può essere risolto analiticamente. Se si vuole calcolare una sua approssimazione senza

fare uso di formule di quadrature, possiamo, ad esempio, pensare di applicare la definizione di integrale ab f (x)d x =
R
Pn
limn→∞ i =0 f (a + i h(n)) · h(n), con h(n) = (b − a)/n, e considerare come approssimazione dell’integrale la somma parziale
Pn
i =0
f (a + i h(n)) · h(n) con un valore di n molto grande. Per esempio, con n = 107 otteniamo il valore 0.74682420125254.

Esempio
Esempio 10.4.3 Riprendiamo l’esempio visto all’inizio del Capitolo, in cui è misurata la velocità di
un’automobile ogni 6 secondi e si vuole calcolare la lunghezza percorsa dalla macchina.
In base ai dati in possesso, possiamo applicare la formula composta dei trapezi su 14 intervalli di
ampiezza h = 6 secondi. Abbiamo (ponendo v 1 = v(0), v 2 = v(6), . . . , v 13 = v(78), v 14 = v(84)):
³v +v ´
1 14
L=6 + v 2 + v 3 + . . . + v 13 = 3009 metri
2
Possiamo anche applicare la formula di Cavalieri-Simpson, considerando ora 7 intervalli di ampiezza
pari a h = 12 secondi. In tal caso, otteniamo:

L = 2 (v 1 + 4v 2 + 2v 3 + 4v 4 + 2v 5 + . . . + 2v 12 + 4v 13 + v 14 ) = 3010 metri

In questo caso entrambi i risultati sono accettabili.

Se la funzione integranda ha le derivate che sono facili da determinare e da maggiorare, la formula del-
l’errore può essere utile per determinare il numero di sottointervalli su cui applicare una formula composta
di quadratura in modo da ottenere un’approssimazione con un errore minore di una tolleranza prefissata.

153
10. I NTEGRAZIONE NUMERICA

Esempio
R1 2
Esempio 10.4.4 Consideriamo 0 e −x d x. In quanti sottointervalli bisogna suddividere l’intervallo di
integrazione per applicare la formula dei trapezi e di Cavalieri-Simpson e ottenere un errore che sia
minore di una tolleranza ² = 10−5 ?
Per i trapezi, l’errore è maggiorato da

max0≤x≤1 | f 00 (x)| (b − a)3


|E t r ap | ≤
12 n2
Per Cavalieri-Simpson si ha

max0≤x≤1 | f I V (x)| (b − a)5


|EC −S | ≤
2880 n4
2
Da f (x) = e −x abbiamo, per le derivate:
2
f 0 (x) = −2xe −x
2
f 00 (x) = (−2 + 4x 2 )e −x
2
f 000 (x) = (12x − 8x 3 )e −x
2
f I V (x) = (12 − 48x 2 + 16x 4 )e −x

Si trova che il massimo di | f 00 | e | f I V | in [0, 1] è dato dal loro valore in x = 0, quindi abbiamo:

2 1 12 1
|E t r ap | ≤ = |EC −S | ≤ =
12n 2 6n 2 2880n 4 240n 4

La richiesta dell’accuratezza per l’errore diventa:

|E t r ap | ≤ 10−5 |EC −S | ≤ 10−5

vale a dire, rispettivamente,

1 1
≤ 10−5 ≤ 10−5
6n 2 240n 4

Per i trapezi, il primo intero n che verifica la disuguaglianza è n = 130, per Cavalieri-Simpson si ha,
invece, n = 5.
Applicando le formule su 130 intervalli per i trapezi e su 5 intervalli per Cavalieri-Simpson, otteniamo i
risultati:

I t r ap = 0.74682050480289 IC −S = 0.7468249482544

154
10.5. Estrapolazione di Richardson

10.5 Estrapolazione di Richardson


Applichiamo la formula di Cavalieri-Simpson sull’intero intervallo [a, b]. L’errore che si commette, come
sappiamo, vale

f I V (ξ1 ) b − a 5 f I V (ξ1 )
µ ¶
E1 = − =− (b − a)5
90 2 2880

Suddividiamo ora l’intervallo [a, b] in due sottointervalli e applichiamo la formula composta di Cavalieri-
Simpson. L’errore che otteniamo vale

f I V (ξ2 ) (b − a)5
E2 = −
2880 24
E1
e, supponendo che le derivate quarte della f non siano molto diverse tra loro, si ha E 2 ≈ .
16
L’errore, quindi, diventa 16 volte più piccolo passando dalla formula di Cavalieri-Simpson in un intervallo
alla formula applicata in due sottointervalli.
Sia I il valore esatto dell’integrale e Q 1 e Q 2 i due valori approssimati ottenuti considerando la formula
di Cavalieri-Simpson con n = 1 e n = 2 sottointervalli. Sia ² l’errore, cambiato di segno, che si ha con n = 2,
² = −E 2 ≈ −E 1 /16. Possiamo scrivere

I + ² = Q 2 per n = 2
I + 16² = Q 1 per n = 1

Si può ricavare ² dalle due relazioni ottenendo

Q 1 −Q 2
²=
15
Quindi

Q 2 −Q 1
I ≈ Q2 +
15
Utilizzando le due approssimazioni Q 1 e Q 2 possiamo approssimare l’integrale esatto con una maggiore ac-
curatezza mediante la formula appena scritta. Questo procedimento prende il nome di estrapolazione di
Richardson. Può essere utilizzato per migliorare l’approssimazione di un integrale ma è basato sull’ipotesi
che le derivate quarte della funzione integranda siano circa uguali e, quindi, va usato con cautela.

10.6 Approssimazione di Romberg


Ripetendo lo stesso discorso dell’estrapolazione di Richardson a partire dalla formula dei trapezi e in
maniera sistematica, si ha l’approssimazione di Romberg.
Supponiamo l’uguaglianza delle derivate seconde della funzione integranda f e sia 2m il numero di
sottointervalli in cui suddividiamo il dominio di integrazione [a, b].
Applicando la formula dei trapezi su 2m−1 sottointervalli e, successivamente, su 2m sottointervalli, l’errore
diminuisce come 1/4. Chiamando con A m e A m−1 i risultati della formula dei trapezi rispettivamente su 2m
e su 2m−1 sottointervalli e chiamando con ² l’errore cambiato di segno commesso con 2m sottointervalli,
abbiamo:

I + ² = Am
I + 4² = A m−1

155
10. I NTEGRAZIONE NUMERICA

L’integrale può essere dunque migliorato con il valore

A m − A m−1
Bm = Am + .
3
Per m = 1 si ha:
b−a
A0 = [ f (a) + f (b)] è la formula dei trapezi applicata su un unico intervallo
2
b − a f (a) a +b f (b)
A1 = [ +f( )+ ] è la formula dei trapezi su 2 sottointervalli
2 2 2 2
a +b
f (a) 4 f ( 2 ) f (b)
B 1 = (b − a)[ + )+ ] troviamo la formula di Cavalieri-Simpson!
6 6 6
Si ha dunque che B 1 (e quindi ciascun B m ) corrisponde al valore ottenuto con la formula di Cavalieri-
Simpson. L’errore ottenuto con B m è dunque proporzionale a 1/n 4 . Nel passo successivo, utilizzando i valori
B m , otteniamo la nuova approssimazione data da

B m − B m−1
Cm = Bm + per m ≥ 2
15
Si può dimostrare che C m coincide con la formula di Newton-Cotes con n = 4, dove l’errore è proporzionale
a 1/n 6 e alla derivata sesta di f.
La nuova approssimazione è data da:

C m −C m−1
Dm = Cm + per m ≥ 3
63

L’errore ora diventa proporzionale a 1/n 8 ma D m non è più un risultato delle formule di Newton-Cotes. Il
procedimento può andare avanti per calcolare E m , F m , etc tenendo presente che al denominatore dobbiamo
mettere il valore 4(d + 1) − 1 dove d è il valore del denominatore della formula precedente.
Il vantaggio dell’approssimazione di Romberg si vede solo ai primi livelli dell’applicazione (in particolare
passando da A m a B m ). Inoltre, a causa della precisione finita con cui sono eseguiti i calcoli, le formule di
Romberg di ordine elevato diventano inefficaci se il risultato iniziale A m è già abbastanza accurato rispetto
alla precisione numerica consentita.

10.7 Introduzione alle formule di quadratura di Gauss


Consideriamo di voler approssimare l’integrale dato da
Z b
f (x)w(x) d x
a

dove [a, b] può essere finito o infinito (per esempio [−1, 1], [0, +∞]). Abbiamo due funzioni, la f (x) e la w(x),
e vogliamo integrare il prodotto di queste due funzioni. La funzione w(x), che chiamiamo funzione peso, sia
positiva (w(x) ≥ 0).
Vogliamo trovare dei coefficienti w i , i = 0, . . . n (detti pesi della formula di quadratura) e dei nodi x i , i =
0, . . . n (detti nodi di quadratura) nell’intervallo [a, b] in modo da approssimare l’integrale mediante
Z b n
X
f (x)w(x) d x ≈ w i f (x i )
a 0=1

Considerando anche l’errore di quadratura:


Z b n
X
f (x)w(x) d x = w i f (x i ) + E i nt ( f )
a i =0

156
10.7. Introduzione alle formule di quadratura di Gauss

Diremo che la formula di quadratura ha un grado di precisione (o esattezza) polinomiale d se E i nt ( f ) = 0


per tutti i polinomi f fino al grado d (cioè se applichiamo la formula di quadratura per approssimare
Rb
a f (x)w(x) d x con f polinomio di grado d , l’errore è nullo). Osserviamo che ora non stiamo parlando di
formule di quadratura composte quindi n non si riferisce a suddivisioni dell’intervallo [a, b].
Per le formule di Newton-Cotes, si ha w(x) ≡ 1 e si può provare che il grado di precisione d è:
G d = n per le formule ottenute da polinomi di interpolazione di grado n dispari (come nei Trapezi: n = 1)
G d = n + 1 per le formule ottenute da polinomi di interpolazione di grado n pari (come in Cavalieri-
Simpson: n = 2)
Diremo che la formula di quadratura è interpolatoria se vale d = n . Le formule interpolatorie sono ot-
tenute per interpolazione, percorrendo la stessa strada che abbiamo visto per le formule di Newton-Cotes.
Interpoliamo la funzione f mediante un polinomio di grado n, utilizzando i polinomi di Lagrange. Nel co-
Rb
struire i pesi dobbiamo tenere conto anche della funzione w e quindi i pesi saranno w i = a L i (x)w(x) d x
dove L i (x) è l’i -simo polinomio di Lagrange.
Con questo approccio, e con nodi equidistanti, la formula di quadratura che ricaviamo ha al più grado di
precisione d = n (o d = n + 1 quando w(x) ≡ 1 e per n pari, come abbiamo visto per le formule di Newton-
Cotes).
È possibile ricavare formule di quadratura che abbiano un grado di precisione d maggiore del grado del
polinomio interpolante? E se sì come?
A tal fine consideriamo il polinomio dei nodi F (x) = ni=0 (x − x i ), di grado n + 1, lo stesso che abbiamo
Q

introdotto nel Capitolo sull’interpolazione.


Vale il seguente teorema.

Teorema 10.7.1 (di W. Gautschi) Dato un intero k con 0 < k ≤ n + 1, la formula di quadratura
Z b n
X
f (x)w(x) d x = w i f (x i ) + E i nt ( f )
a i =0

ha grado di precisione (esattezza) d = n + k se e solo se sono soddisfatte entrambe le condizioni (a) e (b):
(a) la formula è interpolatoria;
Rb
(b) il polinomio dei nodi F (x) soddisfa la relazione a F (x)p(x)w(x) d x = 0 per ogni polinomio p di grado
≤ k − 1.

Osserviamo che la condizione in (b):


G impone k condizioni sui nodi x 0 , x 1 , x 2 , . . . x n . Se fosse k = 0 non ci sarebbero condizioni in più da
considerare e avremmo d = n (cioè esattezza d = n);
G fornisce una relazione di ortogonalità: il polinomio F è ortogonale ai polinomi di grado ≤ k −1 rispetto
alla funzione peso w. 5
Nel caso specifico, il punto (b) dice che:
Z b
F (x)w(x) d x = 0
a
Z b
xF (x)w(x) d x = 0
a
Z b
x 2 F (x)w(x) d x = 0
a
..
.
Z b
x k−1 F (x)w(x) d x = 0
a

5 Per definizione, infatti, due funzioni u e v si dicono ortogonali rispetto alla funzione peso w (positiva), se b u(x)v(x)w(x) d x = 0.
R
a

157
10. I NTEGRAZIONE NUMERICA

G fa sì che k non possa essere maggiore o uguale a n + 2.R Se fosse infatti k = n + 2, il punto (b) sarebbe:
b
(b) il polinomio dei nodi F (x) soddisfa la relazione a F (x)p(x)w(x)d x = 0 per ogni polinomio p di
grado ≤ k − 1 = n + 1.
Allora, si potrebbe prendere come polinomio p(x) esattamente F (x) (che ha grado n + 1) e, per la
Rb
(b) sarebbe a (F (x))2 w(x)d x = 0: ma questo è un assurdo perchè l’integrale di una funzione positiva
non può essere nullo, e, nel nostro caso, w(x) è positiva e (F (x))2 , essendo il quadrato di un polinomio,
è pure essa una funzione positiva.
Il caso ottimale (il più alto grado di precisione che si può ottenere), si ha per k uguale al valore massimo che
può assumere, vale a dire k = n + 1. In tal caso d = n + k = n + n + 1 = 2n + 1. Si hanno le cosiddette formule
di Gauss.
A seconda della scelta della funzione peso w e dell’intervallo [a, b] abbiamo diverse formule di Gauss.

Dimostrazione. [del teorema di W. Gautschi]


Dimostriamo che se d = n + k allora sono vere la (a) e la (b) (necessità). Essendo d =
n + k la formula è esatta anche per polinomi di grado n: abbiamo dimostrato il punto
(a).
Se p è un polinomio di grado al più k − 1, allora F (x)p(x) è un polinomio (perchè
prodotto di due polinomi) di grado al più n + 1 + k − 1 = n + k. Applichiamo a que-
sto polinomio prodotto la formula di quadratura (che è esatta valendo l’ipotesi che d = n + k, quindi
E i nt (F (x)p(x)) = 0). Quindi
Z b n
X
F (x)p(x)w(x) d x = F (x i )p(x i )w i .
a i =0

Ma F (x i ) = 0 essendo F il polinomio dei nodi. Perciò ni=0 F (x i )p(x i )w i = 0 Di conseguenza


P
Rb Pn
a F (x)p(x)w(x) d x = i =0 F (x i )p(x i )w i = 0 e quindi il punto (b) è provato.
Supponiamo ora che siano vere le condizioni (a) e (b) e dimostriamo che d = n + k (sufficienza). Sia
p un polinomio di grado n + k. Dobbiamo provare che E i nt (p) = 0. Dividiamo il polinomio p per il
polinomio F : possiamo scrivere p(x) = F (x)q(x) + r (x) dove q(x) (quoziente) è un polinomio di grado
k − 1 e r (x) (resto) è un polinomio di grado n. Nel fare l’integrale, abbiamo
Z b Z b Z b
p(x)w(x) d x = q(x)F (x)w(x) d x + r (x)w(x) d x
a a a

Il primo integrale a secondo membro vale zero a motivo dell’ipotesi (b) (q(x) è un polinomio di grado
k − 1 e quindi quell’integrale è zero). Il secondo integrale, invece, per la (a) può essere calcolato esat-
tamente andando ad applicare la formula di quadratura (essendo r di grado n ed essendo la formula
interpolatoria si ha E i nt (r ) = 0 ). Si ha
Z b Z b n
X
p(x)w(x) d x = r (x)w(x) d x = r (x i )w i
a a i =0

Ma r (x i ) = p(x i ) − q(x i )F (x i ) = p(x i ) (essendo F (x i ) = 0). Quindi


Z b Z b n
X
p(x)w(x) d x = r (x)w(x) d x = p(x i )w i
a a i =1

L’errore è dunque zero e la dimostrazione è completata. 4

Da un punto di vista teorico la condizione (a) del teorema permette di calcolare i pesi delle formule di
Rb
Gauss: essendo la formula interpolatoria si ha w i = a L i (x)w(x) d x.
La condizione (b) permette di calcolare i nodi x i della formula (imponendo l’ortogonalità tra F (x) e i
polinomi di grado k = 0, 1, 2, . . . , n si ricava un sistema di n + 1 equazioni nelle incognite dei coefficien-

158
10.7. Introduzione alle formule di quadratura di Gauss

ti del polinomio F (x). Una volta trovato il polinomio F (x) ricaviamo le radici, che sono appunti i nodi di
integrazione6 .

10.7.1 Proprietà delle formule di Gauss


Scriviamo le formule di Gauss con la notazione
Z b n
w i f (x i ) + E iGnt ( f )
X
f (x)w(x) d x =
a i =0

Si ha E iGnt ( f ) ≡ 0 per f polinomio di grado ≤ 2n + 1

G I nodi x sono reali, distinti e contenuti nell’intervallo aperto ]a, b[.


G I pesi w sono tutti positivi.
i
i
Rb
Infatti, per j = 0, 1, . . . n si ha 0 < a (L j (x))2 w(x) d x = ni=0 w i (L j (x i ))2
P

(l’errore è nullo perchè (L j (x))2 è un polinomio di grado 2n). Ma L j (x i ) = 0 se i 6= j e L j (x i ) = 1 se i = j .


Quindi ni=0 w i (L j (x i ))2 = w j . Abbiamo provato che i pesi sono positivi.
P

Le formule di Gauss si possono ricavare mediante interpolazione (detta di Hermite) sui nodi x i contati
ciascuno come nodo doppio nel senso che su ciascun nodo imponiamo la condizione di interpolazione non
solo sulla f ma anche sulla derivata prima della f . Una volta che abbiamo ricavato il polinomio di interpo-
Rb
lazione p(x) (che interpola quindi per ogni nodo sia la f sia la f 0 ) e approssimato a f (x)w(x) d x mediante
Rb
a p(x)w(x) d x, dalla formula che ricaviamo imponiamo che i termini che contengono la derivata prima
siano uguali a zero (questa osservazione è dovuta a Markov, matematico russo, nel 1885).
La formula che otteniamo (considerando che il polinomio interpola la f e la f 0 ) avrà termini del tipo:
Rb Pn Pn 0 G
a f (x)w(x) d x = i =0 w i f (x i ) + i =0 C i f (x i ) + E i nt (x)
Imponendo C i = 0 i = 0, 1, 2, . . . n, otteniamo n + 1 condizioni che ci permettono di ricavare i valori di x i (i
nodi di integrazione della formula). Possiamo poi ricavare il valore dei pesi w i (che dipendono a loro volta dai
nodi). Nel procedere con l’interpolazione sui valori della f e della f 0 , l’errore del polinomio di interpolazione
f (2(n+1)) (ξx )
si può scrivere come E = (F (x))2 (poichè ogni nodo è contato due volte, e supponendo che la f
(2(n + 1))!
sia derivabile 2(n + 1) volte e sia continua).
Di conseguenza, l’errore nella formula di integrazione (applicando il teorema del Valor Medio in quanto
(F (x))2 w(x) non cambia segno nell’intervallo di integrazione) si può scrivere come E iGnt

f (2(n+1)) (ξ) b
Z
E iGnt (x) = (F (x))2 w(x) d x
(2(n + 1))! a

10.7.2 Formule di Gauss-Legendre


A seconda della funzione peso, si ha una particolare formula di Gauss.
In genere i nodi di integrazione sono calcolati su intervalli “canonici” (spetta a noi fare il cambio di
variabili se l’integrale è da farsi su altri intervalli).
Per w(x) ≡ 1 e [a, b] ≡ [−1, 1] si ha la formula di Gauss-Legendre.
I nodi della formula di quadratura, sono le radici dei cosiddetti polinomi di Legendre.
6 Ricordiamo che un polinomio di grado n + 1 lo possiamo scrivere come a n+1 + a x n + · · · + a ma possiamo anche dividere
n+1 x n 0
per il coefficiente di grado massimo e scriverlo in forma cosiddetta monica x n+1 + b n x n + b n−1 x n−1 + . . . + b 0 , e avere quindi solo n + 1
coefficienti (b 0 , b 1 , . . . , b n ) : le radici dei due polinomi non cambiano.

159
10. I NTEGRAZIONE NUMERICA

Figura 10.5: Funzioni peso per le formule di quadratura di Gauss-Chebycev di prima e seconda specie (a
sinistra e a destra rispettivamente)

Figura 10.6: Funzioni peso per le formule di quadratura di Gauss-Jacobi (con α = 2 e β = 4) e di Gauss-
Laguerre (con α = 2) (a sinistra e a destra rispettivamente)

n +1 nodi pesi
2 x 0,1 = ±0.57735026918962576 w 0 = w 1 = 1.0
3 x 0 = −0.77459666924148338 w 0 = 5/9 = 0.5555555556
x1 = 0 w 1 = 8/9 = 0.8888888889
x 2 = 0.77459666924148338 w 2 = 5/9 = 0.5555555556
4 x 0 = −0.86113631159405257 w 0 = 0.3478548451374538
x 1 = −0.33998104358485626 w 1 = 0.6521451548625461
x 2 = 0.33998104358485626 w 2 = 0.6521451548625461
x 3 = 0.86113631159405257 w 3 = 0.3478548451374538

I polinomi di Legendre (e, come essi, anche tutti gli altri polinomi le cui radici sono i nodi delle altre
formule di Gauss) hanno la caratteristica di essere polinomi mutuamente ortogonali (nel senso che presi
due polinomi di Legendre, che chiamiamo ωn (x) e ωm (x), rispettivamente di grado n e m, con n 6= m, si ha
Rb
a ωn (x)ωm (x)w(x) d x = 0).
I polinomi di Legendre (e, come essi, i polinomi delle altre formule di Gauss), si ricavano mediante for-
mule ricorsive, cioè ogni polinomio di Legendre di grado n è legato (mediante una relazione opportuna) ai
polinomi di Legendre di grado n − 1 e n − 2.

10.7.3 Altre formule di Gauss

G Con w(x) = p(11− x ) e [a, b] = [−1, 1] si hanno le formule di Gauss-Chebychev (prima specie) in
2
quanto i nodipdi integrazione sono le radici dei cosiddetti polinomi di Chebychev di prima specie.
G Con w(x) = (1 − x 2 ) e [a, b] = [−1, 1] si hanno le formule di Gauss-Chebychev (seconda specie) in
quanto i nodi di integrazione sono le radici dei cosiddetti polinomi di Chebychev di seconda specie.
G Con w(x) = (1 − x)α (1 + x)β (per α > −1 e β > −1) e [a, b] = [−1, 1] si hanno le formule di Gauss-Jacobi.
G Con w(x) = x α e −x (per α > −1) e [a, b] = [0, +∞] si hanno le formule di Gauss-Laguerre.
G 2
Con w(x) = e −x e [a, b] = [−∞, +∞] si hanno le formule di Gauss-Hermite.

160
10.7. Introduzione alle formule di quadratura di Gauss

Figura 10.7: Funzione peso per le formula di quadratura di Gauss-Hermite.

10.7.4 Applicazione delle formule


Supponiamo di voler approssimare un integrale utilizzando le formule di Gauss-Legendre, ma in un
intervallo diverso da [−1, 1]. Rb R1
Dobbiamo fare un cambio di variabili. Da a f (x) d x dobbiamo passare a −1 f (t ) d t .
b−a b+a
Poniamo x = t+
2 2
b−a b + a −b + a + b + a 2a
Per t = −1 si ha x = (−1) + = = = a. Quindi per t = −1, si ha x = a (il primo
2 2 2 2
estremo di un intervallo viene trasformato nel primo estremo dell’altro intervallo).
b−a b + a b − a + b + a 2b
Per t = 1 si ha x = (1) + = = = b.
2 2 2 2
Perciò, per t = 1, si ha x = b.
b−a
Inoltre d x = d t . Con la trasformazione di variabili si ha:
2
Z b Z 1 µ
b−a b+a b−a

f (x) d x = f t+ dt
a −1 2 2 2
Applicando la formula di Gauss-Legendre
Z b b−a Xn b−a b+a
f (x) d x ≈ w iG f ( xi + )
a 2 i =0 2 2

10.7.5 Sulla funzione peso


Supponiamo di voler integrare una funzione g (x) in [a, b] (intervallo finito). Supponiamo che la funzio-
ne integranda g abbia una singolarità algebrica agli estremi (con una certa molteplicità), in modo da poter
scrivere g (x) = f (x)(b − x)α (x − a)β
Adesso, facciamo un cambiamento di variabile, da [a, b] a [−1, 1], considerando la trasformazione x =
b−a b+a
t+ .
2 2
b−a b−a
Si ha (b − x) = (1 − t ) e (x − a) = (1 + t ).
2 2
Allora
b+a b−a α
¶β
b−a R1 b−a α b−a
µ ¶ µ
(1 + t )β d t
Rb
a g (x) d x = −1 f ( t + ) (1 − t )
2 2 2 2 2
b − a α+β+1 R 1 b−a b+a
µ ¶
= −1 f ( t+ )(1 − t )α (1 + t )β d t
2 2 2
Posso applicare le formule di Gauss-Jacobi e “scaricare” sulla funzione peso le singolarità della funzione
di partenza. R1
Sia dato l’integrale 0 f (x)(1 − x)p d x con f regolare e p intero elevato: allora (1 − x)p è una funzione che
ha valori vicini a zero. La funzione da integrare è quasi discontinua e le formule classiche (Trapezi o Cavalieri-
Simpson) non danno buoni risultati. Si può pensare a questo integrale come ad un integrale di tipo Jacobi (su
cui applicare la formula di Gauss-Jacobi) con α = p e β = 0. Si fa l’opportuno passaggio di variabili in modo

161
10. I NTEGRAZIONE NUMERICA

da integrare sull’intervallo [−1, 1]. La formula di Gauss incorpora nella funzione peso la parte che riguarda
(1 − x)p .

10.8 Esercizi

Z 0
Esercizio 10.8.1 Sia dato l’integrale I = e −x (x + 1) dx.
−2
(a) Approssimare il valore dell’integrale applicando la formula dei trapezi con n = 5 suddivisioni in parti
uguali dell’intervallo di integrazione.
(b) Trovare una maggiorazione dell’errore commesso e, dopo aver calcolato analiticamente l’integrale
esatto, confrontare tale stima con l’errore esatto.

Svolgimento
(a) Applichiamo la formula dei trapezi con n = 5 suddivisioni dell’intervallo dato. Vale, dunque, h = 0.4. I
punti da considerare e il valore della f (x) = e −x (x + 1), sono:
i xi f (x i )
0 -2 -7.3890561
1 -1.6 -2.97181945
2 -1.2 -0.664023385
3 -0.8 0.445108186
4 -0.4 0.895094819
5 0 1
La formula dei trapezi è

f (x 0 ) + f (x 5 )
I t r ap = h( + f (x 1 ) + f (x 2 ) + f (x 3 ) + f (x 4 )) = −2.19606715
2
(b) Per calcolare una maggiorazione dell’errore commesso, dobbiamo calcolare la derivata seconda della
f.
Da f (x) = e −x (x + 1) segue f 0 (x) = −e −x (x + 1) + e −x = −e −x x e f 00 (x) = e −x x − e −x = e −x (x − 1).
Poichè f 00 (x) è sempre negativa nell’intervallo di integrazione e a noi interessa la funzione valore
assoluto della f 00 (x), studiamo la funzione g (x) = | f 00 (x)| = e −x (1 − x). Si ha che g 0 (x) = e −x (x − 2) < 0
in [−2, 0], quindi g è decrescente e ha valore massimo per x = −2. Si ha dunque che M = max | f 00 (x)| =
| f 00 (−2)| = 22.1671682968
|(b − a)3 |
Quindi |E t r ap | ≤ M = 0.591124488
12 · 52
Analiticamente, è facile calcolare l’integrale esatto (per parti):
Z 0 Z 0
I= f (x) dx = −e −x
(x + 1)|0−2 + e −x dx = −e −x (x + 2)|0−2 = −2
−2 −2

Quindi l’errore esatto, in valore assoluto, è: |I − I t r ap | = 0.196067154, un valore minore della


maggiorazione trovata prima.

162
10.8. Esercizi

Esercizio 10.8.2 Sia dato l’integrale


Z 2
2
dx
0 x −4
(a) Dare una sua approssimazione con la formula dei trapezi e n = 4 suddivisioni in parti uguali
dell’intervallo di integrazione.
(b) Trovare una maggiorazione dell’errore commesso.
(c) Confrontare l’errore esatto con la stima precedentemente trovata.
(d) Dire in quanti sottointervalli occorre suddividere l’intervallo di integrazione per ottenere una
maggiorazione dell’errore minore della tolleranza ² = 10−5 .

Svolgimento
(a) Suddividendo l’intervallo di integrazione [0, 2] in n = 4 parti si trova un passo h = 2/4 = 1/2 = 0.5.
La formula dei trapezi è:

b − a f (a) + f (b)
IT = ( + f (x 1 ) + f (x 2 ) + f (x 3 ))
n 2
f (0) + f (2)
= 0.5( + f (0.5) + f (1) + f (1.5))
2
−0.5 − 1
= 0.5( − 0.571428571 − 0.666666667 − 0.8)
2
= −1.39404762

f 00 (ξ) (b − a)3
(b) Consideriamo la formula dell’errore: E = −
12 n2
2 0 −2 00 4
Da f (x) = segue f (x) = 2
e f (x) = .
x −4 (x − 4) (x − 4)3
Per maggiorare l’errore dobbiamo considerare che vale
max0≤x≤2 | f 00 (x)| (b − a)3
|E | ≤ , da cui dobbiamo calcolare M = max0≤x≤2 | f 00 (x)|.
12 n2
4
La funzione (x −4)3 è continua, crescente e sempre negativa nell’intervallo [0, 2]. Quindi | |=
(x − 4)3
4 4
3
: osserviamo il cambiamento al denominatore. Poniamo g (x) = . Risulta g 0 (x) =
(4 − x) (4 − x)3
12
> in [0, 2], quindi la g è crescente e ha valore massimo per x = 2. Perciò M = max0≤x≤2 | f 00 (x)| =
(4 − x)4
4 M 23 1
| f 00 (2)| = 3 = 1/2 = 0.5. Si ha allora la maggiorazione dell’errore |E | ≤ = = 0.0208333333
2 12 42 48
(c) L’integrale esatto si calcola facilmente:

Z 2 2
I= d x = 2 ln (|x − 4|)|20 = 2 ln (| − 2|) − 2 ln (| − 4|) = 2 ln (1/2) = ln (1/4) − 1.386294361
0 x −4

L’errore esatto commesso con la formula dei trapezi, in valore assoluto, è |I − I T | = 0.00775325793
M 23
(d) Perchè la maggiorazione dell’errore sia minore della tolleranza ² = 10−5 deve essere |E | ≤ ≤ 10−5
12 n 2
M 3 5 105
cioè n 2 ≥ 2 10 = = 33333.333333. Quindi n > 182.574186, vale a dire n = 183.
12 3

163
10. I NTEGRAZIONE NUMERICA

Esercizio 10.8.3 Dato l’integrale


Z 0.5
1
I= p dx
0 1 − x2
(a) si approssimi I con i valori Q 1 e Q 2 ottenuti applicando il metodo di Cavalieri-Simpson prima a tutto
l’intervallo e poi suddividendo l’intervallo in due parti uguali;
(b) si approssimi I usando la formula di estrapolazione di Richardson;
(c) dopo aver calcolato analiticamente il valore esatto di I , determinare l’errore esatto commesso con
l’estrapolazione di Richardson.

Svolgimento
(a) Applichiamo la formula di Cavalieri-Simpson su tutto l’intervallo, considerando che l’ampiezza
dell’intervallo è b − a = 0.5
0.5
Q1 = ( f (0) + 4 f (0.25) + f (0.5)) = 0.523823565
6
Si ha, infatti, f (0) = 1, f (0.25) = 1.03279556 e f (0.5) = 1.15470054.
Suddividendo l’intervallo in due parti uguali, abbiamo h = 0.25, da cui i punti: x 0 = a = 0, x 1 = 0.125,
x 2 = 0.25, x 3 = 0.375, e x 4 = b = 0.5.
h
Q2 = ( f (x 0 ) + 4( f (x 1 ) + 4 f (x 3 )) + 2 f (x 2 ) + f (x 4 )) = 0.523616326
6
dove f (0.125) = 1.00790526, f (0.375) = 1.07871978 (essendo già in possesso degli altri valori, calcolati
per Q 1 )
Q 2 −Q 1
(b) La formula di estrapolazione di Richardson è: I R = Q 2 + da cui ricaviamo I R = 0.5236025101
15
(c) Analiticamente l’integrale esatto è:
Z 0.5
1
I= p d x = arcsin (x)|0.5
0 = π/6 − 0 = 0.523598775
0 1 − x2
L’errore esatto commesso con l’estrapolazione di Richardson, in valore assoluto, è: |I − I R | = 3.7351·
10−6 .

R5 p
Si calcoli I = 2 sinp( x) d x utilizzando il metodo di Gauss-Legendre con 3 punti di
Esercizio 10.8.4 p
appoggio (x 1 = − (3/5), x 2 = 0, x 3 = (3/5); w 1 = w 3 = 5/9, w 1 = 8/9).

Svolgimento
Applichiamo la formula, ricordandoci che dobbiamo utilizzarla non in [2, 5] ma in [−1, 1]. Considerando
b−a
che la trasformazione dall’intervallo [2, 5] all’intervallo [−1, 1] porta al cambiamento di variabili x = t+
2
b +a 5−2 5+2 3 7 3
= t+ = t + si ha d x = d t . La formula di Gauss-Legendre deve essere applicata sui nodi
2 2 2 2 2 2
3 7
trasformati dati da x i + . Perciò abbiamo
2 2
µ ¶
3 3 7 3 7 3 7
IG = w 1 f ( x1 + ) + w 2 f ( x2 + ) + w 3 f ( x3 + )
2 2 2 2 2 2 2
¡ ¢
= 1.5 (5/9) f (−1.161895004 + 3.5) + (8/9) f (3.5) + (5/9) f (1.161895004 + 3.5)
= 1.5 (0.5550723689 + 0.8491794877 + 0.4621443545) = 2.799594317

164
C APITOLO 11
Differenziazione numerica ed equazioni alle
derivate ordinarie

L’universo è un’equazione
differenziale.

Jules Henri Poincarè

11.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165


11.2 Differenziazione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
11.3 Sulle equazioni differenziali ordinarie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
11.4 Metodo di Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
11.5 Metodo di Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
11.6 Metodo di Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
11.7 Studio dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
11.8 Errori di troncamento locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
11.9 Convergenza e stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
11.9.1 Convergenza di Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
11.9.2 Stabilità di Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
11.9.3 Convergenza di Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.9.4 Stabilità di Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.9.5 Convergenza di Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.9.6 Stabilità di Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
11.9.7 Sulla stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
11.10 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

11.1 Introduzione
All’inizio del ’900, van der Pol1 studiò fenomeni non lineari e propose l’equazione differenziale

y 00 (t ) + ²(y 2 (t ) − 1)y 0 (t ) + y(t ) = 0


1 Balthasar van der Pol (1889-1959) fu un fisico e matematico olandese. Nel 1916 lavorò per un anno con l’ingegnere John Ambrose
Fleming a Londra (Fleming aveva già inventato il diodo nel 1904). Si trasferì successivamente a Cambridge e iniziò una collaborazione
con John Joseph Thomson al Cavendish Laboratory (Thomson aveva scoperto l’elettrone nel 1897). Qui divenne amico di Edward Ap-
pleton che, nel 1947, ricevette il premio Nobel per la fisica per i suoi contributi alla conoscenza della ionosfera – studi fatti insieme a
van der Pol. La loro collaborazione riguardò anche lo studio di fenomeni non lineari usando circuiti triodi per verificare le loro teorie.
Quando van del Pol rientrò in Olanda, continuò a occuparsi di ottica, elettromagnetismo, onde radio e fisica atomica. Il nome di van
der Pol è associato con l’equazione differenziale che porta il suo nome. Questa equazione apparve per la prima volta sul suo articolo On
relaxation oscillation pubblicato sulla rivista Philosophical Magazine nel 1926.

165
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Questa equazione governa l’intensità di corrente in un circuito oscillante a triodo e viene utilizzata nello
studio di circuiti che contengono valvole termoioniche, i cosiddetti tubi a vuoto, come il tubo catodico del
televisore o il magnetron nei forni a microonde. La quantità ² indica l’intensità dello smorzamento non
lineare: quanto più ² è elevato tanto più il sistema perde energia rapidamente.
L’equazione differenziale del secondo ordine si può ricondurre ad un sistema di equazioni differenziali
del primo ordine. Ponendo u = (u 1 , u 2 ) = (y, y 0 ) si ha
µ 0¶ µ ¶
u1 u2
=
u 20 −²((u 1 )2 − 1)u 2 − u 1

Come si risolve numericamente un sistema di equazioni differenziali come quello appena scritto? In que-
sto Capitolo, daremo una piccola introduzione ad alcune tecniche di differenziazione numerica e ad alcuni
metodi numerici che permettono di risolvere equazioni differenziali del primo ordine.

11.2 Differenziazione numerica


Dall’analisi matematica, sappiamo come si calcolano le derivate di una funzione. Tuttavia è utile cono-
scere anche delle tecniche numeriche di differenziazione, sia perchè, molte volte, la funzione non è nota in
maniera esplicita ma solo per punti, sia perchè, a volte, la funzione è troppo complicata!
Dall’analisi, sappiamo che, assegnata una funzione y = f (x) e dato un punto x 0 nel suo insieme di
definizione, la derivata f 0 (x 0 è data da

f (x 0 + h) − f (x 0 )
f 0 (x 0 ) = lim
h→0 h

Per ottenere una formula che approssima la derivata prima di f 0 (x 0 ), useremo nodi equidistanti in un
intorno di xO : x 0 − h, x 0 , x 0 + h, . . . con h una quantità positiva sufficientemente piccola.
Consideriamo la f sufficientemente regolare per applicare la formula di Taylor ( f continua e limitata
insieme alle sue derivate, fino ad un ordine sufficientemente elevato). La formula di Taylor della funzione f
di centro x 0 , se ci fermiamo alla derivata seconda, è data da

(x − x 0 )2 00
f (x) = f (x 0 ) + f 0 (x 0 )(x − x 0 ) + f (ξ)
2
dove ξ è un punto, che non conosciamo, nell’intervallo di estremi x e x 0 ..
Prendiamo come x il valore x = x 0 − h: la formula di Taylor si legge come

h 2 00
f (x 0 − h) = f (x 0 ) − h f 0 (x 0 ) + f (ξ)
2

Portiamo a primo membro f 0 (x 0 , ottenendo

f (x 0 ) − f (x 0 − h) h 00
f 0 (x 0 ) = + f (ξ)
h 2

h 2 00
Se trascuriamo il termine f (ξ) abbiamo una formula che approssima f 0 (x 0 ) e che si chiama backward
2
difference formula, formula delle differenze all’indietro (stiamo usando infatti il punto x o − h).

f (x 0 ) − f (x 0 − h)
La backward difference formula è data da f 0 (x 0 ) =
h

Questa formula richiede la conoscenza del valore della f in due punti x 0 e x 0 − h ed è del primo ordine
h
(trascuriamo, infatti, un termine che dipende da h: f 00 (ξ)).
2

166
11.2. Differenziazione numerica

Se, invece, applichiamo la formula di Taylor a x = x 0 + h abbiamo la forward difference formula, formula
delle differenze in avanti:
h 2 00
f (x 0 + h) = f (x 0 ) + h f 0 (x 0 ) + f (ξ)
2
da cui
f (x 0 + h) − f (x 0 ) h 00
f 0 (x 0 ) = − f (ξ)
h 2

f (x 0 + h) − f (x 0 )
La forward formula è f 0 (x 0 ) =
h

L’errore è sempre del primo ordine.


Una formula di grado più elevato si ottiene considerando tre punti x 0 −h, x 0 , x 0 +h. Prendiamo le formule
di Taylor di centro x 0 − h e x 0 + h scritte fino alla derivata terza di f ,

h 2 00 h 3 000
f (x 0 + h) = f (x 0 ) + h f 0 (x 0 ) + f (x 0 ) + f (ξ1 )
2 6
h 2 00 h 3 000
f (x 0 − h) = f (x 0 ) − h f 0 (x 0 ) + f (x 0 ) − f (ξ2 )
2 6

Sottraendo membro a membro abbiamo


h 3 000
f (x 0 + h) − f (x 0 − h) = 2h f 0 (x 0 ) + ( f (ξ1 ) + f 000 (ξ2 ))
6
Ora le due derivate terze nei due punti ξ1 e ξ2 (che non conosciamo) sono comprese tra un valore minimo e
f 000 (ξ1 ) + f 000 (ξ2 )
un valore massimo, da cui anche il loro valore medio è compreso tra il minimo e il massimo
2
della funzione f 000 stessa (si veda il Teorema del Valore Intermedio), cioè esiste ξ (compreso tra ξ1 e ξ2 e,
f 000 (ξ1 ) + f 000 (ξ2 )
quindi, tra x 0 − h e x 0 + h) per cui f 000 (ξ) = . Sostituendo abbiamo
2
h 3 000
f (x 0 + h) − f (x 0 − h) = 2h f 0 (x 0 ) + 2 f (ξ)
6
Risolviamo ora per f 0 (x 0 ), ottenendo

f (x 0 + h) − f (x 0 − h) h 2 000
f 0 (x 0 ) = − f (ξ)
2h 6
Se trascuriamo il termine che dipende da h 2 otteniamo un’approssimazione di f 0 (x 0 ).

f (x 0 + h) − f (x 0 − h)
La formula centrata è data da f 0 (x 0 ) =
2h

Il termine che trascuriamo per ottenere le formule di differenziazione numerica, cioè l’errore di
discretizzazione, prende il nome di errore di troncamento.
La formula centrata valuta il valore della f in soli due punti, come è stato fatto per le formule backward e
forward ma ha un ordine di accuratezza più elevato.
Formule più accurate si possono ottenere usando più punti nell’intorno di x 0 e considerando espansioni
di Taylor che coinvolgono derivate di ordine più elevato. Ad esempio, prendendo i punti x 0 −2h, x 0 −h, x 0 +h
e x 0 + 2h si può ricavare

1 ¡ ¢ h 4 (v)
f 0 (x 0 ) = f (x 0 − 2h) − 8 f (x 0 − h) + 8 f (x 0 + h) − f (x 0 + 2h) + f (ξ)
12h 30

167
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Ricaviamo la formula, detta a 5 punti perchè, oltre al punto in cui vogliamo approssimare la derivata, ne
consideriamo altri quattro.

La formula a 5 punti è data da

1 ¡
f 0 (x 0 ) ≈
¢
f (x 0 − 2h) − 8 f (x 0 − h) + 8 f (x 0 + h) − f (x 0 + 2h)
12h

L’errore di troncamento dipende da h 4 .


Altre tecniche di differenziazione numerica sono basate sull’interpolazione polinomiale di Lagrange (se
p(x) approssima f (x) allora p 0 (x) approssima f 0 (x)) o su un procedimento di estrapolazione di Richardson
(simile a quello che abbiamo visto per le formule di integrazione numerica). Il discorso si estende, inoltre,
per approssimare derivate di ordine superiore.
Nell’applicare queste formule, dobbiamo ricordarci che, oltre all’errore di troncamento dovuto al tipo di
approssimazione fatto, c’è anche l’errore di arrotondamento. Nell’esempio 3.6.4, avevamo visto come, per
piccoli valori di h, il fenomeno di cancellazione numerica portava a crescite degli errori.
La scelta di h dovrebbe, perciò, dipendere, dall’ordine dell’errore di troncamento (che conosciamo) e
da una maggiorazione sul termine d’errore d’arrotondamento (valore che in genere non conosciamo). Per
evitare che domini l’errore di arrotondamento (che può portare al fenomeno di cancellazione numerica) è
importante non prendere h troppo vicino alla precisione di macchina.

Esempio
Esempio 11.2.1 Riprendiamo l’esempio 3.6.4 per confrontare le diverse formule che abbiamo introdot-
to. Dobbiamo derivare f (x) = sin (x) in x 0 = 1.2. Per confrontare le diverse formule, partiamo da h = 1 e
lo riduciamo fino ad arrivare a h = 10−12 . In Figura 11.1, in un grafico semilogaritmico, confrontiamo
gli errori assoluti ottenuti dalle varie formule. Possiamo osservare che le formule forward e backward
danno risultati confrontabili tra loro. La formula centrata porta a errori notevolmente inferiori rispetto
alle prime due formule e la formula a 5 punti riduce ancora l’errore. Per la scelta di h che abbiamo fatto,
l’errore si riduce senza mostrare il fenomeno di cancellazione numerica.

11.3 Sulle equazioni differenziali ordinarie


Passiamo ora a studiare le equazioni differenziali ordinarie.
Vogliamo trovare una funzione y(t ) che soddisfi la seguente equazione differenziale ordinaria ( ODE:
Ordinary Differential Equation) del primo ordine:

dy
= f (t , y), a ≤t ≤b
dt
La funzione f (t , y) è assegnata. Ci riferiamo a t come alla variabile indipendente. Dobbiamo trovare quella
dy(t )
funzione y = y(t ) tale che la sua derivata prima y 0 = y 0 (t ) = coincida con f (t , y(t )).
dt

168
11.3. Sulle equazioni differenziali ordinarie

Figura 11.1: Grafico semilogaritmico che mette a confronto l’errore esatto al variare di h ∈ [10−12 , 1] delle
formule forward, backward, centrata e a 5 punti.

Esempio
Esempio 11.3.1 Sia f (t , y) = −y + t definita per t ≥ 0 e per qualunque y reale. Si ha

y 0 = −y + t , t ≥0

Si verifica che, per qualunque scalare α la funzione y(t ) = t − 1 + αe −t soddisfa la ODE.


Se, inoltre, è assegnato un valore iniziale, per esempio y(0) = 1, allora, dovendo essere −1 + α = y(0) =
1, risulta α = 2. Assegnare una soluzione iniziale determina un’unica soluzione all’ODE. Si parla di
problema a valori iniziali (IVP).
Nel caso in cui y(0) = 1 si ricava l’unica soluzione y(t ) = t − 1 + 2e −t .

Problemi in cui abbiamo equazioni alle derivate ordinarie di ordine più elevato possono essere
trasformati in sistemi equivalenti di equazioni del primo ordine.

169
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Esempio
Esempio 11.3.2 La seconda legge del moto di Newton dice che la forza F è uguale al prodotto della
massa m per l’accelerazione a: F = ma. Questa equazione è una ODE del secondo ordine in quanto
l’accelerazione a è data da a = y 00 , dove y è la coordinata della posizione. L’ODE può essere riscritta
F
come: y 00 = . Definendo u 1 = y e u 2 = y 0 si ha il sistema (equivalente all’equazione di prima) di due
m
equazioni del primo ordine di ODE: µ 0¶ µ ¶
u1 u2
=
u 20 F /m
Per risolvere il sistema, possiamo usare metodi che vanno bene per risolvere equazioni differenziali del
primo ordine. La prima componente della soluzione u 1 corrisponde alla posizione y dell’equazione da
cui siamo partiti. La seconda componente u 2 fornisce la velocità y 0 .
Sistemi di
ODE Sistemi del primo ordine di ODE hanno la forma

y0 (t ) = f(t , y)

n n+1 dy n
dove y : R −→ R con y = (y 1 y 2 . . . y n ), f : R −→ R e y0 (t ) =
denota la derivata rispetto a t (per cui la
dt
d y i (t )
i -sima componente del vettore derivata è data da y i0 (t ) = ). La funzione f è assegnata e noi vogliamo
dt
determinare il vettore di funzioni y che soddisfa l’ODE.
Per semplicità noi studieremo il caso di una singola equazione scalare, n = 1. Ma l’approccio è del tutto
simile nel caso di sistemi di equazioni del primo ordine.
Sia data l’ODE

y 0 = f (t , y(t )) a ≤t ≤b

con valore iniziale

y(a) = y a .

Per risolvere questa ODE discretizziamo l’intervallo [a, b] in n + 1 punti, equidistanti per semplicità: t i =
a + i h, h = 0, 1, . . . , n, con h = (b − a)/n.
Il passo di discretizzazione (temporale se t assume il significato della variabile temporale) è dunque h.
Nelle applicazioni pratiche, il passo h è variabile (cioè i punti non sono equidistanti), tuttavia, per capire
meglio come funzionano i metodi, noi useremo sempre un passo h costante.
Sia y(t ) la soluzione esatta del nostro problema a valori iniziali. Allora y(t i ) è il valore esatto della
soluzione calcolata nel punto t i .
Indichiamo invece con y i il valore approssimato al tempo t i che ricaviamo applicando un metodo
numerico che risolve il problema proposto.

11.4 Metodo di Eulero esplicito


Con il metodo di Eulero2 esplicito applichiamo la formula di Taylor (del secondo ordine) alla funzione
y(t ), di centro t i , in modo da poter successivamente approssimare la derivata prima y 0 (t i ):

(t − t i )2 00
y(t ) = y(t i ) + (t − t i )y 0 (t i ) + y (ξi )
2
2 Leonhard Euler (1707-1783) fu un matematico svizzero. Fu studente di Johann Bernoulli che comprese le sue grandi potenzialità
e favorì i suoi studi. Eulero è noto soprattutto per i suoi contributi nel campo della geometria, della teoria dei numeri, delle equazioni
differenziali, del calcolo delle variazioni. È lui che introdusse il simbolo f (x) per indicare le funzioni, e per la base naturale, i per la
radice quadrata di −1, di π, il simbolo di sommatoria e altri ancora.
P

170
11.4. Metodo di Eulero esplicito

(t − t i )2 00
La quantità y (ξi ) è il resto della formula di Taylor con ξi un punto opportuno nel segmento di
2
estremi t e t i .
Prendiamo come t il valore t i + h vale a dire t i +1 , da cui si ha t − t i = t i +1 − t i = h. Sostituendo si ottiene:
h 2 00
y(t i +1 ) = y(t i ) + h y 0 (t i ) + y (ξi )
2
Esplicitando y 0 (t i ) rispetto agli altri termini si ha:
y(t i +1 ) − y(t i ) h 00
y 0 (t i ) = − y (ξi )
h 2
Ora si sostituisce il valore trovato per y 0 (t i ) nella ODE y 0 = f (t , y(t )) per t = t i :
y(t i +1 ) − y(t i ) h 00
− y (ξi ) = f (t i , y(t i ))
h 2
h
Trascurando il termine y 00 (ξi ) non abbiamo più i valori della soluzione esatta, ma otterremo i valori della
2
soluzione approssimata. Scriviamo dunque:
y i +1 − y i
= f (t i , y i )
h

La formula di Eulero esplicito è: y i +1 = y i + h f (t i , y i ).

La formula è di tipo esplicito perchè per passare dal livello i al livello i + 1 sfruttiamo i dati che già
conosciamo del livello i .
Si parte infatti da y 0 = y(t 0 ) = y(a) = y a e si ricava:

y 1 = y 0 + f (t 0 , y 0 )
y 2 = y 1 + f (t 1 , y 1 )
.. ..
.=.

Si arriva alla stessa formula integrando l’ODE e approssimando l’integrale della f mediante il valore in Un altro
f (t 0 , y(t 0 )): da y 0 = f (t , y(t )) integrando ambo i membri da t 0 a t , otteniamo approccio
Z t Z t Z y(t ) Z t
dy
dt = f (t , y(t )) d t =⇒ dy = f (t , y(t )) d t
t0 d t t0 y0 t0
Rt
Al secondo membro, approssiamo t0 f (t , y(t )) d t mediante il valore (t − t 0 ) f (t 0 , y(t 0 )) (approssimiamo la f
mediante la retta f (t 0 , y(t 0 ))).
Abbiamo:
y(t ) = y 0 + (t − t 0 ) f (t 0 , y 0 )) + errore della formula di quadratura.
Per t = t 1 , numericamente: y 1 = y 0 + h f (t 0 , y 0 )).
Ai passi successivi: y i +1 = y i + h f (t i , y i ))

Esempio
Esempio 11.4.1 Supponiamo di applicare il metodo di Eulero esplicito alla ODE y 0 = −y con passo h a
partire dal punto iniziale t 0 = 0 e avanziamo al tempo t 1 = t 0 + h

y 1 = y 0 + h f (t 0 , y 0 ) = y 0 − h y 0 = (1 − h)y 0

Il valore y 1 che otteniamo è affetto da errore: y 1 6= y(t 1 ) Per esempio, se per t 0 si ha y 0 = 1, la soluzione
esatta è y(t ) = e −t . Per h = 0.5, si ha y 1 = 0.5 mentre y(0.5) = e −0.5 ≈ 0.60653
Interpretazione
geometrica

171
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Da un punto di vista geometrico (si veda la Figura 11.2), il valore in t i +1 è approssimato utilizzando il va-
lore della retta la cui pendenza è data da f (t i , y i ): è come se ad ogni passo cercassimo di risolvere il problema
a valori iniziali:

y 0 (t ) = f (t , y(t ))
y(t i ) = y i

per cui il valore che otteniamo per il tempo t i +1 è tangente alla traiettoria della soluzione di questo IVP.

Figura 11.2: Interpretazione geometrica del metodo di Eulero esplicito. Si è considerato il problema y 0 = −y
con y(0) = 1 la cui soluzione esatta è y(t ) = e −t . I valori numerici ottenuti dal metodo di Eulero esplicito sono
cerchiati e si trovano sulla linea spezzata che li interpola. La linea spezzata è tangente, all’inizio di ogni passo,
alla traiettoria che passa per il corrispondente punto, soluzione del problema y 0 = −y con y(t i ) = y i .

11.5 Metodo di Eulero implicito


Se applichiamo la formula di Taylor di punto iniziale t i +1 , abbiamo

(t − t i +1 )2 00
y(t ) = y(t i +1 ) + (t − t i +1 )y 0 (t i +1 ) + y (ξi )
2
Per t = t i , si ha t − t i +1 = t i − t i +1 = t i − (t i + h) = −h. Sostituendo, abbiamo:

h 2 00
y(t i ) = y(t i +1 ) − h y 0 (t i +1 ) + y (ξi )
2
Otteniamo quindi

y(t i +1 ) − y(t i ) h 00
y 0 (t i +1 ) = + y (ξi )
h 2

172
11.5. Metodo di Eulero implicito

Andando a sostituire nella ODE al tempo t i +1 , si ha :


y(t i +1 ) − y(t i ) h 00
+ y (ξi ) = f (t i +1 , y(t i +1 ))
h 2
h
Trascurando il termine del resto di Taylor y 00 (ξi ) abbiamo:
2
y i +1 − y i
= f (t i +1 , y i +1 ))
h
La formula di Eulero implicito vale y i +1 = y i + h f (t i +1 , y i +1 )).

La differenza rispetto alla formula esplicita è che la f è valutata non più al tempo t i ma al tempo t i +1 Quindi
il calcolo di y i +1 dipende implicitamente da y i +1 stesso! La valutazione di y i +1 diventa quindi più laboriosa
e complicata (se si ha un’equazione non lineare in y i +1 , la si risolve tramite un metodo di punto fisso o di
Newton-Raphson). In termini di accuratezza si hanno risultati migliori.

Esempio
Esempio 11.5.1 Consideriamo sempre y 0 = −y con y(0) = 1 (soluzione esatta y(t ) = e −t ).
Il metodo di Eulero implicito diventa: y i +1 = y i − h y i +1 ovvero (1 + h)y i +1 = y i
yi
La soluzione numerica è y i +1 = .
(1 + h)
Per h = 0.5 ricaviamo y 1 = 0.66667 contro un valore esatto y(1) ≈ 0.60653.

Esempio
Esempio 11.5.2 Si abbia l’equazione y 0 = −y 3 con condizione iniziale y(0) = 1. Usando il metodo di
Eulero implicito con passo h = 0.5, per ricavare y 1 otteniamo l’equazione implicita

y 1 = y 0 + h f (t 1 , y 1 ) = 1 − 0.5y 13

Questa equazione non lineare in y 1 può essere risolta mediante metodo di punto fisso (x = g (x) =
1 − 0.5x 3 ) oppure utilizzando il metodo di Newton-Raphson per F (x) = 0 con F (x) = x − 1 + 0.5x 3 ) . L’ap-
prossimazione iniziale per ottenere y 1 può essere o la soluzione al passo precedente, y 0 , oppure usare il
metodo di Eulero esplicito, che dà y 1 = y 0 − 0.5y 03 = 0.5. Otteniamo, come y 1 il valore finale y 1 ≈ 0.7709.

Esempio
Esempio 11.5.3 Vogliamo discretizzare il problema di Cauchy

y 0 = −y 2
y(0) = 1

con passo h = 0.1 applicando il metodo di Eulero esplicito per ricavare y 1 e y 2 .


Il metodo di Eulero esplicito è:

y i +1 = y i + h f (t i , y i ) = y i + h(−y i2 ) = y i − h y i2

Partendo da y 0 = 1 si ricava:

y 1 = 1 − 0.1(12 ) = 0.9
y 2 = 0.9 − 0.1(0.92 ) = 0.819

173
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

1
Per confronto, calcoliamo la soluzione esatta y(t ) = , ottenendo:
t +1

y(t 1 ) = y(0.1) = 1/(0.1 + 1) = 0.9090909090


y(t 2 ) = y(0.2) = 1/(0.2 + 1) = 0.8333333333

Applichiamo ora il metodo di Eulero implicito con lo stesso passo h = 0.1.

y i +1 = y i + h f (t i +1 , y i +1 ) = y i − h y i2+1

Per ricavare y 1 la formula diventa:

y 1 = y 0 + h f (t 1 , y 1 ) = 1 − 0.1(y 12 )

Abbiamo un’equazione non lineare in y 1 . Per trovare y 1 , possiamo pensare di applicare lo schema di
punto fisso alla funzione g (y) = 1 − 0.1(y 2 ) partendo da y (0) = y 0 = 1, in quanto y 1 = g (y 1 ) è punto fisso
per la funzione g . Applichiamo tre passi dello schema di punto fisso:

y (1) = g (y (0) ) = 1 − 0.1(12 ) = 0.9


y (2) = g (y (1) ) = 1 − 0.1(0.92 ) = 0.919
y (3) = g (y (2) ) = 1 − 0.1(0.9192 ) = 0.9155439

Se prendiamo y (3) come approssimazione di y 1 ricaviamo y 1 = 0.9155439 (per confronto, il valore


esatto è 0.90909090).
Calcoliamo ora y 2 :

y 2 = y 1 + h f (t 2 , y 2 ) = 0.9155439 − 0.1(y 22 )

Ora la funzione di punto fisso diventa g (y) = 0.9155439−0.1(y 2 ). Applichiamo lo schema di punto fisso
partendo da y (0) = y 1 = 0.9155439.

y (1) = g (y (0) ) = 0.9155439 − 0.1(0.91554392 ) = 0.8317218367


y (2) = g (y (1) ) = 0.9155439 − 0.1(0.83172183672 ) = 0.8463677786
y (3) = g (y (2) ) = 0.9155439 − 0.1(0.84636777862 ) = 0.8439100583

Troviamo quindi y 2 = 0.8439100583 (valore esatto 0.8333333333).


Vediamo cosa accade in Eulero implicito se il punto iniziale del metodo di punto fisso è dato da un
passo del metodo di Eulero esplicito.
Per ricavare y 1 , considero come y (0) = y 0 + h f (t 0 , y 0 ) = 1 − 0.1 = 0.9
In tal caso, l’approssimazione iniziale è quella che, nel caso di prima, era il valore y (1) .
Applichiamo tre volte lo schema di punto fisso:

y (1) = g (y (0) ) = 1 − 0.1(0.92 ) = 0.919


y (2) = g (y (1) ) = 1 − 0.1(0.9192 ) = 0.9155439
y (3) = g (y (2) ) = 1 − 0.1(0.91554392 ) = 0.9161779367

174
11.6. Metodo di Crank-Nicolson

Quindi y 1 = 0.9161779367.
Al secondo passo, lo schema di punto fisso è dato dalla funzione g (y) = y 1 − h(y 2 ) = 0.9161779367 −
0.1y 2 .
Come approssimazione iniziale prendiamo y (0) = y 1 + h f (t 1 , y 1 ) = g (y 1 ) = 0.8322397355. Si ha:

y (1) = g (y (0) ) = 0.9161779367 − 0.1(0.83223973552 ) = 0.8469156390


y (2) = g (y (1) ) = 0.9161779367 − 0.1(0.84691563902 ) = 0.8444513267
y (3) = g (y (2) ) = 0.9161779367 − 0.1(0.84445132672) = 0.8448681324

Ricaviamo y 2 = 0.8448681324.

11.6 Metodo di Crank-Nicolson


Partiamo dall’ODE 3 y 0 = f (t , y(t )). Integriamo ambo i membri dell’equazione sull’intervallo [t i , t i +1 ]:
Z y(t i +1 ) Z t i +1 Z t i +1
dy = f (t , y(t )) dt =⇒ y(t i +1 ) − y(t i ) = f (t , y(t )) dt
y(t i ) ti ti

A secondo membro, applichiamo la formula dei trapezi trascurando l’errore di integrazione:

h
y i +1 − y i = [ f (t i , y i ) + f (t i +1 , y i +1 )]
2

h
Si ha la formula di Crank-Nicolson: y i +1 = y i + [ f (t i , y i ) + f (t i +1 , y i +1 )]
2

Altro
La stessa formula la si può ricavare prendendo la media aritmetica delle formule di Eulero esplicito e approccio

implicito:

y i +1 − y i = h f (t i , y i )
y i +1 − y i = h f (t i +1 , y i +1 )

sommando e dividendo per 2:

h h
y i +1 − y i = [ f (t i , y i ) + f (t i +1 , y i +1 )] =⇒ y i +1 = y i + [ f (t i , y i ) + f (t i +1 , y i +1 )]
2 2

3 John Crank (1916-2006) è stato un matematico inglese che si è dedicato soprattutto allo studio di soluzioni numeriche di equazioni
alle derivate parziali, in particolare di problemi di conduzione del calore. È noto soprattutto per il lavoro svolto con Phyllis Nicolson.
Phyllis Nicolson (1917-1968) è stata una matematica inglese. Negli anni della seconda guerra mondiale lavorò sulla teoria del
magnetron. È nota, appunto, per il metodo di Crank-Nicolson.

175
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Esempio
Esempio 11.6.1 Lo stesso esempio di prima (y 0 = −y con y(0) = 1) risolto con Crank-Nicolson dà: y i +1 =
h
y i + [−y i − y i +1 )] cioè
2
h h 2−h
µ ¶
(1 + )y i +1 = (1 − )y i =⇒ (2 + h)y i +1 = (2 − h)y i =⇒ y i +1 = yi
2 2 2+h

Per h = 0.5, confrontiamo i valori ottenuti dai metodi di Eulero esplicito, implicito e Crank-Nicolson,
con la soluzione esatta:
ti y(t i ) y i Eul. Espl. y i Eul. Impl. y i C-N
0.0 1.000000 1.0000000 1.000000 1.000000
0.5 0.606531 0.5000000 0.666667 0.600000
1.0 0.367879 0.2500000 0.444444 0.360000
1.5 0.223130 0.1250000 0.296296 0.216000
2.0 0.135335 0.0625000 0.197531 0.129600
2.5 0.082085 0.0312500 0.131687 0.077760
3.0 0.049787 0.0156250 0.087791 0.046656
3.5 0.030197 0.0078125 0.058528 0.027994
4.0 0.018316 0.0039062 0.039018 0.016796

11.7 Studio dell’errore


Nel costruire i metodi (di Eulero esplicito, implicito, Crank-Nicolson) abbiamo trascurato un termine (il
resto della formula di Taylor o l’errore della formula dei trapezi): questo termine che abbiamo trascurato
rappresenta l’errore di troncamento locale. Nel caso di Eulero esplicito avevamo (usando la formula di
Taylor):
y(t i +1 ) − y(t i ) h 00
y 0 (t i +1 ) = − y (ξi ) = f (t i , y(t i ))
h 2
Per costruire il metodo, abbiamo trascurato il termine del resto, vale a dire la quantità

y(t i +1 ) − y(t i ) h
di = − f (t i , y(t i )) = y 00 (ξi ) = O (h)
h 2
Questa quantità ci dice di quanto la soluzione esatta “fallisce” nel soddisfare la relazione della formula di
Eulero esplicito e rappresenta l’errore di troncamento locale.

Definizione 11.7.1 Si definisce errore totale di troncamento εi la quantità:

εi = y(t i ) − y i .

Ci aspettiamo che sia dello stesso ordine di grandezza dell’errore di troncamento locale.

Definizione 11.7.2 Per effetto dell’arrotondamento, al tempo t i al posto di y i otteniamo il valore arrotondato
y i . Si definisce errore totale di arrotondamento la quantità:

εi = y i − y i

Definizione 11.7.3 L’errore globale dello schema numerico è dato dal contributo dell’errore totale di
troncamento e dell’errore totale di arrotondamento

²i = y(t i ) − y i = εi + εi

176
11.8. Errori di troncamento locale

Gli errori di arrotondamento nell’approssimare la derivata prima di una funzione si comportano come
1
O ( ) (si veda l’esempio fatto sulla propagazione degli errori a pag. 30). Tuttavia questo aspetto diventa se-
h
condario nella risoluzione delle ODE sia perchè il passo h nelle applicazioni non è mai troppo (esagerata-
mente) piccolo per ragioni di efficienza sia perchè è la y e non la y 0 la funzione che dobbiamo approssimare.
Inoltre, nell’eseguire i calcoli in doppia precisione (come si fa nei moderni linguaggi di programmazione),
l’aspetto dovuto all’arrotondamento si vede poco rispetto ad altri fenomeni che influenzano la propagazione
degli errori.

11.8 Errori di troncamento locale

G Nel metodo di Eulero esplicito:


y(t i +1 ) − y(t i ) h
di = − f (t i , y(t i )) = y 00 (ξi ) = O (h)
h 2
G Nel metodo di Eulero implicito:
y(t i +1 ) − y(t i ) h
di = − f (t i , y(t i +1 )) = − y 00 (ξi ) = O (h)
h 2
G Nel metodo di Crank-Nicolson (derivando la formula dai trapezi e includendo il termine dell’errore):
h f 00 (ξi , τi ) 3
y(t i +1 ) − y(t i ) = [ f (t i , y(t i )) + f (t i +1 , y(t i +1 ))] − h
2 12
dove ξi e τi sono opportuni punti. Ma f = y 0 da cui f 0 = y 00 e f 00 = y 000 .
Perciò
h y 000 (ξi ) 3
y(t i +1 ) − y(t i ) = [ f (t i , y(t i )) + f (t i +1 , y(t i +1 ))] − h
2 12
y(t i +1 ) − y(t i ) 1 y 000 (ξi ) 2
di = − [ f (t i , y(t i )) + f (t i +1 , y(t i +1 ))] = − h = O (h 2 )
h 2 12

11.9 Convergenza e stabilità


Definizione 11.9.1 Un metodo si dice convergente se lim h→0 ²i = 0 cioè se l’errore va a zero al tendere del
i →+∞
passo h a zero e di i all’infinito in modo che il prodotto i h si mantenga costante (così t 0 +i h tende ad un valore
di t fissato: studiamo l’errore fissato t ).

Esempio
Esempio 11.9.1 Vediamo come, fissato un certo istante t , possiamo fare tendere h a zero e far crescere i
all’infinito in modo che t 0 + i h sia sempre uguale a t . Sia t 0 = 0 e t = 0.5:
h i ih
0.5 1 0.5
0.25 2 0.5
0.125 4 0.5
0.0625 8 0.5
.. .. ..
. . .
2.4414e-4 2048 0.5

Definizione 11.9.2 Un metodo si dice stabile se l’errore iniziale si mantiene limitato al crescere di i (per i → ∞):

|²i | ≤ M |²0 |
con M costante positiva.

177
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Studieremo la convergenza e la stabilità dei metodi di Eulero esplicito, implicito e Crank-Nicolson


applicati all’equazione test y 0 = −λy (λ > 0 in modo che −λ < 0) con condizione iniziale y(0) = y 0 .
La soluzione esatta di questo IVP è y(t ) = y 0 e −λt : tende a zero per valori di t crescenti. Ci aspettiamo che
anche la soluzione numerica si comporti in maniera simile.

11.9.1 Convergenza di Eulero esplicito


Per semplicità, applichiamo la formula del metodo di Eulero esplicito all’equazione test con λ = 1.

y 1 = y 0 + h f (t 0 , y 0 ) = y 0 − h y 0 = (1 − h)y 0
y 2 = y 1 + h f (t 1 , y 1 ) = y 1 − h y 1 = (1 − h)y 1
..
.
y i = y i −1 + h f (t i −1 , y i −1 ) = y i −1 − h y i −1 = (1 − h)y i −1

Andando a ritroso troviamo una formula che lega y i direttamente a y 0 .

y 1 = (1 − h)y 0
y 2 = (1 − h)y 1 = (1 − h)2 y 0
..
.
y i = (1 − h)y i −1 = (1 − h)i y 0

La soluzione numerica al tempo t i è data da y i = (1 − h)i y 0 . Fissato un tempo t = i h, vediamo se lim ²i = 0


h→0
i →+∞
cioè se lim y i = y(t ).
h→0
i →+∞
ih  1 t
i
Osserviamo che: (1 − h) = (1 − h) h = (1 − h) h 

1 ln (1 − h)
α
Ricordiamo la proprietà per la quale x α = e ln (x ) = e α ln (x) . Perciò: (1 − h) h = e ln (1−h)
(1/h)
=e h
Quando facciamo il limite per h → 0 e per i → +∞ consideriamo che, per il teorema dell’ Hôpital, vale

ln (1 − h) −1
lim = lim = −1
h→0 h h→0 1 − h

ln (1 − h)
Di conseguenza limh→0 e h = e −1
Allora
1 t 

lim y i = lim y 0 (1 − h)i = lim y 0 (1 − h) h  = y 0 e −t = y(t )


h→0 h→0 h→0
i →+∞ i →+∞ i →+∞

In questo modo abbiamo provato che il metodo converge. Il discorso si ripete in maniera del tutto simile,
per λ 6= 1.

11.9.2 Stabilità di Eulero esplicito


Per quanto riguarda la stabilità, dobbiamo provare che l’errore si mantiene limitato. Sia λ > 0. Abbiamo
y i +1 = y i − hλy i = (1 − hλ)y i , vale a dire y i +1 = y 0 (1 − hλ)i +1 . La soluzione esatta di questo problema è

178
11.9. Convergenza e stabilità

y(t ) = y 0 e −λt e tende a zero per valori di t crescenti. Vogliamo che tenda a zero anche la soluzione numerica
(in modo da mantenere limitato l’errore). La soluzione numerica (fissato h e per i grande, cioè per valori di t
2
crescente) tende a zero se |1 − hλ| < 1 cioè per −1 < 1 − hλ < 1 ⇐⇒ 0 < hλ < 2 ⇐⇒ h < .
λ
Il metodo di Eulero esplicito è stabile sotto condizione.

11.9.3 Convergenza di Eulero implicito


Il metodo di Eulero implicito applicato all’equazione test diventa:
yi
y i +1 =
(1 + hλ)

Quindi
y0
y1 =
(1 + hλ)
y1 y0
y2 = =
(1 + hλ) (1 + hλ)2
y2 y0
y3 = =
(1 + hλ) (1 + hλ)3
..
.
y i −1 y0
yi = =
(1 + hλ) (1 + hλ)i

In tal caso
 1 −i h
y0
lim y i = lim = lim y 0 (1 + hλ) −i
= y 0 (1 + hλ) h  = y 0 e −t λ = y(t )
h→0 h→0 (1 + hλ)i h→0
i →+∞ i →+∞ i →+∞

(i passaggi sono del tutto simili a quelli visti per Eulero esplicito).
Abbiamo provato la convergenza.

11.9.4 Stabilità di Eulero implicito


y0
Per la stabilità, dalla soluzionei numerica y i = , si osserva che, per i → +∞, qualunque sia il va-
(1 + λh)i
1
lore di h, la soluzione tende a zero in quanto limi →+∞ = 0 Si parla di metodo incondizionatamente
(1 + λh)i
stabile.

11.9.5 Convergenza di Crank-Nicolson



Il metodo di Crank-Nicolson applicato all’equazione test diventa: y i +1 = y i + [−y i − y i +1 ] da cui
2
2 − hλ
µ ¶
y i +1 = yi
2 + hλ

Andando a ritroso si ricava ¶i +1


2 − hλ
µ
y i +1 = y 0
2 + hλ

179
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

Per verificare che il metodo converge studiamo il limite lim y i . Partiamo dalla relazione
h→0
i →+∞

i h  t
¶1 ¶1

¶i
2 − hλ hλ hλ
µ µ µ
2 − h 2 − h
=  =
 
2 + hλ 2 + hλ 2 + hλ

Ma
¶1 1 2 − hλ
2 − hλ h
µ
ln ( )
=e h 2 + hλ
2 + hλ
Nel fare il limite per h → 0 e i → +∞ della quantità che si trova all’esponente, applichiamo l’Hôpital e
2 − hλ −λ(2 + hλ) − (2 − hλ)λ −4λ
ricordiamo che la derivata di vale = :
2 + hλ (2 + hλ)2 (2 + hλ)2

2 − hλ
ln ( )
lim 2 + hλ = lim 2 + hλ −4λ = lim −4λ
= −λ
h→0 h h→0 2 − hλ (2 + hλ)2 h→0 (2 + hλ)(2 − hλ)
i →+∞ i →+∞ i →+∞

Quindi
i h
¶1

¶i
2 − hλ  2 − hλ h 
µ µ
−t λ
lim y i = lim y 0 = lim y 0   = y0e = y(t )
h→0 h→0 2 + hλ h→0 2 + hλ
i →+∞ i →+∞ i →+∞

La convergenza è provata.

11.9.6 Stabilità di Crank-Nicolson


¶i
2 − λh
µ
Per la stabilità, si vede che la soluzione numerica è y i = y 0 . Per i → +∞, qualunque sia il valore
2 + λh
¶i
2 − λh
µ
di h, la soluzione tende a zero in quanto limi →+∞ = 0. Il metodo è incondizionatamente stabile.
2 + λh

11.9.7 Sulla stabilità


La stabilità di questi metodi la si può verificare anche considerando direttamente l’errore ²i , dimostrando
che gli errori al passo i e al passo i + 1 verificano la stessa relazione che hanno y i +1 e y i e mostrando che l’er-
rore rimane limitato sotto condizione per Eulero esplicito mentre è incondizionatamente stabile per gli altri
metodi. In Figura 11.3 si vede come il metodo di Eulero esplicito sia stabile sotto condizione mentre i metodi
di Eulero implicito e Crank-Nicolson sono stabili qualunque passo di discretizzazione venga utilizzato.

180
11.10. Esercizi

Figura 11.3: Confronto dei metodi di Eulero esplicito, implicito e Crank-Nicolson sull’equazione test y 0 = −y,
prendendo come h il valore h = 2 (a sinistra) e h = 0.5 (a destra).

Esempio
Esempio 11.9.2 Consideriamo il metodo di Eulero esplicito e applichiamolo all’equazione test.
Sappiamo che y i +1 = y i + hλy i .
Per la soluzione esatta, sappiamo che vale y(t i +1 ) = y(t i ) + hλy(t i ) + hd i (con d i l’errore di troncamento
locale).
Sottraendo la prima equazione dalla seconda abbiamo

²i +1 = ²i + hλ²i + hd i

h 00
Considerato che d i = y (ξi ) e che, per studiare la stabilità, h è fissato mentre i tende a +∞, il termine
2
hd i non influisce sull’andamento dell’errore e possiamo trascurarlo. Si ha allora la relazione:

²i +1 = ²i + hλ²i

Ricaviamo ²i = ²0 (1 + hλ)i .
Il ragionamento da fare è lo stesso che abbiamo fatto in precedenza e troviamo gli stessi risultati.
Dobbiamo infatti verificare quando ²i tende a zero per i che tende a +∞. . .

11.10 Esercizi

Esercizio 11.10.1 Studiare la stabilità del metodo di Eulero esplicito applicato all’equazione differenziale
e −2t + 1
y 0 = −2y + 1, con y(0) = 1 (soluzione esatta y(t ) = )
2

Svolgimento
Per provare la stabilità del metodo dobbiamo verificare che l’errore iniziale si mantiene limitato per valori
crescenti del tempo.
Il metodo di Eulero esplicito applicato all’ODE del problema diventa

y i +1 = y i + h(−2y i + 1) = (1 − 2h)y i + h

181
11. D IFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE

La soluzione esatta soddisfa un’equazione del tipo

y(t i +1 ) = y(t i ) + h(−2y(t i ) + 1) + hd i = (1 − 2h)y(t i ) + h + hd i

Nel calcolare l’errore ²i +1 = y(t i +1 ) − y i +1 abbiamo

²i +1 = (1 − 2h)²i + hd i

Il termine hd i (d i errore locale di troncamento) si può trascurare. Abbiamo allora ²i +1 = (1 − 2h)²i .


Possiamo trovare con facilità che ²i +1 = (1 − 2h)i +1 ²0 o, ancora, ²i = (1 − 2h)i ²0 .
Se vogliamo che l’errore rimanga limitato per i → ∞ la quantità (1 − 2h)i non deve crescere.
Quindi deve essere |1 − 2h| < 1, vale a dire −1 < 1 − 2h < 1 cioè 2h < 2, quindi h < 1: stabilità sotto
condizione.

182
C APITOLO 12
Primi passi in MATLAB®

L’universo non potrà essere letto


finché non avremo imparato il
linguaggio ed avremo familiarizzato
con i caratteri con cui è scritto. È
scritto in linguaggio matematico, e
le lettere sono triangoli, cerchi ed
altre figure geometriche, senza le
quali è umanamente impossibile
comprendere una singola parola.

Galileo Galilei

12.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183


12.2 Avvio di MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
12.2.1 Matrici e vettori in MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
12.3 Comandi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
12.4 MATLAB® per scrivere ed eseguire programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.4.1 Strutture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.5 Dati di input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
12.5.1 Programma sul metodo delle bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
12.6 Dati di output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
12.7 Grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
12.8 Sulle potenzialità di MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.9 Applicazioni di MATLAB® nel Calcolo Numerico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.9.1 Sull’instabilità numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.9.2 Sull’interpolazione e approssimazione di dati . . . . . . . . . . . . . . . . . . . . . . . . . . 195
12.9.3 Confronto tra schemi per equazioni differenziali ordinarie . . . . . . . . . . . . . . . . . . 202

12.1 Introduzione

Questo capitolo è provvisorio. Infatti, in origine, era stato pensato come una semplice introduzione a
MATLAB® , per chi aveva già imparato a usare il FORTRAN. Molte cose non sono quindi approfondite
come dovrebbero! Approfondimenti e integrazioni al presente capitolo saranno disponibili durante il
corso: tenere d’occhio, quindi, il sito delle dispense!!!

MATLAB® può essere considerato un linguaggio di programmazione ad alto livello e, allo stesso tempo,
un ambiente interattivo per lo sviluppo di algoritmi, per la visualizzazione e l’analisi di dati, e per il calcolo
numerico.

183
12. P RIMI PASSI IN MATLAB®

Figura 12.1: L’ambiente MATLAB consiste di una serie di finestre, alcune delle quali vengono aperte di de-
fault: la Command Window (la finestra dei comandi), la Current Folder (la directory corrente in cui si
sta lavorando), la Workspace (lo spazio di lavoro) e la Command History (la finestra con la storia dei
comandi dati).

Per chi ha già imparato a programmare in altri linguaggi di programmazione, come, ad esempio, il lin-
guaggio FORTRAN, il passaggio a MATLAB® è semplice (basta capire come cambiano le strutture di pro-
grammazione e il modo di programmare). In più, MATLAB® ha le sue functions, permette calcoli molto più
sofisticati di quelli di una calcolatrice, ed è capace di fare grafici e visualizzare i risultati in maniera diretta.
Molto spesso la conoscenza di MATLAB® è un requisito richiesto per molte posizioni lavorative in ambito
ingegneristico: a tal fine, è utile imparare qualcosa di MATLAB® . E importante prendere atto, comunque,
del fatto che non esiste un linguaggio di programmazione che vada bene per risolvere tutti i problemi (quindi
non basta conoscere e saper usare un solo linguaggio di programmazione). MATLAB® è esso stesso un pro-
gramma complesso (originariamente scritto in FORTRAN e successivamente riscritto in linguaggio C) che va
bene per risolvere programmi d’elaborazione numerica, per lavorare con matrici (MATLAB® infatti sta per
MATrix LABoratory “laboratorio matriciale”) e per la grafica.
MATLAB® è un prodotto della The MathWorks™ : vedremo in particolare la versione
MATLAB® 7.10.0.499 (R2010a).
Un prodotto simile a MATLAB® ma open source è GNU Octave (si vada sul sito http://www.octave.
org).
Nel seguito vedremo come si lavora in MATLAB® tenendo presente che quasi tutti i comandi che daremo
valgono alla stessa maniera anche per Octave (eccezion fatta per l’interfaccia grafico).

12.2 Avvio di MATLAB®


Tralasciamo la parte relativa alla procedura di installazione di MATLAB® (che dipende dal computer e dal
sistema operativo in uso) e diamo per scontato che il programma sia presente sul proprio computer.
In ambiente Linux, per avviare MATLAB® basta digitare il comando matlab da una finestra di termina-
le. Una volta avviato MATLAB® comparirà il prompt dei comandi in una finestra come quella mostrata in
Figura 12.1. Per uscire dall’ambiente si digita exit dalla finestra dei comandi oppure dal menu File o ancora
dall’icona di chiusura (x in alto a destra della finestra).

184
12.2. Avvio di MATLAB®

Figura 12.2: Primi calcoli in MATLAB® : osservare cosa succede nella Command Window nella Workspace
e nella Command History.

Per imparare a usare MATLAB® , inizialmente si prende familiarità con la finestra dei comandi eseguendo
calcoli come se fosse una calcolatrice. Vediamo che il risultato viene assegnato ad una variabile detta ans e
che nella Workspace si trovano informazioni su di essa (si veda Figura 12.2).

12.2.1 Matrici e vettori in MATLAB®


I vettori si possono scrivere come vettori riga o vettori colonna.
Per esempio:

>>x=[1 2]
>> x=[1 2]

x =

1 2

>> y=[10 20]’

y =

10
20

Un vettore riga x viene scritto usando le parentesi quadre e scrivendo le componenti del vettore una dopo
l’altra. Un vettore colonna può essere creato facendo la trasposta di un vettore riga (mediante il simbolo ’ ),
oppure mettendo un punto e virgola dopo ciascuna componente:

>> y=[10;20]

y =

10
20

185
12. P RIMI PASSI IN MATLAB®

In MATLAB® i vettori altro non sono che un caso particolare di matrice a n righe e 1 colonna (vettore
colonna) o a 1 riga e n colonne (vettore riga). Quindi per scrivere una matrice si scrivono i valori della matrice
riga per riga andando a capo con il punto e virgola:
>> A=[1 2 3 4;
5 6 7 8;
9 10 11 12;
13 14 15 16]

A =

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

Per matrici (e quindi per i vettori) si possono fare le operazioni di somma e prodotto in maniera molto
semplice. Date due matrici A e B si ha
G
G
C=A+B: matrice somma

G
C=A-B: matrice differenza
C=A*B: matrice prodotto (deve essere la matrice A di dimensione n × m e la matrice B di dimensione
m × r altrimenti si ha un messaggio di errore).
G
G
C=A’: matrice trasposta
C=A.*B : matrice i cui elementi sono C (i , j ) = A(i , j ) ∗ B (i , j )
Osserviamo che, per indicare un valore della matrice A basta specificare l’indice di riga e di colonna: per
esempio
>> A(2,2)

ans =

6
Per indicare gli elementi di tutta la colonna i si usa A(:,i), mentre A(i,:) indica gli elementi della riga
i.
>> A(:,2)

ans =

2
6
10
14

>> A(2,:)

ans =

5 6 7 8
L’operatore due punti può dunque essere usato per estrarre un’intera riga o colonna da una matrice o
un’intera sottomatrice. Se vogliamo estrarre le ultime due righe e colonne della matrice A, si digita il comando
>> M=A(3:4,3:4)

M =

11 12
15 16

186
12.3. Comandi utili

In questo modo abbiamo creato la matrice M che ha come elementi quelli della sottomatrice di A con le ultime
due righe e colonne.
Per scrivere una matrice vuota A, invece, si usa l’istruzione A=[ ].
Se si vuole risolvere un sistema lineare Ax = b in MATLAB® si può semplicemente usare una function
propria di MATLAB® “nascosta” nell’operatore \ (backslash): basta digitare il comando x= A \b, con b
vettore colonna, per avere in x il vettore incognito. Ad esempio (si confronti con l’esercizio 7.6.2):
>> A=[0.2 1 0.2; 1 6.5 1.75; 0 2 2.25]

A =

0.2000 1.0000 0.2000


1.0000 6.5000 1.7500
0 2.0000 2.2500

>> b=[2.8 ; 19.25; 10.75]

b =

2.8000
19.2500
10.7500

>> x=A\b

x =

1
2
3

12.3 Comandi utili


Per lavorare meglio sia nella finestra dei comandi sia, successivamente, per scrivere ed eseguire dei veri e
propri programmi, risultano utili le seguenti funzioni:
G who – fornisce l’elenco di tutte le variabili presenti nella finestra dei comandi (lo si può vedere anche
nella Workspace;
G whos – fornisce l’elenco di tutte le variabili insieme allo spazio in memoria da esse occupato;
G help – può essere usato da solo o insieme al nome di una function di MATLAB® o creata dall’utente, e
mostra tutte le informazioni utili per capire come usare MATLAB® o quella function;
G clear – se è usata da sola cancella tutte le variabili presenti nella finestra dei comandi, se invece è
seguita da un elenco di variabili (messe una di seguito all’altra senza virgole) cancella tutte le variabili
dell’elenco;
G il punto e virgola “;” messo dopo un’istruzione non fa vedere il risultato dell’istruzione nella finestra
dei comandi;
G il simbolo % è il simbolo per scrivere commenti: ciò che viene scritto dopo % rappresenta un
commento;
G diary – permette di salvare, su un file che viene chiamato diary, il contenuto di ciò che viene scritto
nella finestra dei comandi. Il file diary si trova nella directory corrente in cui si sta lavorando;
G diary off – chiude il file aperto mediante l’istruzione diary;
G diary filediary – comando analogo a diary, ma il file non si chiamerà diary bensì
filediary, dove filediary rappresenta il nome del file definito dall’utente;
G save filesave – salva tutte le variabili presenti nel Workspace, nel file filesave.mat con
filesave nome scelto dall’utente;
G load ’filesave’ – ripristina lo stato del Workspace, per esempio dopo aver chiuso la sessione
di MATLAB® , caricando tutte le variabili che erano state salvate in filesave.mat.

187
12. P RIMI PASSI IN MATLAB®

C‘e una notevole differenza di significato tra i files generati dall’istruzione diary e quelli generati me-
diante save. Ciò che salviamo con il comando diary è paragonabile a ciò che può essere scritto alla lavagna
e di cui prendiamo appunti: scriviamo un file di testo che possiamo elaborare o da cui possiamo trarre dei
risultati per i nostri problemi. Al contrario, quello che viene salvato mediante il comando save è costituito
da una o più variabili, che possono essere riutilizzate nuovamente in MATLAB® nella finestra dei comandi, in
sessioni successive a quella in cui sono state create, senza dover rieseguire tutti i comandi che hanno portato
alla creazione delle variabili stesse.
Il comando save è utile anche per salvare singole matrici o una lista di matrici nella directory corrente. Ci
soffermiamo sulla possibilità di salvare i dati in formato ASCII, in modo da poter utilizzare i dati che salviamo
non solo in MATLAB® ma anche in programmi scritti con altri linguaggi di programmazione. Supponiamo
di avere una matrice A e di volerla salvare nel file matriceA.dat. Scriveremo il comando
save matriceA.dat A -ascii
Quando vogliamo caricare in MATLAB® la matrice dal file useremo il comando
load(’matriceA.dat’)
e in questo modo avremo la matrice nella variabile matriceA (il nome del file senza l’estensione dopo il
punto).

12.4 MATLAB® per scrivere ed eseguire programmi


Per eseguire determinati algoritmi o risolvere determinati problemi mediante determinate istruzion, MA-
TLAB® utilizza le cosiddette functions che possono avere uno o più variabili di ingresso (dati di input) e una
o più variabili in uscita (dati di output).
I files in cui vengono scritti i programmi si chiamano M-files dal fatto che hanno l’estensione .m:
prova.m, fun.m, . . . I files vanno scritti con l’editor di testo di MATLAB® o con un altro editor di testo in
formato ASCII.
In MATLAB® abbiamo due tipi di files eseguibili: lo script, che presenta una lista di comandi da ese-
guire in ambiente MATLAB® , tra cui la chiamata alle functions proprie di MATLAB® o definite dall’utente
(sempre tramite M-files) e le functions (di MATLAB® o definite dall’utente) che possono essere chiamate
direttamente nell’ambiente di lavoro di MATLAB® o all’interno di uno script.
Per eseguire uno script salvato in nomefile.m non c’è bisogno di dover compilare il programma
(come invece si fa con altri linguaggi di programmazione): basta lanciare il programma nella finestra dei
comandi mediante il nome del file (senza l’estensione .m) o mediante il comando run(’nomefile.m’)
o run(’nomefile’). Una function invece può essere eseguita tramite uno script oppure direttamen-
te nella finestra dei comandi, specificando le variabili di ingresso e di uscita, come vedremo con qualche
esempio tra breve.
Per quanto riguarda il nome da dare alle variabili, MATLAB® è sensibile alle lettere minuscole e
maiuscole: una variabile chiamata A è diversa da a, una variabile XOLD è diversa da xold.
È importante osservare, inoltre, che nello scrivere M-files le variabili utilizzate non vanno dichiarate, ma
è bene sapere di che tipo sono (intere, reali in singola precisione, reali in doppia precisione,...)

12.4.1 Strutture
Elenchiamo in breve gli operatori logici.
Vediamo i vari cicli in MATLAB® (spiegazione dettagliata in aula e ampliata con materiale on-line
distributo durante il corso):

188
12.4. MATLAB® per scrivere ed eseguire programmi

Operatore MATLAB® Significato


< minore
> maggiore
<= minore o uguale
>= maggiore o uguale
== uguale
∼= non uguale
&& congiunzione
|| disgiunzione
∼ negazione
Tabella 12.1: Operatori relazionali e logici

Ciclo if con più condizioni


i f ( espr . logi ca1 )
Ciclo if con una condizione { i s t r u z i o n e 1a }
{ i s t r u z i o n e 2a }
i f ( espr . l o g i c a )
{ .... }
{ i s t r u z i o n e 1a }
e l s e i f ( espr . logi ca2 )
{ i s t r u z i o n e 2a }
{ i s t r u z i o n e 1b }
{ .... }
{ i s t r u z i o n e 2b }
el se
{ .... }
{ i s t r u z i o n e 1b }
....
{ i s t r u z i o n e 2b }
el se
{ .... }
{ i s t r u z i o n e 1z }
end
{ i s t r u z i o n e 2z }
{ .... }
end

Osserviamo che in MATLAB® elseif va scritto tutto attaccato.

Ciclo while
while ( espressione l o g i c a ) Ciclo for
{ istruzione 1 }
for ind= v a l i n i z : i ncr : v a l f i n
{ istruzione 2 }
{ istruzioni }
{ ... }
end
{ istruzione n }
end

189
12. P RIMI PASSI IN MATLAB®

Ciclo switch
switch ( espressione ) % ( s c a l a r e o s t r i n g a )
case { valore1 } % e s e g u i t a s e l ’ e s p r e s s i o n e e ’ valutata al valore1 )
{ istruzioni }
{ ... }
case { valore2 } % ( e s e g u i t a s e l ’ e s p r e s s i o n e e ’ valutata al valore2 )
{ istruzioni }
{ ... }
otherwise
{ istruzioni }
{ ... }
end

Il ciclo con switch confronta i valori dati nell’espressione di input (subito dopo switch) con ciascun
valore assegnato a case ed esegue le istruzioni relative al case in cui valore ed espressione coincidono.
Nell’esempio che riportiamo, a seconda del valore assegnato alla variabile scelta cambiano i valori da
assegnare alle variabili a e b:
s c e l t a =’test1’ ;
switch s c e l t a
case { ’test1’ }
x0= 0 . 1 ;
x1= 0 . 2 ;
case { ’test2’ }
x0= 0 . 0 ;
x1= 1 . 0 ;
otherwise
disp ( ’nessun caso test scelto’ )
end

Osserviamo che scelta è una variabile di stringa di caratteri, il nome del caso test scritto tra apici; per
visualizzare un messaggio sulla Command Window, abbiamo usato la function di MATLAB® chiamata disp.

12.5 Dati di input


Quando si lavora nella finestra dei comandi, per assegnare il valore alle variabili basta scrivere il nome
della variabile seguito dal simbolo di uguale e dal valore (o dai valori) da assegnare (a seconda che si tratti di
una variabile scalare, matrice, vettore...):

>> a=10.5;
>> A=[1 2 3; 4 5 6; 7 8 9];

Nell’eseguire uno script, alla stessa maniera, si può assegnare il valore alle variabili direttamente all’interno
dello script. Tuttavia, se si vuole dare maggiore generalità al programma e si vogliono dare in input i valori
delle variabili, conviene usare la function input. Vediamo con un esempio:
a=input(’ scrivi il valore della variabile a ’)
Il messaggio contenuto tra apici viene visualizzato sulla finestra dei comandi e il prompt aspetterà che
l’utente scriva il valore da assegnare ad a.
Questa procedura può essere utilizzata sia per assegnare il valore a variabili scalari, sia per matrici e vetto-
ri. Tuttavia, se i dati di input sono molto “pesanti” (ad esempio matrici di dimensioni molto elevate), conviene
usare in maniera opportuna la funzione di input unitamente al comando load - scrivendo una volta per tut-
te la matrice di input in un file da caricare ogni volta che si vuole eseguire il programma con quella matrice.
Per esempio, abbiamo scritto nel file A.dat i valori della matrice e vogliamo dare in input questa matrice al
nostro programma. Invece di scrivere

190
12.5. Dati di input

A= input(’ matrice A ’);


nello script scriveremo
A= input(’ file di input con la matrice A ’, ’s’);
A= load(A);
Osserviamo che abbiamo usato input inserendo, oltre alla stringa tra apici ’file di input con
la matrice A’, anche ’s’: questa opzione serve perchè noi scriveremo il nome del file su cui si trova
memorizzata la matrice e questo file viene letto come una stringa di caratteri per cui inizialmente alla varia-
bile A viene associato il file con la matrice (in questo caso A.dat). Con il comando successivo, viene caricato
il file e memorizzato di nuovo sulla variabile A, che quindi diventa la nostra matrice.
Si osservi la differenza che c’è nel lasciare o meno spazi bianchi prima dell’apice che chiude la frase che
viene visualizzata sulla Command Window tramite input.
È utile sapere anche che, se un’istruzione è troppo lunga e si vuole andare a capo, si utilizzano tre puntini
... sulla riga che si vuole interrompere e si prosegue a scrivere sulla riga successiva.

12.5.1 Programma sul metodo delle bisezioni


Consideriamo l’algoritmo del metodo delle bisezioni, per calcolare gli zeri di un’opportuna funzione f .
x
Ad esempio vogliamo risolvere il problema f (x) = 0 con f (x) = ( )2 − sin(x) nell’intervallo [1, 3].
2
Dobbiamo scrivere il programma principale, in un file che chiamiamo bisez.m, e la function legata alla
funzione f (x), in un file che chiamiamo fun.m.
Scriviamo il programma principale:
% programma per i l c a l c o l o d e g l i z e r i di una funzione mediante
% i l metodo di b i s e z i o n e
a=input ( ’primo estremo dell’’intervallo a ’ ) ;
b=input ( ’secondo estremo dell’’intervallo b ’ ) ;
aux=fun ( a ) * fun (b ) ;
i f aux>=0
disp ( ’estremi dello stesso segno’ )
break
end
itmax =100;
t o l l =1. e−10;
i t e r =0;
c =( a+b ) * 0 . 5 ;
scarto =abs ( b−a ) * 0 . 5 ;
while i t e r <=itmax && fun ( c)~=0 && scarto > t o l l
i t e r = i t e r +1;
aux=fun ( a ) * fun ( c ) ;
i f aux>0
a=c ;
else
b=c ;
end
c =( a+b ) * 0 . 5 ;
scarto =abs ( b−a ) * 0 . 5 ;
end
i f fun ( c)==0 | | scarto < t o l l
s p r i n t f ( ’%s %15.8e’ , ’soluzione approssimata c= ’ , c )
else
s p r i n t f ( ’%s’ , ’raggiunto numero max di iterazioni ’ )
end

Per poter essere eseguito, dobbiamo scrivere in un file chiamato fun.m la function fun. Si ha:
function y=fun ( x )
% funzione per l o schema d e l l e b i s e z i o n i

191
12. P RIMI PASSI IN MATLAB®

% input x
% output y =( x / 2 ) ^ 2 −sin ( x )
y =( x /2).^2 − sin ( x ) ;

Nel programma principale abbiamo semplicemente tradotto l’algoritmo del metodo delle bisezioni. Ab-
biamo considerato dei comandi che non abbiamo ancora visto in MATLAB® , per la stampa dei risultati (me-
diante sprintf) e abbiamo usato il comando break per interrompere l’esecuzione del programma se una
condizione non è verificata.
Le righe di commento scritte dopo l’istruzione function y=fun(x) vengono visualizzate sulla
Command Window se, una volta salvata la function, digitiamo l’istruzione help fun

12.6 Dati di output


L’ambiente MATLAB® permette di visualizzare tutte le variabili presenti al termine dell’esecuzione di un
programma o di una funzione. Tuttavia, alcune volte vogliamo visualizzare subito dei risultati sulla Com-
mand Window o su un file separato rispetto all’ambiente di lavoro. Abbiamo già visto, nell’esempio prece-
dente il comando sprintf: esso serve per stampare un messaggio sulla Command Window utilizzando un
certo tipo di formato.
Nell’esempio avevamo usato
sprintf(’%s %15.8e’, ’soluzione approssimata c= ’, c)
All’interno delle parentesi tonde si possono riconoscere due parti: nella prima parte si scrive, tra apici e uno di
seguito all’altro, il formato da utilizzare per la stampa delle variabili che sono scritte subito dopo. Nel nostro
caso, le variabili da stampare sono la stringa di caratteri soluzione approssimata c= e il valore della
variabile c. Per la stringa di caratteri si usa il formato delle stringhe che è dato da %s mentre per la variabile c,
volendo scriverla mediante un formato esponenziale con 8 cifre nella mantissa, usiamo il formato %15.8e.
Il formato per una variabile è preceduto dal simbolo % . Per la variabili intere o reali possiamo decide-
re quante cifre utilizzare per rappresentare la variabile (%15.8e nell’esempio). Riassumiamo nella tabella
seguente i principali tipi di formato e i simboli che servono per andare a capo o creare nuove linee: Se si

formato Significato
%s stringhe di caratteri
%d formato intero
%f formato fisso
%e formato esponenziale (del tipo 3.5e + 00)
%E formato esponenziale (del tipo 3.5E + 00)
\n nuova linea
\r per andare a capo
Tabella 12.2: Il formato

vogliono scrivere i risultati su un file, occorre aprire il file e associarlo ad una variabile mediante la function
fopen. Ad esempio
fid= fopen(’risultati.txt’,’w’)
Con questa istruzione aprimamo il file di risultati dal nome risultati.txt (’w’ indica che il file è di
scrittura) associandolo alla variabile fid. Per scrivere sul file, al posto della function sprintf si userà la
function fprintf che differisce dalla prima per il fatto che bisogna indicare la variabile associata al file di
scrittura dati. Il comando sprintf di prima diventa ora:
fprintf(fid , ’%s %15.8e’, ’soluzione approssimata c= ’, c)
Per chiudere il file si usa l’istruzione fclose(fid).

192
12.7. Grafici

Figura 12.3: Finestra con il grafico

12.7 Grafici
Supponiamo di voler fare il grafico di una serie di dati (x i , y i ), i = 1, . . . , n. Sulla Command Window (o
all’interno di uno script) basta digitare il comando
plot(x,y)
Si aprirà una nuova finestra con il grafico (vedi Figura 12.3).
Potremo poi modificare il colore, il tipo di linea, inserire titolo, legenda,...operando direttamente sul menu
della finestra del grafico, o inserendo i comandi opportuni tramite la Command Window1 .
Si possono sovrascrivere grafici l’uno sull’altro utilizzando il comando hold on. Oppure si possono
affiancare grafici mediante il comando subplot. Lasciamo gli approfondimenti all’help on line.
Per fare il grafico di una funzione, si possono seguire diverse strade.
Se si ha a disposizione la function (propria di MATLAB® o scritta su un file .m), si può costruire il vettore
con il valore della funzione in un numero determinato di punti equidistanti sull’intervallo in cui si desidera
visualizzarla. A tal proposito è utile la function linspace che permette di discretizzare un intervallo chiuso
[a, b] in un prefissato numero di punti. Useremo allora le seguenti istruzioni:
x=linspace ( 0 , 2 ) ;% d i s c r e t i z z i a m o l ’ i n t e r v a l l o [ 0 , 2 ] in 100 p a r t i
% uguali
% x= l i n s p a c e ( 5 0 , 0 , 2 ) d i s c r e t i z z a l ’ i n t e r v a l l o in
%50 p a r t i uguali
y=myfun( x ) ; % valuto la function myfun nel v e t t o r e x
plot ( x , y )

Questo approccio è comodo quando la funzione da visualizzare ha una espressione complicata o quando
stiamo lavorando all’interno di uno script. La function myfun deve essere scritta in modo che sia possibi-
le valutarla direttamente su un vettore (che è quello che facciamo tramite l’istruzione y=myfun(x)). Le
operazioni di moltiplicazione, divisione ed elevamento a potenza devono essere vettorizzate, facendo pre-
cendere il simbolo di moltiplicazione, divisione e elevamento a potenza dal simbolo del punto ( .*, ./,
.ˆ ) permettendo, in tal modo, che le operazioni vengano fatte componente per componente del vettore. Le
operazioni di somma e differenza sono vettorizzate per definizione.
Ad esempio: la function myfun definita tramite le istruzioni
1 Ci sarebbe tanto da dire a riguardo ma lasciamo che il lettore curioso approfondisca l’argomento utilizzando l’help on line di
MATLAB® . In Octave, invece, le modifiche ai grafici non possono essere fatte usando la finestra del grafico.

193
12. P RIMI PASSI IN MATLAB®

function [ y ]= f ( x )
y=log ( x ) * x

non è vettorizzata. Se invece scriviamo


function [ y ]= f ( x )
y=log ( x ) . * x

allora la function è vettorizzata.


Un’altra via è di scrivere la function come una funzione inline nella Command Window e di utilizzare la
function ezplot per farne il grafico.
Supponiamo di voler fare il grafico della funzione f (x) = e x −10 sin(x)−1. Per avere questa funzione nella
Command Window durante la sessione di lavoro (quindi non come una function scritta su file), scriviamo il
comando
fun = inline(’exp(x)-10*sin(x)-1’)
Sulla Command Window compaiono le seguenti righe:
>> fun=inline(’exp(x)-10*sin(x)-1’)

fun =

Inline function:
fun(x) = exp(x)-10*sin(x)-1
Se vogliamo farne il grafico nell’intervallo [0, 2] scriveremo
ezplot(fun, 0, 2)
e viene direttamente creato il grafico della funzione fun. La function ezplot può essere utilizzata anche
con funzioni intrinseche di MATLAB® o definite dall’utente in forma vettorizzata (per esempio
ezplot(’sin’,0,2)
crea il grafico della funzione sin(x) nell’intervallo [0, 2]).

12.8 Sulle potenzialità di MATLAB®


MATLAB® ha un grande numero di functions predefinite che permettono di eseguire applicazioni in di-
versi settori propriamente matematici, per approssimare zeri di funzioni, per lavorare su matrici sparse, ri-
solvere equazioni differenziali, lavorare su dati statistici, fare grafici in due e tre dimensioni... Basta vedere il
Demo di MATLAB® per trovare la function di cui si ha bisogno.
È possibile inoltre installare pacchetti specifichi per specifiche aree di applicazioni, quali sistemi di
controllo, biologia computazionale, finanza computazionale, meccatronica...
In questa breve presentazione di MATLAB® , tuttavia, cercheremo di vedere come utilizzarlo per capire
meglio alcuni dei problemi trattati in Calcolo Numerico, rielaborando o ripresentando alcuni esempi già visti.

12.9 Applicazioni di MATLAB® nel Calcolo Numerico

12.9.1 Sull’instabilità numerica


Riprendiamo l’esempio sull’instabilità numerica visto nel Capitolo sulla rappresentazione dei numeri al
calcolatore, per cui vogliamo approssimare il valore degli integrali espressi mediante la formula
xn
Z 1
yn = dx
0 x + 10

per valori di n = 1, 2, . . . , 30.


Avevamo visto due formule ricorsive che ci permettevano di approssimare y n , una era instabile e l’altra
era stabile.
Proviamo a rivedere gli algoritmi e scriviamo un programma MATLAB® da eseguire per verificare quanto
avevamo detto.

194
12.9. Applicazioni di MATLAB® nel Calcolo Numerico

% E s e r c i z i o s u l l ’ i n s t a b i l i t a ’ numerica
% c a l c o l o d e l l ’ i n t e g r a l e y_n= int_0 ^1 x^n / ( x+10) dx
%
% y i n s t : v e t t o r e con i v a l o r i d e l l ’ algoritmo i n s t a b i l e
% y s t : v e t t o r e con i v a l o r i d e l l ’ algoritmo s t a b i l e
%
% algoritmo i n s t a b i l e
%
y i n s t ( 1)= log ( 1 1 ) −log ( 1 0 ) ; %corrisponde al valore i n i z i a l e
for i =1:30
y i n s t ( i +1)= 1/ i −10* y i n s t ( i ) ;
end
%
% algoritmo s t a b i l e
% s i r i c h i e d e che i l valore d e l l ’ i n t e g r a l e y_n1 s i a approssimato
% con una accuratezza data dal valore di input t o l
n1= input ( ’ indice n1’ ) ;
t o l =input ( ’ tolleranza tol’ ) ;
k= −log10 ( t o l ) + n1 ;
k= f i x ( k + 1 ) ; % f i x e ’ una function che e f f e t t u a l ’ arrotondamento
% del numero in modo da avere un valore i n t e r o
yst (k)=0;
for j =k−1: −1:1
y s t ( j ) =1/10 * (1/ j − y s t ( j + 1 ) ) ;
end

Uno volta eseuito lo script, nella Command Window si hanno i due vettori che possono essere confrontati
tra loro. Il valore iniziale y 0 si avrà nella prima componente dei vettori che vengono creati. Perciò si faccia
attenzione agli indici utilizzati (per yst si usa j e j+1: perchè?).
Volendo, si può modificare lo script facendo uso della function di MATLAB® single che converte il
risultato in singola precisione in modo da confrontare i due algoritmi con i calcoli in singola precisione.
% y i n s t s i n g : v e t t o r e d e l l ’ algoritmo i n s t a b i l e lavorando
% in singola p r e c i s i o n e
% ystsing : v e t t o r e d e l l ’ algoritmo s t a b i l e lavorando
% in singola p r e c i s i o n e
y i n s t s i n g (1 )= s i n g l e ( log ( 1 1 ) ) −s i n g l e ( log ( 1 0 ) ) ;
for i =1:30
y i n s t s i n g ( i +1)= s i n g l e (1/ i ) −s i n g l e (10 * y i n s t s i n g ( i ) ) ;
end
n1= input ( ’ indice n1’ ) ;
t o l =input ( ’ tolleranza tol’ ) ;
k= −log10 ( t o l ) + n1 ;
k= f i x ( k + 1 ) ;
ystsing (k )=0;
for j =k−1: −1:1
y s t s i n g ( j ) = s i n g l e ( 1 / 1 0 ) * s i n g l e (1/ j − y s t s i n g ( j + 1 ) ) ;
end

Come si può osservare dalle Figure 12.4 e 12.5, i risultati ottenuti dall’algoritmo instabile cambiano a seconda
che si usi o meno la function single mentre abbiamo gli stessi risultati (consideriamo le cifre corrette in
singola precisione, usando il formato format short e) per l’algoritmo stabile.

12.9.2 Sull’interpolazione e approssimazione di dati


In MATLAB® esistono già delle function che permettono di interpolare e approssimare delle serie di dati.
C’è la function polyfit che, dati i vettori contenenti le ascisse e le ordinate da interpolare o approssima-
re, di dimensione n, e il grado m del polinomio che si vuole creare, fornisce in output il vettore contenente i

195
12. P RIMI PASSI IN MATLAB®

Figura 12.4: Algoritmo instabile: schermata del confronto tra l’uso o meno della function single

coefficienti del polinomio interpolante (o approssimante) in ordine decrescente [a m a m−1 . . . a 0 ] da cui il po-
linomio è p(x) = a m x m + a m−1 x m−1 +. . . a 0 : per m = n −1 si ha il polinomio di interpolazione, per m < n −1 si
ha il polinomio di approssimazione. L’algoritmo si basa sul processo di minimizzazione nel senso dei minimi
quadrati.
Esempio:

>> x=[7 8 9 10];


>> y=[3 1 1 9];
>> p=polyfit(x,y,3)

p =

1.0000 -23.0000 174.0000 -431.0000


Significa che il polinomio di interpolazione è:

p(x) = x 3 − 23x 2 + 174x − 431

Una volta ricavati i coefficienti, si può fare un grafico del polinomio utilizzando la function polyval.

>> xx=linspace(x(1), x(4));


>> yy=polyval(p,xx);
>> plot(x,y,’o’, xx,yy)

196
12.9. Applicazioni di MATLAB® nel Calcolo Numerico

Figura 12.5: Algoritmo stabile: schermata del confronto tra l’uso o meno della function single

Con polyval si valuta il polinomio, i cui coefficienti sono dati dal vettore p, nei punti di xx. Abbiamo usato
la function plot per rappresentare sullo stesso grafico due curve, quella dei dati x,y (grafico che facciamo
per punti utilizzando dei “cerchietti”) e quella del polinomio.
Scriviamo ora delle function che ci permettano di ottenere il polinomio di interpolazione sia usando
l’approccio delle funzioni base monomiali che porta alla costruzione della matrice di Vandermonde, sia
costruendo i polinomi di Lagrange o utilizzando le differenze divise di Newton.
Usando le funzioni base monomiali, scriviamo la seguente function, interpmonom:
function p=interpmonom ( x , y )
% function p=interpmonom ( x , y )
% i n t e r p o l a z i o n e monomiale
% dati i v a l o r i x e y da i n t e r p o l a r e s i c o s t r u i s c e i l v e t t o r e p
% dei c o e f f i c i e n t i del polinomio di i n t e r p o l a z i on e
% applicando i l metodo dei c o e f f i c i e n t i indeterminati
%
% s e x e y non sono gia ’ v e t t o r i colonna l i rendiamo t a l i
% mediante l e due i s t r u z i o n i s u c c e s s i v e
x=x ( : ) ;
y=y ( : ) ;
i f length ( x )~= length ( y )
% length e ’ una function che misura la lunghezza del v e t t o r e
% ( s i c o n f r o n t i la d i f f e r e n z a t r a length e s i z e )
error ( ’MATLAB:interpmonom’ , . . .
’i vettori x e y non hanno la stessa lunghezza’ )

197
12. P RIMI PASSI IN MATLAB®

else
n=length ( x ) −1;
% V matrice di Vandermonde c o s t r u i t a in maniera r i c o r s i v a
V ( : , 1 ) = ones (n+1 , 1 ) ;
for i =2:n+1
V ( : , i )= x . * V ( : , i −1);
end
p=V\y ;
% i l v e t t o r e p contiene i c o e f f i c i e n t i del polinomio i n t e r p o l a t o r e
% in ordine c r e s c e n t e − p0 p1 p2 . . .
% s e vogliamo usare la function del MATLAB polyval per valutare
% t a l e polinomio in piu ’ punti , dobbiamo s c r i v e r l i in ordine d e c r e s c e n t e
p=p(n+ 1 : − 1 : 1 ) ;
end

Osserviamo che abbiamo usato l’istruzione error per mostrare un messaggio di errore e far interrompere
l’esecuzione della function, nel caso in cui i dati di input x e y non abbiano la stessa lunghezza. La stringa
’MATLAB:interpmonom’ è una stringa di identificazione dell’errore (puù essere anche omessa), mentre la
stringa ’i vettori x e y non hanno la stessa lunghezza’ è quella che viene visualizzata durante l’esecuzione del
codice.
La matrice V è stata costruita in maniera ricorsiva. Una volta calcolato il vettore p possiamo valutare il
polinomio di interpolazione mediante la polyval.
Riprendendo l’esempio di prima, con x,y,xx,yy già dati:

>> p=interpmonom(x,y);
>> plot(x,y,’o’, xx,yy)
Per quanto riguarda l’interpolazione di Lagrange, si considerino le due functions che chiamamo
lagrange e interplagrange rispettivamente. La prima valuta l’i -simo polinomio di Lagrange e l’altra
valuta il polinomio di interpolazione di Lagrange in un assegnato punto (o nelle componenti di un vettore).
function yval=lagrange ( xval , x , i )
% function yval=lagrange ( xval , x , i )
% function che c a l c o l a i l polinomio i−simo di Lagrange
% valutandolo in xval
% xval puo ’ e s s e r e uno s c a l a r e o un v e t t o r e
% x − v e t t o r e d e l l e a s c i s s e da i n t e r p o l a r e
% yval e ’ un v e t t o r e colonna
xval=xval ( : ) ;
n=length ( x ) ;
yval =ones ( length ( xv a l ) , 1 ) ; % s i crea un v e t t o r e di t u t t i 1
for j =1:n
i f j ~= i
yval=yval . * ( xval−x ( j ) ) / ( x ( i ) −x ( j ) ) ;
end
end

Scriviamo ora la seguente function in due modi: la prima non è ottimale per MATLAB® , la seconda sì. Si
osservino le differenze: nella prima usiamo un ciclo for, nella seconda no.
function yval=interplagrange ( xval , x , y )
% function yval=interplagrange ( xval , x , y )
% dati i v e t t o r i x e y da i n t e r p o l a r e
% la function implementa l ’ i n t e r p o l a z i o n e di Lagrange valutandola
% in xval
% xval puo ’ e s s e r e uno s c a l a r e o un v e t t o r e
% questa function chiama la function lagrange ( xval , x , i )
i f length ( x )~= length ( y )
error ( ’MATLAB:interplagrange’ , . . .

198
12.9. Applicazioni di MATLAB® nel Calcolo Numerico

’i vettori x e y non hanno la stessa lunghezza’ )


else
xval=xval ( : ) ;
yval=zeros ( length ( xv a l ) , 1 ) ; % s i crea un v e t t o r e di t u t t i zero
n=length ( x ) −1; % n grado del polinomio
for i =1:n+1
yval = yval + lagrange ( xval , x , i ) * y ( i ) ;
end
end

function yval=interplagrange ( xval , x , y )


% dati i v e t t o r i x e y da i n t e r p o l a r e
% la function fa l ’ i n t e r p o l az i o n e di Lagrange valutandola
% in xval
i f length ( x )~= length ( y )
error ( ’MATLAB:lagrange’ , ’x e y non hanno la stessa lunghezza’ )
else
y=y ( : )
n=length ( x ) −1;% n grado del polinomio
A=[];
for i =1:n+1
A=[A , lagrange ( xval , x , i ) ] %ogni colonna d e l l a matrice A ha i l
% valore d e l l ’ i−simo polinomio di
% Lagrange c a l c o l a t o nei v a l o r i xval
end
yval=A * y ;
end

Eseguiamo l’esempio di prima per vedere cosa si ottiene:

>> yy=interplagrange(xx,x,y);
>> plot(x,y,’o’, xx,yy)

Ora la function interplagrange sostituisce l’uso delle due function polyfit, polyval o
interpmonom, polyval.
Calcoliamo ora il polinomio di interpolazione mediate le differenze divise di Newton. Scriviamo due
functions, la prima che scrive la tabella delle differenze divise, la seconda che valuta il polinomio di in-
terpolazione implementando l’algoritmo di Horner2 in modo da minimizzare il numero delle operazioni da
eseguire.
function t a b l e = d i v d i f ( x , y )
% function t a b l e = d i v d i f ( x , y )
% x − a s c i s s e dei dati da i n t e r p o l a r e
% y − ordinate dei dati da i n t e r p o l a r e
% table − tabella delle differenze divise
x=x ( : ) ;
y=y ( : ) ;
n=length ( x ) ;
m=length ( x ) ;
i f n~=m
error ( ’MATLAB:differenze_divise’ , ’errore sui dati’ )
else
t a b l e =zeros (n , n ) ; % iniziamo la t a b e l l a come una matrice di z e r i
table ( : , 1 ) = y ;
for j =2:n
2 William Horner (1786-1837) fu un matematico inglese, ricordato essenzialmente per il suo metodo sulle equazioni algebriche.
Spieghiamo l’algoritmo solo per rendere comprensibile la function che scriviamo.

199
12. P RIMI PASSI IN MATLAB®

for k =2: j
t a b l e ( j , k )= ( t a b l e ( j , k−1) − t a b l e ( j −1,k−1) ) / . . .
( x ( j ) − x ( j −k+1) ) ;
end
end
end

La diagonale principale della matrice table ha i coefficienti a 0 , a 1 , . . . a n del polinomio di interpolazione.


Il polinomio è dunque:

p(x) = a 0 + a 1 (x − x 0 ) + a 2 (x − x 0 )(x − x 1 ) + . . . + a n (x − x 0 )(x − x 1 ) · · · (x − x n−1 )

Per valutarlo in un punto x eseguiamo i seguenti passaggi, applicando, in tal modo, l’algoritmo di Horner:

p = an
p = p(x − x n−1 ) + a n−1
= a n (x − x n−1 ) + a n−1
p = p(x − x n−2 ) + a n−2
= a n (x − x n−1 )(x − x n−2 ) + a n−1 (x − x n−2 ) + a n−2
..
.
p = p(x − x 0 ) + a 0
= a n (x − x n−1 )(x − x n−2 ) . . . (x − x 1 )(x − x 0 ) + . . . + a 1 (x − x 1 )(x − x 0 ) + a 0
= a 0 + a 1 (x − x 0 )(x − x 1 ) + . . . + a n (x − x 0 )(x − x 1 ) . . . (x − x n−2 )(x − x n−1 )

La function da scrivere è dunque:


function yval= i n t e r p d i v d i f ( xval , x , t a b l e )
% function yval= i n t e r p d i v d i f ( xval , x , t a b l e )
% x − a s c i s s e dei dati da i n t e r p o l a r e
% table − tabella delle differenze divise ,
% ottenuta dalla function d i v d i f ;
% servono i v a l o r i d e l l a diagonale p r i n c i p a l e
% xval − s c a l a r e o v e t t o r e in cui c a l c o l a r e i l polinomio
% interpolatore
% yval − valore ( o v a l o r i ) del polinomio i n t e r p o l a t o r e
% valutato in xval
% nel c a l c o l o del polinomio i n t e r p o l a t o r e s i applica
% l ’ algoritmo di Horner
xval=xval ( : ) ;
x=x ( : ) ;
n=length ( x ) −1;
yval= t a b l e (n+1 ,n+1) * ones ( length ( xv a l ) , 1 ) ;
for j =n: −1:1
yval=yval . * ( xval−x ( j ) ) + t a b l e ( j , j ) ;
end

Le functions appena descritte possono essere usate in maniera del tutto equivalenti per risolvere il proble-
ma dell’interpolazione. Ci sono però dei casi in cui i risultati ottenuti dalla polyfit e dalla interpmonom
non sono corretti in quanto la matrice di Vandermonde ad esse legate è malcondizionata.
Abbiamo già descritto gli effetti del malcondizionamento nell’interpolazione. Quando applichiamo la
function polyfit ai dati di quel problema, si ha il seguente messaggio di avvertimento (un warning):

>> poli=polyfit(x,y,5)
Warning: Polynomial is badly conditioned. Add points with distinct X
values, reduce the degree of the polynomial, or try

200
12.9. Applicazioni di MATLAB® nel Calcolo Numerico

centering
and scaling as described in HELP POLYFIT.
Questo ci dice che i risultati che avremo non saranno buoni e, effettivamente, se facciamo il grafico dei dati
del problema e del polinomio di interpolazione ottenuto con la polyfit, si nota subito che il polinomio è
completamente errato (vedi Figura 12.8) Anche nell’applicare la function interpmonom si ha il messaggio

Figura 12.6: Uso della function polyfit per l’esempio malcondizionato.

di avvertimento

>> pmon=interpmonom(x,y)
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 5.537667e-31.
Se aggiungiamo al grafico precendente la curva corrispondente al polinomio ottenuto con la interpmonom
osserviamo come le due curve siano tra loro distinte e non interpolano i dati.

Figura 12.7: Uso della function interpmonom per l’esempio malcondizionato.

Proviamo invece ad applicare l’algoritmo di Lagrange o delle differenze divise di Newton e aggiungiamo
le nuove curve sul precedente grafico:

>> ylagr=interplagrange(xx,x,y);
>> table=divdif(x,y);
>> ynewt=interpdivdif(xx,x,table);
>> plot(xx,ylagr,xx,ynewt)
Si nota subito che le due curve sono tra loro coincidenti e interpolatorie!

201
12. P RIMI PASSI IN MATLAB®

Figura 12.8: Uso delle functions corrispondenti agli algoritmi di Lagrange e delle differenze divise di Newton
nell’esempio malcondizionato. Osserviamo che la Figura 5.6 relativa allo stesso problema è stata ottenuta
eseguendo le stesse functions (per semplicità abbiamo omesso i risultati ottenuti dalla interpmonom) in
ambiente Octave.

12.9.3 Confronto tra schemi per equazioni differenziali ordinarie


Quando abbiamo introdotto alcuni metodi per la risoluzione di equazioni differenziali ordinarie, in
particolare i metodi di Eulero esplicito, di Eulero implicito e di Crank-Nicolson.
Li abbiamo anche confrontati per capire meglio il concetto di stabilità, considerando l’equazione test
y 0 = −y con y(0) = 1 (si veda a proposito la Figura 11.3).
Scriviamo ora un programma MATLAB® che, per questa equazione test,
G ci permetta di poter confrontare i tre metodi tra loro e con la soluzione esatta
G crei dei grafici simili a quelli di Figura 11.3
G salvi i valori numerici dei diversi metodi e della soluzione esatta in un file.
clear
% h = passo di d i s c r e t i z z a z i o n e temporale
% Tfin = tempo f i n a l e di osservazione
% n = numero di v o l t e in cui verra ’ applicato ciascuno dei metodi
% proposti
% f i d = v a r i a b i l e a s s o c i a t a al f i l e di r i s u l t a t i
% t = v e t t o r e dei tempi
% ye = v e t t o r e dei v a l o r i a s s o c i a t i al metodo di Eulero e s p l i c i t o
% ( di lunghezza n+1 perche ’ la prima componente corrisponde
% al valore d e l l a soluzione al tempo zero )
% y i = v e t t o r e dei v a l o r i a s s o c i a t i al metodo di Eulero i m p l i c i t o
% ycn = v e t t o r e dei v a l o r i a s s o c i a t i al metodo di Crank−Nicolson
% yex = v e t t o r e dei v a l o r i a s s o c i a t i a l l a soluzione e s a t t a
h=input ( ’passo h ’ ) ;
Tfin=input ( ’tempo finale di osservazione ’ ) ;
n=Tfin /h ;
f i d =fopen ( ’ode_a_confronto.txt’ , ’w’ ) ;
t (1)=0;
y(1)=1;
ye (1)= y ( 1 ) ;
y i (1 )= y ( 1 ) ;
ycn (1)= y ( 1 ) ;
yex (1 )= y ( 1 ) ;
for i =1:n
ye ( i +1)= ye ( i ) − h * ye ( i ) ;
y i ( i +1)= y i ( i ) / ( 1 +h) ;

202
12.9. Applicazioni di MATLAB® nel Calcolo Numerico

ycn ( i +1)= (2−h) / ( 2 +h ) * ycn ( i ) ;


t ( i +1)= t ( i )+h ;
yex ( i +1)=exp(− t ( i + 1 ) ) ;
end
plot ( t , yex , ’k’ , ’linewidth’ ,2 )
hold on %comando per s o v r a s c r i v e r e i g r a f i c i l ’ uno s u l l ’ a l t r o
plot ( t , ye , ’b’ , ’linewidth’ , 2 )
plot ( t , yi , ’r’ , ’linewidth’ , 2 )
plot ( t , ycn , ’g’ , ’linewidth’ , 2 )
legend ( ’soluzione esatta’ , ’Eulero esplicito’ , ’Eulero implicito’ , ’Crank-Nicolson’ , )
% la legenda , l o s p e s s o r e d e l l e l i n e e , o i l c o l o r e possono e s s e r e
% messi s i a direttamente dalla f i n e s t r a d e l l a f i g u r a
% s i a dal programma s t e s s o , come in questo caso ( s o l o in Octave s i
% deve operare direttamente dal programma per poter cambiare
% l e proprieta ’ d e l l a f i g u r a ) .
hold o f f
for i =1:n+1
f p r i n t f ( f i d , ’\n%5.2f %12.6e %12.6e %12.6e %12.6e’ , t ( i ) , yex ( i ) , . . .
ye ( i ) , y i ( i ) , ycn ( i ) ) ;
end
fclose ( fid ) ;

Questo programma è specifico per l’equazione test assegnata. La sua esecuzioneci permette ci comprendere
meglio il concetto di stabilità dei metodi studiati per la soluzione di equazioni differenziali ordinarie.

203
Bibliografia

[1] A SCHER , U. M. e G REIF, C. (2011), A First Course on Numerical Methods, SIAM, Philadelphia.

[2] B JÖRK , A. e D AHLQUIST, G. (2008), Numerical Methods in Scientific Computing, Volume II, Siam.

[3] B URDEN , R. L. e FAIRES , J. D. (2004), Numerical Analysis, Brooks-Cole Publishing.

[4] D AHLQUIST, G. e B JÖRK , A. (2006), Numerical Methods in Scientific Computing, Volume I, Siam.

[5] G AMBOLATI , G. (1994), Lezioni di Metodi Numerici, Cortina, Padova.

[6] G AUTSCHI , W. (1997), Numerical Analysis: An Introduction, Birkäuser, Boston.

[7] G IANGRANDI , P. (2010), Dispense del corso di Storia dell’Informatica, Università degli Studi di Udine,
Italia.

[8] G IANGRANDI , P. (ultima visita: febbraio 2012), Museo on line - Breve storia degli Strumenti di Calcolo,
Tecnoteca, http://www.tecnoteca.it/museo/.

[9] K EISLER , H. J. (2009), Elementary Calculus, An Infinitesimal Approach, Creative Commons Attribution
Non-Commercial-ShareAlike License, http://www.math.wisc.edu/~Keisler/calc.html.

[10] L ANGLEY, R. B. (1991), «The Mathematics of GPS», GPS World, vol. 2 (8), p. 55–59.

[11] M OORE , H. (2008), MATLAB® per l’ingegneria, Pearson Prentice Hall, Italy.

[12] O’C ONNOR , J. e R OBERTSON , E. F. (ultima visita: febbraio 2012), The MacTutor History of Mathematics
archive, University of St Andrews Scotland, http://www-gap-dcs.st-and.ac.uk/~history/.

[13] S ARTORETTO, F. e P UTTI , M. (2008), Introduzione alla Programmazione per Elaborazioni Numeriche.,
Edizioni Libreria Progetto, Padova.

[14] S TRANG , G. (1991), Calculus, Wellesley-Cambridge Press.

[15] S WADE , D. (ultima visita: febbraio 2012), The Babbage Engine, Computer History Museum, Mountain
View, CA, http://www.computerhistory.org/babbage.

205