18.01.2015 Views

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Annamaria Mazzia<br />

<strong>Appunti</strong> <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong><br />

Dipartimento <strong>di</strong> Ingegneria Civile E<strong>di</strong>le e Ambientale<br />

Università <strong>degli</strong> Stu<strong>di</strong> <strong>di</strong> Padova<br />

Creative Commons Attribuzione- Non commerciale -Non opere derivate 3.0 Italia License<br />

a.a. 2012/2013


Annamaria Mazzia: <strong>Appunti</strong> <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong>,<br />

Dipartimento <strong>di</strong> Ingegneria Civile E<strong>di</strong>le e Ambientale<br />

Università <strong>degli</strong> Stu<strong>di</strong> <strong>di</strong> Padova<br />

VERSIONE A.A. 2012/2013 .<br />

SITO DELLE DISPENSE:<br />

http://<strong>di</strong>spense.dmsa.unipd.it/<br />

E-MAIL:<br />

mazzia@dmsa.unipd.it<br />

Questo lavoro è stato rilasciato sotto la licenza CREATIVE COMMONS ATTRIBUZIONE- NON COMMERCIALE -<br />

NON OPERE DERIVATE 3.0 ITALIA LICENSE,<br />

Per leggere una copia della licenza visita il sito web (http://creativecommons.org/licenses/<br />

by-nc-nd/3.0/it/)<br />

Foto <strong>di</strong> copertina: Pietre...<br />

Per ricordare l’etimologia della parola CALCOLO: dal latino Calculus – pietruzza, lapillo – a sua volta <strong>di</strong>minuitivo<br />

<strong>di</strong> Calx, nel senso originario <strong>di</strong> ghiaia, sasso, perchè gli antichi, per fare i loro conti, utilizzavano<br />

pietruzze al posto <strong>di</strong> cifre aritmetiche. (definizione tratta dal Vocabolario Etimologico della Lingua Italiana <strong>di</strong><br />

O. Pianigiani http://www.etimo.it)


In<strong>di</strong>ce<br />

In<strong>di</strong>ce<br />

iii<br />

1 Struttura dell’elaboratore 1<br />

1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 La preistoria del computer: Babbage e Lovelace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.3 Gli albori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

1.4 Architettura del Computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

1.5 Software e Sistema Operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

1.5.1 Per capire meglio il sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

1.6 Il file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

1.7 Un po’ <strong>di</strong> storia sui sistemi operativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

1.8 Lavorare in ambiente Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

1.9 E<strong>di</strong>tor <strong>di</strong> testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

2 Richiami <strong>di</strong> analisi 13<br />

2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.2 Identità trigonometriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.3 Regole su funzione esponenziale e logaritmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

2.4 Derivate e integrali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

2.5 Teoremi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

3 Rappresentazione dei numeri nel calcolatore 19<br />

3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

3.2 Aritmetica <strong>di</strong> macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

3.3 Conversione <strong>di</strong> base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />

3.4 Rappresentazione IEEE dei numeri <strong>di</strong> macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

3.5 Precisione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

3.6 Propagazione <strong>degli</strong> errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

3.7 Instabilità e malcon<strong>di</strong>zionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

3.7.1 Instabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

3.7.2 Malcon<strong>di</strong>zionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />

4 Zeri <strong>di</strong> funzione 37<br />

4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

4.2 Metodo delle Bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.3 Metodo del Punto Fisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

4.4 Il Metodo <strong>di</strong> Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

4.5 Convergenza <strong>di</strong> un metodo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

iii


INDICE<br />

4.6 Complessità computazionale <strong>di</strong> uno schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />

4.7 Il metodo delle secanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />

4.8 Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula Falsi . . . . . . . . . . . . . . . . . . . . . 50<br />

4.9 Metodo <strong>di</strong> Newton-Raphson per ra<strong>di</strong>ci multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.10 Controllo sugli scarti e grafici <strong>di</strong> convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.11 Osservazioni sull’or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong> un metodo iterativo . . . . . . . . . . . . . . . . . . . 54<br />

4.12 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />

5 Interpolazione 61<br />

5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />

5.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />

5.3 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

5.3.1 Funzioni base monomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

5.3.2 Polinomi <strong>di</strong> Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

5.3.3 Formula dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

5.3.4 Differenze <strong>di</strong>vise e formula <strong>di</strong> Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />

5.4 Considerazioni sull’interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />

5.4.1 Fenomeno <strong>di</strong> Runge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />

5.4.2 Malcon<strong>di</strong>zionamento nell’interpolazione con funzioni base monomiali . . . . . . . . . 73<br />

5.5 Interpolazione polinomiale a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />

5.5.1 Interpolazione lineare a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />

5.5.2 Interpolazione spline cubica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

5.5.3 Curve parametriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />

5.6 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />

6 Approssimazione 85<br />

6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />

6.2 Retta <strong>di</strong> regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86<br />

6.3 Approssimazione polinomiale ai minimi quadrati . . . . . . . . . . . . . . . . . . . . . . . . . . . 88<br />

6.4 Approssimazioni <strong>di</strong> tipo esponenziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89<br />

6.5 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90<br />

7 Meto<strong>di</strong> <strong>di</strong>retti per la soluzione <strong>di</strong> sistemi lineari 93<br />

7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

7.2 Elementi <strong>di</strong> Algebra Lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

7.3 Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />

7.3.1 Sostituzione all’in<strong>di</strong>etro e in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />

7.3.2 Eliminazione <strong>di</strong> Gauss: esempio particolare . . . . . . . . . . . . . . . . . . . . . . . . . . 99<br />

7.3.3 Eliminazione <strong>di</strong> Gauss: caso generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101<br />

7.4 Strategie <strong>di</strong> pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102<br />

7.5 Fattorizzazione triangolare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104<br />

7.5.1 Fattorizzazione LDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104<br />

7.5.2 Fattorizzazione <strong>di</strong> Gauss senza pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106<br />

7.5.3 Fattorizzazione <strong>di</strong> Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108<br />

7.6 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />

8 Meto<strong>di</strong> Iterativi per la soluzione <strong>di</strong> sistemi lineari 113<br />

8.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113<br />

8.2 Meto<strong>di</strong> iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />

8.3 Norme <strong>di</strong> vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />

8.4 Norme <strong>di</strong> matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115<br />

8.5 Autovalori e autovettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116<br />

8.6 Meto<strong>di</strong> classici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118<br />

iv


In<strong>di</strong>ce<br />

8.6.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118<br />

8.6.2 Controllo della convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119<br />

8.6.3 I meto<strong>di</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121<br />

8.6.4 Convergenza dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamento . . . . . . . . . . . . . . . 125<br />

8.7 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128<br />

9 Problemi non lineari in più variabili 131<br />

9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131<br />

9.2 Metodo <strong>di</strong> Newton per sistemi <strong>di</strong> equazioni in più variabili . . . . . . . . . . . . . . . . . . . . . . 132<br />

9.3 Minimi quadrati non lineari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135<br />

10 Integrazione numerica 141<br />

10.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141<br />

10.2 Formula dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142<br />

10.3 Formule <strong>di</strong> Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143<br />

10.3.1 Formula <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145<br />

10.3.2 Sull’errore della formula <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . 147<br />

10.4 Formule composte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148<br />

10.4.1 Formula composta dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148<br />

10.4.2 Confronti tra la formula dei trapezi e <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . 152<br />

10.5 Estrapolazione <strong>di</strong> Richardson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />

10.6 Approssimazione <strong>di</strong> Romberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />

10.7 Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . 156<br />

10.7.1 Proprietà delle formule <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159<br />

10.7.2 Formule <strong>di</strong> Gauss-Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159<br />

10.7.3 Altre formule <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160<br />

10.7.4 Applicazione delle formule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161<br />

10.7.5 Sulla funzione peso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161<br />

10.8 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162<br />

11 Differenziazione numerica ed equazioni alle derivate or<strong>di</strong>narie 165<br />

11.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165<br />

11.2 Differenziazione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166<br />

11.3 Sulle equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168<br />

11.4 Metodo <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170<br />

11.5 Metodo <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172<br />

11.6 Metodo <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175<br />

11.7 Stu<strong>di</strong>o dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176<br />

11.8 Errori <strong>di</strong> troncamento locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177<br />

11.9 Convergenza e stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177<br />

11.9.1 Convergenza <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178<br />

11.9.2 Stabilità <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178<br />

11.9.3 Convergenza <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179<br />

11.9.4 Stabilità <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179<br />

11.9.5 Convergenza <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179<br />

11.9.6 Stabilità <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180<br />

11.9.7 Sulla stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180<br />

11.10 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181<br />

12 Primi passi in MATLAB® 183<br />

12.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183<br />

12.2 Avvio <strong>di</strong> MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184<br />

12.2.1 Matrici e vettori in MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185<br />

v


INDICE<br />

12.3 Coman<strong>di</strong> utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187<br />

12.4 MATLAB® per scrivere ed eseguire programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188<br />

12.4.1 Strutture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188<br />

12.5 Dati <strong>di</strong> input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190<br />

12.5.1 Programma sul metodo delle bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191<br />

12.6 Dati <strong>di</strong> output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192<br />

12.7 Grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193<br />

12.8 Sulle potenzialità <strong>di</strong> MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194<br />

12.9 Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194<br />

12.9.1 Sull’instabilità numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194<br />

12.9.2 Sull’interpolazione e approssimazione <strong>di</strong> dati . . . . . . . . . . . . . . . . . . . . . . . . . 195<br />

12.9.3 Confronto tra schemi per equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie . . . . . . . . . . . . . . . . . 202<br />

Bibliografia 205<br />

vi


CAPITOLO 1<br />

Struttura dell’elaboratore<br />

I computer sono incre<strong>di</strong>bilmente<br />

veloci, accurati e stupi<strong>di</strong>. Gli uomini<br />

sono incre<strong>di</strong>bilmente lenti,<br />

inaccurati e intelligenti. L’insieme<br />

dei due costituisce una forza<br />

incalcolabile.<br />

Albert Einstein<br />

1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 La preistoria del computer: Babbage e Lovelace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.3 Gli albori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

1.4 Architettura del Computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

1.5 Software e Sistema Operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

1.5.1 Per capire meglio il sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

1.6 Il file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

1.7 Un po’ <strong>di</strong> storia sui sistemi operativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

1.8 Lavorare in ambiente Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

1.9 E<strong>di</strong>tor <strong>di</strong> testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

1.1 Introduzione<br />

Se dobbiamo comprare un computer, abbiamo solo l’imbarazzo della scelta tra i tanti <strong>di</strong>sponibili sul<br />

mercato. Ma in base a quali criteri scegliamo un computer<br />

Le caratteristiche fondamentali <strong>di</strong> un computer si possono riassumere in poche parole-chiave: processore,<br />

sistema operativo, memoria. Cosa significano esattamente E, prima ancora, cosa significa<br />

Computer<br />

Definizione 1.1.1<br />

Computer = elaboratore elettronico <strong>di</strong>gitale<br />

Dispositivo elettronico che elabora le informazioni, immesse sotto forma <strong>di</strong> dati<br />

numerici, secondo una sequenza <strong>di</strong> istruzioni preor<strong>di</strong>nate (programma).<br />

G Elaboratore: macchina capace <strong>di</strong> immagazzinare ed elaborare dati in base<br />

ad una serie <strong>di</strong> istruzioni (programmi) memorizzate sul computer<br />

G elettronico: utilizza componenti elettroniche per elaborare le informazioni<br />

G <strong>di</strong>gitale: elabora e memorizza segnali <strong>di</strong>gitali basati su cifre binarie: 0 e 1<br />

1


1. STRUTTURA DELL’ELABORATORE<br />

Figura 1.1: Stralci <strong>di</strong> volantini pubblicitari per l’acquisto <strong>di</strong> un computer.<br />

Hardware<br />

Software<br />

In generale, un computer esegue operazioni logiche e aritmetiche e ha una memoria per conservare i dati.<br />

Un programma contiene le informazioni relative alle operazioni da eseguire.<br />

Si definisce hardware la struttura fisica del computer cioè i i suoi componenti elettronici e i <strong>di</strong>spositivi<br />

fisici che lo compongono.<br />

Si chiama, invece, software l’insieme delle istruzioni (i programmi) che consentono all’hardware <strong>di</strong><br />

svolgere i propri compiti (per esempio, il sistema operativo – Windows, Linux, etc – è un tipo <strong>di</strong> software;<br />

programmi applicativi come Word, Excel, LaTex sono dei software).<br />

Attraverso un computer, elaboriamo dati (numeri, suoni, video, fotografie) in modo da ottenere informazioni<br />

(lettere, tabelle, risultati <strong>di</strong> proce<strong>di</strong>menti numerici. . . ). Alcune <strong>di</strong> queste informazioni possono<br />

<strong>di</strong>ventare dati da elaborare <strong>di</strong> nuovo al computer.<br />

1.2 La preistoria del computer: Babbage e Lovelace<br />

Charles<br />

Babbage<br />

La seconda metà del <strong>di</strong>ciannovesimo secolo fu un tempo <strong>di</strong> grande fermento in numerosi campi, dall’ingegneria<br />

ai trasporti, dalla comunicazione all’architettura... Furono scoperti nuovi materiali, la forza animale<br />

fu sostituita dalla forza motrice, le navi a vapore iniziarono a competere con quelle a vela, la rete ferroviaria<br />

si espanse sempre più, il telegrafo elettrico rivoluzionò le comunicazioni... In questo contesto, ingegneri, architetti,<br />

matematici, astronomi, marinai, banchieri, agenti assicurativi... – chiunque avesse a che fare con il<br />

calcolo – si basava su tavole <strong>di</strong> calcolo per eseguire i calcoli meno banali. Tuttavia, si sa, gli uomini possono<br />

sbagliare e il timore che su quelle tavole ci fossero <strong>degli</strong> errori era giustificato: un errore non trovato poteva<br />

<strong>di</strong>ventare un <strong>di</strong>sastro nelle numerose applicazioni in cui le tavole <strong>di</strong> calcolo venivano usate!<br />

Già nel 1812 Charles Babbage 1 era consapevole dell’inaccuratezza dei calcoli fatti dall’uomo. Nel suo<br />

lavoro, Babbage doveva verificare l’esattezza <strong>di</strong> tavole <strong>di</strong> calcolo che sarebbero state usate da banchieri come<br />

da marinai. Le navi avrebbero identificato la loro posizione in mare me<strong>di</strong>ante quelle tavole! Eliminare il<br />

rischio dell’errore umano <strong>di</strong>venne per lui un desiderio sempre più grande. Egli stesso scrisse che, mentre<br />

era seduto nella stanza della Società Analitica, a Cambridge, lavorando, mezzo addormentato, su una tavola<br />

dei logaritmi, arrivò un altro membro della società che gli chiese cosa stesse sognando. E lui rispose : – Sto<br />

pensando che tutte queste tavole – riferendosi alle tavole dei logaritmi – potrebbero essere calcolate da una<br />

macchina!<br />

Nel 1821, Babbage e il suo amico e astronomo John Herschel stanno controllando delle tabelle calcolate<br />

a mano. Errore dopo errore, Babbage esclama : – Volesse Dio che questi calcoli venissero eseguiti da una<br />

macchina a vapore!<br />

1 Charles Babbage (1791-1871), inventore e matematico inglese, è senza dubbio il primo ad avere avuto il concetto del moderno<br />

calcolatore.<br />

2


1.3. Gli albori<br />

Il suo desiderio <strong>di</strong> creare una macchina per eseguire calcoli si concretizzò in due progetti, quello della<br />

Macchina alle Differenze e quello della Macchina Analitica 2 . La Macchina alle Differenze doveva calcolare<br />

in modo automatico funzioni polinomiali ma non venne mai completata per il suo costo eccessivamente<br />

elevato. La Macchina Analitica, invece, doveva essere una macchina <strong>di</strong> calcolo programmabile, e si può considerare<br />

come la prima idea del moderno computer. Anche questo progetto, tuttavia, rimase incompiuto.<br />

Solo nel 2002 è stato possibile costruire una macchina che rispondesse al progetto <strong>di</strong> Babbage.<br />

Nel 1833, Babbage incontrò Ada Lovelace 3 , figlia del famoso poeta Lord Byron. Lovelace, appena <strong>di</strong>ciassettenne,<br />

aveva parecchie conoscenze matematiche, inusuali per l’epoca, e si entusiasmò talmente tanto per<br />

il progetto <strong>di</strong> Babbage, da intuire altre potenzialità della macchina stessa, come la capacità dei numeri <strong>di</strong><br />

poter rappresentare altre entità quali le lettere dell’alfabeto o le note musicali, e che dalla manipolazione dei<br />

numeri la macchina avrebbe esteso la propria potenza oltre il mondo della matematica. Sempre la Lovelace<br />

intuì che la soluzione dei problemi matematici si sarebbe effettuata attraverso delle procedure <strong>di</strong> calcolo<br />

(quelli che noi chiamiamo programmi).<br />

Alla luce <strong>degli</strong> sviluppi che si sono avuti nel ventesimo secolo, la visione <strong>di</strong> Babbage e della Lovelace<br />

appare profetica.<br />

Ada Lovelace<br />

1.3 Gli albori<br />

Il 1800 si chiude con una grande invenzione: nel 1896, Guglielmo Marconi inventa la ra<strong>di</strong>o. Il 1900 si apre<br />

con altre importanti invenzioni: il triodo, il registratore magnetico, la televisione, fino ad arrivare intorno alla<br />

metà del 1900 con il transistor (nel 1947) e il circuito integrato (nel 1958). La nuova tecnologia elettromeccanica<br />

ed elettronica si rivelò decisiva per lo sviluppo dei computer, grazie allo stu<strong>di</strong>o sistematico della teoria dei<br />

circuiti elettrici. Il più noto tra gli stu<strong>di</strong>osi <strong>di</strong> questa teoria fu l’americano Claude Shannon 4 . Il suo contributo<br />

fondamentale fu quello <strong>di</strong> elaborare un metodo sistematico per progettare reti logiche capaci <strong>di</strong> eseguire le<br />

operazioni logico-aritmetiche desiderate: detto più semplicemente, egli mostrò come trasformare una assegnata<br />

operazione matematica in un circuito elettrico costruito con interruttori e relè <strong>di</strong> commutazione (quelli<br />

usati nelle telecomunicazioni). Nel 1948, il suo articolo A Mathematical Theory of Communication pubblicato<br />

sulla rivista The Bell System Technical Journal getta le basi teoriche dell’informatica. Per prima volta<br />

viene usato il termine bit come abbreviazione <strong>di</strong> binary <strong>di</strong>git, termine suggeritogli dal chimico e statistico J.<br />

W. Tukey.<br />

Il lavoro <strong>di</strong> Shannon <strong>di</strong>ede l’avvio allo stu<strong>di</strong>o delle tecniche in<strong>di</strong>spensabili per progettare in modo<br />

sistematico tutti i circuiti logici <strong>di</strong> base necessari per realizzare i circuiti <strong>di</strong> calcolo dei futuri computer.<br />

Da un punto <strong>di</strong> vista propriamente ”pratico“ invece, la nascita e lo sviluppo dei calcolatori elettronici<br />

inizia nel 1938: il tedesco Konrad Zuse 5 costruisce Z1, una macchina costruita e pensata in maniera completamente<br />

meccanica, tutta da migliorare, ma che può essere considerata come il primo calcolatore. Zuse<br />

passa subito al progetto Z2, dove l’aritmetica meccanica è sostituita da relè elettromeccanici. L’inizio della<br />

seconda guerra mon<strong>di</strong>ale interrompe bruscamente il lavoro <strong>di</strong> Zuse, che viene chiamato alle armi, ma riesce<br />

a persuadere l’Istituto <strong>di</strong> Ricerca Aero<strong>di</strong>namica del Terzo Reich a continuare i suoi stu<strong>di</strong>. Completa quin<strong>di</strong> la<br />

costruzione dello Z2 e inizia a lavorare sullo Z3, che è il primo computer che Zuse costruisce per essere usato<br />

e non per verificare le proprie idee. Lo Z3 ha non solo l’unità aritmetica ma anche la memoria realizzata con<br />

relè elettromeccanici, ben 2600. Z3 fu la prima macchina <strong>di</strong> calcolo programmabile e venne usata dall’industria<br />

aerea per risolvere sistemi <strong>di</strong> equazioni e altri sistemi matematici ricavati da problemi <strong>di</strong> vibrazione<br />

<strong>degli</strong> apparecchi aerei messi sotto stress.<br />

2 Osserviamo che l’invenzione del telaio meccanico a schede, in cui il tipo <strong>di</strong> tessuto veniva scelto (o programmato) in base a delle<br />

schede inserite nella macchina, è un precursore del progetto <strong>di</strong> Babbage.<br />

3 Augusta Ada Lovelace (1815-1852) fu la figlia del famoso poeta Lord Byron. I genitori si separono subito dopo la sua nascita e<br />

la bambina crebbe insieme alla madre (Lord Byron partì dall’Inghilterra senza farvi più ritorno e morì in Grecia quando Ada aveva otto<br />

anni). Poichè la madre era appassionata <strong>di</strong> matematica e non voleva che la figlia seguisse la strada del padre, incoraggiò la figlia in questa<br />

<strong>di</strong>rezione, impartendole un’istruzione legata alla matematica e alla musica. Nel 1835 sposò William King, <strong>di</strong> <strong>di</strong>eci anni più anziano. Nel<br />

1838 il marito ricevette il titolo nobiliare <strong>di</strong> Conte <strong>di</strong> Lovelace. Ebbero tre figli. La Lovelace morì <strong>di</strong> cancro a soli 37 anni.<br />

4 Claude Shannon (1916-2002) fu fisico e matematico del MIT.<br />

5 Konrad Zuse, ingegnere civile (1910-1995).<br />

3


1. STRUTTURA DELL’ELABORATORE<br />

von<br />

Neumann<br />

Quando Zuse propose <strong>di</strong> passare all’uso <strong>di</strong> un computer basato su valvole elettroniche, la proposta fu<br />

respinta perchè i tedeschi si consideravano così vicini alla vittoria della guerra che ulteriori sforzi nella ricerca<br />

non apparivano necessari.<br />

Il lavoro <strong>di</strong> Zuse, comunque, andò avanti con la costruzione dello Z4, <strong>di</strong> S1 e S2. E, soprattutto, fu<br />

completamente in<strong>di</strong>pendente dai lavori <strong>di</strong> John Eckert e John Mauchly negli Stati Uniti e <strong>di</strong> A. Turing in<br />

Inghilterra.<br />

In Inghilterrra, Turing 6 si occupò <strong>di</strong> problematiche riguardanti un macchina <strong>di</strong> calcolo <strong>di</strong>gitale astratta,<br />

con una memoria senza limiti, mentre negli USA Eckert e Mauchly 7 costruirono l’ENIAC (Electronic Integrator<br />

and Computer). L’ENIAC fu costruito, con progetto <strong>di</strong> Eckert, in piena seconda guerra mon<strong>di</strong>ale, a<br />

partire dal 1943, presso il Ballistic Research Laboratory e fu completato nel febbraio del 1946. La macchina<br />

era pensata per compiere operazioni <strong>di</strong> carattere generale, ma fu costruita con lo scopo preciso <strong>di</strong> compilare<br />

tabelle per le traiettorie <strong>di</strong> bombe. L’ENIAC conteneva circa 18 . 000 valvole termoioniche e misurava circa 2<br />

metri e mezzo <strong>di</strong> altezza per 24 metri <strong>di</strong> lunghezza! La macchina era più <strong>di</strong> mille volte veloce <strong>di</strong> tutti i predecessori<br />

elettromeccanici costruiti fino a quel momento e poteva eseguire 5000 ad<strong>di</strong>zioni al secondo. Le sue<br />

operazioni erano controllate da un programma che veniva inserito dall’esterno me<strong>di</strong>ante nastri perforati.<br />

Intanto, nel 1944 aveva iniziato a collaborare nella costruzione dell’ENIAC, John von Neumann 8 . Egli si<br />

accorse che l’architettura della macchina andava rivista e che la programmazione del computer me<strong>di</strong>ante un<br />

numero enorme <strong>di</strong> cavi e interruttori rendeva lenta e poco flessibile la programmazione stessa. Sostenne,<br />

quin<strong>di</strong>, che il programma non dovesse essere rigidamente pre<strong>di</strong>sposto nell’hardware tramite interruttori e<br />

cavi e neanche letto me<strong>di</strong>ante nastri perforati, ma risiedesse in una memoria su cui poter scrivere e accedere<br />

velocemente insieme ai dati da elaborare. Von Neumann per primo descrisse l’architettura dei calcolatori in<br />

termini logico-funzionale, secondo uno schema astratto non legato ai <strong>di</strong>spositivi fisici utilizzati per le varie<br />

operazioni. E il suo schema, sostanzialmente invariato, è l’architettura adottata dai calcolatori dei nostri<br />

giorni!<br />

Prima <strong>di</strong> von Neumann, il calcolatore veniva controllato me<strong>di</strong>ante programmi non mo<strong>di</strong>ficabili, registrati<br />

su nastro perforato o cablati in una configurazione <strong>di</strong> cavetti e interruttori. Con von Neumann si presenta<br />

un’architettura <strong>di</strong> riferimento precisa.<br />

Il primo calcolatore costruito seguendo l’architettura <strong>di</strong> von Neumann entrò in funzione nel 1948<br />

all’Università <strong>di</strong> Manchester e venne chiamato Manchester Mark I.<br />

Inizia, in tal modo, una nuova fase per i calcolatori: i programmi che controllano le operazioni da svolgere<br />

risiedono nella memoria del calcolatore insieme ai dati e possono essere mo<strong>di</strong>ficati <strong>di</strong>namicamente nel corso<br />

dell’elaborazione.<br />

Dal 1948 fino ai nostri giorni, lo sviluppo dei calcolatori elettronici ha avuto ritmi esponenziali: l’invenzione<br />

del circuito integrato (chip) alla fine <strong>degli</strong> anni cinquanta permise non solo <strong>di</strong> ridurre via via lo spazio<br />

fisico occupato dai computer ma anche <strong>di</strong> ottenere computer sempre più potenti tanto che, in due suoi lavori,<br />

del 1965 e del 1975, Gordon Moore 9 stabilì che il numero dei transistor inseribili su un chip raddoppia<br />

approssimativamente ogni 24 mesi (legge <strong>di</strong> Moore). Nel 1971 tre ingegneri della Intel tra cui l’italiano Federico<br />

Faggin 10 inventarono il microprocessore, vale a <strong>di</strong>re un’intera CPU in un singolo circuito integrato:<br />

su una piastrina <strong>di</strong> 4 × 3 millimetri riuscirono a inserire 2250 transistor, che formavano il cuore <strong>di</strong> un intero<br />

computer: questo microprocessore fu chiamato Intel 4004 ed era capace <strong>di</strong> eseguire 60 . 000 operazioni al<br />

secondo.<br />

6 Alan Turing (1912-1954), matematico inglese, si interessò <strong>di</strong> logica matematica e <strong>di</strong> teoria della probabilità. Introdusse il concetto<br />

<strong>di</strong> una macchina astratta, detta macchina <strong>di</strong> Turing e pose questioni riguardanti l’intelligenza artificiale<br />

7 John Presper Eckert (1919-1995) e John William Mauchly (1907-1980) lavorarono a quello che si può considerare il vero primo<br />

calcolatore elettronico.<br />

8 John von Neumann (1903-1957) ungherese, stu<strong>di</strong>ò prima a Berlino, poi a Zurigo e infine a Budapest, dove ricevette il dottorato in<br />

matematica. Nel 1930 si trasferì alla Università <strong>di</strong> Princeton dove insegnò matematica. Il suo nome è legato a stu<strong>di</strong> in <strong>di</strong>versi settori:<br />

teoria dei giochi, matematica applicata, logica... Occupa un ruolo fondamentale nello sviluppo dei calcolatori elettronici. Ricevette<br />

numerosi premi e riconoscimenti in tutto il mondo.<br />

9 Gordon Moore è nato nel 1929 in California. Di lui basti ricordare che ha stabilito la legge <strong>di</strong> Moore, è co-fondatore della Intel<br />

Corporation e nel 2008 ha ricevuto la medaglia d’onore dell’IEEE per il suo pioneristico contributo nei processi dei circuiti integrati,<br />

e per la leadership nello sviluppo della memoria del MOS (semiconduttore metal-ossido), del microprocessore e dell’industria dei<br />

semiconduttori.<br />

10 Federico Faggin è nato nel 1940 a Vicenza e si è laureato in fisica all’Università <strong>di</strong> Padova. Nel 1968 si è trasferito prima a Palo Alto<br />

presso la Fairchild Semiconductor e poi nel 1970 nella Intel. Oggi è presidente e CEO (Chief Executive Officer) della Foveon.<br />

4


1.4. Architettura del Computer<br />

Se pensiamo che il processore Intel Pentium 4 introdotto nel 2000 ha 42 . 000 . 000 processori e l’Intel Itanium<br />

2 (con 9MB <strong>di</strong> cache) introdotto nel 2004 ha 592 . 000 . 000 transistors, ci accorgiamo <strong>di</strong> come la legge <strong>di</strong><br />

Moore, dal 1968 ad oggi, sia stata rispettata.<br />

1.4 Architettura del Computer<br />

L’architettura del Computer si può riassumere in tre unità:<br />

G il processore, che fornisce la capacità <strong>di</strong> elaborazione delle informazioni;<br />

G la memoria (centrale e <strong>di</strong> massa)<br />

G i <strong>di</strong>spositivi <strong>di</strong> input/output, che comunicano attraverso un canale detto BUS, costituito da un insieme<br />

<strong>di</strong> linee elettriche <strong>di</strong>gitali.<br />

Il processore è composto da blocchi con funzionalità <strong>di</strong>verse:<br />

G CPU (Central Processing Unit), unità centrale <strong>di</strong> elaborazione<br />

G cache<br />

G varie interfacce<br />

Se il processore è integrato su un unico chip prende il nome <strong>di</strong> microprocessore. Sia la CPU sia gran parte<br />

dei <strong>di</strong>spositivi che servono per l’attività della CPU sono realizzati con la tecnologia dei circuiti integrati, che<br />

possono essere <strong>di</strong>sposti in una singola scheda detta scheda madre. Questa scheda può essere dunque considerata<br />

la parte più importante del computer. La CPU esegue tutte le operazioni <strong>di</strong> elaborazione numerica e<br />

<strong>di</strong> controllo e rappresenta la parte centrale del computer.<br />

A sua volta si sud<strong>di</strong>vide in<br />

G unità logico-aritmetica (ALU), che svolge tutti i calcoli logici ed aritmetici;<br />

G unità floating-point (FPU) (Floating Point Unit), che consente <strong>di</strong> eseguire le operazioni su numeri reali;<br />

G unità <strong>di</strong> controllo (CU), che sovrintende all’elaborazione dei dati e alle operazioni <strong>di</strong> input e output;<br />

G registri, cioè memoria locale per memorizzare dati e lo stato <strong>di</strong> avanzamento delle istruzioni. Abbiamo,<br />

ad esempio, il registro <strong>di</strong> Program Counter, <strong>di</strong> Program Status Word, il registro Istruzioni, In<strong>di</strong>rizzi<br />

Memoria. . .<br />

Ogni elaboratore contiene un circuito <strong>di</strong> temporizzazione (clock) che genera un riferimento temporale<br />

comune per tutti gli elementi del sistema.<br />

Un ciclo-macchina è il tempo richiesto per svolgere un’operazione elementare (ed è un multiplo del periodo<br />

del clock). La velocità <strong>di</strong> elaborazione <strong>di</strong> un processore <strong>di</strong>pende dalla frequenza del clock. I processori<br />

attuali hanno valori <strong>di</strong> frequenza del clock che variano tra gli 8 MHz e i 3500 MHz (1 MHz = 1 milione <strong>di</strong><br />

istruzioni al secondo).<br />

La memoria serve per conservare le istruzioni da eseguire e per scrivere/leggere i dati elaborati. Si<br />

sud<strong>di</strong>vide in memoria principale e memoria secondaria.<br />

La memoria principale (o <strong>di</strong> lavoro) è la memoria in grado <strong>di</strong> conservare <strong>di</strong>namicamente dati e<br />

programmi che il processore sta utilizzando. A sua volta la memoria principale può essere <strong>di</strong> due tipi:<br />

5


1. STRUTTURA DELL’ELABORATORE<br />

RAM<br />

G memoria <strong>di</strong> sola lettura (read-only memory): ROM. Viene scritta una volta per tutte dal produttore del<br />

sistema e contiene programmi e informazioni specifiche per il sistema; è utilizzata per memorizzare<br />

parametri <strong>di</strong> configurazione del sistema, utili all’avvio del computer;<br />

G memoria per scrittura-lettura (random access memory): RAM. Serve alla CPU per lavorare con i<br />

programmi inseriti dall’utente.<br />

Poichè la RAM conserva i dati solo fino a quando il computer rimane acceso (infatti è detta memoria<br />

<strong>di</strong> tipo volatile, perchè se ne perde il contenuto quando la macchina viene spenta), per conservare dati e<br />

programmi per tempi lunghi e a sistema spento, si utilizza la memoria <strong>di</strong> massa (o secondaria) – <strong>di</strong>schi<br />

come l’Hard Disk, CDROM, DVD, pendrive USB. . . .<br />

La RAM può essere pensata come una sequenza <strong>di</strong> celle (locazioni), ognuna identificata da un in<strong>di</strong>rizzo e<br />

capace <strong>di</strong> contenere informazioni binarie.<br />

L’unità minima in<strong>di</strong>rizzabile della memoria è detta parola (word) e può variare da macchina a macchina.<br />

In genere una parola vale un byte, cioè 8 bit.<br />

Bit è l’unità elementare <strong>di</strong> informazione.<br />

Per esempio: 0/1, sì/no.<br />

1 byte = 8 bit<br />

1 Kilobyte (KB) = 2 10 byte = 1024 byte (circa 10 3 )<br />

1 Megabyte (MB) = 2 20 byte (circa 10 6 )<br />

1 Gigabyte (GB) ≈ 10 9 byte (un miliardo <strong>di</strong> byte)<br />

1 Terabyte (TB) ≈ 10 12 byte (mille miliar<strong>di</strong> <strong>di</strong> byte)<br />

1 Petabyte (PB) ≈ 10 15 byte (un milione <strong>di</strong> miliar<strong>di</strong> <strong>di</strong> byte)<br />

Il computer scambia informazioni con il “mondo esterno” per mezzo delle periferiche <strong>di</strong> input/output<br />

(monitor, mouse, stampante, web-cam,...).<br />

Input è l’inserimento <strong>di</strong> dati nel computer per l’elaborazione. Output è il trasferimento <strong>di</strong> dati dal<br />

computer a <strong>di</strong>spositivi che permettono all’utente <strong>di</strong> vedere/ascoltare i risultati dell’elaborazione.<br />

1.5 Software e Sistema Operativo<br />

Un software è una sequenza <strong>di</strong> istruzioni per eseguire le varie elaborazioni sui dati. Ci sono <strong>di</strong>verse<br />

categorie <strong>di</strong> software: software per il sistema operativo, software <strong>di</strong> base, software <strong>di</strong> tipo applicativo.<br />

6


1.5. Software e Sistema Operativo<br />

Il sistema operativo è costituito dall’insieme dei programmi essenziali per far funzionare la macchina.<br />

Esso utilizza piccoli programmi già presenti nel calcolatore per accedere ai singoli <strong>di</strong>spositivi fisici. Questi<br />

programmi prendono il nome <strong>di</strong> Device Driver e sono memorizzati nel BIOS (Basic Input Output System).<br />

Il BIOS si trova nella ROM del Computer.<br />

Il sistema operativo, da una parte, permette <strong>di</strong> rendere fruibile all’utente le molteplici risorse del computer<br />

(gestione della memoria, della stampante, della tastiera,...); dall’altra rende il computer uno strumento<br />

amichevole e utile per affrontare le molteplici attività che gli si richiedono.<br />

I compiti affidati al sistema operativo sono molteplici:<br />

G agire da interme<strong>di</strong>ario tra l’utente e l’harware del computer<br />

G controllare e coor<strong>di</strong>nare l’utilizzo dell’hardware tra i programmi applicativi<br />

G fornire gli strumenti per l’uso corretto delle risorse <strong>di</strong> tipo hardware e software del sistema<br />

G nascondere i dettagli legati alla gestione delle risorse del sistema.<br />

I primi sistemi operativi iniziarono a vedersi intorno alla metà <strong>degli</strong> anni cinquanta quando si cominciò<br />

a in<strong>di</strong>viduare una serie <strong>di</strong> programmi standard <strong>di</strong> comune utilizzo in<strong>di</strong>pendenti dall’applicazione specifica<br />

richiesta al computer.<br />

L’evoluzione dei sistemi operativi ha influenzato anche lo sviluppo dell’hardware in quanto per supportare<br />

certe funzioni del sistema operativo sono necessari meccanismi hardware ad hoc (basti pensare alla<br />

gestione della memoria o delle interruzioni).<br />

I primi computer come lo Z3 <strong>di</strong> Zuse o l’ENIAC non avevano sistema operativo. Per inserire un programma<br />

(scritto in linguaggio macchina) bisognava azionare un gruppo <strong>di</strong> interruttori o mo<strong>di</strong>ficare collegamenti<br />

tramite opportuni cavi e spinotti. Ci ren<strong>di</strong>amo conto, quin<strong>di</strong>, <strong>di</strong> quanto fosse <strong>di</strong>fficile usare il computer per<br />

risolvere problemi me<strong>di</strong>ante l’esecuzione <strong>di</strong> un programma perchè oltre alla competenza specifica del problema<br />

da risolvere, si richiedeva una grande conoscenza tecnica della macchina su cui si doveva lavorare. Il<br />

programma doveva contenere non solo le istruzioni per la risoluzione del problema (per esempio un sistema<br />

<strong>di</strong> equazioni) ma anche le istruzioni per gestire le unità <strong>di</strong> input e output e delle altre periferiche collegate al<br />

computer. Infine, poteva essere eseguito un solo programma alla volta.<br />

Considerando gli elevatissimi costi per la realizzazione e la gestione dei primi computer, il calcolo automatico<br />

era una risorsa preziosa a <strong>di</strong>sposizione <strong>di</strong> pochi utenti. Tutto ciò portò ad un ripensamento del modo<br />

<strong>di</strong> utilizzare i computer e nacquero le prime idee <strong>di</strong> sistema operativo.<br />

Per prima cosa si pensò <strong>di</strong> creare delle librerie con le istruzioni necessarie per eseguire le operazioni<br />

più comuni legate alla gestione delle periferiche del computer (ingresso e uscita dei dati, accesso alla<br />

memoria,...).<br />

Ulteriori progressi si ebbero quando il sistema operativo iniziò a sfruttare anche il <strong>di</strong>sco fisso ed ebbe<br />

inizio la cosiddetta multiprogrammazione, in base alla quale nella memoria centrale venivano tenuti attivi<br />

contemporaneamente alcuni processi e i loro dati pronti per essere eseguiti. Ad ogni momento, uno solo <strong>di</strong><br />

Cenni storici<br />

7


1. STRUTTURA DELL’ELABORATORE<br />

Sul software<br />

Memoria<br />

cache<br />

questi processi veniva eseguito, tuttavia, quando il processo in esecuzione richiedeva un’istruzione <strong>di</strong> ingresso<br />

o <strong>di</strong> uscita, esso veniva sospeso attivando le unità periferiche necessarie per l’esecuzione dell’istruzione<br />

data. Questa tecnica richiedeva una elevata capacità della memoria centrale e solo pochi sistemi potevano<br />

funzionare in modo adeguato.<br />

Uno dei primi sistemi che iniziò ad utilizzare la multiprogrammazione fu il sistema OS/360 realizzato per<br />

i computer IBM 360. Questo sistema operativo fu importante per due motivi:<br />

G si cercò <strong>di</strong> realizzare un sistema operativo uniforme e compatibile per macchine IBM molto <strong>di</strong>verse tra<br />

loro per quando riguarda l’hardware sottostante: fino a quel momento ogni macchina aveva il proprio<br />

sistema operativo, che cambiava da macchina a macchina!<br />

G lo sviluppo <strong>di</strong> questo sistema operativo fu molto delicato e complesso e aprì lo stu<strong>di</strong>o delle<br />

problematiche relative all’ingegneria del software.<br />

Nonostante questi progressi, la multiprogrammazione non permetteva molta interattività tra utente e<br />

computer: <strong>di</strong> fatto l’utente consegnava i dati e il programma da eseguire (un pacco <strong>di</strong> schede perforate) all’operatore<br />

del computer e accedeva ai risultati dopo qualche ora se non ad<strong>di</strong>rittura dopo giorni e giorni, risultati<br />

che riceveva in forma cartacea ad esecuzione avvenuta (non c’era ancora il monitor per la visualizzazione<br />

su video dei risultati).<br />

Per risolvere questo tipo <strong>di</strong> problemi, l’uso delle schede fu sostituito da appositi terminali sempre collegati<br />

al computer e furono cambiate le modalità <strong>di</strong> gestione dell’unità centrale mo<strong>di</strong>ficando i sistemi operativi<br />

esistenti. Si arrivò all’interazione con il computer non più me<strong>di</strong>ante schede perforate bensì tramite tastierastampante<br />

o tramite tastiera-monitor.<br />

Alla fine del 1950 si introdusse il concetto <strong>di</strong> time-sharing che permetteva l’esecuzione <strong>di</strong> più processi<br />

in modo da poter sod<strong>di</strong>sfare le esigenze <strong>di</strong> più utenti contemporaneamente. Con il time-sharing si assegna,<br />

infatti, un piccolo intervallo <strong>di</strong> tempo a ciascun processo dando l’impressione che ciascun processo vada<br />

avanti parallelamente agli altri.<br />

Gli sviluppi del sistema operativo ottenuti da allora fino ad oggi si possono così riassumere: il sistema<br />

operativo fornisce funzioni <strong>di</strong> base per la gestione delle risorse, quali:<br />

G uso del processore (multitasking: l’uso della CPU è permesso ad un programma alla volta per brevi<br />

intervalli <strong>di</strong> tempo, quin<strong>di</strong> l’utente può eseguire più programmi contemporaneamente)<br />

G uso della memoria centrale (memoria virtuale)<br />

G riconoscimento e gestione <strong>degli</strong> utenti (multiutenza)<br />

G gestione delle periferiche (drivers)<br />

G file system<br />

G interfaccia grafico.<br />

Il software <strong>di</strong> base (o general purpose) può avere funzioni varie: e<strong>di</strong>tor <strong>di</strong> testo, elaborazione <strong>di</strong> testi, fogli<br />

elettronici, posta elettronica, internet.<br />

Il software applicativo è costituito da programmi che hanno obiettivi specifici come intrattenimento,<br />

controllo <strong>di</strong> sistemi, progettazione (CAD), risoluzione <strong>di</strong> problemi matematici.<br />

Per migliorare le prestazioni <strong>di</strong> un computer si inserisce una memoria interme<strong>di</strong>a tra CPU e RAM, detta<br />

cache. Si trova all’interno del processore. È più veloce della RAM ma anche più costosa.<br />

1.5.1 Per capire meglio il sistema operativo<br />

Immaginiamo un ristorante con un capo-cuoco, il suo aiutante, una cucina, i camerieri e i clienti. I clienti<br />

scelgono un piatto dal menu, un cameriere prende l’or<strong>di</strong>ne e lo porta al capo-cuoco. Il capo-cuoco riceve<br />

l’or<strong>di</strong>ne e assegna al suo aiutante il compito <strong>di</strong> preparare il piatto. L’aiutante si de<strong>di</strong>cherà alla preparazione<br />

del piatto, compito che potrà richiedere più attività. Il capo-cuoco, intanto, supervisiona la preparazione dei<br />

piatti e gestisce le risorse (limitate) dei posti nel ristorante.<br />

G il capo-cuoco rappresenta il sistema operativo,<br />

G i clienti sono gli utenti,<br />

G le ricette associate ai piatti corrispondono ai programmi,<br />

G gli ingre<strong>di</strong>enti sono l’input del programma,<br />

G il piatto è l’output del programma,<br />

G il menu e il cameriere sono l’interfaccia verso il sistema operativo,<br />

8


1.6. Il file system<br />

G l’aiutante corrisponde al processore (CPU) (Se abbiamo più processori, ci sono più aiutanti),<br />

G la cucina corrisponde al computer,<br />

G pentole, fornelli etc, sono le parti che compongono il computer.<br />

L’aiuto cuoco, quin<strong>di</strong>, rappresenta la CPU mentre il tavolo da lavoro, su cui appoggia gli ingre<strong>di</strong>enti e la<br />

ricetta per preparare il piatto, rappresenta la memoria centrale. Prima <strong>di</strong> iniziare a lavorare, il cuoco deve<br />

svolgere alcune mansioni (sempre le stesse ogni volta: pulire il tavolo, controllare lo stato <strong>di</strong> pentole, tegami,<br />

coltelli. . . , ricevere le or<strong>di</strong>nazioni). Supponiamo che queste mansioni siano incise su un pezzo del tavolo da<br />

lavoro: corrispondono alla memoria ROM (quella che non può essere alterata). La RAM invece è la parte del<br />

tavolo che può essere alterata a piacimento (spostare pentole, tegami, ingre<strong>di</strong>enti).<br />

Quando il ristorante chiude, il tavolo deve essere pulito e sgombro altrimenti si rovina tutto quello che vi<br />

rimane, ad eccezione <strong>di</strong> ciò che vi è stato inciso. Perciò il cuoco conserva in <strong>di</strong>spense e frigoriferi i vari ingre<strong>di</strong>enti<br />

rimasti e gli utensili da lavoro: le <strong>di</strong>spense e i frigoriferi rappresentano i <strong>di</strong>schi (Hard Disk, CDROM,<br />

pen drive USB . . . ) per immagazzinare i dati.<br />

1.6 Il file system<br />

Il sistema operativo gestisce le informazioni su <strong>di</strong>spositivi <strong>di</strong> memoria secondaria (<strong>di</strong>schi).<br />

La gestione delle informazioni avviene me<strong>di</strong>ante file 11 . Un file costituisce un insieme <strong>di</strong> informazioni<br />

della stessa natura e logicamente correlate. In genere un file contiene un programma (programma sorgente<br />

o programma eseguibile), oppure una sequenza <strong>di</strong> dati.<br />

L’informazione è rappresentata da files, organizzati in maniera gerarchica (pensiamo ad una struttura ad<br />

albero) in <strong>di</strong>rectories (cartelle). Una <strong>di</strong>rectory è un file che svolge il ruolo <strong>di</strong> ”raccoglitore“.<br />

I files possono contenere dati (abbiamo i cosiddetti files <strong>di</strong> testo) oppure programmi (i files <strong>di</strong><br />

applicazioni).<br />

Un file è caratterizzato da:<br />

G posizione (path, o percorso): sequenza delle <strong>di</strong>rectories che portano al file<br />

<strong>di</strong>r1 / <strong>di</strong>r2 /.../.../<br />

G nome: in<strong>di</strong>vidua univocamente il file all’interno della cartella (o <strong>di</strong>rectory)<br />

G estensione: la parte del nome del file che segue l’ultimo punto . (dati.txt prova.f matrice.dat<br />

welcome.html foto.jpeg )<br />

G <strong>di</strong>mensione: quantità <strong>di</strong> informazione contenuta nel file<br />

G altre informazioni (data <strong>di</strong> creazione, data <strong>di</strong> ultima mo<strong>di</strong>fica, permessi <strong>di</strong> scrittura, lettura. . . )<br />

L’intera gestione dei file è a carico <strong>di</strong> un componente del sistema operativo detto file system.<br />

1.7 Un po’ <strong>di</strong> storia sui sistemi operativi<br />

Tra i numerosi sistemi operativi, il sistema Unix è quello che ha maggiormente influenzato questo settore<br />

dell’informatica. Il sistem Unix venne sviluppato sul finire <strong>degli</strong> anni sessanta nei laboratori della AT &<br />

T. La filosofia <strong>di</strong> base era <strong>di</strong> realizzare un sistema semplice rispetto agli altri in uso e adatto per la ricerca e<br />

lo sviluppo. La prima versione fu scritta in linguaggio Assembly e <strong>di</strong>pendeva dal tipo <strong>di</strong> macchina su cui si<br />

doveva applicare. Successivamente venne scritto in larga parte in un linguaggio <strong>di</strong> alto livello, il C, progettato<br />

appositamente per il sistema Unix. In tal modo il sistema operativo <strong>di</strong>ventava facilmente portabile su macchine<br />

<strong>di</strong> tipo <strong>di</strong>verso senza <strong>di</strong>pendere eccessivamente dalle caratteristiche dell’hardware su cui veniva fatto<br />

funzionare. Diversamente dalle abitu<strong>di</strong>ni del tempo, l’azienda AT & T <strong>di</strong>stribuì Unix nelle università e rese<br />

<strong>di</strong>sponibili i co<strong>di</strong>ci sorgenti utilizzati per realizzarlo. Questo portò ad una sua ulteriore innovazione grazie a<br />

tutti i ricercatori delle università che iniziarono a sperimentarlo.<br />

Quando furono messi in commercio i primi microcomputer (a partire dal 1975), fu necessario sviluppare<br />

sistemi operativi appositamente progettati per sfruttare le poche risorse <strong>di</strong>sponibili essendo le risorse <strong>di</strong><br />

11 File in inglese significa archivio. Il termine compare nei primi anni cinquanta e inizialmente si riferisce a un pacco <strong>di</strong> schede<br />

contenente informazioni omogenee. È il sistema operativo a realizzare il concetto astratto <strong>di</strong> file nella gestione dei <strong>di</strong>spositivi <strong>di</strong> memoria<br />

<strong>di</strong> massa.<br />

9


1. STRUTTURA DELL’ELABORATORE<br />

calcolo <strong>di</strong> tali macchine molto limitate. Inoltre, queste macchine erano pensate più per gli appassionati che<br />

per il personale tecnico esperto e quin<strong>di</strong> era importante creare un sistema operativo che fosse d’uso relativamente<br />

semplice. In questo campo si <strong>di</strong>stinsero Bill Gates e Paul Allen, che iniziarono la loro attività scrivendo<br />

il linguaggio <strong>di</strong> programmazione Basic per il micromputer Altair. Nel 1975 crearono una <strong>di</strong>tta... la Microsoft.<br />

Un altro microcomputer, popolare nei primi anni ottanta, fu l’Apple sviluppato da Steve Wozniak e Steve<br />

Jobs. Per questa macchina svilupparono un sistema più semplice ed efficiente <strong>di</strong> quello usato per l’Altair, che<br />

si ispirava vagamente al sistema Unix.<br />

I sistemi operativi per i microcomputer dovevano essere più semplici <strong>di</strong> quelli impiegati per i gran<strong>di</strong> computer,<br />

in quanto la macchina veniva utilizzata da un solo utente e le periferiche collegate erano poche e semplici.<br />

Il problema maggiore ero quello <strong>di</strong> gestire i file su floppy <strong>di</strong>sk (gli antenati dei CD-ROM e dei DVD, in<br />

uso fino ad una decina <strong>di</strong> anni fa) o su nastri magnetici e mettere a <strong>di</strong>sposizione dell’utente un linguaggio<br />

<strong>di</strong> programmazione semplice, come il Basic. Tuttavia, il confine tra linguaggio <strong>di</strong> programmazione e sistema<br />

operativo non era ancora ben definito e, una volta avviato, il sistema era pronto per ricevere sia coman<strong>di</strong> del<br />

sistema operativo, sia istruzioni in linguaggio Basic.<br />

I microcomputer iniziarono ad avere un grosso successo tanto che all’inizio <strong>degli</strong> anni ottanta, l’IBM pensò<br />

<strong>di</strong> entrare in questo settore (prima si era solo occupata <strong>di</strong> gran<strong>di</strong> computer e <strong>di</strong> software), introducendo<br />

il personal computer, IBM PC, realizzando in tal modo una macchina che servisse non solo per gli appassionati<br />

e per giocare (uno dei fattori che aveva determinato il successo dei microcomputer) ma anche come<br />

strumento <strong>di</strong> stu<strong>di</strong>o, per i professionisti e per la gestione <strong>di</strong> piccole aziende.<br />

L’IBM incaricò Bill Gates <strong>di</strong> realizzare un sistema operativo per il nuovo personal computer. Il successo<br />

dell’IBM PC portò al successo anche <strong>di</strong> Bill Gates: i profitti della Microsoft iniziarono a crescere in modo<br />

esponenziale. Il sistema realizzato dalla Microsoft prese il nome <strong>di</strong> MS-Dos e <strong>di</strong>venne il sistema operativo<br />

più <strong>di</strong>ffuso al mondo grazie alla standar<strong>di</strong>zzazione dei personal computer lanciato dall’IBM.<br />

Il sistema MS-Dos non era facile da usare perchè l’utente interagiva con il computer solo attraverso<br />

coman<strong>di</strong> testuali la cui sintassi non era così semplice da ricordare (qualche anno più tar<strong>di</strong> fu lanciata sul<br />

mercato una versione più amichevole).<br />

Nel 1984, invece, dalla Apple fu prodotto il personal computer Macintosh che adottava un tipo <strong>di</strong> interfaccia<br />

grafico progettato per interagire in modo semplice e intuitivo con l’utente. Il Macintosh utilizzava un<br />

interfaccia grafico chiamato GUI (Graphic User Interface) composto da icone, finestre, menù... Gli oggetti<br />

dell’ambiente operativo erano rappresentati con simboli grafici <strong>di</strong> facile intuizione senza dover comprendere<br />

a fondo tutti i tecnicismi informatici. L’interfaccia GUI non era un’invezione della Apple perchè era stata<br />

già sperimentata nel corso <strong>degli</strong> anni settanta dalla Xerox, che però non aveva intuito le potenzialità <strong>di</strong> questo<br />

lavoro, lasciandone invece la fortuna e il successo alla Apple che, insieme ad esso, introdusse il mouse.<br />

Ovviamente, queste novità furono molto apprezzate e la Microsoft, per colmare questa lacuna, lanciò un<br />

altro sistema operativo basato su interfaccia grafica: nel 1985 nacque il primo Windows 1.0 che trovò pochi<br />

consensi perchè troppo lento e instabile. Nel 1986, con la comparsa <strong>di</strong> nuovi microprocessori, il sistema<br />

Windows cominciò a funzionare in modo adeguato tanto che le versioni <strong>di</strong> Windows 3.1 e <strong>di</strong> Windows 95<br />

portarono al sopravvento del sistema operativo Windows rispetto al Macintosh.<br />

Accanto a questi sistemi operativi, e forse anche per ridurre lo strapotere della Microsoft, si deve vedere<br />

la strada percorsa da un informatico <strong>di</strong> Helsinki (data <strong>di</strong> nascita 1969), Linus Bene<strong>di</strong>ct Torvalds, che ha<br />

introdotto il sistema Linux.<br />

Durante gli stu<strong>di</strong> universitari, Torvalds si era interessato <strong>di</strong> sistemi operativi e aveva stu<strong>di</strong>ato una versione<br />

semplificata <strong>di</strong> Unix, chiamata Minix. Questo sistema poteva funzionare su personal computer e veniva<br />

<strong>di</strong>stributo con i programmi sorgenti <strong>di</strong>sponibili. Torvalds migliorò il sistema Minix, in modo da poterlo utilizzare<br />

come alternativa a Windows, nella logica <strong>di</strong> non realizzare profitti (cioè non <strong>di</strong>ventare milionario) ma<br />

<strong>di</strong> realizzare un sistema utilizzabile gratuitamente da tutti e migliorabile con il contributo <strong>di</strong> tutti (la filosofia<br />

dell’open source). Nel 1991 fu completata la prima versione del sistema, che fu chiamata Linux e venne messa<br />

a <strong>di</strong>sposizione <strong>di</strong> tutti. Torvalds si riservò il compito <strong>di</strong> coor<strong>di</strong>nare i <strong>di</strong>versi miglioramenti via via introdotti<br />

dagli altri sviluppatori.<br />

Tra le tante <strong>di</strong>stribuzioni attualmente in uso ricor<strong>di</strong>amo: Debian, Ubuntu, Fedora, Gentoo, Slackware. . .<br />

Linux si è <strong>di</strong>mostrato e si <strong>di</strong>mostra tuttora un valido sistema operativo, affidabile, sicuro e <strong>di</strong> buone<br />

prestazioni, in grado <strong>di</strong> gestire situazioni multiutente e multitasking.<br />

Ed è il sistema operativo <strong>di</strong> riferimento del corso <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong>.<br />

10


1.8. Lavorare in ambiente Linux<br />

1.8 Lavorare in ambiente Linux<br />

Una volta entrati nel sistema (tramite login e password), si apre l’ambiente grafico e <strong>di</strong> qui possiamo<br />

lavorare (per esempio, aprire una finestra <strong>di</strong> e<strong>di</strong>tor, lavorare in Office, navigare in Internet ....).<br />

Per aprire nuove <strong>di</strong>rectories (cartelle), per spostare files, per eseguire programmi, ... è bene lavorare<br />

tramite una finestra <strong>di</strong> terminale o shell.<br />

La finestra <strong>di</strong> terminale (shell) mostra il prompt dei coman<strong>di</strong>.<br />

Un esempio <strong>di</strong> prompt è la login dell’utente (ad esempio studente) + chiocciola + nome della macchina<br />

su cui si sta lavorando (ad esempio george) + attuale <strong>di</strong>rectory <strong>di</strong> lavoro (se non compare nessun nome, è<br />

perchè ci troviamo nella home <strong>di</strong>rectory, la <strong>di</strong>rectory principale dell’utente) + un simbolo (% o $, a seconda<br />

della macchina):<br />

studente@george:~ $<br />

Ve<strong>di</strong>amo ora alcuni coman<strong>di</strong> essenziali (coman<strong>di</strong> da scrivere dopo il prompt, in una finestra <strong>di</strong> terminale<br />

– dopo<strong>di</strong>chè si clicca il tasto <strong>di</strong> Invio):<br />

G ls mostra l’elenco dei files e delle <strong>di</strong>rectories contenuti nella <strong>di</strong>rectory attuale ( ls sta per list):<br />

Esempio:<br />

studente@george:~ $ ls<br />

Un volta cliccato Invio, compare l’elenco delle <strong>di</strong>rectories presenti nello spazio <strong>di</strong> lavoro <strong>di</strong>sponibile per<br />

l’utente studente sulla macchina george, ad esempio (i numeri a sinistra delle <strong>di</strong>rectories o files sono<br />

in<strong>di</strong>catori dello spazio che occupano in memoria):<br />

5 appunti/ 4 mail/<br />

2 calcolonumerico/ 4 movies/<br />

3 fortran/ 1 varie/<br />

3 foto/ 57 prova.pdf<br />

G Per cambiare <strong>di</strong>rectory, si deve <strong>di</strong>gitare cd nome-<strong>di</strong>rectory<br />

(cd sta per change <strong>di</strong>rectory). Esempio: per entrare nella <strong>di</strong>rectory foto, scriviamo<br />

studente@george:~ $ cd foto<br />

Una volta cliccato il tasto <strong>di</strong> Invio, si è entrati nella <strong>di</strong>rectory foto:<br />

studente@george:~/foto $<br />

Il comando cd .. fa tornare nella <strong>di</strong>rectory precedente.<br />

Per creare una nuova <strong>di</strong>rectory: mk<strong>di</strong>r nome<strong>di</strong>rectory (mk<strong>di</strong>r sta per make <strong>di</strong>rectory).<br />

Per copiare un file dentro una <strong>di</strong>rectory: cp nomefile nome<strong>di</strong>rectory (cp sta per copy).<br />

Per trasferire un file in una <strong>di</strong>rectory mv nomefile nome<strong>di</strong>rectory (mv sta per move).<br />

G Per rinominare un file (o una <strong>di</strong>rectory): mv nomevecchio nomenuovo .<br />

G Per cancellare un file si usa il comando<br />

rm nomefile.<br />

G Per cancellare una <strong>di</strong>rectory, dobbiamo prima cancellare tutti i files della <strong>di</strong>rectory e poi usare il<br />

comando rm<strong>di</strong>r nome<strong>di</strong>rectory.<br />

G Per sapere in quale <strong>di</strong>rectory ci troviamo, si usa il comando pwd. Esempio: siamo nella <strong>di</strong>rectory foto,<br />

che è una sotto<strong>di</strong>rectory della home <strong>di</strong> studente. Con il comando pwd si ha:<br />

studente@george:~/foto $ pwd<br />

studente@george:~/foto $ /home/studente/foto<br />

11


1. STRUTTURA DELL’ELABORATORE<br />

Esempio<br />

Esempio 1.8.1 Abbiamo due <strong>di</strong>rectory chiamate uno e due e il file prova.f nella <strong>di</strong>rectory uno.<br />

Vogliamo copiare il file dalla <strong>di</strong>rectory uno alla <strong>di</strong>rectory due.<br />

Se ci troviamo nella home, cioè nell’ambiente <strong>di</strong> partenza, dobbiamo scrivere<br />

cp uno/prova.f due<br />

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

Se ora passiamo nella <strong>di</strong>rectory due e facciamo ls, vedremo il file prova.f<br />

studente@george:~ $ cd due<br />

studente@george:~/due $ ls<br />

total 1<br />

1 prova.f<br />

Se siamo nella <strong>di</strong>rectory uno, dobbiamo scrivere<br />

cp prova.f ../due per ottenere lo stesso risultato.<br />

Se siamo nella <strong>di</strong>rectory due, dobbiamo scrivere<br />

cp ../uno/prova.f . Il punto finale serve per copiare il file prova.f nella <strong>di</strong>rectory in<br />

cui ci troviamo.<br />

Con cp abbiamo due file identici, quello nella <strong>di</strong>rectory uno e quello copiato nella <strong>di</strong>rectory due.<br />

Possiamo anche scrivere cp prova.f prova2.f: in questo modo creiamo il file prova2.f nella<br />

stessa <strong>di</strong>rectory in cui si trova prova.f.<br />

Se vogliamo trasferire il file dalla <strong>di</strong>rectory uno alla <strong>di</strong>rectory due (in questo modo avremo solo un<br />

file alla fine del proce<strong>di</strong>mento), dobbiamo usare il comando mv.<br />

Riassumendo<br />

G ls : lista dei files e delle <strong>di</strong>rectory<br />

G cd : per cambiare <strong>di</strong>rectory<br />

G mk<strong>di</strong>r: per creare una nuova <strong>di</strong>rectory<br />

G cp: per copiare files<br />

G mv: per trasferire o rinominare files<br />

G rm: per cancellare files<br />

G rm<strong>di</strong>r: per cancellare <strong>di</strong>rectories<br />

1.9 E<strong>di</strong>tor <strong>di</strong> testo<br />

Se vogliamo scrivere su un file un documento <strong>di</strong> testo, abbiamo bisogno <strong>di</strong> un e<strong>di</strong>tor <strong>di</strong> testo. Sotto Linux<br />

ne troviamo <strong>di</strong>versi: vi, emacs, ke<strong>di</strong>t, ge<strong>di</strong>t, ne<strong>di</strong>t.... I più semplici da utilizzare sono ge<strong>di</strong>t e ne<strong>di</strong>t.<br />

Sotto Linux esiste anche il pacchetto Office (del tutto simile all’equivalente Microsoft) per scrivere<br />

documenti in word, creare tabelle, etc. . . . Anche il programma Gnumeric è molto utile per creare tabelle.<br />

Per visualizzare grafici, invece, c’è il pacchetto Gnuplot.<br />

12


CAPITOLO 2<br />

Richiami <strong>di</strong> analisi<br />

La teoria attrae la pratica come il<br />

magnete attrae il ferro.<br />

Carl Friedrich Gauss<br />

2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.2 Identità trigonometriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.3 Regole su funzione esponenziale e logaritmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

2.4 Derivate e integrali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

2.5 Teoremi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.1 Introduzione<br />

Quando si descrivono teoremi, si danno definizioni o, semplicemente, si <strong>di</strong>scute <strong>di</strong> matematica, è<br />

abbastanza usuale prendere in prestito lettere dell’alfabeto greco.<br />

È importante, quin<strong>di</strong>, saperle riconoscere e chiamarle in maniera corretta:<br />

A α Alfa N ν Nu<br />

B β Beta Ξ ξ Xi<br />

Γ γ Gamma O o Omicron<br />

∆ δ Delta Π π Pi<br />

E ɛ Epsilon P ρ Rho<br />

Z ζ Zeta Σ σ Sigma<br />

H η Eta T τ Tau<br />

Θ θ Theta Υ υ Upsilon<br />

I ι Iota Φ φ Fi<br />

K κ Kappa X χ Chi<br />

Λ λ Lambda Ψ ψ Psi<br />

M µ Mu Ω ω Omega<br />

2.2 Identità trigonometriche<br />

Nel seguito introduciamo alcune formule trigonometriche, con la notazione:<br />

G sin(x) ≡ seno(x), cos(x) ≡ coseno(x),<br />

G tan(x) ≡ tangente(x) = sin(x)<br />

cos(x) , sec(x) ≡ secante(x) = 1<br />

cos(x) ,<br />

13


2. RICHIAMI DI ANALISI<br />

cos(−θ) = cos(θ)<br />

cos( π 2<br />

− θ) = sin(θ)<br />

sin(<br />

cos( π 2<br />

+ θ) = −sin(θ)<br />

sin(<br />

cos(π − θ) = −cos(θ)<br />

cos(π + θ) = −cos(θ)<br />

cos(θ + φ) = cos(θ)cos(φ) − sin(θ)sin(φ)<br />

sin(2θ) = 2sin(θ)cos(θ)<br />

sin 2 (θ) + cos 2 (θ) = 1<br />

sin(−θ) = −sin(θ)<br />

π<br />

2<br />

− θ) = cos(θ)<br />

π<br />

2<br />

+ θ) = cos(θ)<br />

sin(π − θ) = sin(θ)<br />

sin(π + θ) = −sin(θ)<br />

sin(θ + φ) = sin(θ)cos(φ) + cos(θ)sin(φ)<br />

cos(2θ) = cos 2 (θ) − sin 2 (θ)<br />

tan 2 (θ) + 1 = sec 2 (θ)<br />

2.3 Regole su funzione esponenziale e logaritmica<br />

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

1 x = 1<br />

a x+y = a x a y<br />

a x y = (a x ) y<br />

a log a (x) = x a 0 = 1<br />

a x−y = a x /a y<br />

a x b x = (ab) x<br />

log a (x y) = log a (x) + log a (y)<br />

log a (x/y) = log a (x) − log a (y)<br />

log a (x y ) = y log a (x)<br />

log a (a x ) = x<br />

log b (x) = log a (x)<br />

log a (b)<br />

b x = a x log a (b)<br />

2.4 Derivate e integrali<br />

Siano f e g due funzioni <strong>di</strong>pendenti dalla variabile reale x mentre c ∈ R sia una costante. In<strong>di</strong>chiamo la<br />

derivata <strong>di</strong> f con il simbolo d f<br />

d x o me<strong>di</strong>ante f ′ . Si ha:<br />

d (c f )<br />

d x = c f ′ regola della costante<br />

d (f + g )<br />

= d f<br />

d x d x + d g<br />

d x<br />

regola della somma<br />

d (f /g )<br />

= f ′ g − f g ′<br />

d x g 2<br />

regola del quoziente<br />

d (f g )<br />

= f g ′ + f ′ g<br />

d x<br />

regola del prodotto<br />

d f r<br />

d x = r f r −1 f ′ regola della potenza<br />

Tra le regole <strong>di</strong> integrazione, invece, ricor<strong>di</strong>amo quella <strong>di</strong> integrazione per parti:<br />

∫<br />

∫<br />

f g ′ dx = f g − f ′ g dx<br />

Diamo ora una tabella delle derivate e <strong>degli</strong> integrali delle funzioni più note (per gli integrali lasciamo<br />

fuori la costante <strong>di</strong> integrazione), e con la simbologia arcsin(x) ≡ arcoseno(x), arccos(x) ≡ arcocoseno(x),<br />

cot(x) ≡ cotangente (x), arctan(x) ≡ arcotangente(x), arccot(x) ≡, arcocotangente(x).<br />

14


2.5. Teoremi utili<br />

f<br />

f f ′ f f ′<br />

1<br />

ln(x)<br />

e x<br />

e x<br />

x<br />

sin(x) cos(x) cos(x) −sin(x)<br />

1<br />

tan(x)<br />

cos 2 (x) (= 1<br />

sec2 (x)) cot(x) −<br />

sin 2 (x)<br />

1<br />

1<br />

1<br />

1<br />

tan(x)<br />

−cot(x)<br />

cos(x)<br />

cos(x)<br />

sin(x)<br />

sin(x)<br />

1<br />

1<br />

arcsin(x) arccos(x) − <br />

1 − x<br />

2<br />

1 − x<br />

2<br />

1<br />

arctan(x)<br />

1 + x 2 arccot(x) − 1<br />

1 + x 2<br />

x r x r +1<br />

∫<br />

f d x f<br />

∫<br />

f d x<br />

r + 1 (r ≠ 1) x−1 ln|x|<br />

e x e x ln|x| x ln|x| − x<br />

sin(x) −cos(x) cos(x) sin(x)<br />

tan(x)<br />

1<br />

ln| |<br />

cos(x)<br />

cot(x) ln|sin(x)|<br />

1<br />

cos(x)<br />

1<br />

ln|<br />

cos(x) + tan(x)| 1<br />

sin(x)<br />

1<br />

ln|<br />

sin(x) + cot(x)|<br />

1<br />

cos 2 (x)<br />

tan(x)<br />

1<br />

sin 2 (x)<br />

−cot(x)<br />

tan(x)<br />

cos(x)<br />

1<br />

cos(x)<br />

cot(x)<br />

sin(x)<br />

− 1<br />

sin(x)<br />

arcsin(x) x arcsin(x) + 1 − x 2 arccos(x) x arccos(x) − 1 − x 2<br />

arctan(x) x arctan(x) − 1 2 ln(1 + x2 ) arccot(x) xarccot(x) − 1 2 ln(1 + x2 )<br />

1<br />

<br />

1 − x<br />

2<br />

2.5 Teoremi utili<br />

arcsin(x)<br />

1<br />

1 + x 2 arctan(x)<br />

Richiamiamo, nel seguito, teoremi che trovano applicazione nel <strong>Calcolo</strong> <strong>Numerico</strong>. Per alcuni <strong>di</strong>amo<br />

anche la <strong>di</strong>mostrazione.<br />

Utilizzeremo, inoltre, le seguenti notazioni per funzioni <strong>di</strong> una sola variabile definite in un insieme X ⊂ R.<br />

L’insieme delle funzioni continue in X verrà denotato con il simbolo C (X ). L’insieme delle funzioni continue<br />

in X , che hanno le prime n derivate pure esse continue, sarà in<strong>di</strong>cato con C n (X ).<br />

Notazioni<br />

usate per le<br />

funzioni<br />

continue<br />

Teorema 2.5.1 (Teorema <strong>di</strong> Rolle) a<br />

Sia f ∈ C ([a,b]) e <strong>di</strong>fferenziabile in ]a,b[.<br />

Se f (a) = f (b) = 0, allora esiste un punto ξ ∈]a,b[<br />

tale che f ′ (ξ) = 0<br />

a Michel Rolle (1652- 1719) fu un matematico francese. È<br />

conosciuto per il teorema che porta il suo nome. Si deve a lui<br />

la notazione della ra<strong>di</strong>ce n-sima per mezzo del simbolo n x.<br />

15


2. RICHIAMI DI ANALISI<br />

Teorema 2.5.2 (Teorema del Valor Me<strong>di</strong>o)<br />

Sia f ∈ C ([a,b]) e <strong>di</strong>fferenziabile in ]a,b[,<br />

allora esiste un punto ξ ∈]a,b[ tale che<br />

f ′ f (b) − f (a)<br />

(ξ) =<br />

b − a<br />

Teorema 2.5.3 (Teorema del Valore Interme<strong>di</strong>o)<br />

Sia f ∈ C ([a,b]) e sia K un valore compreso tra f (a)<br />

e f (b). Allora esiste almeno un punto ξ ∈]a,b[ tale<br />

che f (ξ) = K .<br />

Quin<strong>di</strong> per funzioni continue, un valore compreso tra i due estremi dell’insieme <strong>di</strong> definizione, è un valore<br />

assunto dalla funzione stessa (in uno o più punti).<br />

Come conseguenza <strong>di</strong> questo teorema, se f (a)f (b) < 0 (la funzione assume segno opposto agli estremi<br />

dell’intervallo [a,b]) allora esiste almeno un punto ξ tale che f (ξ) = 0, cioè esiste almeno una ra<strong>di</strong>ce<br />

dell’equazione f (x) = 0 nell’intervallo [a,b].<br />

Teorema 2.5.4 (Esistenza del punto fisso) Data una funzione g definita in [a,b], continua e tale che a ≤<br />

g (x) ≤ b per ogni x ∈ [a,b], allora g ammette almeno un punto fisso.<br />

Dimostrazione. Dire che una funzione g ammette almeno un punto fisso, vuol <strong>di</strong>re che esiste almeno<br />

un punto ξ nel suo insieme <strong>di</strong> definizione, tale che g (ξ) = ξ.<br />

Dalle ipotesi del teorema, i valori della funzione g sono contenuti nell’intervallo [a,b] e, in particolare<br />

a ≤ g (a) ≤ b e a ≤ g (b) ≤ b. Definiamo, perciò, la funzione continua Φ(x) me<strong>di</strong>ante la relazione<br />

Φ(x) = g (x) − x<br />

Allora Φ(a) = g (a) − a > 0 e Φ(b) = g (b) − b < 0. Per il Teorema del Valore Interme<strong>di</strong>o esiste almeno un punto<br />

ξ ∈]a,b[ tale che Φ(ξ) = 0, vale a <strong>di</strong>re g (ξ) − ξ = 0, cioè g (ξ) = ξ. Esiste almeno un punto fisso per la funzione<br />

g . ✔<br />

Teorema 2.5.5 (Esistenza e unicità del punto fisso) Data una funzione g <strong>di</strong> classe C 1 in [a,b], con a ≤ g (x) ≤<br />

b per ogni x ∈ [a,b], e con |g ′ (x)| ≤ m < 1 per ogni x ∈ [a,b] allora esiste ed è unico il punto fisso della g in tale<br />

intervallo.<br />

Dimostrazione. L’esistenza <strong>di</strong> almeno un punto fisso è assicurata dal teorema precedente (le ipotesi del<br />

teorema precedente ci sono tutte). Supponiamo, allora, che esistano due punti fissi ξ e η, con ξ ≠ η, per la<br />

funzione g . Si ha<br />

|ξ − η| = |g (ξ) − g (η)|<br />

Applicando il teorema del Valor Me<strong>di</strong>o, esiste un punto c compreso tra ξ e η per cui<br />

16<br />

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


2.5. Teoremi utili<br />

Ma per ipotesi |g ′ (c)| ≤ m < 1 da cui<br />

|ξ − η| ≤ m|ξ − η| < |ξ − η|<br />

Si arriva ad una contrad<strong>di</strong>zione. L’assurdo deriva dall’aver supposto ξ ≠ η. Quin<strong>di</strong> ξ = η e il punto fisso è<br />

unico. ✔<br />

Teorema 2.5.6 (Teorema del Valor Me<strong>di</strong>o del <strong>Calcolo</strong> Integrale) Se f ∈ C ([a,b]) e g è integrabile in [a,b] e<br />

g (x) non cambia segno in [a,b], allora esiste un punto ξ ∈]a,b[ tale che<br />

∫ b<br />

a<br />

f (x)g (x) d x = f (ξ)<br />

∫ b<br />

a<br />

g (x) d x<br />

Per g ≡ 1, questo teorema ci dà il valore me<strong>di</strong>o della funzione f sull’intervallo [a,b], dato da f (ξ) =<br />

1 ∫ b<br />

a<br />

b − a<br />

f (x) d x<br />

Teorema 2.5.7 (Teorema <strong>di</strong> Rolle generalizzato) Sia f ∈ C ([a,b]) n volte <strong>di</strong>fferenziabile in ]a,b[. Se f si annulla<br />

in n +1 punti <strong>di</strong>stinti x 0 , x 1 ,..., x n in ]a,b[, allora esiste un punto ξ ∈]a,b[ in cui la derivata n-sima della<br />

f si annulla: f (n) (ξ) = 0.<br />

Teorema 2.5.8 (Formula <strong>di</strong> Taylor) 1<br />

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:<br />

f (x) = f (x 0 ) + f ′ (x 0 )(x − x 0 ) + (x − x 0) 2<br />

f ′′ (ξ x )<br />

2<br />

dove ξ x è un opportuno punto <strong>di</strong> [a,b] che si trova sul segmento in<strong>di</strong>viduato da x 0 e x.<br />

La formula appena scritta si <strong>di</strong>ce formula <strong>di</strong> Taylor <strong>di</strong> centro x 0 nel punto x.<br />

La formula <strong>di</strong> Taylor appena scritta si può generalizzare se la funzione f è derivabile n +1 volte. Si ha così<br />

la formula polinomiale <strong>di</strong> Taylor <strong>di</strong> centro x 0 :<br />

dove<br />

f (x) = f (x 0 ) + f ′ (x 0 )(x − x 0 ) + f ′′ (x 0 )<br />

2!<br />

(x − x 0 ) 2 + ... + f (n) (x 0 )<br />

(x − x 0 ) n + R n<br />

n!<br />

R n (x) = f (n+1) (ξ x )<br />

(x − x 0 ) n+1<br />

(n + 1)!<br />

con ξ x un opportuno punto <strong>di</strong> [a,b] che si trova sul segmento in<strong>di</strong>viduato da x 0 e x.<br />

1 Brook Taylor (1685 - 1731) fu un matematico inglese che sviluppò quello che oggi è chiamato calcolo delle <strong>di</strong>fferenze finite.<br />

L’importanza del suo lavoro e, soprattutto, della formula conosciuta oggi con il suo nome, venne riconosciuta solo nel 1772 da Lagrange.<br />

17


CAPITOLO 3<br />

Rappresentazione dei numeri nel<br />

calcolatore<br />

Tutti noi ogni giorno usiamo la<br />

matematica: per prevedere il tempo,<br />

per <strong>di</strong>re l’ora, per contare il denaro.<br />

Usiamo la matematica anche per<br />

analizzare i crimini, comprendere<br />

gli schemi, prevedere i<br />

comportamenti. Usando i numeri,<br />

possiamo svelare i più gran<strong>di</strong><br />

misteri della vita!<br />

NUMB3RS<br />

3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

3.2 Aritmetica <strong>di</strong> macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

3.3 Conversione <strong>di</strong> base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />

3.4 Rappresentazione IEEE dei numeri <strong>di</strong> macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

3.5 Precisione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

3.6 Propagazione <strong>degli</strong> errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

3.7 Instabilità e malcon<strong>di</strong>zionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

3.7.1 Instabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

3.7.2 Malcon<strong>di</strong>zionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />

3.1 Introduzione<br />

Molte volte, si pensa che i risultati numerici ottenuti da un calcolatore elettronico, specie se sono ottenuti<br />

come output <strong>di</strong> un sofisticato software, non contengano errori e, se ne abbiano, siano da ritenersi trascurabili.<br />

In realtà, quando si esegue un programma al calcolatore, bisogna prima <strong>di</strong> tutto aver verificato che sia stato<br />

scritto correttamente (il programma deve, cioè, tradurre correttamente il problema matematico che si vuole<br />

risolvere). Inoltre, bisogna tener conto che i risultati numerici sono sempre affetti da un certo tipo <strong>di</strong> errore,<br />

che può essere, per esempio, <strong>di</strong> arrotondamento o <strong>di</strong> troncamento: π è un numero con infinite cifre decimali<br />

ma il calcolatore lo può vedere solo come un numero con finite cifre decimali..., molte formule non possono<br />

essere usate così come sono ma devono essere in qualche modo semplificate (basti pensare ad una somma <strong>di</strong><br />

infiniti termini). Non tenere conto <strong>di</strong> questi fattori può portare a risultati davvero <strong>di</strong>sastrosi, come può essere<br />

verificato andando a controllare la pagina web de<strong>di</strong>cata ai <strong>di</strong>sastri dovuti a uno scorretto calcolo numerico:<br />

http://www.ima.umn.edu/~arnold/<strong>di</strong>sasters/<strong>di</strong>sasters.html<br />

19


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

La pagina web è del prof. Douglas N. Arnold, dell’Università del Minnesota, e viene introdotta con la<br />

seguente frase (traducendo): Stai seguendo con attenzione il tuo corso <strong>di</strong> analisi numerica o <strong>di</strong> calcolo scientifico<br />

Se no, potrebbe essere un caro errore. Nel seguito, ci sono esempi dalla vita reale <strong>di</strong> ciò che può succedere<br />

quando gli algoritmi numerici non sono applicati correttamente.<br />

Ve<strong>di</strong>amo alcuni <strong>di</strong> questi <strong>di</strong>sastri numerici.<br />

Esempio sul<br />

<strong>di</strong>sastro del<br />

missile<br />

Patriot<br />

Il 25 febbraio 1991, durante la prima Guerra del Golfo, un missile Patriot fallì l’intercettazione <strong>di</strong> un<br />

missile Scud iracheno. Questo errore costò la vita <strong>di</strong> 28 soldati, un centinaio <strong>di</strong> feriti e la <strong>di</strong>struzione <strong>di</strong><br />

un capannone americano. La causa del <strong>di</strong>sastro fu dovuto ad errori <strong>di</strong> arrotondamento nel sistema operativo<br />

del Patriot: ad ogni secondo che passava si introduceva un ritardo infinitesimo che comportava un<br />

errore nella valutazione della traiettoria del missile Scud. Col passare delle ore il ritardo accumulato fu<br />

tale da far intercettare una posizione del tutto <strong>di</strong>versa da quella in cui si trovava il missile da abbattere.<br />

Difatti, il computer usato per controllare il missile Patriot era basato su<br />

un’aritmetica a 24 bit. Per i calcoli, il tempo veniva registrato dall’orologio<br />

interno del sistema in decine <strong>di</strong> secon<strong>di</strong> e successivamente moltiplicato<br />

per 1/10 per ottenere i secon<strong>di</strong>, utilizzando 24 bit in virgola fissa. Il<br />

numero 1/10 in base 2 ha infinite cifre decimali: la sua espansione binaria<br />

è infatti 0.0001100110011001100110011001100.... In 24 bit esso veniva<br />

registrato come 0.00011001100110011001100 introducendo un errore<br />

<strong>di</strong> 0.0000000000000000000000011001100..., che, in base 10, significa<br />

circa 0.000000095.<br />

Gli errori <strong>di</strong> arrotondamento nella conversione del tempo<br />

causarono un errore nel calcolo della traiettoria: il tempo<br />

<strong>di</strong> 100 ore calcolato in secon<strong>di</strong> <strong>di</strong>ede il valore 359999.6567<br />

Figura 3.1: Il <strong>di</strong>sastro del missile invece <strong>di</strong> 360000, un errore <strong>di</strong> 0.3433 secon<strong>di</strong> che portò<br />

Patriot<br />

il Patriot 687 metri fuori della traiettoria del missile Scud!<br />

L’esplosione<br />

dell’Ariane 5<br />

Il <strong>di</strong>sastro del<br />

Mars Climate<br />

Orbiter<br />

Il 4 giugno 1996, dopo una spesa <strong>di</strong> 7 miliar<strong>di</strong> <strong>di</strong> dollari, e dopo appena 40<br />

secon<strong>di</strong> dal suo lancio, esplose il razzo Ariane 5, nella Guiana Francese. Il razzo<br />

e il suo carico erano valutati per oltre 500 milioni <strong>di</strong> dollari. Perciò il costo<br />

totale della missione era stato <strong>di</strong> oltre 7 miliar<strong>di</strong> e mezzo <strong>di</strong> dollari. Fu scoperto<br />

che l’errore era nel software e, in particolare, nella componente del Sistema <strong>di</strong><br />

Riferimento Inerziale, che era stato preso dal software dell’Ariane 4. Certe parti<br />

del software dell’Ariane 5 erano state aggiornate rispetto al software dell’Ariane<br />

4, ma non si era aggiornato quanto preso dal software dell’Ariane 4.<br />

In particolare, il fallimento dell’Ariane 5 è dovuto ad un errore <strong>di</strong> conversione<br />

da un sistema a 64 bit a virgola mobile ad uno a 16 bit a virgola<br />

fissa.<br />

La velocità orizzontale del razzo rispetto alla piattaforma misurato in 64 bit<br />

era un numero più grande del massimo consentito nell’aritmetica a 16 bit. Si<br />

ebbe quin<strong>di</strong> un errore <strong>di</strong> overflow che causò l’arresto del software <strong>di</strong> controllo<br />

del volo 37 secon<strong>di</strong> dopo il lancio del razzo. Dopo 3 secon<strong>di</strong> il razzo si <strong>di</strong>strusse.<br />

Figura 3.2: L’esplosione <strong>di</strong><br />

Ariane 5<br />

Il <strong>di</strong>sastro, invece, del veicolo spaziale della missione Mars Climate Orbiter<br />

non si trova sulla pagina web del prof. Douglas, ma i dettagli della storia si<br />

possono trovare, ad esempio, sul sito http://marsprogram.jpl.nasa.<br />

gov/msp98/orbiter.<br />

Il 23 settembre 1999 si perdono le tracce del veicolo spaziale<br />

Mars Climate Orbiter. Gli obiettivi <strong>di</strong> questa missione della NASA erano sia <strong>di</strong> monitoraggio<br />

dei cambiamenti climatici sia <strong>di</strong> supporto per la missione Mars Polar Lander. I costi<br />

della Climate Orbiter e della Polar Lander erano <strong>di</strong> un totale <strong>di</strong> oltre 320 milioni <strong>di</strong> dollari.<br />

20


3.2. Aritmetica <strong>di</strong> macchina<br />

Figura 3.3: La Mars Climate Orbiter<br />

unità metriche!<br />

Si era ipotizzato <strong>di</strong> entrare nell’atmosfera <strong>di</strong> Marte ad una altezza<br />

<strong>di</strong> circa 150 km mentre il veicolo spaziale entrò ad una altezza<br />

<strong>di</strong> circa 60 km. Per un errore <strong>di</strong> conversione delle unità <strong>di</strong><br />

misura, il velivolo entrò nell’atmosfera con una traiettoria inferiore<br />

rispetto a quella pianificata. La velocità del mezzo era molto<br />

elevata e portò alla <strong>di</strong>struzione non solo del veicolo spaziale ma<br />

anche della stessa Polar Lander.<br />

Diversi furono i motivi che portarono al fallimento <strong>di</strong> questa<br />

missione. Il principale è dovuto all’errore nel trasferimento <strong>di</strong> informazioni<br />

tra il team che lavorava sul veicolo spaziale, che si trovava<br />

in Colorado e il team della missione <strong>di</strong> navigazione, che lavorava<br />

in California. Un team usava le unità inglesi (inches, feet,<br />

pounds) mentre l’altro usava le unità metriche. L’errore fu nella<br />

mancata conversione delle unità <strong>di</strong> misura tra unità inglesi e<br />

3.2 Aritmetica <strong>di</strong> macchina<br />

Un qualunque numero reale può essere rappresentato accuratamente da una sequenza <strong>di</strong> infinite cifre<br />

decimali.<br />

Ad esempio:<br />

(<br />

1<br />

0<br />

3 = 0.3333333... = 10 0 + 3<br />

10 1 + 3<br />

10 2 + 3<br />

10 3 + 3 )<br />

10 4 ... × 10 0<br />

( 3<br />

π = 3.14159265358979... =<br />

10 0 + 1<br />

10 1 + 4<br />

10 2 + 1<br />

10 3 + 5 )<br />

10 4 ... × 10 0<br />

Osserviamo che abbiamo scritto 1/3 e π in base 10, usando, quin<strong>di</strong>, le cifre 0,1,2,...,9 per poterli<br />

rappresentare.<br />

In genere, un numero reale x può essere rappresentato in base N come<br />

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<br />

} {{ }<br />

parte intera<br />

} {{ }<br />

parte frazionaria<br />

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

In base 10, il numero 726.625, scritto in forma estesa è dato dalla forma:<br />

Esempio<br />

7 × 10 2 + 2 × 10 1 + 6 + 6 × 10 −1 + 2 × 10 −2 + 5 × 10 −3<br />

Tuttavia, i calcolatori hanno una memoria finita per poter rappresentare i numeri. Ciò significa che solo<br />

una sequenza finita <strong>di</strong> cifre possono essere usate. Inoltre, i calcolatori lavorano in base binaria, quin<strong>di</strong> ogni<br />

numero può essere rappresentato me<strong>di</strong>ante una sequenza <strong>di</strong> 0 e 1.<br />

Avendo in mente questi due fattori, possiamo ora capire la rappresentazione dei numeri al calcolatore,<br />

per cui ad ogni numero reale x è associato il numero <strong>di</strong> macchina denotato come f l(x), in rappresentazione<br />

floating point – virgola mobile.<br />

21


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

3.3 Conversione <strong>di</strong> base<br />

Nel seguito, non affronteremo gli aspetti teorici del passaggio da una base ad un altra per rappresentare<br />

lo stesso numero, ma vedremo l’implementazione pratica per convertire un numero dalla base 10 alla base 2<br />

e viceversa.<br />

Il passaggio <strong>di</strong> un numero dalla rappresentazione in base 2 alla rappresentazione in base 10 è semplice, in<br />

quanto si tratta <strong>di</strong> scrivere il numero come combinazione delle opportune potenze <strong>di</strong> 2. Ve<strong>di</strong>amo un esempio.<br />

Esempio<br />

Esempio 3.3.1 Sia 10001000.010 il numero scritto in base 2.<br />

Se lo scriviamo me<strong>di</strong>ante le potenze <strong>di</strong> 2 si ha:<br />

10001000.010 = 1 · 2 7 + 0 · 2 6 + 0 · 2 5 + 0 · 2 4 + 1 · 2 3 + 0 · 2 2 + 0 · 2 1 + 0 · 2 0 +<br />

} {{ }<br />

parte intera<br />

0 · 2 −1 + 1 · 2 −2 + 0 · 2 −2<br />

= 2 7 + 2 3 + 2 −2 = 128 + 8 + 0.25 = 136.25<br />

} {{ }<br />

parte frazionaria<br />

Questo è quin<strong>di</strong> lo stesso numero ma rappresentato in base 10.<br />

Il passaggio <strong>di</strong> un numero dalla rappresentazione in base 10 a quella in base 2 si effettua, invece, in due<br />

passi.<br />

GSi prende la parte intera del numero e la si <strong>di</strong>vide per 2: se il resto della <strong>di</strong>visione è zero, allora la corrispondente<br />

cifra binaria sarà 0; se il resto è <strong>di</strong>verso da zero, la corrispondente cifra binaria sarà 1. Si ripete<br />

la procedura sul risultato avuto dalla <strong>di</strong>visione, fino a quando si arriva a 1. In tal modo, calcoliamo le cifre<br />

binarie a partire da x 0 (il primo resto ottenuto) e andando avanti con in<strong>di</strong>ce crescente.<br />

GSi prende la parte frazionaria del numero e la si moltiplica per 2. Se il risultato dell’operazione ha la<br />

parte intera <strong>di</strong>versa da zero, allora la corrispondente cifra binaria vale 1, altrimenti vale 0. Si ripete la procedura<br />

sulla parte frazionaria del risultato appena ottenuto e si continua fino a quando si arriva allo zero (o se<br />

si vede che c’è una perio<strong>di</strong>cità nei risultati). Le cifre binarie vengono costruite da x −1 con in<strong>di</strong>ce decrescente.<br />

Esempio<br />

Esempio 3.3.2 Vogliamo convertire il numero 725.625 dalla base 10 nella base 2.<br />

Per la parte intera si ha:<br />

Per la parte decimale si ha :<br />

: 2 = quoziente resto<br />

.625 × 2 = 1.250 x<br />

725 362 1 x −1 = 1<br />

0<br />

.250 × 2 = 0.50 x<br />

362 181 0 x −2 = 0<br />

1<br />

.5 × 2 = 1.0 x<br />

181 90 1 x −3 = 1<br />

2<br />

.0 × 2 = 0.0<br />

90 45 0 x 3<br />

1 0 1 x 9<br />

45 22 1 x 4<br />

22 11 0 x 5<br />

11 5 1 x 6<br />

5 2 1 x 7<br />

2 1 0 x 8<br />

In base 2 il numero <strong>di</strong>venta 1011010101.101.<br />

Osserviamo che un numero può avere una rappresentazione finita in base 10 e infinita in base 2. Ve<strong>di</strong>amo<br />

in dettaglio un esempio:<br />

22


3.4. Rappresentazione IEEE dei numeri <strong>di</strong> macchina<br />

Esempio<br />

Esempio 3.3.3 Scriviamo il numero 11 , che è 1.1 in base 10, nella base 2.<br />

10<br />

Per la parte intera:<br />

Per la parte decimale:<br />

: 2 = quoziente resto<br />

.1 × 2 = 0.2 x<br />

1 0 1 x −1 = 0<br />

0<br />

.2 × 2 = 0.4 x −2 = 0<br />

.4 × 2 = 0.8 x −3 = 0<br />

.8 × 2 = 1.6 x −3 = 1<br />

.6 × 2 = 1.2 x −4 = 1<br />

.2 × 2 = 0.4 x −5 = 0<br />

.4 × 2 = 0.8 x −6 = 0<br />

.8 × 2 = 1.6 x −7 = 1<br />

.6 × 2 = 1.2 x −8 = 1<br />

.2 × 2 = 0.4 x −9 = 0<br />

Osserviamo che nella parte decimale si ripetono all’infinito le cifre 0011. Il numero in base 2 si scrive<br />

quin<strong>di</strong> come: 1.00011<br />

} {{ } 0011 } {{ } ...<br />

3.4 Rappresentazione IEEE dei numeri <strong>di</strong> macchina<br />

Lo sviluppo dei calcolatori ha promosso e sviluppato l’uso del sistema binario, in cui ciascun numero è<br />

rappresentato da una successione <strong>di</strong> cifre binarie (0 e 1). Ma come avviene la rappresentazione <strong>di</strong> un numero<br />

nel calcolatore Come rappresentare un numero a infinite cifre in maniera accurata utilizzando solo un<br />

numero finito <strong>di</strong> cifre<br />

Lo standard IEEE (Institute of Electrical and Electronics Engineers), oggi utilizzato dalla maggior parte dei<br />

calcolatori, è dato dalla rappresentazione in virgola mobile (floating point). Esiste anche un tipo <strong>di</strong> rappresentazione<br />

in virgola fissa (fixed point), ma in genere è preferita quella in floating point, e noi ci soffermeremo<br />

solo su questa.<br />

Ripren<strong>di</strong>amo l’esempio proposto in Sezione 3.2, dove abbiamo scritto 1 in base 10 come<br />

3<br />

(<br />

1<br />

0<br />

3 = 0.3333333... = 10 0 + 3<br />

10 1 + 3<br />

10 2 + 3<br />

10 3 + 3 )<br />

10 4 ... × 10 0<br />

Questo è un esempio <strong>di</strong> numero scritto in virgola mobile: un qualunque numero x, in base 10, si può<br />

scrivere sotto la forma x = f 10 e dove f rappresenta la mantissa del numero e e è l’esponente (intero) della<br />

base con cui stiamo rappresentando il numero stesso, che dà informazioni sulla parte intera del numero.<br />

Ci sono <strong>di</strong>verse rappresentazioni in virgola mobile, tutte equivalenti tra loro. Per esempio 12.5 = 1.25 ×<br />

10 1 = 0.125×10 2 = 0.000125×10 5 . Si parla <strong>di</strong> virgola mobile normalizzata quando la mantissa ha una singola<br />

cifra <strong>di</strong> valore <strong>di</strong>verso da zero a sinistra della virgola, quin<strong>di</strong>, in base 2, la mantissa è del tipo 1.qual cosa.<br />

La rappresentazione in virgola mobile normalizzata in base 2 è quella utilizzata nello standard IEEE: i<br />

numeri si possono scrivere nella forma x = f 2 e . Al calcolatore, tuttavia, non possiamo rappresentare numeri<br />

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 ,<br />

e e Ne−1 ,e Ne−2 ,...,e 0 sono le cifre che caratterizzano rispettivamente la mantissa e l’esponente del numero<br />

in virgola mobile normalizzata in base 2, e quin<strong>di</strong> possono valere 1 o 0. Abbiamo n cifre per la mantissa (in<br />

realtà sono n + 1 ma poichè la rappresentazione è normalizzata f 0 = 1) e Ne per l’esponente. Nel sistema<br />

binario, le cifre vengono chiamate bits ( binary <strong>di</strong>gits): quin<strong>di</strong> n bits sono riservati per la mantissa, Ne per<br />

l’esponente.<br />

23


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

Un numero in floating point nella rappresentazione IEEE viene scritto come<br />

x = ±(1 + f −1 2 −1 + f −2 2 −2 + ... + f −n 2 −n ) × 2 e<br />

dove<br />

G 1+ f −1 2 −1 + f −2 2 −2 +...+ f −n 2 −n è la mantissa, normalizzata, cui sono riservati<br />

un numero n <strong>di</strong> bits,<br />

G e è la potenza della base 2 cui sono riservati un numero Ne <strong>di</strong> bits ed è<br />

limitato a variare in un determinato intervallo [L,U ].<br />

Il primo 1 della mantissa (che corrisponde a f 0 ) non viene messo in memoria ma c’è. La rappresentazione<br />

in virgola mobile può essere schematizzata nel modo seguente (s, e ed f rappresentano i bits riservati rispettivamente<br />

per il segno della mantissa, e per le cifre dell’esponente e della mantissa – ogni celletta può avere<br />

il valore 0 o 1):<br />

s e e e e e ··· ··· e f f f f f ··· ··· f<br />

}{{}<br />

segno<br />

} {{ }<br />

cifre dell’esponente<br />

} {{ }<br />

cifre della mantissa<br />

Abbiamo 1 bit riservato al segno (si ha 0 per il segno + e 1 per il segno −), un numero Ne <strong>di</strong> bits per<br />

l’esponente 2 e , e un numero n <strong>di</strong> bits per la mantissa.<br />

La scelta del numero <strong>di</strong> bits da riservare all’esponente e alla mantissa si basa su un compromesso tra la<br />

<strong>di</strong>mensione dell’esponente (e quin<strong>di</strong> il più piccolo e il più grande numero rappresentabile) e la <strong>di</strong>mensione<br />

della mantissa (e quin<strong>di</strong> la precisione del numero rappresantibile, più o meno cifre decimali).<br />

Nel sistema IEEE, la rappresentazione in singola precisione è a 32 bits mentre quella in doppia precisione<br />

è a 64 bits. La sud<strong>di</strong>visione dei bits tra esponente e mantissa viene ripartita nel modo seguente:<br />

s Ne n # totale bits<br />

Singola precisione 1 8 23 32<br />

Doppia precisione 1 11 52 64<br />

Gli esponenti possono essere sia positivi sia negativi ma si preferisce memorizzarli come interi positivi<br />

(senza segno). Abbiamo dunque bisogno <strong>di</strong> una tecnica che permetta <strong>di</strong> rappresentare esponenti negativi<br />

come interi positivi. La tecnica utilizzata nello standard IEEE è chiamata <strong>di</strong> biasing (<strong>di</strong>storsione): un numero<br />

positivo (detto bias) viene aggiunto all’esponente (sia esso positivo o negativo) in modo che il risultato finale<br />

sia sempre positivo. Ed è questo valore che viene memorizzato per rappresentare l’esponente. L’esponente<br />

viene quin<strong>di</strong> rappresentato in forma biased (parziale, influenzata da un altro numero): se e è l’esponente<br />

effettivo, noi memorizziamo il valore b + e dove b è il bias dato b = 0111...1<br />

} {{ }<br />

, vale a <strong>di</strong>re b = 1 + 2 + 2 2 + ... +<br />

Ne bits<br />

2 Ne−2 +0·2 Ne−1 = 1 − 2Ne−1<br />

= 2 Ne−1 −1 (si veda la nota per capire perchè si ha questo risultato nella somma).<br />

1 − 2<br />

Per trovare il limite superiore e inferiore entro cui può variare e, dobbiamo tener conto del fatto che, nella<br />

rappresentazione IEEE, due patterns <strong>di</strong> bits sono riservati per rappresentare numeri speciali quali lo zero,<br />

infinito e il Not-a-Number, precisamente 0000...0 e 1111...1.<br />

Quin<strong>di</strong>, b + e non può essere uguale nè a 0000...0, nè a 1111...1. Ciò significa che il massimo esponente<br />

che si può rappresentare è dato sottraendo a 1111...1 il valore 1 in base 2, cioè da 1111...1 − 0000...01 =<br />

1111...10.<br />

Si ha b + e ≤ 1111...10, o equivalentemente, 0111...1 + e ≤ 1111...10, da cui ricaviamo<br />

e ≤ 1111...10 − 0111...1 = 0111...1 = b<br />

.<br />

Il limite superiore U è proprio uguale a b.<br />

24


3.4. Rappresentazione IEEE dei numeri <strong>di</strong> macchina<br />

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

−b < e ⇔ −b + 0000...01 ≤ e.<br />

Osserviamo che siamo passati da una <strong>di</strong>seguaglianza in senso stretto (


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

Esempio<br />

Esempio 3.4.1 Vogliamo scrivere il numero 5.75 10 in formato IEEE in singola precisione.<br />

Effettuiamo prima la conversione in base 2:<br />

Per la parte intera:<br />

Per la parte decimale:<br />

1 0 1 x 2 .0 × 2 = 0.0<br />

5 2 1 x 0<br />

.75 × 2 = 1.50 x −1 = 1<br />

2 1 0 x 1<br />

.5 × 2 = 1.0 x −2 = 1<br />

Quin<strong>di</strong> 5.75 10 = 101.11 2 = 1.0111 × 2 2 .<br />

Memorizziamo ora il numero in singola precisione:<br />

Per l’esponente, essendo p = 2, si ha:<br />

(b + p) 10 = (127 + 2) 10 = 129 10 = 10000001 2<br />

Per la mantissa, m = 23 e si deve trascurare l’1 della normalizzazione, quin<strong>di</strong> memorizzeremo le cifre<br />

0111 e poi avremo tutti 0.<br />

0 1 1 1 0 0 0 ... 0 0 0 0 0 0 0 0 0 0<br />

Il segno è positivo, quin<strong>di</strong> s = 0<br />

Perciò la memorizzazione, considerati i bits per il segno, l’esponente e la mantissa è:<br />

0 1 0 0 0 0 0 0 1 0 1 1 1 0 ... 0 0 0 0 0<br />

}{{}<br />

s<br />

} {{ }<br />

esponente<br />

} {{ }<br />

manti ssa<br />

Consideriamo, ora, la rappresentazione dei numeri speciali.<br />

Per convenzione si pone uguale a 0 la rappresentazione che vede tutti zero sia nel segno, sia nell’esponente<br />

che nella mantissa (non <strong>di</strong>mentichiamo che il valore 1 della normalizzazione non è messo in memoria<br />

ma c’è e quin<strong>di</strong> non potremmo mai avere il valore 0, perciò lo si pone per convenzione).<br />

Per i valori ±∞ si considerano tutti 1 nello spazio de<strong>di</strong>cato all’esponente, tutti 0 nello spazio de<strong>di</strong>cato alla<br />

mantissa e 0 o 1 per il segno, a seconda che sia + o −∞.<br />

0 / 1 1 1 1 ... 1 1 0 0 0 ... 0 0<br />

}{{}<br />

s<br />

} {{ }<br />

esponente<br />

} {{ }<br />

mantissa<br />

I valori ±∞ si hanno se si fa una <strong>di</strong>visione per zero o si fa un calcolo che comporta overflow.<br />

Si ha invece il Not-a-Number (NaN) come risultato <strong>di</strong> operazioni non definite, come 0/0 o log0.<br />

A seconda della macchina si ha:<br />

NaNS, che produce un segnale <strong>di</strong> errore<br />

0 1 1 1 ... 1 1 0 1 1 ... 1 1<br />

}{{}<br />

s<br />

} {{ }<br />

esponente<br />

} {{ }<br />

mantissa<br />

NaNQ, con il quale il calcolo continua comunque...<br />

0 1 1 1 ... 1 1 1 0 0 ... 0 0<br />

}{{}<br />

s<br />

3.5 Precisione numerica<br />

} {{ }<br />

esponente<br />

} {{ }<br />

mantissa<br />

Un numero può avere una rappresentazione finita o infinita. Basti pensare al valore <strong>di</strong> π o a 2 in base 10.<br />

Abbiamo anche visto che un numero può avere rappresentazione finita in una base ma infinita in un’altra.<br />

Quando rappresentiamo un numero al calcolatore è possibile memorizzare solo un certo numero <strong>di</strong> cifre:<br />

in che modo lo esprimiamo<br />

26


3.6. Propagazione <strong>degli</strong> errori<br />

Per lasciare maggiore generalità al <strong>di</strong>scorso, consideriamo una base N .<br />

Sia x = ±( ∑ ∞<br />

k=0 x −k N −k )N p il numero esatto (può avere infinite cifre decimali e lo rappresentiamo come<br />

somma <strong>di</strong> infiniti termini).<br />

In floating-point esso sarà espresso come x ∗ = ±( ∑ t−1<br />

k=0 x∗ −k N −k )N p∗ , esso, cioè, sarà arrotondato (non<br />

possiamo avere infinite cifre decimali e, <strong>di</strong>fatti, la somma considera solo t termini).<br />

Ci sono due mo<strong>di</strong> per arrotondare un numero<br />

G troncamento: x ∗ = tr onc(x), dove p ∗ = p e x ∗ −k = x −k per k = 0,..., t − 1. Le altre cifre, x −t , x −t−1 ,...<br />

sono ignorate.<br />

G arrotondamento simmetrico: x ∗ = ar r (x) = tr onc(x + 1 2 N −t+1 N p ), aggiungiamo un’unità a x −t+1 se<br />

x −t ≥ N /2.<br />

L’errore assoluto |x − x ∗ | che si commette approssimando il numero x con x ∗ sarà 2<br />

⎧<br />

⎨N N p nel troncamento<br />

|x − x ∗ | ≤ 1<br />

⎩<br />

2 N 1−t N p nell’arrotondamento<br />

Per l’errore relativo |x − x∗ |<br />

, invece, si ha:<br />

|x|<br />

⎧<br />

|x − x ∗ |<br />

⎨N 1−t nel troncamento<br />

≤ 1<br />

|x| ⎩<br />

2 N 1−t nell’arrotondamento<br />

Il valore 1 2 N 1−t è il numero conosciuto come precisione <strong>di</strong> macchina.<br />

Nel caso della rappresentazione IEEE <strong>di</strong> un numero, si ha t−1 = n, (ricor<strong>di</strong>amo che nella rappresentazione<br />

IEEE si memorizza il numero normalizzato), da cui l’errore <strong>di</strong> arrotondamento relativo che si commette è<br />

|x − x ∗ |<br />

≤ 2 −(n+1) .<br />

|x|<br />

In singola precisione (n = 23), avremo<br />

Esempio<br />

|x − x ∗ |<br />

≤ 2 −24 ≈ 5.96 × 10 −8<br />

|x|<br />

ciò significa che avremo 8 cifre decimali corrette.<br />

In doppia precisione (n = 52) avremo<br />

|x − x ∗ |<br />

≤ 2 −53 ≈ 1.11 × 10 −16<br />

|x|<br />

ciò significa che avremo 16 cifre decimali corrette.<br />

3.6 Propagazione <strong>degli</strong> errori<br />

Prima <strong>di</strong> vedere come si propagano gli errori nelle operazioni elementari <strong>di</strong> moltiplicazione, <strong>di</strong>visione,<br />

ad<strong>di</strong>zione e sottrazione, ve<strong>di</strong>amo il concetto <strong>di</strong> cifre significative.<br />

Le cifre significative sono quelle che danno un’informazione effettiva sul valore del numero,<br />

in<strong>di</strong>pendentemente dalla parte esponenziale.<br />

2 Evitiamo <strong>di</strong> effettuare tutti i passaggi che portano alle formule dell’errore assoluto e relativo, che sono il risultato <strong>di</strong> maggiorazioni<br />

<strong>di</strong> serie geometriche.<br />

27


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

Se scriviamo il numero in virgola mobile normalizzata, le cifre significative sono date dalle cifre della<br />

parte frazionaria. La bontà delle cifre va <strong>di</strong>minuendo procedendo da sinistra verso destra e questo può portare<br />

ad una per<strong>di</strong>ta <strong>di</strong> cifre significative, come possiamo vedere stu<strong>di</strong>ando la propagazione <strong>degli</strong> errori nelle<br />

operazioni elementari.<br />

Supponiamo che i numeri su cui lavoriamo siano affetti da errore (<strong>di</strong> arrotondamento), mentre le operazioni<br />

siano eseguite in modo esatto. In<strong>di</strong>chiamo con il simbolo o una qualunque delle operazioni elementari<br />

{×,/,+,−} e in<strong>di</strong>chiamo con f l(x) il numero x rappresentato in floating point e arrotondato, quin<strong>di</strong><br />

f l(x) = x(1 + e x ) dove e x è l’errore <strong>di</strong> arrotondamento.<br />

Allora f l(x o y) = f l(x)o f l (y) = x(1 + e x )o y(1 + e y ).<br />

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 )<br />

Quin<strong>di</strong> l’errore nel prodotto è dato da e x y = e x + e y<br />

G Divisione (con y ≠ 0) 4 x(1 + e x )<br />

y(1 + e y ) = x y (1 + e x)(1 − e y + e 2 y + ...) ≈ x y (1 + e x − e y )<br />

Si ha e x/y = e x − e y : gli errori si accumulano ad<strong>di</strong>tivamente<br />

G Ad<strong>di</strong>zione (e, analogamente, Sottrazione)<br />

L’errore è e x+y =<br />

x(1 + e x ) + y(1 + e y ) = x + y + xe x + ye y = (x + y)(1 + x<br />

x + y e x +<br />

y<br />

x + y e y )<br />

x<br />

x + y e x +<br />

y<br />

x + y e y , una combinazione lineare che <strong>di</strong>pende da x e y.<br />

– x y > 0 =⇒ |e x+y | ≤ |e x | + |e y |<br />

– x y < 0 =⇒ |x|<br />

|x + y| e |y|<br />

possono essere molto gran<strong>di</strong> e, in tal caso, ci sarà un’amplificazione<br />

|x + y|<br />

notevole dell’errore. Si ha il fenomeno <strong>di</strong> cancellazione se non si fa attenzione al numero <strong>di</strong> cifre<br />

significative dei numeri che vengono sommati.<br />

Sulla cancellazione<br />

Supponiamo <strong>di</strong> avere due numeri molto vicini tra loro, in cui le prime p + 2 cifre della parte frazionaria<br />

sono buone mentre le altre sono corrotte. Inoltre, le prime p cifre siano le stesse per entrambi i numeri<br />

(usiamo i simboli v v v v v e w w w w w w per esprimere le cifre corrotte):<br />

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

f l(y) = 1.d −1 d −2 ...d −p b ′ −(p+1) b′ −(p+2) w w w w × 2e<br />

Quando an<strong>di</strong>amo a fare la sottrazione le prime p cifre buone si annullano. Da p + 2 cifre buone, ne abbiamo<br />

ora solo 2 e tutte le altre sono quelle corrotte. Con la normalizzazione il risultato <strong>di</strong>venta del tipo (ora qqqqq<br />

sono le cifre corrotte):<br />

f l(x − y) = 1.b −1 ′′ b′′ −2qqqqqq × 2e<br />

Ricor<strong>di</strong>amo, infine, che in aritmetica <strong>di</strong> macchina non valgono più la proprietà <strong>di</strong>stributiva o associativa<br />

del prodotto.<br />

3 Nei calcoli sono trascurabili le potenze maggiori o uguali a due per e x e e y<br />

4 1<br />

Possiamo scrivere = (1 − e y + e 2 y<br />

1 + e + ...) come risultato della formula polinomiale <strong>di</strong> Taylor della funzione f (e 1<br />

y ) = <strong>di</strong><br />

y 1 + e y<br />

centro 0.<br />

28


3.6. Propagazione <strong>degli</strong> errori<br />

Esempio<br />

Esempio 3.6.1 Sia x = 0.1103 e y = 0.009963. Se consideriamo un sistema decimale a 4 cifre,<br />

normalizzando i numeri, abbiamo x = 1.103 · 10 −1 e y = 9.963 · 10 −3<br />

Facendo la sottrazione <strong>di</strong> questi due numeri, abbiamo 1.103 · 10 −1 − 9.963 · 10 −3 = 0.1103 − 0.009963 =<br />

0.100337. Facendo l’arrotondamento a 4 cifre abbiamo il valore 1.0034 · 10 −1 .<br />

|0.100337 − 0.10034|<br />

L’errore relativo che commettiamo è: ≈ 2.99 × 10 −5 . Questo errore è minore della<br />

0.100337<br />

precisione <strong>di</strong> macchina (considerata la base 10 e le 4 cifre) 1 2 · 10−3 .<br />

Tuttavia, se non teniamo conto delle cifre significative ma tronchiamo i numeri alle prime 4 cifre,<br />

abbiamo la sottrazione <strong>di</strong> 0.1103 − 0.0099 = 0.1004.<br />

|0.100337 − 0.1004|<br />

Questa volta l’errore relativo è ≈ .63 × 10 −3 . L’errore è maggiore della precisione <strong>di</strong><br />

0.100337<br />

macchina.<br />

Esempio<br />

Esempio 3.6.2 Sia da risolvere l’equazione ax 2 + bx + c = 0 con a = 1, b = −56 e c = 1, quin<strong>di</strong> x 2 − 56x +<br />

1 = 0, in una macchina a 4 cifre decimali (normalizzata).<br />

Applicando la formula x 1/2 = −b ± b 2 − 4ac<br />

abbiamo x 1/2 = 28 ± 783 = 28 ± 27.98213716 =<br />

{ 2a<br />

0.01786284073<br />

. L’arrotondamento delle due ra<strong>di</strong>ci in virgola mobile normalizzata a 4 cifre decimali<br />

55.98213716<br />

dà: x 1 = 1.7863 · 10 −2 e x 2 = 5.5982 · 10 1 .<br />

Consideriamo ora la macchina a 4 cifre decimali per risolvere l’equazione:<br />

x 1 = 28 − 783 = 2.8 · 10 1 − 2.7982 · 10 1 = 0.0018 · 10 1 = 0.018 = 1.8 · 10 −2<br />

x 2 = 28 + 783 = 2.8 · 10 1 + 2.7982 · 10 1 = 5.5982 · 10 1<br />

La ra<strong>di</strong>ce x 2 è arrotondata correttamente, mentre la variabile x 1 no, per effetto della cancellazione.<br />

Per ricavare x 1 con l’arrotondamento corretto, applichiamo la formula x 1 x 2 = c/a, che, nel nostro caso,<br />

vale x 1 x 2 = 1 da cui x 1 = 1/x 2 = 1/(5.5982 · 10 1 ) = 1.7863 · 10 −2 . Abbiamo fatto un’operazione che non<br />

risente del fenomeno <strong>di</strong> cancellazione numerica!<br />

Esempio<br />

Esempio 3.6.3 Ve<strong>di</strong>amo come non valga più la relazione (a − b) 2 = a 2 − 2ab + b 2 .<br />

Sia a = 15.6 e b = 15.7 e la macchina sia a 3 cifre decimali (questa volta lavoriamo su una macchina non<br />

normalizzata, per cui scriveremo la parte frazionaria come 0.qual cosa. Ripetere poi l’esempio lavorando<br />

su una macchina a 2 cifre decimali normalizzata e su una macchina a 3 cifre decimali normalizzata.<br />

Cosa si osserva)<br />

(a − b) = (a − b) ∗ + e a−b . Abbiamo (a − b) ∗ = 15.6 − 15.7 = −0.1.<br />

Quin<strong>di</strong> (a − b) 2 = +0.01 = 0.1 · 10 −1 .<br />

Consideriamo ora a 2 − 2ab + b 2 = 243.36 − 489.84 + 246.49 = 0.24336 · 10 3 − 0.48984 · 10 3 + 0.24649 · 10 3<br />

Considerando la macchina a 3 cifre decimali, abbiamo: 0.243 · 10 3 − 0.490 · 10 3 + 0.246 · 10 3 = −0.1 · 10 1<br />

I risultati sono completamente <strong>di</strong>versi!<br />

29


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

Esempio<br />

Esempio 3.6.4 Consideriamo il problema <strong>di</strong> approssimare la derivata della funzione f (x) = sin x nel<br />

punto x = 1.2.<br />

Supponiamo <strong>di</strong> non poter valutare <strong>di</strong>rettamente la derivata della f e <strong>di</strong> volerla approssimare applicando<br />

la formula polinomiale <strong>di</strong> Taylor:<br />

Allora<br />

f (x 0 + h) = f (x 0 ) + h f ′ (x 0 ) + h2<br />

2 f ′′ (x 0 ) + h3<br />

6 f ′′′ (x 0 ) + h4<br />

24 f IV (x 0 ) + ...<br />

f ′ (x 0 ) = f (x 0 + h) − f (x 0 )<br />

− ( h h<br />

2 f ′′ (x 0 ) + h2<br />

6 f ′′′ (x 0 ) + h3<br />

24 f IV (x 0 ) + ...)<br />

Approssimiamo, quin<strong>di</strong>, la f ′ (x 0 ) calcolando f (x 0 + h) − f (x 0 )<br />

.<br />

h<br />

L’errore, detto errore <strong>di</strong> <strong>di</strong>scretizzazione, che si commette è<br />

|f ′ (x 0 ) − f (x 0 + h) − f (x 0 )<br />

| = | h h<br />

2 f ′′ (x 0 ) + h2<br />

6 f ′′′ (x 0 ) + h3<br />

24 f IV (x 0 ) + ...|<br />

Supponendo <strong>di</strong> conoscere il valore della derivata seconda in x 0 , per piccoli valori <strong>di</strong> h possiamo dare una<br />

stima dell’errore <strong>di</strong> <strong>di</strong>scretizzazione,<br />

|f ′ (x 0 ) − f (x 0 + h) − f (x 0 )<br />

| ≈ h h<br />

2 |f ′′ (x 0 )|<br />

Ci aspettiamo, anche senza conoscere il valore <strong>di</strong> f ′′ (x 0 ) (purchè <strong>di</strong>verso da 0) che l’errore <strong>di</strong><br />

<strong>di</strong>scretizzazione <strong>di</strong>minuisca proporzionalmente con il passo h, al decrescere <strong>di</strong> h.<br />

Nel nostro caso, in cui f (x) = sin(x), noi conosciamo il valore esatto della derivata in 1.2, cos(1.2) =<br />

0.362357754476674... e possiamo dunque calcolare l’errore esatto che commettiamo approssimando la<br />

derivata <strong>di</strong> sin x con la formula che abbiamo ricavato.<br />

Per h = 0.1 non abbiamo un’approssimazione accurata. Ci aspettiamo che <strong>di</strong>minuendo il passo h l’errore<br />

che commettiamo <strong>di</strong>minuisca.<br />

Riportiamo gli errori della formula (in valore assoluto) e confrontiamoli con l’errore <strong>di</strong> <strong>di</strong>scretizzazione<br />

h<br />

2 |f ′′ (x 0 )| (i conti sono fatti in singola precisione):<br />

h errore<br />

h<br />

2 |f ′′ (x 0 )|<br />

1.e-1 4.7167e-2 4.6602e-2<br />

1.e-2 4.6662e-3 4.6602e-3<br />

1.e-3 4.6608e-4 4.6602e-4<br />

1.e-4 4.6603e-5 4.6602e-5<br />

1.e-5 4.6602e-6 4.6602e-6<br />

1.e-6 4.6597e-7 4.6602e-7<br />

L’errore commesso dall’algoritmo decresce come h e, in particolare, come h 2 |f ′′ (1.2)| = 0.46602h.<br />

Possiamo pensare <strong>di</strong> ottenere un’accuratezza grande quanto vogliamo a con<strong>di</strong>zione <strong>di</strong> prendere valori <strong>di</strong><br />

h sempre più piccoli. In realtà, per valori <strong>di</strong> h molto piccoli, gli errori iniziano ad aumentare!<br />

30


3.7. Instabilità e malcon<strong>di</strong>zionamento<br />

h errore<br />

h<br />

2 |f ′′ (x 0 )|<br />

1.e-8 4.3611e-10 4.6602e-9<br />

1.e-9 5.5947e-8 4.6602e-10<br />

1.e-10 1.6697e-7 4.6602e-11<br />

1.e-11 4.6603e-5 4.6602e-12<br />

1.e-12 1.3006e-4 4.6602e-13<br />

1.e-13 4.2505e-4 4.6602e-14<br />

1.e-16 3.6236e-1 4.6602e-16<br />

1.e-18 3.6236e-1 4.6602e-19<br />

In Figura 3.4 ve<strong>di</strong>amo come la curva dell’errore inizialmente segue la retta descritta dall’errore <strong>di</strong> <strong>di</strong>scretizzazione<br />

ma poi si allontana da essa. Perchè questo <strong>di</strong>verso comportamento per valori <strong>di</strong> h molto<br />

piccoli Dobbiamo tenere presente che l’errore che noi valutiamo non è semplicemente l’errore <strong>di</strong> <strong>di</strong>scretizzazione<br />

ma la somma dell’errore <strong>di</strong> <strong>di</strong>scretizzazione e dell’errore <strong>di</strong> arrotondamento! Per valori<br />

<strong>di</strong> h gran<strong>di</strong>, l’errore <strong>di</strong> <strong>di</strong>scretizzazione descresce al <strong>di</strong>minuire <strong>di</strong> h e domina sull’errore <strong>di</strong> arrotondamento.<br />

Ma quando l’errore <strong>di</strong> <strong>di</strong>scretizzazione <strong>di</strong>venta molto piccolo, per valori <strong>di</strong> h minori <strong>di</strong> 10 −8 ,<br />

allora l’errore <strong>di</strong> arrotondamento inizia a dominare e ad aumentare sempre più al <strong>di</strong>minuire <strong>di</strong> h. Questo<br />

è un motivo per cui si deve cercare <strong>di</strong> far prevalere l’errore <strong>di</strong> <strong>di</strong>scretizzazione in un proce<strong>di</strong>mento<br />

numerico. Nell’errore <strong>di</strong> arrotondamento, per h via via più piccoli, si verifica un errore <strong>di</strong> cancellazione:<br />

f (x 0 + h) è praticamente uguale a f (x 0 ) per h molto piccoli! per cui l’errore che calcoliamo è<br />

|f ′ (x 0 ) − 0| = f ′ (x 0 ) = 0.3623577544....<br />

Una strategia per evitare la cancellazione è <strong>di</strong> scrivere <strong>di</strong>versamente la <strong>di</strong>fferenza f (x 0 + h) −<br />

f (x 0 ). Nel caso <strong>di</strong> f (x) = sin(x) ricorriamo alla formula trigonometrica per cui sin(φ) − sin(ψ) =<br />

2cos( φ + ψ )sin( φ − ψ ).<br />

2 2<br />

Ve<strong>di</strong>amo come migliorano le cose inserendo nel grafico 3.4 anche la curva dell’errore che otteniamo<br />

utilizzando questa espressione trigonometrica. L’errore continua a <strong>di</strong>minuire anche quando la formula<br />

precedente dà un errore crescente. Sempre in Figura 3.4, e in riferimento alla formula “non buona”,<br />

abbiamo considerato la curva dell’errore <strong>di</strong> arrotondamento in modo da confrontare l’andamento effettivo<br />

dell’errore con un limite superiore teorico dell’errore computazionale totale dato dalla somme<br />

<strong>degli</strong> errori <strong>di</strong> <strong>di</strong>scretizzazione e <strong>di</strong> arrotondamento. La rappresentazione <strong>di</strong> f (x) è affetta da errore per<br />

cui avremo: f (x) = f ∗ (x) + e x . L’errore <strong>di</strong> arrotondamento è f (x 0 + h) − f (x 0 )<br />

= f ∗ (x 0 + h) − f ∗ (x 0 )<br />

+<br />

h<br />

h<br />

e x0 +h − e x0<br />

. Maggiorando e x con la precisione <strong>di</strong> macchina ɛ, l’errore <strong>di</strong> arrotondamento è dato da<br />

h<br />

2ɛ/h: per h piccoli è l’errore che predomina!<br />

3.7 Instabilità e malcon<strong>di</strong>zionamento<br />

3.7.1 Instabilità<br />

In generale è impossibile evitare un accumulo lineare <strong>degli</strong> errori <strong>di</strong> arrotondamento durante un calcolo,<br />

ed è accettabile che ci sia una crescita lineare moderata, del tipo<br />

E n ≈ c 0 nE 0<br />

dove E n misura l’errore relativo dell’n-sima operazione dell’algoritmo 5 e c 0 sia una costante non molto<br />

grande.<br />

Se invece avviene una crescita <strong>di</strong> tipo esponenziale<br />

E n ≈ c n 1 E 0<br />

5 Per algoritmo inten<strong>di</strong>amo un proce<strong>di</strong>mento <strong>di</strong> calcolo. Per una definizione più approfon<strong>di</strong>ta si veda pag. al Capitolo .<br />

31


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

Figura 3.4: In alto: errore <strong>di</strong> <strong>di</strong>scretizzazione ed effettivo approssimando f ′ (x 0 ) con il rapporto incrementale<br />

f (x 0 + h) − f (x 0 )<br />

. In basso: errori <strong>di</strong> <strong>di</strong>scretizzazione, <strong>di</strong> arrotondamento, ed errore effettivo approssimando<br />

f ′ (x 0 ) con il rapporto incrementale f (x 0 + h) − f (x 0 )<br />

h<br />

, ed errore che si commette applicando la formula<br />

h<br />

trigonometrica per cui f (x 0 + h) − f (x 0 ) = sin(x 0 + h) − sin(x 0 ) = 2cos(2x 0 + h/2)sin(h/2).<br />

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

Definizione 3.7.1 Un proce<strong>di</strong>mento numerico si <strong>di</strong>ce instabile se gli errori che vi sono associati non rimangono<br />

limitati ma crescono fino a <strong>di</strong>struggere completamente la soluzione.<br />

32


3.7. Instabilità e malcon<strong>di</strong>zionamento<br />

Esempio<br />

Esempio 3.7.1 Consideriamo l’integrale<br />

∫ 1<br />

x n<br />

y n =<br />

0 x + 10 dx<br />

per valori <strong>di</strong> n = 1,2,...,30. Osserviamo che, poichè x ∈ [0,1], la funzione integranda varia pure essa<br />

nell’intervallo [0,1] per cui 0 < y n < 1.<br />

Analiticamente, si ha:<br />

∫ 1<br />

x n + 10x n−1 ∫ 1<br />

x n−1 (x + 10)<br />

y n + 10y n−1 =<br />

dx =<br />

dx =<br />

0 x + 10<br />

0 x + 10<br />

Vale anche la relazione<br />

y 0 =<br />

∫ 1<br />

0<br />

1<br />

dx = ln(11) − ln(10).<br />

x + 10<br />

∫ 1<br />

0<br />

x n−1 dx = 1 n<br />

Possiamo pensare, quin<strong>di</strong>, <strong>di</strong> calcolare numericamente il valore <strong>di</strong> y n attraverso il seguente algoritmo:<br />

1. valutare y 0 = ln(11) − ln(10)<br />

2. per n = 1,2,...,30 valutare y n = 1 n − 10y n−1<br />

Questa formula ricorsiva darebbe l’esatto valore se non fossero presenti errori <strong>di</strong> arrotondamento che ci<br />

allontanano completamente dalla soluzione vera. L’errore si moltiplica esponenzialmente. Infatti<br />

y 1 = 1 − 10y 0<br />

y 2 = 1 2 − 10(1 − 10y 0) = 1 2 − 10 + (−10)2 y 0<br />

y 3 = 1 3 − 10( 1 2 − 10 + 102 y 0 ) = −10 3 y 0 + cost ante<br />

. . . .<br />

y n = (−10) n y 0 + cost ante n<br />

L’algoritmo quin<strong>di</strong>, considerati gli errori <strong>di</strong> arrotondamento, presenta un errore E n con crescita <strong>di</strong> tipo<br />

esponenziale. Difatti otteniamo valori che via via si allontanano dall’intervallo <strong>di</strong> ammissibilità [0,1].<br />

I risultati che ricaviamo sono i seguenti (osserviamo che sono leggermente <strong>di</strong>versi a seconda dal<br />

linguaggio usato, proprio per effetto dell’instabilità).<br />

Da un programma in Fortran:<br />

Da un programma Matlab:<br />

n y n<br />

0 9.5310e-2<br />

1 4.6898e-2<br />

2 3.1021e-2<br />

3 2.3122e-2<br />

4 1.8778e-2<br />

... ....<br />

7 -3.0229e-1<br />

8 3.1479e+0<br />

9 -3.1368e+1<br />

10 3.1378e+2<br />

18 3.1377e+10<br />

27 -3.1377e+19<br />

30 3.1377e+22<br />

n y n<br />

0 9.5310e-2<br />

1 4.6898e-2<br />

2 3.1018e-2<br />

3 2.3154e-2<br />

4 1.8465e-2<br />

... ....<br />

7 1.1481-2<br />

8 1.0194e-2<br />

9 9.1673e-3<br />

10 8.3270e-3<br />

18 -9.1694e+1<br />

27 -9.1699e+9<br />

30 -9.1699e+13<br />

33


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

Se invece, consideriamo y n−1 = 1<br />

10 ( 1 n − y n), partendo da un valore <strong>di</strong> n molto grande e andando a<br />

ritroso, l’errore <strong>di</strong>minuisce. Perciò, dato un valore <strong>di</strong> accuratezza ɛ > 0 e fissato un intero n 1 è possibile<br />

determinare l’intero n 0 tale che, partendo da y n0 = 0 e andando a ritroso, gli integrali y n saranno<br />

valutati con un errore in valore assoluto minore <strong>di</strong> ɛ per 0 < n ≤ n 1 . Infatti:<br />

y n0 = 0<br />

y n0 −1 = 1 1<br />

10<br />

n 0<br />

y n0 −2 = 1<br />

10 ( 1<br />

n 0 − 1 − 1<br />

10<br />

. . .<br />

y n =<br />

1<br />

) =<br />

n 0<br />

1<br />

(−10) n 0−n n 0<br />

+ cost ante n0 −n<br />

1<br />

(−10) 2 n 0<br />

+ cost ante<br />

L’errore al passo n <strong>di</strong>pende, quin<strong>di</strong>, (in valore assoluto) da<br />

ɛ = 10 −6 , e fissiamo un valore n 1 , per calcolare n 0 dovrà essere<br />

1<br />

10 n 0−n 1<br />

< ɛ cioè 10 n 1−n 0<br />

< ɛ<br />

Passando al logaritmo in base 10:<br />

n 1 − n 0 < logɛ =⇒ n 0 > n 1 − logɛ<br />

1<br />

10 n 0−n<br />

Fissato n 1 = 20 si ricava n 0 = 26.<br />

Questa volta i calcoli danno gli stessi risultati sia in Matlab sia in Fortran:<br />

n y n n y n<br />

26 0.000000 11 7.62944e-3<br />

25 3.84615e-3 10 8.32797e-3<br />

24 3.61538e-3 9 9.16720e-3<br />

23 3.80513e-3 8 1.01944e-2<br />

22 3.96731e-3 7 1.14806e-2<br />

21 4.14872e-3 6 1.31377e-2<br />

20 4.34703e-3 5 1.53529e-2<br />

19 4.56530e-3 4 1.84647e-2<br />

18 4.80663e-3 3 2.31535e-2<br />

17 5.07489e-3 2 3.10180e-2<br />

16 5.37486e-3 1 4.68982e-2<br />

15 5.71251e-3 0 9.53102e-2<br />

14 6.09542e-3<br />

13 6.53332e-3<br />

12 7.03898e-3<br />

Osserviamo come il valore y 0 coincida con il valore teorico noto.<br />

. Se richie<strong>di</strong>amo una tolleranza<br />

L’esempio appena visto ci porta a dare alcune considerazioni sui criteri su cui si deve basare un algoritmo:<br />

un algoritmo deve essere accurato, efficiente e robusto, accurato nel senso che bisogna essere in grado<br />

<strong>di</strong> sapere la grandezza dell’errore che si commette nell’algoritmo stesso; efficiente in termini <strong>di</strong> velocità <strong>di</strong><br />

esecuzione e <strong>di</strong> richiesta <strong>di</strong> spazio <strong>di</strong> memoria per le variabili utilizzate; robusto nel dare il risultato corretto<br />

34


3.7. Instabilità e malcon<strong>di</strong>zionamento<br />

Figura 3.5: Esempio: malcon<strong>di</strong>zionamento<br />

entro un livello <strong>di</strong> tolleranza dell’errore che sia accettabile.<br />

3.7.2 Malcon<strong>di</strong>zionamento<br />

Definizione 3.7.2 Un problema si <strong>di</strong>ce malcon<strong>di</strong>zionato se a piccole variazioni nei dati <strong>di</strong> input del problema<br />

corrispondono forti variazioni nei dati <strong>di</strong> output.<br />

Quando il problema è molto sensibile alle variazioni dei dati <strong>di</strong> input, producendo risultati molto <strong>di</strong>versi tra<br />

loro, allora nessun algoritmo, per quanto robusto e stabile, potrà dare una soluzione robusta al problema<br />

stesso.<br />

Esempio<br />

Esempio 3.7.2 Il problema del calcolo delle ra<strong>di</strong>ci <strong>di</strong> un polinomio p(x) <strong>di</strong> grado n è un esempio <strong>di</strong><br />

problema malcon<strong>di</strong>zionato.<br />

Sia p(x) = a 0 +a 1 x +a 2 x 2 +...+a n x n . I dati <strong>di</strong> input del problema sono i coefficienti a 0 , a 1 ,..., a n . I dati<br />

<strong>di</strong> output sono le ra<strong>di</strong>ci del polinomio.<br />

Si può provare che a piccole variazioni sui dati iniziali, corrispondono gran<strong>di</strong> variazioni sui risultati.<br />

Ve<strong>di</strong>amo il caso del polinomio p(x) = (x − 1)(x − 2)···(x − 10). Chiaramente, tale polinomio ha ra<strong>di</strong>ci<br />

1,2,...,10. Se perturbiamo il polinomio variando il coefficiente a 9 del valore <strong>di</strong> 0.00001, considerando<br />

quin<strong>di</strong> il polinomio p(x) + 0.00001x 9 , le ra<strong>di</strong>ci corrispondenti si <strong>di</strong>scostano <strong>di</strong> poco da quelle del polinomio<br />

<strong>di</strong> partenza, come si può notare in Figura 3.5. Ma se variamo il coefficiente a 9 del valore 0.0001,<br />

considerando cioè il polinomio p(x) + 0.0001x 9 allora le ra<strong>di</strong>ci corrispondenti a x 7 , x 8 , x 9 , x 10 non saranno<br />

più reali ma avranno anche una parte immaginaria. La piccola variazione sui dati <strong>di</strong> ingresso,<br />

quin<strong>di</strong>, provoca una grande variazione sui dati in uscita, proprio perchè il problema è malcon<strong>di</strong>zionato.<br />

Una quantità che misura il grado <strong>di</strong> sensibilità <strong>di</strong> un problema – fornendoci in<strong>di</strong>cazioni sul fatto che a<br />

35


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE<br />

in<strong>di</strong>ce <strong>di</strong><br />

con<strong>di</strong>zionamento<br />

piccole variazioni sui dati <strong>di</strong> ingresso del problema ci possono essere piccole o gran<strong>di</strong> variazioni sui dati <strong>di</strong><br />

uscita – si chiama in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento (o numero <strong>di</strong> con<strong>di</strong>zionamento) del problema.<br />

Diamo la definizione nel caso in cui il nostro problema si possa identificare come una funzione f : R −→<br />

R. Il valore y = f (x) è il valore <strong>di</strong> uscita del problema f . Vogliamo vedere cosa succede se il dato <strong>di</strong> ingresso<br />

non è più x ma x + ∆x. ∆x rappresenta quin<strong>di</strong> una perturbazione sul dato iniziale. Assumiamo x ≠ 0, y ≠ 0.<br />

Applichiamo la formula <strong>di</strong> Taylor <strong>di</strong> centro x. Si ha:<br />

f (x + ∆x) = f (x) + f ′ (x)∆x +O(∆x 2 ) ≈ f (x) + f ′ (x)∆x<br />

La variazione sul dato d’uscita è data dalla <strong>di</strong>fferenza f (x + ∆x) − f (x). Chiamiamo questa <strong>di</strong>fferenza con<br />

∆y. Quin<strong>di</strong> ∆y = f (x + ∆x) − f (x) ≈ f ′ (x)∆x (utilizziamo il risultato ottenuto dalla formula <strong>di</strong> Taylor).<br />

Se utilizziamo gli errori relativi, abbiamo (e sapendo che y = f (x)):<br />

∆y<br />

y<br />

∆y<br />

y<br />

≈ f ′ (x)∆x<br />

f (x)<br />

Moltiplico poi numeratore e denominatore a secondo membro per x<br />

≈ x f ′ (x) ∆x<br />

f (x) x<br />

Al limite per ∆x → 0, questa uguaglianza approssimata (abbiamo usato il simbolo ≈) <strong>di</strong>venta una vera<br />

uguaglianza. Questo suggerisce <strong>di</strong> definire l’in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento <strong>di</strong> f me<strong>di</strong>ante la formula<br />

(cond f )(x) =<br />

x f ′ (x)<br />

∣<br />

f (x)<br />

∣<br />

Questo numero ci <strong>di</strong>ce quanto gran<strong>di</strong> sono le perturbazioni relative per y confrontate con le relative<br />

perturbazioni <strong>di</strong> x.<br />

Per x = 0 e y ≠ 0, non ha senso considerare l’errore relativo ∆x , e si considera l’errore assoluto su x. In tal<br />

x<br />

caso, si definisce in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento la quantità<br />

(cond f )(x) =<br />

f ′ (x)<br />

∣<br />

f (x)<br />

∣<br />

Per x = y = 0 si considera invece l’errore assoluto sia per x che per y, <strong>di</strong>modochè l’in<strong>di</strong>ce <strong>di</strong><br />

con<strong>di</strong>zionamento <strong>di</strong>venta<br />

(cond f )(x) = |f ′ (x)|<br />

Esempio<br />

Esempio 3.7.3 Sia f (x) = x 1/α , con x > 0 e α > 0. Calcoliamo l’in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento applicando<br />

la formula (poichè abbiamo supposto x > 0, si ha f (x) ≠ 0). Risulta<br />

∣ (cond f )(x) =<br />

x f ′ ∣∣∣∣∣∣<br />

(x)<br />

x 1 ∣ ∣∣∣∣∣∣ ∣<br />

f (x)<br />

∣ = α x1/α−1<br />

= 1 α<br />

x 1/α<br />

Per α grande, (cond f )(x) tende a zero, quin<strong>di</strong> abbiamo un problema bencon<strong>di</strong>zionato. Se, invece α è<br />

molto piccolo si ha un problema malcon<strong>di</strong>zionato (se α = 10 −10 , si ha f (x) = x 1010 e (cond f )(x) = 10 10 ,<br />

un valore molto grande).<br />

36


CAPITOLO 4<br />

Zeri <strong>di</strong> funzione<br />

Non so come il mondo potrà<br />

giu<strong>di</strong>carmi ma a me sembra<br />

soltanto <strong>di</strong> essere un bambino che<br />

gioca sulla spiaggia, e <strong>di</strong> essermi<br />

<strong>di</strong>vertito a trovare ogni tanto un<br />

sasso o una conchiglia più bella del<br />

solito, mentre l’oceano della verità<br />

giaceva insondato davanti a me.<br />

Isaac Newton<br />

4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

4.2 Metodo delle Bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.3 Metodo del Punto Fisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

4.4 Il Metodo <strong>di</strong> Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

4.5 Convergenza <strong>di</strong> un metodo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

4.6 Complessità computazionale <strong>di</strong> uno schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />

4.7 Il metodo delle secanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />

4.8 Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula Falsi . . . . . . . . . . . . . . . . . . . . . . 50<br />

4.9 Metodo <strong>di</strong> Newton-Raphson per ra<strong>di</strong>ci multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.10 Controllo sugli scarti e grafici <strong>di</strong> convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.11 Osservazioni sull’or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong> un metodo iterativo . . . . . . . . . . . . . . . . . . . . 54<br />

4.12 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />

4.1 Introduzione<br />

Il problema <strong>di</strong> calcolare la ra<strong>di</strong>ce quadrata <strong>di</strong> un numero è un problema molto antico. Già gli antichi<br />

Babilonesi, intorno al 1700 a.C., se lo erano posto e avevano trovato la soluzione: per calcolare b, partivano<br />

da un certo valore x che si avvicinava alla soluzione, <strong>di</strong>videvano b per questo numero, e facevano poi la<br />

me<strong>di</strong>a, iterando il proce<strong>di</strong>mento. L’algoritmo si può schematizzare nel modo seguente:<br />

G partire da x 0 prossimo a b;<br />

G considerare x 1 = 1 2 (x 0 + b x 0<br />

);<br />

G generalizzando: x n+1 = 1 2 (x n + b x n<br />

).<br />

37


4. ZERI DI FUNZIONE<br />

Per esempio, per calcolare 2 ≈ 1.41421356237310, sapendo che il valore che dobbiamo approssimare è<br />

compreso tra 1 e 2, possiamo partire da x 0 = 1.5, ottenendo:<br />

x 0 = 1.5<br />

x 1 = 1 2 (1.5 + 2<br />

1.5 ) = 1.41666667<br />

x 2 = 1 2 (1.41666667 + 2<br />

1.41666667 ) = 1.41421569<br />

x 3 = 1 2 (1.41421569 + 2<br />

1.41421569 ) = 1.41421356<br />

Il metodo usato dai Babilonesi non è altro che il metodo <strong>di</strong> Newton-Raphson (che vedremo più avanti)<br />

per trovare gli zeri della funzione f (x) = x 2 − b.<br />

I meto<strong>di</strong> numerici <strong>di</strong>scussi in questo Capitolo servono per trovare approssimazioni numeriche ad<br />

equazioni del tipo f (x) = 0.<br />

4.2 Metodo delle Bisezioni<br />

Sia data una funzione f continua in un intervallo [a,b], con f (a) e f (b) che assumono valori <strong>di</strong> segno<br />

opposto. Allora, per il teorema del Valore Interme<strong>di</strong>o (si veda il Teorema 2.5.3 con K = 0), esiste almeno un<br />

punto ξ ∈]a,b[ tale che f (ξ) = 0.<br />

Assumiamo, per semplicità che ci sia una sola ra<strong>di</strong>ce ξ nell’intervallo ]a,b[ (nel caso ci sia più <strong>di</strong> una<br />

ra<strong>di</strong>ce, la procedura che ora descriviamo vale sempre, e ci permette <strong>di</strong> calcolare una <strong>di</strong> queste ra<strong>di</strong>ci).<br />

Il metodo delle bisezioni (detto anche metodo <strong>di</strong>cotomico) si chiama così perchè, ad ogni passo, viene<br />

<strong>di</strong>mezzato l’intervallo precedente, cercando in tal modo <strong>di</strong> racchiudere la ra<strong>di</strong>ce ξ in sottointervalli sempre<br />

più piccoli.<br />

G Si pone a 1 = a e b 1 = b. Si prende il punto me<strong>di</strong>o dell’intervallo [a 1 ,b 1 ], c 1 = a 1 + b 1<br />

.<br />

G Se f (c 1 ) = 0 allora abbiamo trovato la ra<strong>di</strong>ce dell’equazione, altrimenti si va a controllare il segno <strong>di</strong><br />

f (c 1 ).<br />

– Se f (c 1 ) e f (a 1 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ]c 1 ,b 1 [ (applicando <strong>di</strong> nuovo<br />

il teorema del Valore Interme<strong>di</strong>o). In tal caso porremo a 2 = c 1 e b 2 = b 1 .<br />

– 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<br />

porremo a 2 = a 1 e b 2 = c 1 .<br />

G Riapplichiamo questa procedura appena descritta sul sottointervallo [a 2 ,b 2 ]<br />

G Fermiamo il proce<strong>di</strong>mento ad una certa iterazione n, se f (c n ) = 0 o se l’ampiezza del sottointervallo<br />

è sufficientemente piccola, cioè b n − a n<br />

≤ tol l dove tol l è una certa tolleranza prefissata. In tal caso<br />

2<br />

assumiamo c n come approssimazione della ra<strong>di</strong>ce ξ.<br />

Osserviamo che, ad ogni passo, viene <strong>di</strong>mezzato l’intervallo in cui si trova la ra<strong>di</strong>ce ξ, da cui<br />

|ξ − c n | ≤ b − a<br />

2 n .<br />

Da questa relazione, si può determinare il numero <strong>di</strong> iterazioni n necessarie per calcolare un’approssimazione<br />

della ra<strong>di</strong>ce ξ entro una certa tolleranza tol l richiesta. Infatti<br />

b − a<br />

2 n ≤ tol =⇒ |ξ − c n | ≤ tol<br />

2<br />

Ma<br />

( ) b − a<br />

b − a<br />

2 n ≤ tol ⇐⇒ 2 n ≥ b − a log<br />

tol<br />

=⇒ n ≥<br />

.<br />

tol<br />

log(2)<br />

L’algoritmo <strong>di</strong> bisezione può essere descritto nel modo seguente (sotto forma <strong>di</strong> pseudo-co<strong>di</strong>ce). Se il<br />

metodo non converge (perchè, ad esempio, la funzione che abbiamo scelto non assume segno opposto agli<br />

38


4.3. Metodo del Punto Fisso<br />

Figura 4.1: Metodo delle Bisezioni<br />

estremi dell’intervallo), il proce<strong>di</strong>mento iterativo potrebbe entrare in stallo (pensiamo ad un programma da<br />

fare eseguire al calcolatore) e quin<strong>di</strong> conviene introdurre un numero massimo <strong>di</strong> iterazioni, che viene in<strong>di</strong>cato<br />

con itmax.<br />

Dati <strong>di</strong> input: a, b, tol , i tmax<br />

Dati <strong>di</strong> output: soluzione approssimata c o messaggio <strong>di</strong> fallimento<br />

1 verificare che f (a)f (b) < 0, altrimenti non si può implementare il metodo ;<br />

2 n ←− 1 ;<br />

3 c ←− (a + b)/2 ;<br />

4 scar to ←− |b − a|/2 ;<br />

5 Fintantochè n ≤ i tmax e ( f (c) ≠ 0 e scar to > tol )<br />

6 n ←− n + 1 (incrementa n) ;<br />

7 Se f (a)f (c) > 0 allora<br />

8 a ←− c<br />

9 altrimenti<br />

10 b ←− c<br />

11 Fine-Se<br />

12 aggiorna c ;<br />

13 aggiorna scar to ;<br />

14 Fine-Fintantochè<br />

15 Se f (c) = 0 o scar to ≤ tol allora<br />

16 c è la soluzione approssimata<br />

17 altrimenti<br />

18 n > i tmax ;<br />

19 il metodo è fallito dopo i tmax iterazioni ;<br />

20 Fine-Se<br />

4.3 Metodo del Punto Fisso<br />

Il problema f (x) = 0 può essere reso equivalente alla ricerca del punto fisso <strong>di</strong> una opportuna funzione g<br />

(vale a <strong>di</strong>re del problema g (x) = x).<br />

39


4. ZERI DI FUNZIONE<br />

( x<br />

) 2−sin(x) ( x<br />

) 2−sin(x)+x<br />

Ad esempio, da f (x) =<br />

= 0, aggiungendo ad ambo i membri x, otteniamo = x<br />

( 2<br />

2<br />

x<br />

) 2<br />

da cui poniamo g (x) = − sin(x) + x. Le ra<strong>di</strong>ci della f coincidono con i punti fissi della g .<br />

2<br />

Definizione 4.3.1 Data una funzione g , si definisce punto fisso della g , quel punto<br />

ξ che sod<strong>di</strong>sfa la relazione g (ξ) = ξ<br />

Una funzione può ammettere uno o più punti fissi o non ammetterne affatto.<br />

Un modo per calcolare un punto fisso <strong>di</strong> una funzione g è dato da iterazioni successive sulla funzione g<br />

stessa.<br />

Esempio<br />

Esempio 4.3.1 Supponiamo che la funzione g sia g (x) = cos(x). Pren<strong>di</strong>amo come valore iniziale x 0 =<br />

1. Con una calcolatrice, an<strong>di</strong>amo a calcolare (in modalità ra<strong>di</strong>anti!) il suo coseno: ricaviamo x 1 =<br />

cos(x 0 ) = g (x 0 ) = 0.54030230. Successivamente, calcoliamo il coseno <strong>di</strong> x 1 , ottenendo x 2 = cos(x 1 ) =<br />

0.857553216. Osserviamo che x 2 = cos(x 1 ) = cos(cos(x 0 )) e non cos 2 (x 0 )! Abbiamo innescato, in questo<br />

modo, un proce<strong>di</strong>mento iterativo per cui x n+1 = cos(x n ) = g (x n ). Con la calcolatrice, basta <strong>di</strong>gitare<br />

sulla funzione cos ogni volta in modo da avere i nuovi valori della successione x n+1 . I primi numeri<br />

che otteniamo non sono molto importanti. Quelli importanti sono quelli che si hanno dopo 15, 30 o 100<br />

passi. Nel nostro caso, abbiamo<br />

n x n<br />

5 0.7013687746<br />

11 0.7356047404<br />

13 0.7414250866<br />

14 0.7375068905<br />

15 0.7401473356<br />

29 0.7390893414<br />

30 0.7390822985<br />

56 0.7390851333<br />

57 0.7390851332<br />

58 0.7390851332<br />

Perchè i valori <strong>di</strong> x tendono a 0.7390851332 Cosa ha <strong>di</strong> speciale questo numero È un punto fisso per la<br />

funzione cos(x).<br />

Esempio<br />

Esempio 4.3.2 Consideriamo la funzione g (x) = 1 2 x + 2. Partendo da x 0 = 0 si ha<br />

n x n<br />

1 x 1 = 1 2 · 0 + 2 = 2<br />

2 x 2 = 1 2 · 2 + 2 = 3<br />

3 x 3 = 1 2 · 3 + 2 = 3.5<br />

4 x 4 = 1 2 · 3.5 + 2 = 3.75<br />

5 x 5 = 1 2 · 3.75 + 2 = 3.875<br />

6 x 6 = 1 2 · 3.875 + 2 = 3.9375<br />

I numeri 2, 3, 3.5, 3.75, 3.875, 3.9375 sembrano avvicinarsi a ξ = 4. Difatti, per valori crescenti <strong>di</strong> n, per<br />

1<br />

x n che tende a ξ, si ha, da una parte ξ = lim n→∞ x n+1 = lim n→∞<br />

2 x n + 2 = 1 2 ξ + 2 da cui, ξ = 1 ξ + 2, cioè<br />

2<br />

ξ = 4.<br />

Scopriamo quin<strong>di</strong> che se l’iterazione x n+1 = g (x n ) converge a ξ, ξ è punto fisso per la funzione g .<br />

40


4.3. Metodo del Punto Fisso<br />

Da un punto <strong>di</strong> vista geometrico, i grafici <strong>di</strong> y = x (bisettrice del primo e terzo quadrante) e <strong>di</strong> y = g (x) si<br />

intersecano in ξ.<br />

Tuttavia, non sempre questo schema iterativo, applicato a funzioni che ammettono uno o più punti fissi,<br />

converge. Ve<strong>di</strong>amo con un esempio.<br />

Esempio<br />

Esempio 4.3.3 Sia g (x) = x 2 . Analiticamente troviamo due punti fissi per questa funzione. Dovendo<br />

essere ξ = ξ 2 , si ricava ξ 2 − ξ = 0, vale a <strong>di</strong>re ξ(ξ − 1) = 0: quin<strong>di</strong> ξ = 0 e ξ = 1 sono i due punti fissi per<br />

questa funzione.<br />

Partendo da x 0 = 0.5, si ha la successione <strong>di</strong> valori 0.25, 0.0625, 0.00390625, rapidamente il metodo<br />

converge a ξ = 0<br />

Se si prende come punto iniziale un valore x 0 ∈]−1,1[, la successione converge a ξ = 0. Le sole successioni<br />

che convergono a ξ = 1 solo le ovvie successioni generate da x 0 = ±1. Se si prende come punto iniziale x 0<br />

tale che |x 0 | > 1 allora lo schema iterativo x n+1 = x 2 n <strong>di</strong>verge a +∞. Partendo da x 0 = 2, si ha 4, 16, 256,<br />

65536...<br />

Questo esempio è significativo per capire come ciascun punto fisso ξ abbia un proprio bacino <strong>di</strong> attrazione:<br />

se si prende x 0 in questo bacino, allora i valori x n tendono a ξ. Un punto fisso può dunque attirare o<br />

respingere i valori x n prodotti dallo schema iterativo.<br />

Prima <strong>di</strong> passare a stu<strong>di</strong>are quando lo schema <strong>di</strong> punto fisso converge, ricor<strong>di</strong>amo che una funzione può<br />

ammettere più <strong>di</strong> un punto fisso, ammetterne uno solo o non ammetterne affatto. Ci sono due teoremi (2.5.4<br />

e 2.5.5) che ci <strong>di</strong>cono quando una funzione può ammettere punti fissi. Il primo assicura l’esistenza <strong>di</strong> almeno<br />

un punto fisso (ciò vuol <strong>di</strong>re che vi possono essere più punti fissi) quando la funzione g , definita e continua<br />

in [a,b], è tale che a ≤ g (x) ≤ b per ogni x ∈ [a,b]. Il secondo teorema aggiunge, a queste ipotesi, quelle che g<br />

sia <strong>di</strong> classe C 1 e, inoltre, |g ′ (x)| ≤ m < 1 per ogni x ∈ [a,b]: in tal caso esiste un unico punto fisso.<br />

È importante osservare che, data una funzione che ammette punto fisso, le ipotesi dei due teoremi 2.5.4<br />

e 2.5.5 possono essere rilassate dall’intervallo [a,b] ad un intorno del punto fisso.<br />

Possiamo ora provare un teorema <strong>di</strong> convergenza per lo schema iterativo del punto fisso.<br />

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 ξ <strong>di</strong><br />

g se |g ′ (x)| < 1 in un intorno <strong>di</strong> ξ.<br />

Dimostrazione.<br />

Dalle relazioni<br />

ξ = g (ξ)<br />

x n+1 = g (x n )<br />

sottraendo membro a membro e, applicando il teorema del Valore Me<strong>di</strong>o 2.5.2 (con ξ n un opportuno punto<br />

del segmento che congiunge ξ a x n ), otteniamo:<br />

ξ − x n+1 = g (ξ) − g (x n ) = g ′ (ξ n )(ξ − x n )<br />

Possiamo scrivere questa relazione per n = 0,1,... ottenendo<br />

ξ − x 1 = g ′ (ξ 0 )(ξ − x 0 )<br />

ξ − x 2 = g ′ (ξ 1 )(ξ − x 1 )<br />

ξ − x 3 = g ′ (ξ 2 )(ξ − x 2 )<br />

. = . . .<br />

ξ − x n = g ′ (ξ n−1 )(ξ − x n−1 )<br />

Moltiplicando, ora, membro a membro e prendendo i valori assoluti, abbiamo:<br />

|ξ − x 1 | · |ξ − x 2 | · ... · |ξ − x n | =<br />

|g ′ (ξ 0 )| · |g ′ (ξ 1 )| · |g ′ (ξ 2 )| · ... · |g ′ (ξ n−1 )| · |ξ − x 0 | · |ξ − x 1 | · ... · |ξ − x n−1 |<br />

41


4. ZERI DI FUNZIONE<br />

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

2<br />

La relazione appena trovata può essere semplificata, <strong>di</strong>videndo ambo i membri per |ξ − x 1 | · |ξ − x 2 | · ... ·<br />

|ξ − x n−1 | ottenendo:<br />

|ξ − x n | = |g ′ (ξ 0 )| · |g ′ (ξ 1 )| · |g ′ (ξ 2 )| · ·... · |g ′ (ξ n−1 )||ξ − x 0 |<br />

Assumiamo, ora che |g ′ (x i )| ≤ m per i = 0,1,...,n − 1. Abbiamo dunque una relazione che lega l’errore<br />

assoluto al passo n con l’errore assoluto iniziale.<br />

|ξ − x n | ≤ m n |ξ − x 0 |<br />

Perchè il metodo converga, l’errore deve tendere a zero per n che tende all’infinito. Se m < 1 è assicurata la<br />

convergenza (quin<strong>di</strong>, se in un intorno del punto fisso, la derivata prima è minore <strong>di</strong> 1, lo schema converge).<br />

Se invece m > 1 in un intorno del punto fisso, lo schema non può convergere al punto fisso.<br />

Se vale m = 1 nulla si può <strong>di</strong>re a priori, ma bisogna vedere caso per caso cosa succede nell’intorno del<br />

punto fisso. ✔<br />

Negli esempi precedenti:<br />

g (x) g ′ (x)<br />

cos(x) −sin(x)<br />

1<br />

2 x + 2 1<br />

2<br />

x 2 2x<br />

Nel primo caso (esempio 4.3.1) −sin(0.7390851332) = −0.673612, perciò in un intorno del punto fisso la<br />

derivata è minore <strong>di</strong> 1 in valore assoluto e si ha convergenza.<br />

Nell’esempio 4.3.2 g ′ (x) = 1 qualunque sia x: si ha convergenza.<br />

2<br />

Nel terzo caso (esempio 4.3.3), g ′ (x) = 2x da cui g ′ (0) = 0 e g ′ (1) = 2. In un intorno del primo punto fisso,<br />

vale m < 1, in un intorno del secondo punto fisso m > 1 e non si potrà mai avere convergenza ad esso.<br />

Il bacino <strong>di</strong> attrazione si ha quin<strong>di</strong> se vale m < 1.<br />

Da un punto <strong>di</strong> vista grafico, le iterazioni dello schema <strong>di</strong> punto fisso si possono vedere sotto forma <strong>di</strong><br />

ragnatela. Le iterazioni, infatti, si muovono avanti e in<strong>di</strong>etro tra il grafico della y = g (x) e il grafico della<br />

bisettrice y = x. L’esempio 4.3.1, con g (x) = cos(x), è rappresentato in Figura 4.2 (a sinistra): partendo da<br />

(x 0 , x 0 ) sulla retta y = x, applicando l’algoritmo si ha x 1 = g (x 0 ). Perciò:<br />

G da (x 0 , x 0 ) si va su o giù fino a raggiungere (x 0 , x 1 ) sulla curva g ;<br />

G da (x 0 , x 1 ) si arriva a (x 1 , x 1 ) sulla bisettrice y = x.<br />

Questi due passi vengono ripetuti per tutte le altre iterazioni. Da x 1 si arriva sulla curva a g (x 1 ). Ora l’altezza<br />

è x 2 . Da qui si va sulla bisettrice al punto (x 2 , x 2 ). E così via. Lo scopo delle iterazioni, infatti, è <strong>di</strong> arrivare al<br />

punto (ξ,ξ) ≈ 0.7390851332 che è il punto <strong>di</strong> intersezione tra il grafico <strong>di</strong> g e la bisettrice y = x. Osserviamo<br />

42


4.3. Metodo del Punto Fisso<br />

Figura 4.3: Il metodo <strong>di</strong> punto fisso: esempio con g (x) = x 2 . Si noti la convergenza monotona a ξ = 0 (a<br />

sinistra) e la <strong>di</strong>vergenza monotona da ξ = 1 (a destra)<br />

Figura 4.4: Il metodo <strong>di</strong> punto fisso: esempio con g (x) = x − sin(x). ξ = 0 e ξ = 2π sono punti fissi attrattivi, al<br />

contrario <strong>di</strong> ξ = π in cui g ′ (ξ) = g ′ (π) = 2<br />

che, per questo esempio, i valori della successione si avvicinano a ξ muovendosi a destra e a sinistra rispetto<br />

ad esso. Si parla <strong>di</strong> convergenza oscillante.<br />

Nell’esempio 4.3.2, si devono intersecare due linee rette. Notiamo, anche dalla Figura 4.2 (a destra), che i<br />

valori delle iterazioni si trovano tutti da un lato rispetto al punto fisso: si parla <strong>di</strong> convergenza monotona.<br />

In generale, quando 0 ≤ g ′ (x) < 1 in un intorno del punto fisso, si ha convergenza monotona. Se, invece,<br />

−1 < g ′ (x) < 0 in un intorno del punto fisso, si ha convergenza oscillante.<br />

Analogamente, in Figura 4.3, si possono osservare le conclusioni già viste per l’esempio 4.3.3, in cui g (x) =<br />

x 2 : si ha convergenza monotona verso ξ = 0 partendo da un punto iniziale in valore assoluto minore <strong>di</strong> uno,<br />

e <strong>di</strong>vergenza monotona a infinito, partendo da |x 0 | > 1.<br />

Esempio<br />

Esempio 4.3.4 Consideriamo ora g (x) = x − sin(x) nell’intervallo [0,2π]. Data la perio<strong>di</strong>cità della funzione<br />

seno, g ammette più <strong>di</strong> un punto fisso. Infatti da ξ = ξ − sin(ξ) si ha 0 = sin(ξ) da cui ξ = 0, ξ = π e<br />

ξ = 2π.<br />

Stu<strong>di</strong>amo ora la derivata prima g ′ (x) = 1 − cos(x). Si ha g ′ (0) = 1 − 1 = 0, g ′ (π) = 1 − (−1) = 2 e g ′ (2π) =<br />

1 − 1 = 0. Da queste informazioni, deduciamo che qualunque sia il punto iniziale x 0 la successione<br />

generata dallo schema del punto fisso non potrà mai convergere a π, come si vede anche dalla Figura 4.4.<br />

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

43


4. ZERI DI FUNZIONE<br />

commette approssimando ξ me<strong>di</strong>ante x n . Vale infatti la <strong>di</strong>suguaglianza<br />

|ξ − x n | ≤ m<br />

1 − m |x n − x n−1 |<br />

dove m, come prima, è una maggiorazione <strong>di</strong> |g ′ (x)|.<br />

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

g (x n−1 ) Applicando il teorema del valor me<strong>di</strong>o e considerando, come prima, |g ′ (x)| ≤<br />

m < 1 in un intorno del punto fisso, si ha:<br />

|ξ − x n | ≤ m|ξ − x n−1 | (4.1)<br />

Possiamo scrivere ξ − x n−1 nel modo seguente aggiungendo e sottraendo x n :<br />

ξ − x n−1 = ξ − x n + x n − x n−1<br />

ξ − x n−1 = g (ξ) − g (x n−1 ) + x n − x n−1<br />

|ξ − x n−1 | ≤ m|ξ − x n−1 | + |x n − x n−1 |<br />

(1 − m)|ξ − x n−1 | ≤ |x n − x n−1 |<br />

|ξ − x n−1 | ≤ 1<br />

1 − m |x n − x n−1 |<br />

Andando a sostituire questa maggiorazione nella <strong>di</strong>suguaglianza (4.1), si ha<br />

|ξ − x n | ≤ m<br />

1 − m |x n − x n−1 |<br />

Abbiamo una maggiorazione dell’errore che lega l’errore al passo n con il valore assoluto della <strong>di</strong>fferenza<br />

tra due iterazioni successive |x n − x n−1 | (quest’ultima quantità prende il nome <strong>di</strong> scarto).<br />

Generalmente, per vedere se il metodo <strong>di</strong> punto fisso converge al punto fisso entro una certa tolleranza<br />

prestabilita, il controllo da fare è proprio sullo scarto d n = |x n − x n−1 |. Sfruttiamo questo fatto per vedere<br />

come implementare l’algoritmo dello schema <strong>di</strong> punto fisso (sotto forma <strong>di</strong> pseudo-co<strong>di</strong>ce; per i dettagli<br />

sull’implementazione in Fortran si vada a pag. ):<br />

Dati <strong>di</strong> input: x 0 , tol ,i tmax<br />

Dati <strong>di</strong> output: x n soluzione approssimata o messaggio <strong>di</strong> fallimento<br />

1 n ←− 1 contatore delle iterazioni;<br />

2 d n ←− 2tol (una quantità iniziale > tol ) ;<br />

3 Fintantochè n ≤ i tmax e d n > tol<br />

4 incrementa n <strong>di</strong> 1;<br />

5 applicare l’algoritmo <strong>di</strong> punto fisso x n = g (x n−1 ) ;<br />

6 aggiorna d n ;<br />

7 Fine-Fintantochè<br />

8 Se d n ≤ tol allora<br />

9 x n è la soluzione approssimata<br />

10 altrimenti<br />

11 n > i tmax ;<br />

12 il metodo è fallito dopo i tmax iterazioni ;<br />

13 Fine-Se<br />

44


4.4. Il Metodo <strong>di</strong> Newton-Raphson<br />

4.4 Il Metodo <strong>di</strong> Newton-Raphson<br />

Il metodo <strong>di</strong> Newton-Raphson 1 è uno dei meto<strong>di</strong> più potenti e più famosi per risolvere equazioni non lineari.<br />

Ci sono <strong>di</strong>versi approcci per introdurre questo metodo – tra questi c’è anche quello <strong>di</strong> vedere il metodo<br />

<strong>di</strong> Newton-Raphson come un particolare schema <strong>di</strong> punto fisso, come vedremo in seguito.<br />

Supponiamo ora che la derivata prima e seconda <strong>di</strong> f esistano e siano continue e assumiamo che la<br />

derivata prima f ′ sia valutabile con sufficiente facilità.<br />

Lo schema <strong>di</strong> Newton-Raphson è uno schema iterativo che produce una successione <strong>di</strong> approssimazioni<br />

x 0 , x 1 ,..., x n della ra<strong>di</strong>ce della funzione f .<br />

Sia x n l’iterata corrente. Applicando la formula <strong>di</strong> Taylor <strong>di</strong> centro x n si ha:<br />

f (x) = f (x n ) + f ′ (x n )(x − x n ) + f ′′ (ξ x )(x − x n ) 2 /2<br />

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

Sia x = ξ, dove ξ è ra<strong>di</strong>ce <strong>di</strong> f , f (ξ) = 0. Se f fosse lineare, avremmo f ′′ ≡ 0 e quin<strong>di</strong> potremmo trovare la<br />

ra<strong>di</strong>ce risolvendo <strong>di</strong>rettamente<br />

0 = f (ξ) = f (x n ) + f ′ (x n )(ξ − x n )<br />

Supponendo f ′ (x n ) ≠ 0, otterremmo, con semplici passaggi,<br />

ξ = x n − f (x n)<br />

f ′ (x n )<br />

In questo caso, partendo da un qualunque valore iniziale x 0 , in una sola iterazione otterremo il valore della<br />

ra<strong>di</strong>ce ξ.<br />

Per una funzione non lineare, il <strong>di</strong>scorso da fare è molto simile.<br />

La nuova approssimazione x n+1 vogliamo che sia uguale al valore x n più una certa quantità h che ci<br />

permetta <strong>di</strong> arrivare alla soluzione desiderata.<br />

Applicando la formula <strong>di</strong> Taylor <strong>di</strong> centro x n , deve essere<br />

f (x n+1 ) = f (x n + h) = f (x n ) + f ′ (x n )h + f ′′ (ξ h )h 2 /2<br />

Vogliamo che sia f (x n+1 ) = 0, da cui, trascurando il termine in h 2 e considerando f ′ (x n ) ≠ 0, ricaviamo<br />

h = − f (x n)<br />

f ′ (x n )<br />

Utilizziamo questo valore <strong>di</strong> h per la nuova approssimazione x n+1 = x n + h ottenendo la formula<br />

x n+1 = x n − f (x n)<br />

f ′ , n = 0,1,2,... (4.2)<br />

(x n )<br />

L’interpretazione geometrica del metodo <strong>di</strong> Newton è che x n+1 è l’intercetta, sull’asse delle x, della<br />

tangente della f a x n (ve<strong>di</strong> figura 4.5).<br />

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<br />

x 3 − 2x − 5 = 0). Il metodo <strong>di</strong> Newton fu pubblicato per la prima volta nel 1685. Nel 1690 Joseph Raphson ne pubblicò una descrizione<br />

semplificata in termini <strong>di</strong> approssimazioni successive x n piuttosto che <strong>di</strong> sequenze <strong>di</strong> polinomi. Fu solo nel 1740 che Thomas Simpson<br />

descrisse il metodo <strong>di</strong> Newton come un metodo iterativo per risolvere equazioni non lineari (e non solo polinomi) e <strong>di</strong>ede una versione<br />

generalizzata per sistemi <strong>di</strong> due equazioni.<br />

Isaac Newton (1643-1727), inglese, fu fisico, matematico, astronomo, alchimista, inventore, filosofo naturalista. È visto come uno dei<br />

più gran<strong>di</strong> scienzati nella storia dell’umanità.<br />

Su Joseph Raphson (1648-1715) non si hanno molti dettagli. Pare che Newton stesso gli permettesse <strong>di</strong> vedere e stu<strong>di</strong>are i suoi scritti<br />

matematici. Il suo lavoro del 1690 Analysis aequationum universalis gli valse l’ingresso nella Royal Society, nel 1691 benchè fosse uno<br />

studente (si laureò nel 1692) piuttosto anziano (aveva 43 anni).<br />

45


4. ZERI DI FUNZIONE<br />

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

Lo schema <strong>di</strong> Newton-Raphson si può vedere come un caso particolare dello schema del punto fisso applicato<br />

alla funzione g (x) = x − f (x)/f ′ (x). Perchè lo schema del punto fisso converga, deve essere |g ′ (x)| < 1<br />

in un intorno <strong>di</strong> ξ. Nel caso specifico abbiamo:<br />

|g ′ (x)| = |1 − f ′ (x) 2 − f (x)f ′′ (x)<br />

f ′ (x) 2 | = | f (x)f ′′ (x)<br />

f ′ (x) 2 |<br />

Supponendo f ′ (ξ) ≠ 0 (che è il caso in cui la ra<strong>di</strong>ce non è multipla), si ha |g ′ (ξ)| = 0, poichè al numeratore<br />

f (ξ) = 0 (essendo ξ ra<strong>di</strong>ce della f ). Per continuità, allora, vale |g ′ (x)| < 1 in un intorno <strong>di</strong> ξ. Pertanto il<br />

metodo <strong>di</strong> Newton-Raphson è generalmente convergente. Cosa vuol <strong>di</strong>re quel generalmente Vuol <strong>di</strong>re:<br />

quasi sempre, tranne alcuni casi particolari (che vedremo in seguito).<br />

Per vedere come si riduce l’errore via via che le approssimazioni si avvicinano a ξ, consideriamo l’errore<br />

cambiato <strong>di</strong> segno ɛ n , per cui x n = ξ + ɛ n . Sostituendo in (4.2) abbiamo<br />

ɛ n+1 + ξ = ɛ n + ξ − f (ξ + ɛ n)<br />

f ′ (ξ + ɛ n )<br />

ɛ n+1 = ɛ n − f (ξ + ɛ n)<br />

f ′ (ξ + ɛ n )<br />

Applicando la formula polinomiale <strong>di</strong> Taylor sia su f sia su f ′ <strong>di</strong> centro ξ, si ha:<br />

ɛ n+1 = ɛ n − f (ξ) + ɛ n f ′ (ξ) + ɛ 2 n f ′′ (ξ)/2 + ...<br />

f ′ (ξ) + ɛ n f ′′ (ξ) + ...<br />

Poichè f (ξ) = 0, raccogliendo i termini si ricava:<br />

ɛ n+1 = ɛ n f ′ (ξ) + ɛ 2 n f ′′ (ξ) − ɛ n f ′ (ξ) − ɛ 2 n f ′′ (ξ)/2 + ...<br />

f ′ (ξ) + ɛ n f ′′ (ξ) + ...<br />

= ɛ2 n f ′′ (ξ)/2 + ...<br />

f ′ (ξ) + ɛ n f ′′ (ξ) + ...<br />

Trascurando i termini ɛ n f ′′ (ξ)+... al denominatore e le potenze maggiori o uguali a ɛ 3 n al numeratore si trova:<br />

ɛ n+1 = f ′′ (ξ)<br />

2f ′ (ξ) ɛ2 n = Aɛ2 n<br />

ponendo A = f ′′ (ξ)<br />

2f ′ (ξ) .<br />

46


4.5. Convergenza <strong>di</strong> un metodo iterativo<br />

L’ultima relazione che abbiamo ottenuto ci <strong>di</strong>ce che l’errore al passo n + 1 è proporzionale, secondo il<br />

fattore A, al quadrato dell’errore al passo precedente. Perciò se partiamo da un errore iniziale dell’or<strong>di</strong>ne<br />

<strong>di</strong> 10 −2 , al passo successivo l’errore è proporzionale a 10 −4 e poi a 10 −8 fino a 10 −16 in tre sole iterazioni.<br />

Generalmente, quin<strong>di</strong>, il numero delle cifre significative raddoppia ad ogni passo del metodo. Si parla <strong>di</strong><br />

convergenza quadratica.<br />

Nel caso in cui ξ sia una ra<strong>di</strong>ce multipla, allora f ′ (ξ) = 0 e A = ∞: se il metodo converge, la convergenza<br />

non sarà più quadratica ma avremo una convergenza <strong>di</strong> tipo lineare, come vedremo meglio in seguito.<br />

Se in ξ vi è un punto <strong>di</strong> flesso, non orizzontale, per cui f (ξ) = 0, f ′ (ξ) ≠ 0, f ′′ (ξ) = 0, allora A = 0 e ci<br />

aspettiamo una convergenza superiore a quella quadratica.<br />

Sulla<br />

convergenza<br />

4.5 Convergenza <strong>di</strong> un metodo iterativo<br />

Un metodo iterativo si <strong>di</strong>ce:<br />

G linearmente convergente se esiste una costante M < 1 tale che, per n sufficientemente grande, vale<br />

|x n+1 − ξ| ≤ M|x n − ξ|<br />

G a convergenza quadratica se esiste una costante M tale che, per n sufficientemente grande, vale<br />

|x n+1 − ξ| ≤ M|x n − ξ| 2<br />

G a convergenza superlineare se esiste una successione <strong>di</strong> costanti M n → 0 tale che, per n<br />

sufficientemente grande, vale<br />

|x n+1 − ξ| ≤ M n |x n − ξ|.<br />

In generale un metodo ha or<strong>di</strong>ne <strong>di</strong> convergenza p se si possono definire due costanti p ≥ 1 e M > 0 tali<br />

che<br />

|x n+1 − ξ|<br />

lim<br />

n→∞ |x n − ξ| p = M<br />

La costante M prende il nome <strong>di</strong> costante asintotica dell’errore o fattore <strong>di</strong> convergenza.<br />

Nel caso del metodo <strong>di</strong> Newton-Raphson, generalmente vale p = 2 e la costante asintotica dell’errore è<br />

quella che abbiamo definito come A presa in valore assoluto, cioè M =<br />

f ′′ (ξ<br />

∣<br />

2f ′ (ξ)<br />

∣ .<br />

Nel metodo del punto fisso, la convergenza è lineare. Infatti, considerando l’errore cambiato <strong>di</strong> segno, la<br />

relazione x n+1 = g (x n ) si può scrivere, in modo equivalente, come<br />

ξ + ɛ n+1 = g (ξ + ɛ n ) e, applicando la formula (polinomiale) <strong>di</strong> Taylor si ha<br />

ξ + ɛ n+1 = g (ξ) + ɛ n g ′ (ξ) + ...<br />

ξ + ɛ n+1 = ξ + ɛ n g ′ (ξ) + ...<br />

ɛ n+1 = ɛ n g ′ (ξ) + ... e, al limite per n → ∞<br />

ɛ n+1 = g ′ (ξ)ɛ n<br />

La costante asintotica per lo schema <strong>di</strong> punto fisso vale, dunque, M = |g ′ (ξ)|.<br />

Il metodo delle bisezioni, invece, può essere visto come un metodo lineare, con M = 1 2 (considerando<br />

che, ad ogni passo, si riduce della metà l’intervallo in cui viene cercata l’approssimazione della ra<strong>di</strong>ce).<br />

47


4. ZERI DI FUNZIONE<br />

Esempio<br />

Esempio 4.5.1 Consideriamo l’equazione f (x) = 2x − cos(x) + 1 = 0 che ammette come unica ra<strong>di</strong>ce<br />

ξ = 0. Poichè f ′ (x) = 2 + sin(x), il metodo <strong>di</strong> Newton-Raphson <strong>di</strong>venta:<br />

x n+1 = x n − 2x n − cos(x n ) + 1<br />

2 + sin(x n )<br />

Partendo da x 0 = 0.5 e richiedendo una tolleranza pari a 10 −10 nei risultati (interrompiamo l’algoritmo<br />

quando d n < 10 −10 ), si ha:<br />

n x n d n<br />

0 0.5<br />

1 0.4730746270E-01 0.4526925E+00<br />

2 0.5462695134E-03 0.4676119E-01<br />

3 0.7458221874E-07 0.5461949E-03<br />

4 0.1395426403E-14 0.7458222E-07<br />

5 0.7647622253E-17 0.1387779E-14<br />

I valori generati dall’algoritmo tendono a ξ = 0.<br />

Considerando che f ′′ (x) = cos(x) possiamo valutare la costante asintotica M = |f ′′ (ξ)|<br />

2|f ′ (ξ)|<br />

|cos(ξ)|<br />

2(|2 + sin(ξ)|) = 1 4 = 0.25<br />

Da un punto <strong>di</strong> vista teorico, applicando il teorema del valor me<strong>di</strong>o, si ha<br />

=<br />

f (ξ) − f (x n ) = f ′ (ξ n )(ξ − x n )<br />

dove ξ n è un punto, che non conosciamo, compreso tra ξ e x n . Per x n vicino a ξ possiamo considerare<br />

ξ n ≈ x n , da cui ricaviamo (essendo f (ξ) = 0):<br />

−f (x n ) ≈ f ′ (x n )(ξ − x n )<br />

. Sostituendo questa espressione nell’iterazione <strong>di</strong> Newton-Raphson si ha:<br />

vale a <strong>di</strong>re<br />

x n+1 = x n − f (x n)<br />

f ′ (x n ) ≈ x n + (ξ − x n )<br />

x n+1 − x n = ξ − x n cioè d n+1 = ɛ n<br />

Ma in con<strong>di</strong>zioni <strong>di</strong> convergenza, d n+1 < d n da cui, per l’errore, vale la maggiorazione ɛ n < d n .<br />

Perciò gli scarti sono molto vicini agli errori e possono essere utilizzati sia per controllare il numero <strong>di</strong><br />

iterazioni da effettuare per approssimare la ra<strong>di</strong>ce entro una certa tolleranza sia per approssimare M.<br />

Nel nostro esempio<br />

d 2<br />

d 3<br />

d 4<br />

d 5<br />

(d 1 ) 2 = 0.2282 (d 2 ) 2 = 0.2498 (d 3 ) 2 = 0.2500 (d 4 ) 2 = 0.2495<br />

4.6 Complessità computazionale <strong>di</strong> uno schema<br />

Un altro elemento da considerare per valutare l’efficienza numerica <strong>di</strong> uno schema iterativo è la sua complessità<br />

computazionale. Un metodo, infatti, può avere un elevato or<strong>di</strong>ne <strong>di</strong> convergenza ma avere anche un<br />

48


4.7. Il metodo delle secanti<br />

costo computazionale molto elevato. Viceversa, un metodo può avere un basso or<strong>di</strong>ne <strong>di</strong> convergenza ma<br />

essere anche semplice computazionalmente e, quin<strong>di</strong>, molto vantaggioso da questo punto <strong>di</strong> vista.<br />

Si definisce in<strong>di</strong>ce <strong>di</strong> efficienza E dello schema iterativo la quantità<br />

E = p 1/s<br />

dove s in<strong>di</strong>ca il numero <strong>di</strong> volte in cui bisogna calcolare la funzione e la sua derivata prima ad ogni iterazione<br />

e p è l’or<strong>di</strong>ne <strong>di</strong> convergenza del metodo.<br />

4.7 Il metodo delle secanti<br />

La conoscenza della derivata prima della f per applicare il metodo <strong>di</strong> Newton-Raphson potrebbe essere<br />

semplice ma a volte potrebbe rivelarsi un’operazione molto costosa e alquanto complicata.<br />

Il metodo delle secanti è una variante del metodo <strong>di</strong> Newton-Raphson dove, al posto della derivata prima,<br />

si considera una sua approssimazione.<br />

Scriviamo la formula ricorsiva<br />

x n+1 = x n − f (x n)<br />

C n<br />

Per C n = f ′ (x n ) abbiamo la formula <strong>di</strong> Newton-Raphson, che possiamo anche chiamare della tangente<br />

variabile perchè è il coefficiente angolare della retta tangente a (x n , f (x n )) che interseca l’asse delle x in x n+1 .<br />

Ve<strong>di</strong>amo altre scelte <strong>di</strong> C n :<br />

G C n = f ′ (x 0 ): il valore <strong>di</strong> C n è costante e dà vita al metodo della tangente fissa.<br />

G C n = f (x 1) − f (x 0 )<br />

: abbiamo sempre una costante che approssima la derivata f ′ (x 0 ) utilizzando i valori<br />

x 1 − x 0<br />

<strong>di</strong> x 1 e x 0 . Lo schema è detto della secante fissa.<br />

G C n = f (x n) − f (x n−1 )<br />

. La derivata f ′ (x n ) è approssimata utilizzando il rapporto incrementale della f<br />

x n − x n−1<br />

valutata in x n e x n−1 . Abbiamo il metodo delle secante variabile, che chiameremo nel seguito anche<br />

metodo 2 della Regula Falsi.<br />

In forma estesa, l’iterazione n + 1 della Regula Falsi si scrive come:<br />

x n+1 = x n − f (x n)(x n − x n−1 )<br />

f (x n ) − f (x n−1 )<br />

Notiamo che, per innescare il metodo occorrono due valori iniziali, x 0 e x 1 . Ma è richiesta solo la<br />

valutazione della funzione f a ciascun passo (nessuna conoscenza della derivata prima).<br />

Da un punto <strong>di</strong> vista geometrico, nel metodo delle secanti il valore x n+1 è dato dall’intercetta sull’asse<br />

delle x della retta passante per x n , f (x n ) e x n−1 , f (x n−1 ). Per quanto riguarda l’accumulo <strong>degli</strong> errori <strong>di</strong> arrotondamento,<br />

conviene utilizzare la formula così come è stata scritta in quanto è più sicura rispetto alla forma<br />

compatta in cui vengono raccolti i termini, data da<br />

x n+1 = x n−1 f (x n ) − x n f (x n−1 )<br />

f (x n ) − f (x n−1 )<br />

in quanto in quest’ultima, si può avere il fenomeno della cancellazione numerica per x n ≈ x n−1 e<br />

f (x n )f (x n−1 ) > 0.<br />

Per quanto riguarda l’or<strong>di</strong>ne <strong>di</strong> convergenza si può <strong>di</strong>mostrare che si ha convergenza superlineare poichè<br />

vale la relazione<br />

ɛ n+1 = M<br />

p<br />

p + 1 ɛ<br />

p<br />

n<br />

2 Attenzione! In letteratura viene descritto un altro metodo (simile ma non lo stesso) con il nome della Regula Falsi o Falsa Posizione<br />

che genera i valori x n+1 in modo che la ra<strong>di</strong>ce ξ sia sempre compresa tra le iterazioni successive.<br />

49


4. ZERI DI FUNZIONE<br />

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<br />

dove p = 1 + 5<br />

2<br />

ɛ n+1 = M 0.618 ɛ 1.618<br />

n<br />

= 1.618 e A è la costante asitontica del metodo <strong>di</strong> Newton-Raphson, da cui<br />

4.8 Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula Falsi<br />

Sebbene il metodo <strong>di</strong> Newton-Raphson abbia or<strong>di</strong>ne <strong>di</strong> convergenza più elevato della Regula Falsi,<br />

quest’ultimo è computazionalmente più efficiente. Si ha infatti<br />

Metodo p s E<br />

<br />

Newton-Raphson 2 2 2 ≈ 1.414<br />

Regula Falsi 1.618 1 1.618<br />

Ve<strong>di</strong>amo ora come applicare i due meto<strong>di</strong> e le <strong>di</strong>fferenze che si hanno.<br />

Esempio<br />

Esempio 4.8.1 Consideriamo la funzione f (x) = 0 con f (x) = (x/2) 2 − sin(x). La derivata prima è<br />

f ′ (x) = (x/2) − cos(x) Consideriamo come x 0 = 1.3 per entrambi i meto<strong>di</strong> e x 1 = 1.35 per la Regula Falsi.<br />

Come criterio <strong>di</strong> arresto, consideriamo una tolleranza tol = 1.e −8, cioè andremo avanti con le iterazioni<br />

fino a quando troveremo che lo scarto d n = |x n − x n−1 | sarà minore <strong>di</strong> tol . Otteniamo i seguenti risultati<br />

per il metodo <strong>di</strong> Newton-Raphson<br />

n x n f (x n ) f ′ (x n ) d n d n /d<br />

n−1<br />

2<br />

0 1.3 -5.410581854E-01 0.382501171<br />

1 2.714526871831 1.427962127E+00 2.26744846 1.41452687E+00<br />

2 2.084760792766 2.157545986E-01 1.53401376 6.29766079E-01 0.314743565<br />

3 1.944113685369 1.377189572E-02 1.33676314 1.40647107E-01 0.354627390<br />

4 1.933811265085 7.60156095E-05 1.32199993 1.03024203E-02 0.520808008<br />

5 1.933753764621 2.37200355E-09 1.32191743 5.75004640E-05 0.541742396<br />

6 1.933753762827 -1.00668172E-16 1.79436599E-09 0.542710632<br />

50


4.8. Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula Falsi<br />

Per la Regula Falsi:<br />

n x n f (x n )<br />

f (x n ) − f (x n−1 )<br />

d n d n /d<br />

x n − x n−1<br />

1.618<br />

n−1<br />

0 1.3 -5.41058185E-01<br />

1 1.35 -5.20098358E-01 0.419196552<br />

2 2.590702853065 1.15448972E+00 1.34970922 1.24070285E+00<br />

3 1.735341043061 -2.33640901E-01 1.62285784 8.55361810E-01 0.603386215<br />

4 1.879309845941 -6.98346071E-02 1.13779020 1.43968803E-01 0.185374473<br />

5 1.940687248331 9.19996444E-03 1.28768192 6.13774024E-02 1.412310765<br />

6 1.933542654410 -2.79035921E-03 1.32673746 7.14459392E-03 0.653100215<br />

7 1.933752971771 -1.04570967E-06 1.32176540 2.10317362E-04 0.623935239<br />

8 1.933753762918 1.19824825E-10 1.32191686 7.91146198E-07 0.704441455<br />

9 1.933753762827 -1.00668172E-16 9.06448250E-11 0.676026603<br />

Attraverso gli scarti, abbiamo fatto una stima della costante asintotica dell’errore, considerando che,<br />

al limite per k → ∞, x n → ξ. Le ultime colonne delle tabelle, infatti, valutano i rapporti d n /dn−1 2 e<br />

d n /dn−1 1.618.<br />

Diamo un’ulteriore stima <strong>di</strong> tali costanti facendo uso della definizione teorica e considerando ξ ≈ x n .<br />

Per il metodo <strong>di</strong> Newton-Raphson dobbiamo calcolare M = |f ′′ (ξ)|<br />

2|f ′ mentre per la Regula Falsi<br />

(ξ)|<br />

dobbiamo considerare il valore M 0.618 .<br />

Poichè f ′′ (x) = 1/2 + sin(x), abbiamo, per ξ ≈ x 6 (<strong>di</strong> Newton-Raphson) o, equivalentemente per ξ ≈ x 9<br />

(della Regula Falsi), in pratica ξ ≈ 1.933753762827, f ′ (ξ) = 1.32191743 e f ′′ (ξ) = 1.4348509. Otteniamo<br />

quin<strong>di</strong>: M ≈ 0.542715784 e M 0.618 ≈ 0.685434221<br />

Esempio<br />

{ x per x ≥ 0<br />

Esempio 4.8.2 Si consideri f (x) =<br />

− . La ra<strong>di</strong>ce <strong>di</strong> questa funzione è ξ = 0.<br />

−x per x < 0<br />

⎧<br />

1<br />

⎪⎨<br />

Per la derivata prima, si ha f ′ (x) =<br />

2 per x ≥ 0<br />

x<br />

1<br />

.<br />

⎪⎩<br />

2 per x < 0<br />

−x<br />

Se partiamo da x 0 > 0 abbiamo x 1 = x 0 −<br />

<br />

x0<br />

x 1 = x 0 − − −x 0<br />

1<br />

2 −x 0<br />

= x 0 + 2(−x 0 ) = −x 0 .<br />

Il metodo <strong>di</strong> Newton applicato alla funzione f , <strong>di</strong>venta quin<strong>di</strong>:<br />

x n+1 = −x n , n = 0,1,2,...<br />

= x<br />

1 0 − 2x 0 = −x 0 . Se partiamo da x 0 < 0 abbiamo<br />

2 x 0<br />

Qualunque sia il valore iniziale x 0 ≠ 0, si ha x 1 = −x 0 , x 2 = −x 1 = x 0 ... i valori generati dal metodo <strong>di</strong><br />

Newton-Raphsono si alternano tra x 0 e −x 0 e non si avrà mai convergenza alla ra<strong>di</strong>ce ξ = 0.<br />

Questo esempio ci permette <strong>di</strong> capire meglio il significato <strong>di</strong> metodo generalmente convergente.<br />

Da un punto <strong>di</strong> vista pratico occorre prestare molta attenzione anche alla scelta del punto iniziale per il<br />

metodo <strong>di</strong> Newton-Raphson. Dal momento che la formula richiede una <strong>di</strong>visione per f ′ (x n ), occorre evitare<br />

<strong>di</strong> prendere un punto iniziale in cui la f abbia una tangente (e quin<strong>di</strong> f ′ ) con pendenza vicina allo zero. In tal<br />

caso, infatti, ci si può allontanare dalla ra<strong>di</strong>ce e il metodo può non convergere.<br />

Quando<br />

Newton-<br />

Raphson dà<br />

risultati<br />

scarsi<br />

51


4. ZERI DI FUNZIONE<br />

Figura 4.7: A sinistra: applicazione del metodo <strong>di</strong> Newton-Raphson nell’esempio in cui oscilla tra due valori.<br />

A destra: la funzione f (x) = x 5 − 6<br />

Esempio<br />

Esempio 4.8.3 Consideriamo f (x) = x 5 − 6, per la quale f ′ (x) = 5x 4 , il cui grafico è in Figura 4.7 (a destra).<br />

Se partiamo da un punto iniziale prossimo allo zero, poichè la tangente alla f è quasi orizzontale,<br />

non si riesce ad avere convergenza se non dopo molte iterazioni: partendo da x 0 = 0.01 e richiedendo<br />

una tolleranza 10 −8 , sono necessarie 88 iterazioni per arrivare a ξ = 1.430969081115725849. Ve<strong>di</strong>amo in<br />

tabella, come cambia il numero delle iterazioni al variare <strong>di</strong> x 0 :<br />

x 0 0.05 0.1 0.5 0.8 1.0 1.4 1.5 2. 3. 10. 20. 100.<br />

iterazioni 59 46 18 10 7 4 4 6 8 14 17 24<br />

4.9 Metodo <strong>di</strong> Newton-Raphson per ra<strong>di</strong>ci multiple<br />

Definizione 4.9.1 Data un’equazione f (x) = 0, una ra<strong>di</strong>ce ξ è multipla <strong>di</strong> molteplicità r se vale: f (ξ) = f ′ (ξ) =<br />

... = f r −1 (ξ) = 0 e f r (ξ) ≠ 0.<br />

Quando si ha una ra<strong>di</strong>ce multipla, il metodo <strong>di</strong> Newton-Raphson <strong>di</strong>venta un metodo del primo or<strong>di</strong>ne in<br />

quanto la formula che lega l’errore al passo n + 1 con l’errore al passo n <strong>di</strong>venta 3 :<br />

ɛ n+1 = r − 1 ɛ n<br />

r<br />

da cui la costante asintotica è M = r − 1 . Per poter avere un metodo che sia <strong>di</strong> nuovo a convergenza<br />

r<br />

quadratica, occorre mo<strong>di</strong>ficare l’algoritmo, ottenendo la formula <strong>di</strong> Newton-Raphson mo<strong>di</strong>ficata, nel modo<br />

seguente:<br />

x n+1 = x n − r f (x n)<br />

f ′ (x n )<br />

4.10 Controllo sugli scarti e grafici <strong>di</strong> convergenza<br />

Da un punto <strong>di</strong> vista pratico, il controllo per verificare la convergenza o meno della successione x n generata<br />

dallo schema iterativo viene effettuato sullo scarto d n = |x n − x n−1 | piuttosto che sull’errore (assolu-<br />

3 Il proce<strong>di</strong>mento da seguire è del tutto simile a quanto è stato fatto nell’ipotesi in cui f ′ (ξ) ≠ 0. Come esercizio, si consiglia <strong>di</strong> provare<br />

a ricavare questo risultato.<br />

52


4.10. Controllo sugli scarti e grafici <strong>di</strong> convergenza<br />

to) ɛ n = |ξ − x n |, poichè, se avessimo informazioni sull’errore, conosceremmo anche il valore <strong>di</strong> ξ (che, in<br />

generale, non è noto).<br />

Nel caso del metodo <strong>di</strong> Newton-Raphson, quando è <strong>di</strong> or<strong>di</strong>ne 2, abbiamo visto che il controllo sullo scarto<br />

va bene (si veda quanto detto a pag. 48).<br />

Ve<strong>di</strong>amo cosa succede per meto<strong>di</strong> lineari. Sia tol l la tolleranza richiesta per approssimare ξ utilizzando<br />

gli scarti. Sappiamo che, per n grande e se il metodo converge, vale la relazione<br />

ɛ n+1 ≈ Mɛ n<br />

dove M < 1 è la costante asintotica.<br />

Riscriviamo la precedente formula come:<br />

Quin<strong>di</strong><br />

|ξ − x n+1 | ≈ M|ξ − x n | = M|ξ − x n + x n+1 − x n+1 | ≤ M (|ξ − x n+1 | + |x n+1 − x n |)<br />

ɛ n+1 ≤ M(ɛ n+1 + d n+1 )<br />

(1 − M)ɛ n+1 ≤ Md n+1<br />

Supponendo d n+1 ≤ tol l, vale<br />

ɛ n+1 ≤<br />

M<br />

1 − M d n+1 ≤ M<br />

1 − M tol l<br />

M<br />

Perciò, per<br />

1 − M < 1 (quin<strong>di</strong> per M < 1/2), se d n+1 ≤ tol l anche ɛ n+1 ≤ tol l. Se, invece, M ≥ 1/2, allora<br />

l’errore può essere più grande della tolleranza richiesta.<br />

Per quanto riguarda il metodo della secante variabile, poichè è superlineare, in base alla definizione,<br />

ɛ n+1 ≈ M n+1 ɛ n con M n+1 → 0, perciò si può vedere come un caso limite <strong>di</strong> convergenza lineare con fattore <strong>di</strong><br />

convergenza che tende a zero, e quin<strong>di</strong> il controllo dello scarto permette un buon controllo dell’errore.<br />

Quando si implementa un metodo iterativo, si può fare il grafico semilogaritmico <strong>di</strong> convergenza del<br />

metodo, ponendo sull’asse delle ascisse i valori delle iterazioni e sull’asse delle or<strong>di</strong>nate i logaritmi (in base<br />

10) <strong>degli</strong> scarti.<br />

Asintoticamente possiamo sostituire l’errore con lo scarto, nella definizione <strong>di</strong> or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong><br />

un metodo, per cui d n ≈ Md p n−1 .<br />

Nel caso in cui p = 1, si ha:<br />

d n ≈ Md n−1<br />

d n−1 ≈ Md n−2<br />

d n−2 ≈ Md n−3<br />

. . . .<br />

d 2 ≈ Md 1<br />

d 1 ≈ Md 0<br />

Partendo dalla prima relazione abbiamo:<br />

d n ≈ Md n−1 ≈ M 2 d n−2 ≈ M 3 d n−3 ≈ ... ≈ M n d 0<br />

Troviamo una relazione tra d n e d 0 . Passando ai logaritmi:<br />

log 10 (d n ) = n log 10 (M) + log 10 (d 0 )<br />

53


4. ZERI DI FUNZIONE<br />

Abbiamo un’equazione del tipo y = ax + b dove y = log 10 (d n ) e x = n, che rappresenta l’equazione della retta<br />

nel nostro grafico semilogaritmico, e la pendenza della retta vale a = log 10 (M). Dalla pendenza della retta<br />

possiamo dunque risalire al valore della costante asintotica M.<br />

Nel caso in cui p ≠ 1 il <strong>di</strong>scorso si fa più complicato (e non staremo qui ad analizzarlo nei dettagli). Per<br />

esempio, per p = 2, si trova una curva che <strong>di</strong>pende da 2 n .<br />

Esempio<br />

Esempio 4.10.1 In Figura 4.8, riportiamo un esempio <strong>di</strong> grafico con i profili <strong>di</strong> convergenza per i meto<strong>di</strong><br />

<strong>di</strong> Newton-Raphson, secante variabile e punto fisso per trovare lo zero della funzione f (x) = x + ln(x)<br />

(applicando lo schema <strong>di</strong> punto fisso alla funzione g (x) = e −x ).<br />

Figura 4.8: Profili <strong>di</strong> convergenza a confronto<br />

4.11 Osservazioni sull’or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong> un metodo iterativo<br />

Abbiamo visto che, in generale, uno schema iterativo ha un certo or<strong>di</strong>ne <strong>di</strong> convergenza, ma ci sono delle<br />

eccezioni: ad esempio, il metodo <strong>di</strong> Newton-Raphson in genere è <strong>di</strong> or<strong>di</strong>ne p = 2 ma se la ra<strong>di</strong>ce è multipla<br />

allora il metodo <strong>di</strong>venta lineare, e se la ra<strong>di</strong>ce è un punto <strong>di</strong> flesso non orizzontale il metodo ha convergenza<br />

cubica; analogamente nello schema <strong>di</strong> punto fisso, se g ′ (ξ) = 0 allora il metodo non è più lineare...<br />

Se non abbiamo sufficienti informazioni sulla ra<strong>di</strong>ce o sul punto fisso che vogliamo approssimare, come<br />

facciamo a capire qual è l’or<strong>di</strong>ne <strong>di</strong> convergenza del metodo iterativo Una strada è vedere se l’approssimazione<br />

della costante asintotica usando gli scarti o la formula teorica che vale per l’or<strong>di</strong>ne p che ci aspettiamo<br />

abbia senso (cioè non tenda nè a zero nè a infinito ma ad un valore limite ben preciso – ciò che abbiamo<br />

fatto negli esempi precedenti, si veda l’esempio 4.8.1). In tal casoa l’or<strong>di</strong>ne p è effettivamente quello e le<br />

formule utilizzate ci danno una stima della costante asintotica. Ma se l’approssimazione della costante asintotica<br />

fatta in questa maniera non va bene, c’è una strada più pratica da seguire per capire qual è l’or<strong>di</strong>ne <strong>di</strong><br />

convergenza del metodo Ripren<strong>di</strong>amo la definizione <strong>di</strong> or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong> uno schema iterativo: se<br />

54


4.11. Osservazioni sull’or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong> un metodo iterativo<br />

vale<br />

|x n+1 − ξ|<br />

lim<br />

n→∞ |x n − ξ| p = M<br />

con p ≥ 1 e M numero reale positivo allora p è l’or<strong>di</strong>ne <strong>di</strong> convergenza e M la costante asintotica del metodo.<br />

Utilizzando gli scarti come approssimazione dell’errore possiamo <strong>di</strong>re che, se p è l’or<strong>di</strong>ne <strong>di</strong> convergenza,<br />

allora, al limite per n che tende all’infinito, si ha<br />

|x n+1 − x n |<br />

d n+1<br />

|x n − x n−1 | p → M ovvero (d n ) p → M.<br />

Partendo dall’iterazione 1 (lo scarto d 0 ha un significato fittizio e non lo usiamo) fino ad arrivare<br />

all’iterazione n + 1, abbiamo le seguenti approssimazioni per M:<br />

d 2<br />

d 3<br />

d 4<br />

d n<br />

d n+1<br />

(d 1 ) p ≈ M, (d 2 ) p ≈ M, (d 3 ) p ≈ M, ... (d n−1 ) p ≈ M, (d n ) p ≈ M<br />

Supponiamo <strong>di</strong> non conoscere quale sia il valore <strong>di</strong> p. Allora non possiamo andare a calcolare quei rapporti<br />

tra gli scarti che abbiamo appena scritto! Sappiamo però che quei rapporti tendono allo stesso valore <strong>di</strong> M<br />

(la costante asintotica). Perciò possiamo eguagliarli a due a due in modo da poter avere una relazione che ci<br />

permetta <strong>di</strong> ricavare p:<br />

Da<br />

d 2<br />

(d 1 ) p ≈ M ≈ d 3<br />

(d 2 ) p =⇒ d 2<br />

(d 1 ) p ≈ d 3<br />

(d 2 ) p<br />

d 3<br />

(d 2 ) p ≈ M ≈ d 4<br />

(d 3 ) p =⇒ d 3<br />

(d 2 ) p ≈ d 4<br />

(d 3 ) p<br />

. . .<br />

d n<br />

(d n−1 ) p ≈ M ≈ d n+1<br />

(d n ) p =⇒ d n<br />

(d n−1 ) p ≈ d n+1<br />

(d n ) p<br />

d 2<br />

(d 1 ) p ≈ d 3<br />

(d 2 ) p<br />

ricaviamo facilmente<br />

d 2<br />

≈ (d 1) p ( ) p<br />

d 3 (d 2 ) p = d1<br />

d 2<br />

e passando ai logaritmi si ha<br />

( ) ( )<br />

d2<br />

d1<br />

log ≈ p log<br />

d 3 d 2<br />

da cui<br />

( )<br />

d2<br />

log<br />

d<br />

p ≈ ( 3<br />

)<br />

d1<br />

log<br />

d 2<br />

Lavorando allo stesso modo sugli altri rapporti che avevamo scritto abbiamo<br />

( )<br />

( )<br />

d3<br />

dn+1<br />

log<br />

log<br />

d<br />

p ≈ ( 4 d<br />

) , ... p ≈ ( n<br />

)<br />

d2<br />

dn<br />

log<br />

log<br />

d 3 d n−1<br />

Man mano che ci stiamo avvicinando a convergenza il valore <strong>di</strong> p tenderà ad un valore ben preciso, l’or<strong>di</strong>ne<br />

<strong>di</strong> convergenza del metodo. E, una volta trovato p, possiamo stimare M usando la formula del rapporto tra<br />

gli scarti.<br />

55


4. ZERI DI FUNZIONE<br />

Esempio<br />

Esempio 4.11.1 Ripren<strong>di</strong>amo l’esempio 4.8.1 in cui abbiamo confrontato gli schemi <strong>di</strong> Newton-<br />

Raphson e della Regula Falsi. An<strong>di</strong>amo a rivedere i valori <strong>degli</strong> scarti e a stimare il valore <strong>di</strong> p usando la<br />

formula appena scritta.<br />

n d n (N-R) p (N-R) d n (R-F) p (R-F)<br />

1 1.41452687E+00 5.E-02<br />

2 6.29766079E-01 1.24070285E+00<br />

3 1.40647107E-01 1.8526 8.55361810E-01 -0.11581<br />

4 1.03024203E-02 1.7436 1.43968803E-01 4.7913<br />

5 5.75004640E-05 1.9849 6.13774024E-02 0.47845<br />

6 1.79436599E-09 1.9997 7.14459392E-03 2.5226<br />

7 2.10317362E-04 1.6392<br />

8 7.91146198E-07 1.5836<br />

9 9.06448250E-11 1.6254<br />

Osserviamo che per poter iniziare a stimare il valore approssimato ( ) <strong>di</strong>( p dobbiamo ) avere fatto almeno tre<br />

dn+1 dn<br />

iterazioni in modo da poter applicare la formula p ≈ log /log .<br />

d n d n−1<br />

Dalla tabella, osserviamo che, per il metodo <strong>di</strong> Newton Raphson, a parte un’iniziale oscillazione, il valore<br />

<strong>di</strong> p tende a 2. Per il metodo della Regula Falsi invece si vede all’inizio un valore negativo (dovuto alla<br />

scelta dei due valori iniziali x 0 e x 1 ), successivamente ci sono forti oscillazioni, infine, quando si sta<br />

arrivando a convergenza, si hanno i valori <strong>di</strong> p = 1.6392,1.5836,1.6254. Ricor<strong>di</strong>amo che in questo caso<br />

p = 1.618 e l’approssimazione finale che otteniamo è abbastanza buona.<br />

Se, all’ultima iterazione, il valore dello scarto fosse zero o molto prossimo a zero (dell’or<strong>di</strong>ne <strong>di</strong> 10 −16 ,<br />

la precisione <strong>di</strong> macchina) allora la stima dell’or<strong>di</strong>ne <strong>di</strong> convergenza non si potrà fare usando questo<br />

valore dello scarto (che altererebbe il risultato finale, dovendo praticamente fare una <strong>di</strong>visione per zero).<br />

In tal caso ci si ferma alla stima al passo precendente.<br />

4.12 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 4.12.1 Si vuole risolvere l’equazione x = g (x) con lo schema del punto fisso; sapendo che<br />

g (x) = x 2 − 5x + 9<br />

(a) calcolare analiticamente il valore del punto fisso;<br />

(b) determinare il fattore <strong>di</strong> convergenza M dello schema del punto fisso;<br />

(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<br />

il <strong>di</strong>verso comportamento.<br />

Svolgimento<br />

(a) ξ è punto fisso della funzione g se verifica g (ξ) = ξ.<br />

Imponiamo dunque la con<strong>di</strong>zione g (ξ) = ξ. Ricaviamo ξ 2 − 5ξ + 9 = ξ, ovvero ξ 2 − 6ξ + 9 = 0, cioè<br />

(ξ − 3) 2 = 0, da cui ξ = 3 è punto fisso della g .<br />

(b) Il fattore <strong>di</strong> convergenza è M = g ′ (ξ).<br />

Poichè g ′ (x) = 2x − 5, si ha g ′ (ξ) = g ′ (3) = 1.<br />

Osserviamo che, a priori, non si può <strong>di</strong>re se lo schema del punto fisso converge o meno proprio<br />

perchè nel punto fisso la derivata prima vale esattamente 1, ma bisogna vedere caso per caso a seconda<br />

del punto iniziale da cui si fa partire il metodo.<br />

56


4.12. <strong>Esercizi</strong><br />

Figura 4.9: <strong>Esercizi</strong>o sullo schema <strong>di</strong> punto fisso<br />

(c)<br />

Per x 0 = 1 si ha<br />

k x k g (x k )<br />

0 1 5<br />

1 5 9<br />

2 9 45<br />

3 45 1809<br />

Per x 0 = 2.5 si ha<br />

k x k g (x k )<br />

0 2.5 2.75<br />

1 2.75 2.8125<br />

2 2.8125 2.84765625<br />

3 2.84765625 2.870864868<br />

Per x 0 = 1 il metodo non converge, mentre per x 0 = 2.5 il metodo converge. La <strong>di</strong>versità <strong>di</strong> comportamento<br />

si giustifica graficamente, come si può vedere dalla Figura 4.9, osservando che per x 0 = 1 i<br />

valori ottenuti dallo schema si allontanano sempre più dal punto fisso. Nel secondo caso, al contrario,<br />

i valori si avvicinano con monotonia al punto fisso.<br />

<strong>Esercizi</strong>o 4.12.2 Si vuole risolvere l’equazione f (x) = 0 con f (x) = (x − 1) 2 + 3ln(x), nell’intervallo [0.5,2]<br />

con gli schemi <strong>di</strong> Newton-Raphson e della Regula Falsi.<br />

(a) Dimostrare esistenza e unicità della soluzione nell’intervallo considerato.<br />

(b) Calcolare le approssimazioni x 1 , x 2 e x 3 con lo schema <strong>di</strong> Newton-Raphson, partendo da x 0 = 0.5;<br />

(c) Calcolare le approssimazioni x 2 e x 3 con lo schema della Regula-Falsi partendo da x 0 = 0.5 e x 1<br />

calcolato al punto b).<br />

Stimare, inoltre il fattore <strong>di</strong> convergenza del metodo <strong>di</strong> Newton-Raphson assumendo ξ ≈ x 3 .<br />

Svolgimento<br />

(a) La funzione ammette valori opposti all’estremo dell’intervallo. Infatti f (0.5) = −1.82944154 e f (2) =<br />

3.07944154. Quin<strong>di</strong>, per il teorema del valor interme<strong>di</strong>o, esiste almeno una ra<strong>di</strong>ce. Inoltre f ′ (x) = 2(x −<br />

1) + 3 x = 2x2 − 2x + 3<br />

è sempre positivo nell’intervallo dato, (la parabola 2x 2 − 2x + 3 ha <strong>di</strong>scriminante<br />

x<br />

negativo e quin<strong>di</strong> è sempre positiva). Perciò, da f ′ (x) > 0 conclu<strong>di</strong>amo che la f è crescente. Di qui<br />

l’unicità della ra<strong>di</strong>ce.<br />

(b) Partendo da x 0 = 0.5, il metodo <strong>di</strong> Newton-Raphson fornisce i seguenti valori:<br />

57


4. ZERI DI FUNZIONE<br />

k x k f (x k ) f ′ (x k )<br />

0 0.50000000E+00 -0.18294415E+01 0.50000000E+01<br />

1 0.86588831E+00 -0.41401211E+00 0.31964267E+01<br />

2 0.99541173E+00 -0.13775443E-01 0.30046517E+01<br />

3 0.99999643E+00<br />

Dalla tabella sembra che i valori della successione tendano a 1. E, infatti, si vede facilmente che<br />

f (1) = 0 e quin<strong>di</strong> 1 è il valore che stiamo cercando. Per stimare la costante asintotica dell’errore del<br />

metodo <strong>di</strong> Newton-Raphson assumendo ξ ≈ x 3 , occorre usare la formula<br />

M ≈ |f ′′ (x 3 )|<br />

2|f ′ (x 3 )|<br />

dove, nel caso specifico, vale f ′ (x) = 2(x − 1) + 3 x e f ′′ (x) = 2 − 3 x 2 .<br />

Usando il valore trovato per x 3 si ricava M ≈ 0.16667004E + 00.<br />

(c) Partendo da x 0 e x 1 del metodo <strong>di</strong> Newton-Raphson, la Regula Falsi dà:<br />

k x k f (x k )<br />

f (x n ) − f (x n−1 )<br />

x n − x n−1<br />

0 0.50000000E+00 -0.18294415E+01 -<br />

1 0.86588831E+00 -0.41401211E+00 0.38684741E+01<br />

2 0.97291038E+00 -0.81656072E-01 0.31054906E+01<br />

3 0.99920448E+00<br />

<strong>Esercizi</strong>o 4.12.3 Provare, anche solo graficamente, che l’equazione<br />

f (x) = sin(x) + x − 1 = 0<br />

ammette una sola ra<strong>di</strong>ce ξ nell’intervallo [0,1].<br />

(a) Dire se lo schema del punto fisso con g (x) = arcsin(1 − x) può convergere.<br />

(b) Partendo da x 0 = 0.1 calcolare le approssimazioni x 1 , x 2 e x 3 con lo schema <strong>di</strong> Newton-Raphson;<br />

(c) Dare una stima del fattore <strong>di</strong> convergenza.<br />

Svolgimento<br />

Graficamente, da f (x) = 0 si ha sin(x) = 1 − x. Se si stu<strong>di</strong>a l’intersezione delle due curve, sin(x) e 1 − x<br />

nell’intervallo [0,1], si può osservare una sola intersezione, cioè una sola ra<strong>di</strong>ce della f (fare il grafico delle<br />

due funzioni).<br />

Analiticamente, la funzione f (x) assume valori <strong>di</strong> segno opposto agli estremi dell’intervallo dato:<br />

f (0) = sin(0) + 0 − 1 = −1<br />

f (1) = sin(1) + 1 − 1 = 0.8414709848<br />

La derivata prima della f è f ′ = cos(x)+1: è funzione continua e sempre positiva nell’intervallo [0,1]. Quin<strong>di</strong><br />

f è una funzione crescente e interseca l’asse delle x solo una volta in [0,1], vale a <strong>di</strong>re ammette un’unica<br />

ra<strong>di</strong>ce.<br />

58<br />

(a) Da f (x) = 0 si ha sin(x) + x − 1 = 0 o, equivalentemente, sin(x) = 1 − x, da cui x = arcsin(1 − x).<br />

Consideriamo perciò lo schema del punto fisso con g (x) data da g (x) = arcsin(1 − x). La derivata <strong>di</strong><br />

g (x) è g ′ 1<br />

(x) = √ .<br />

1 − (1 − x)<br />

2<br />

Nell’intervallo [0,1] valgono le seguenti <strong>di</strong>suguaglianze:<br />

0 ≤ x ≤ 1 =⇒ 0 ≥ −x ≥ −1 =⇒ 1 ≥ 1 − x ≥ 0 =⇒<br />

=⇒ 1 ≥ (1 − x) 2 ≥ 0 =⇒ −1 ≤ −(1 − x) 2 ≤ 0 =⇒ 0 ≤ 1 − (1 − x) 2 ≤ 1 =⇒<br />

√<br />

=⇒ 0 ≤ 1 − (1 − x) 2 1<br />

≤ 1 =⇒ 1 ≤ √<br />

1 − (1 − x)<br />

2<br />

Perciò g ′ (x) è sempre maggiore <strong>di</strong> 1 e lo schema del punto fisso non può convergere.


4.12. <strong>Esercizi</strong><br />

(b) Da f (x) = sin(x) + x − 1 si ha f ′ (x) = cos(x) + 1 e f ′′ (x) = −sin(x). Il metodo <strong>di</strong> Newton-Raphson è:<br />

x k+1 = x k − sin(x) + x − 1<br />

cos(x) + 1 .<br />

Utilizziamo la notazione M 1 e M 2 per in<strong>di</strong>care la stima della costante asintotica dell’errore me<strong>di</strong>ante le<br />

formule<br />

M 1 = |x k+1 − x k |<br />

|x k − x k−1 | 2 o M 2 = |f ′′ (x k )|<br />

2|f ′ (x k )|<br />

Partendo da x 0 = 0.1 si ottengono i seguenti valori:<br />

k x k f (x k ) f ′ (x k ) |x k − x k−1 |<br />

0 0.1 -0.80016658E+00 0.19950042E+01 -<br />

1 0.50108517E+00 -0.18537249E-01 0.18770618E+01 0.40108517E+00<br />

2 0.51096084E+00 -0.23565955E-04 0.18722750E+01 0.98756733E-02<br />

3 0.51097343E+00 -0.38737166E-10 - 0.12586802E-04<br />

(c) La stima del fattore <strong>di</strong> convergenza è dato da M 1 = 0.12905712E+00 o da M 2 = 0.13059731E+00, a<br />

seconda della strada scelta per dare la stima.<br />

<strong>Esercizi</strong>o 4.12.4 Data l’equazione f (x) = ln(x) + x 2 − x = 0,<br />

(a) si provi, anche solo graficamente, che l’equazione ammette l’unica ra<strong>di</strong>ce ξ = 1 nell’intervallo<br />

[0.7,2.3];<br />

(b) si applichino due iterazioni del metodo <strong>di</strong>cotomico (o delle bisezioni) a partire dall’intervallo dato,<br />

chiamando con x 0 l’ultimo valore ottenuto con tale metodo;<br />

(c) a partire da x 0 del punto (b) si calcoli l’approssimazione x 1 con il metodo <strong>di</strong> Newton-Raphson;<br />

(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<br />

Falsi;<br />

(e) considerata la ra<strong>di</strong>ce esatta ξ = 1, si calcoli la costante asintotica <strong>di</strong> convergenza del metodo della<br />

Regula Falsi.<br />

Svolgimento<br />

(a) Da f (x) = 0 si ricava ln(x) = x − x 2 , per cui graficamente si può vedere che le due curve si intersecano<br />

in un solo punto, che vale ξ = 1.<br />

Analiticamente, invece, la funzione f (x) assume valori <strong>di</strong> segno opposto agli estremi dell’intervallo<br />

dato:<br />

f (0.7) = −0.566674943938732<br />

f (2.3) = 3.8229091229351<br />

Inoltre f è continua, quin<strong>di</strong> ammette almeno una ra<strong>di</strong>ce nell’intervallo dato. La derivata prima è:<br />

f ′ (x) = 1 x + 2x − 1, che possiamo anche scrivere come f ′ (x) = 1 + 2x2 − x<br />

: numeratore e denominatore<br />

x<br />

sono entrambi sempre positivi nell’intervallo dato, (la parabola 2x 2 − x + 1 ha <strong>di</strong>scriminante negativo<br />

∆ = −7, <strong>di</strong> conseguenza, per ogni x reale si ha 2x 2 − x + 1 > 0). Da f ′ (x) > 0 per ogni x segue che f è<br />

crescente e, quin<strong>di</strong>, ammette un’unica ra<strong>di</strong>ce.<br />

(b) Applichiamo il metodo delle bisezioni a partire dall’intervallo dato (utilizziamo la notazione x s per<br />

in<strong>di</strong>care l’estremo sinistro dell’intervallo, x d per in<strong>di</strong>care l’estremo destro dell’intervallo, x c , il punto<br />

me<strong>di</strong>o dell’intervallo considerato):<br />

59


4. ZERI DI FUNZIONE<br />

iter. x s f (x s ) segno x d f (x d ) segno x c f (x c )<br />

1 0.7 -0.566674944 - 2.3 3.822909123 + 1.5 1.155465108<br />

2 0.7 -0.566674944 - 1.5 1.155465108 + 1.1 0.205310180<br />

Il valore x 0 è dunque x 0 = 1.1.<br />

(c) Il metodo <strong>di</strong> Newton-Rapshon è x k+1 = x k − f (x k)<br />

f ′ (x k ) dove f ′ = 1/x +2x −1. Partendo da x 0 = 1.1, si ricava<br />

x 1 = 1.1 − 0.20531018<br />

2.1090909 = 1.002654656<br />

(d) Applicando il metodo della Regula Falsi si ha:<br />

k x k f (x k )<br />

f (x k ) − f (x k−1 )<br />

x k − x k−1<br />

1 1.002654656 0.5312842078E-02 0.2054513650E+01<br />

2 1.000068720 0.1374413812E-03 0.2001364094E+01<br />

3 1.000000046<br />

(e) Considerato che la ra<strong>di</strong>ce esatta è ξ = 1, la costante asintotica <strong>di</strong> convergenza della Regula Falsi si calcola<br />

utilizzando l’espressione M = | f ′′ (ξ)<br />

2f ′ (ξ) |0.618 . Da f ′ (x) = 1 x + 2x − 1 segue f ′ (1) = 2 e f ′′ (x) = − 1 x 2 + 2,<br />

da cui f ′′ (1) = 1, per cui M = 1 0.618<br />

= 0.4245481.<br />

4<br />

60


CAPITOLO 5<br />

Interpolazione<br />

Non vi è alcuna incompatibilità fra<br />

l’esatto e il poetico. Il numero è<br />

nell’arte come nella scienza.<br />

L’algebra è nell’astronomia e<br />

l’astronomia confina con la poesia.<br />

L’anima dell’uomo ha tre chiavi che<br />

aprono tutto: la cifra, la lettera, la<br />

nota. Sapere, pensare, sognare.<br />

Victor Hugo<br />

5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />

5.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />

5.3 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

5.3.1 Funzioni base monomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

5.3.2 Polinomi <strong>di</strong> Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

5.3.3 Formula dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

5.3.4 Differenze <strong>di</strong>vise e formula <strong>di</strong> Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />

5.4 Considerazioni sull’interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />

5.4.1 Fenomeno <strong>di</strong> Runge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />

5.4.2 Malcon<strong>di</strong>zionamento nell’interpolazione con funzioni base monomiali . . . . . . . . . . 73<br />

5.5 Interpolazione polinomiale a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />

5.5.1 Interpolazione lineare a tratti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />

5.5.2 Interpolazione spline cubica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

5.5.3 Curve parametriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />

5.6 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />

5.1 Introduzione<br />

Il censimento della popolazione italiana, dall’unità d’Italia al 2001, ha visto un incremento della<br />

popolazione, come si può vedere in Tabella 5.1. Gli stessi dati sono riportati in Figura 5.1.<br />

Ci si può chiedere se questi dati possono essere utili (considerandoli tutti o solo una parte) per dare una<br />

ragionevole stima della popolazione nel 1975 o nel 1995 o per pre<strong>di</strong>re a quanto ammonterà nel 2015. Per far<br />

ciò, possiamo seguire due strade:<br />

G cercare una funzione che passi esattamente per i dati assegnati (detti anche punti <strong>di</strong> appoggio): questo<br />

proce<strong>di</strong>mento prende il nome <strong>di</strong> interpolazione ed è il soggetto <strong>di</strong> questo Capitolo;<br />

G cercare una funzione che, “in qualche modo” passi vicino ai dati assegnati: si parla <strong>di</strong> approssimazione<br />

(che vedremo nel prossimo Capitolo).<br />

61


5. INTERPOLAZIONE<br />

Anno 1861 1871 1881 1901 1911 1921 1931<br />

Popolazione 22176 27300 28952 32963 35842 39397 41043<br />

Anno 1936 1951 1961 1971 1981 1991 2001<br />

Popolazione 42398 47516 50624 54137 56557 56778 56996<br />

Tabella 5.1: Dati forniti dall’ISTAT, tratti da http://dawinci.istat.it/daWinci/jsp/dawinci.<br />

jsp: popolazione residente dell’Italia ai confini ai confini attuali ai censimenti dal 1861 al 2001. Popolazione<br />

in migliaia.<br />

Figura 5.1: Censimento della popolazione residente in Italia.<br />

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<br />

in x i o il valore <strong>di</strong> un dato sperimentale, cerchiamo una funzione v(x) che, in maniera ragionevole si ad<strong>di</strong>ca<br />

all’insieme dei dati. Se i dati sono accurati, ha senso richiedere che la funzione interpoli i dati (cioè passi<br />

esattamente per le coppie <strong>di</strong> punti): v(x i ) = y i . Nell’approssimazione, invece, si cerca una funzione più<br />

semplice v(x) che sia vicina ad una funzione più complicata f (x) o ad una serie <strong>di</strong> dati.<br />

5.2 Interpolazione<br />

Una funzione <strong>di</strong> interpolazione v(x) serve per vari scopi.<br />

G Possiamo usare la v(x) per trovare valori approssimati y in punti x <strong>di</strong>versi da quelli assegnati<br />

x 0 , x 1 ,... x n . Se x si trova all’interno dell’intervallo che contiene le ascisse dei dati assegnati si parla<br />

<strong>di</strong> interpolazione. Se invece x si trova all’esterno dell’intervallo si ha estrapolazione. Nell’esempio della<br />

popolazione italiana, si interpolano i dati per stimare la popolazione nel 1975 o nel 1995, si applica<br />

invece un proce<strong>di</strong>mento <strong>di</strong> estrapolazione se si vuole stimare la popolazione del 2012.<br />

G Se le coppie <strong>di</strong> dati assegnati si riferiscono ad una funzione f (x), la funzione <strong>di</strong> interpolazione può<br />

essere utile per approssimare le derivate o gli integrali della f .<br />

Assumiamo che la funzione v <strong>di</strong> interpolazione sia una combinazione lineare <strong>di</strong> funzioni base <strong>di</strong> un<br />

qualche appropriato spazio <strong>di</strong> funzioni, cioè si possa scrivere come<br />

v(x) = c 0 φ 0 (x) + ... + c n φ n (x)<br />

62


5.3. Interpolazione polinomiale<br />

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

mentre φ i sono le funzioni base che assumiamo linearmente in<strong>di</strong>pendenti 1 .<br />

Esempi <strong>di</strong> interpolazione sono dati dall’interpolazione polinomiale, dall’interpolazione polinomiale a<br />

tratti, dall’interpolazione trigonometrica. Noi ci limitiamo a stu<strong>di</strong>are l’interpolazione polinomiale: date n +1<br />

coppie <strong>di</strong> punti (x i , y i ), per i = 0,1,...,n, andremo a cercare un polinomio p(x) <strong>di</strong> grado n per cui p(x i ) = y i .<br />

Parleremo, dunque, <strong>di</strong> polinomio <strong>di</strong> interpolazione p(x) (v(x) ≡ p(x)).<br />

Il processo <strong>di</strong> interpolazione si basa su due sta<strong>di</strong>:<br />

G costruire la funzione interpolante, cioè determinare i coefficienti c 0 , c 1 ,...,c n per un’assegnata base<br />

φ 0 ,φ 1 ,...,φ n ;<br />

G valutare la funzione interpolante in un assegnato punto x.<br />

Il primo punto è fatto una volta per tutte, una volta fissata la base e noto l’insieme dei punti da interpolare. Il<br />

secondo punto può essere applicato tutte le volte che si vuole valutare la funzione interpolante.<br />

5.3 Interpolazione polinomiale<br />

L’interpolazione polinomiale è il tipo <strong>di</strong> interpolazione più semplice. I polinomi, infatti, sono facili da<br />

costruire e da valutare, sono facili da sommare e moltiplicare (e il risultato è sempre un polinomio) e sono<br />

altrettanto facili da <strong>di</strong>fferenziare e integrare (e il risultato è sempre un polinomio).<br />

Sia p(x) = p n (x) un polinomio <strong>di</strong> grado n dato da<br />

p n (x) = c 0 + c 1 x + ... + c n x n<br />

Date n + 1 coppie <strong>di</strong> 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<br />

tali che p(x i ) = y i , i = 0,...,n.<br />

Ricor<strong>di</strong>amo che, un polinomio <strong>di</strong> grado n ha n+1 coefficienti e che, date n+1 coppie <strong>di</strong> punti, il polinomio<br />

interpolatore sarà <strong>di</strong> grado n.<br />

Assumiamo, inoltre, che le ascisse delle coppie dei punti siano <strong>di</strong>stinte, cioè x i ≠ x j , per i ≠ j .<br />

5.3.1 Funzioni base monomiali<br />

Utilizziamo come funzioni base i monomi x 0 , x 1 , x 2 ,..., x n .<br />

Esempio<br />

Esempio 5.3.1 Sia n + 1 = 2: abbiamo quin<strong>di</strong> due coppie <strong>di</strong> dati<br />

x i 1 2<br />

y i 1 3<br />

Cerchiamo quin<strong>di</strong> un polinomio <strong>di</strong> primo grado (una retta) che passi per i punti assegnati, della forma<br />

p(x) = p 1 (x) = c 0 + c 1 x.<br />

Le con<strong>di</strong>zioni <strong>di</strong> interpolazione <strong>di</strong>ventano:<br />

p 1 (x 0 ) = y 0 ⇐⇒ c 0 + 1c 1 = 1<br />

p 1 (x 1 ) = y 1 ⇐⇒ c 0 + 2c 1 = 3<br />

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

quin<strong>di</strong> p 1 (x) = 2x − 1.<br />

1 Le funzioni φ 0 ,φ 1 ,...,φ n si <strong>di</strong>cono linearmente in<strong>di</strong>pendenti se vale: c 0 φ 0 (x) + ...c n φ n (x) ≡ 0 per ogni x se e solo se tutti i<br />

coefficienti sono nulli c 0 = ... = c n = 0.<br />

63


5. INTERPOLAZIONE<br />

Figura 5.2: Interpolazione lineare e quadratica<br />

Esempio<br />

Esempio 5.3.2 Consideriamo adesso un ulteriore coppia <strong>di</strong> punti per cui i dati che abbiamo sono n+1 =<br />

3 e<br />

x i 1 2 4<br />

y i 1 3 3<br />

Il problema è ora <strong>di</strong>verso rispetto a quello appena risolto, perchè la terza coppia <strong>di</strong> punti specifica una<br />

valore y 2 ben <strong>di</strong>verso da quello predetto da p 1 in x 2 = 4. Difatti p 1 (x 2 ) = 7, nell’esempio precedente,<br />

mentre ora al valore <strong>di</strong> x 2 = 4 deve corrispondere y 2 = 3.<br />

Cerchiamo il polinomio <strong>di</strong> grado 2, quin<strong>di</strong>, della forma p 2 (x) = c 0 + c 1 x + c 2 x 2 che passa attraverso i<br />

punti dati.<br />

Le con<strong>di</strong>zioni <strong>di</strong> interpolazione adesso sono:<br />

⎧<br />

⎪⎨ p 2 (x 0 ) = c 0 + 1c 1 + 1c 2 = 1<br />

p 2 (x 1 ) = c 0 + 2c 1 + 4c 2 = 3<br />

⎪⎩<br />

p 2 (x 2 ) = c 0 + 4c 1 + 16c 2 = 3<br />

Abbiamo un sistema lineare <strong>di</strong> 3 equazioni in 3 incognite, la cui soluzione è:<br />

c 0 = − 7 3 , c 1 = 4, c 2 = − 2 3 .<br />

Il polinomio è p 2 (x) = (−2x 2 + 12x − 7)/3. Per x = 3 si ha p 2 (3) = 11 = 3.666666667, valore ben <strong>di</strong>verso<br />

3<br />

da p 1 (3) = 5. Del resto le curve che abbiamo ottenuto coincidono solo nei punti d’appoggio comuni a<br />

entrambe, una è una retta, l’altra è un polinomio <strong>di</strong> secondo grado (si veda Figura 5.2).<br />

Generalizzando gli esempi precedenti, date n + 1 coppie <strong>di</strong> punti, il polinomio <strong>di</strong> interpolazione <strong>di</strong> grado<br />

64


5.3. Interpolazione polinomiale<br />

n sarà costruito risolvendo un sistema lineare <strong>di</strong> n equazioni nelle n incognite c 0 ,c 1 ,...,c n :<br />

⎧<br />

p n (x 0 ) = y 0 ⇐⇒ c 0 + c 1 x 0 + c 2 x0 2 + ... + c n x0 n = y 0<br />

p ⎪⎨ n (x 1 ) = y 1 ⇐⇒ c 0 + c 1 x 1 + c 2 x1 2 + ... + c n x1 n = y 1<br />

p n (x 2 ) = y 2 ⇐⇒ c 0 + c 1 x 2 + c 2 x2 2 + ... + c n x2 n = y 2<br />

.<br />

⎪⎩<br />

p n (x n ) = y n ⇐⇒ c 0 + c 1 x n + c 2 xn 2 + ... + c n xn n = y n<br />

In forma compatta, sotto forma matriciale 2 le equazioni del sistema si possono scrivere come<br />

⎛<br />

1 x 0 x0 2 ... x n ⎞<br />

⎛ ⎞ ⎛ ⎞<br />

0<br />

1 x 1 x1 2 ... x1<br />

n c 0 y 0<br />

1 x 2 x 2 2<br />

... x2<br />

n c 1<br />

⎜<br />

⎝<br />

.<br />

.<br />

⎜<br />

.<br />

⎟⎝<br />

⎟<br />

. ⎠ = y 1<br />

⎜<br />

⎝<br />

⎟<br />

. ⎠<br />

. ⎠<br />

1 x n xn 2 ... xn<br />

n c n y n<br />

La matrice dei coefficienti è una matrice ben nota in letteratura e prende il nome <strong>di</strong> matrice <strong>di</strong> Vandermonde.<br />

3 È una matrice con determinante <strong>di</strong>verso da zero, e quin<strong>di</strong> il sistema ammette una ed una sola<br />

soluzione. Osserviamo che la prima colonna ha tutti gli elementi uguali a 1, la seconda colonna ha le ascisse<br />

dei punti <strong>di</strong> appoggio, la terza colonna ha i quadrati <strong>di</strong> esse, e così via.<br />

Perciò, date n+1 coppie <strong>di</strong> punti <strong>di</strong> appoggio (x i , y i ), i = 0,...,n, con ascisse <strong>di</strong>stinte<br />

x i , esiste un unico polinomio interpolatore p(x) <strong>di</strong> grado al più n tale che p(x i ) = y i ,<br />

i = 0,...,n.<br />

Tuttavia, la matrice <strong>di</strong> Vandermonde non ha buone proprietà: <strong>di</strong>fatti è una matrice malcon<strong>di</strong>zionata, e<br />

questo lo si osserva al crescere <strong>di</strong> n in quanto la soluzione del sistema <strong>di</strong>venta inaccurata 4 , qualunque metodo<br />

venga utilizzato per risolverlo.<br />

Questo approccio ci è servito per <strong>di</strong>mostrare che il polinomio <strong>di</strong> interpolazione esiste ed è unico, ma<br />

non è utile nella pratica a causa del malcon<strong>di</strong>zionamento. Sarebbe preferibile, quin<strong>di</strong>, poter usare funzioni<br />

base <strong>di</strong>verse dai monomi in modo da evitare il malcon<strong>di</strong>zionamento, avere meno operazioni dal punto <strong>di</strong><br />

vista computazionale e poter manipolare in maniera più efficiente le funzioni basi φ i in vista <strong>di</strong> una loro<br />

applicazione nella <strong>di</strong>fferenziazione e integrazione numerica.<br />

5.3.2 Polinomi <strong>di</strong> Lagrange<br />

Scriviamo il polinomio p(x) con i coefficienti c i uguali alle or<strong>di</strong>nate dei punti d’appoggio y i , c i ≡ y i :<br />

p(x) = p n (x) = y 0 φ 0 (x) + ... y n φ n (x)<br />

Una base <strong>di</strong> funzioni che ci permette una simile rappresentazione è data dai polinomi <strong>di</strong> Lagrange. 5<br />

I polinomi <strong>di</strong> Lagrange L j (x), per j = 0,1,...,n sono polinomi <strong>di</strong> grado n che, nei no<strong>di</strong> x i , sod<strong>di</strong>sfano la<br />

relazione<br />

{<br />

0 se i ≠ j<br />

L j (x i ) =<br />

1 se i = j<br />

2 Questo argomento verrà approfon<strong>di</strong>to nel Capitolo 7, dove riman<strong>di</strong>amo per i dettagli.<br />

3 Alexandre-Theophile Vandermonde, (1735-1796), abbandonò una carriera da violinista per de<strong>di</strong>carsi alla matematica quando<br />

aveva 35 anni. Si occupò <strong>di</strong> vari problemi <strong>di</strong> algebra, <strong>di</strong> topologia, calcolo combinatoriale, e teoria dei determinanti.<br />

4 Una matrice A è malcon<strong>di</strong>zionata quando, a piccole variazioni sui coefficienti della matrice, corrispondono gran<strong>di</strong> variazioni nella<br />

soluzione del sistema lineare Ax = b<br />

5 Joseph Louis Lagrange (1736-1813) nacque a Torino (come Giuseppe Luigi Lagrangia) e si trasferì in Francia, a Parigi, dove <strong>di</strong>venne<br />

citta<strong>di</strong>no francese adottando la traduzione francese del suo nome. Matematico e astronomo, <strong>di</strong>ede un importante contributo alla<br />

meccanica classica e celeste e alla teoria dei numeri.<br />

65


5. INTERPOLAZIONE<br />

Allora il polinomio p n (x) = ∑ n<br />

j =0 L j (x) · y j è tale che p n (x i ) = y i cioè sod<strong>di</strong>sfa la con<strong>di</strong>zione <strong>di</strong><br />

interpolazione, per ogni i = 0,...,n.<br />

I polinomi <strong>di</strong> Lagrange sono definiti dalla relazione: 6<br />

L j (x) =<br />

n∏<br />

k=0<br />

k≠j<br />

(x − x k )<br />

(x j − x k )<br />

In forma estesa abbiamo<br />

L j (x) = (x − x 0)···(x − x j −1 )(x − x j +1 )···(x − x n )<br />

(x j − x 0 )···(x j − x j −1 )(x j − x j +1 )···(x j − x n ) = n∏<br />

k=0<br />

k≠j<br />

x − x k<br />

x j − x k<br />

Esempio<br />

Esempio 5.3.3 Siano date le tre coppie <strong>di</strong> punti dell’esempio precedente (1,1), (2,3), (4,3). I polinomi <strong>di</strong><br />

Lagrange sono:<br />

(x − 2)(x − 4)<br />

L 0 (x) =<br />

(1 − 2)(1 − 4)<br />

(x − 1)(x − 4)<br />

L 1 (x) =<br />

(2 − 1)(2 − 4)<br />

(x − 1)(x − 2)<br />

L 2 (x) =<br />

(4 − 1)(4 − 2)<br />

=<br />

(x − 2)(x − 4)<br />

3<br />

= −<br />

(x − 1)(x − 4)<br />

2<br />

=<br />

(x − 1)(x − 2)<br />

6<br />

Il polinomio si scrive, quin<strong>di</strong>, come<br />

p 2 (x) = L 0 (x) · 1 + L 1 (x) · 3 + L 2 (x) · 3 = 1 3 (x − 2)(x − 4) − 3 2 (x − 1)(x − 4) + 3 (x − 1)(x − 2)<br />

6<br />

Raccogliendo i termini ritroviamo p 2 (x) = (−2x 2 + 12x − 7)/3, lo stesso polinomio ottenuto con le<br />

funzioni base monomiali, e ciò è dovuto all’unicità del polinomio interpolatore.<br />

5.3.3 Formula dell’errore<br />

Formula<br />

dell’errore Supponiamo, ora, che le or<strong>di</strong>nate y i siano i valori <strong>di</strong> una funzione f continua in un intervallo [a,b] (e<br />

con le derivate fino all’or<strong>di</strong>ne n + 1 continue) valutata nei punti <strong>di</strong> appoggio x i . Per ipotesi, i punti x i siano<br />

<strong>di</strong>stinti tra loro. Conosciamo, quin<strong>di</strong>, una funzione f e <strong>di</strong> questa funzione vogliamo fare l’interpolazione<br />

sostituendola me<strong>di</strong>ante un polinomio <strong>di</strong> grado n tale che p(x i ) = f (x i ) = y i , i = 0,...,n.<br />

In queste ipotesi, l’errore che si commette interpolando la funzione f con un polinomio p(x) <strong>di</strong> grado n<br />

vale<br />

f (x) − p(x) = f (n+1) (ξ(x))<br />

(n + 1)!<br />

n∏<br />

(x − x i )<br />

i=0<br />

dove ξ(x) è un punto, che non conosciamo e che <strong>di</strong>pende da x, che si trova all’interno dell’intervallo [a,b].<br />

6 Ricor<strong>di</strong>amo che, dati n valori w 1 , w 2 ,..., w n usiamo la seguente simbologia per in<strong>di</strong>care la loro somma e il loro prodotto, rispettivamente:<br />

.<br />

n∑<br />

w i = w 1 + w 2 + w 3 + ... + w n<br />

i=1<br />

n∏<br />

w i = w 1 · w 2 · w 3 · ... · w n<br />

i=1<br />

66


5.3. Interpolazione polinomiale<br />

Figura 5.3: Polinomi <strong>di</strong> Lagrange L 0 (x), L 1 (x), L 2 (x), con x 0 = 1, x 1 = 2, x 2 = 4.<br />

Proviamo questo risultato introducendo il polinomio F (x) <strong>di</strong> grado n +1 che si annulla<br />

nelle n + 1 ascisse dei dati assegnati.<br />

F (x) =<br />

n∏<br />

(x − x k )<br />

k=0<br />

Consideriamo, inoltre, un punto t <strong>di</strong>stinto dai punti <strong>di</strong> appoggio e compreso nell’intervallo<br />

I in<strong>di</strong>viduato dai valori minimo e massimo delle ascisse dei punti <strong>di</strong><br />

appoggio.<br />

f (t) − p(t)<br />

Definiamo la quantità S che <strong>di</strong>pende da t, data da S = e la funzione G(x) = f (x) − p(x) −<br />

F (t)<br />

SF (x).<br />

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<br />

per i = 0,...,n ma anche in t a causa <strong>di</strong> come è stato definito S. Si annulla, quin<strong>di</strong>, in n + 2 punti.<br />

Per il teorema <strong>di</strong> Rolle, la derivata prima si annulla n+1 volte in I . Applicando ripetutamente il teorema<br />

<strong>di</strong> Rolle sulle derivate successive, si arriva alla derivata n +1-sima <strong>di</strong> G, che si annulla almeno 1 volta in<br />

I . Sia ξ il punto in cui G (n+1) (ξ) = 0. Ma a<br />

G (n+1) (ξ) = f (n+1) (ξ) − S(n + 1)!<br />

Si ha perciò:<br />

f (n+1) (ξ) − S(n + 1)! = 0<br />

ovvero<br />

f (t) − p(t)<br />

F (t)<br />

= S = f (n+1) (ξ)<br />

(n + 1)!<br />

Considerando, ora, x al posto <strong>di</strong> t, e scrivendo ξ come funzione <strong>di</strong> x (in quanto il valore <strong>di</strong> ξ <strong>di</strong>pende<br />

da x) e scrivendo in forma estesa il polinomio F (x), otteniamo<br />

f (x) − p(x) = f (n+1) (ξ(x))<br />

(n + 1)!<br />

n∏<br />

(x − x i )<br />

i=0<br />

a La derivata n + 1-sima <strong>di</strong> un polinomio <strong>di</strong> grado n è una quantità nulla, mentre la derivata n + 1-sima <strong>di</strong> un polinomio <strong>di</strong><br />

grado n + 1, quale è F (x), vale (n + 1)!.<br />

67


5. INTERPOLAZIONE<br />

Abbiamo quin<strong>di</strong> una formula per l’errore, detta anche formula del resto. Il resto normalmente è incognito<br />

ma se conosciamo la f e una maggiorazione della f (n+1) , allora possiamo maggiorare il resto.<br />

Allo stesso modo, possiamo limitare l’errore <strong>di</strong> interpolazione se troviamo un limite superiore per |F (x)|.<br />

Differenze<br />

<strong>di</strong>vise e<br />

formula <strong>di</strong><br />

Newton<br />

5.3.4 Differenze <strong>di</strong>vise e formula <strong>di</strong> Newton<br />

Uno dei punti forti della rappresentazione <strong>di</strong> Lagrange è che se alcuni dati cambiano (ad esempio il valore<br />

<strong>di</strong> y j per un certo j ) allora il cambiamento è imme<strong>di</strong>atamente visibile nell’intero polinomio <strong>di</strong> interpolazione.<br />

Uno dei punti deboli, invece, è la procedura per valutare p n (x). Con la formula <strong>di</strong> Newton abbiamo un utile<br />

compromesso.<br />

Le funzioni base che ora consideriamo sono<br />

j∏<br />

−1<br />

φ j (x) = (x − x i ) j = 0,1,...,n<br />

i=0<br />

Quin<strong>di</strong> vogliamo scrivere il polinomio <strong>di</strong> interpolazione come:<br />

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 )<br />

dove c 0 , c 1 ...c n sono delle costanti da definire in modo opportuno.<br />

Esempio<br />

Esempio 5.3.4 Consideriamo sempre le tre coppie <strong>di</strong> punti <strong>degli</strong> esempi precedenti, (1,1), (2,3) e (4,3).<br />

Per costruire p 2 (x) abbiamo bisogno <strong>di</strong> φ 0 , φ 1 e φ 2 :<br />

φ 0 (x) = 1<br />

φ 1 (x) = (x − x 0 ) = (x − 1)<br />

φ 2 (x) = (x − x 0 )(x − x 1 ) = (x − 1)(x − 2)<br />

La con<strong>di</strong>zione <strong>di</strong> interpolazione in x 0 = 1 porta a:<br />

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<br />

Quin<strong>di</strong> c 1 = 1 = f (x 0 ).<br />

In x 1 = 2 abbiamo:<br />

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<br />

Ricaviamo quin<strong>di</strong> c 1 = f (x 1) − f (x 0 )<br />

= 3 − 1 = 2. Chiamiamo questa quantità <strong>di</strong>fferenza <strong>di</strong>visa del<br />

x 1 − x 0 2 − 1<br />

primo or<strong>di</strong>ne tra x 0 e x 1 e la in<strong>di</strong>chiamo con f [x 0 , x 1 ]. Quin<strong>di</strong><br />

Infine,<br />

f [x 0 , x 1 ] = f (x 1) − f (x 0 )<br />

x 1 − x 0<br />

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)<br />

= f (x 0 ) + f [x 0 , x 1 ](4 − 1) + c 2 (4 − 1)(4 − 2)<br />

Per ottenere una formula per c 2 che abbia carattere generale, riscriviamo l’equazione precedente<br />

utilizzando i simboli x 0 , x 1 , x 2 per le ascisse.<br />

68


5.3. Interpolazione polinomiale<br />

In x 1 si ha f (x 1 ) = p 2 (x 1 ) = f (x 0 ) + f [x 0 , x 1 ](x 1 − x 0 ).<br />

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 ).<br />

Sottraendo membro a membro la prima equazione dalla seconda si ricava:<br />

Quin<strong>di</strong><br />

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 )<br />

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 )<br />

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 )<br />

f (x 2 ) − f (x 1 )<br />

x 2 − x 1<br />

− f [x 0 , x 1 ] x 2 − x 1<br />

x 2 − x 1<br />

= c 2 (x 2 − x 0 )<br />

Ma f (x 2) − f (x 1 )<br />

x 2 − x 1<br />

f (x 2 ) − f (x 1 )<br />

x 2 − x 1<br />

− f [x 0 , x 1 ] = c 2 (x 2 − x 0 )<br />

= f [x 1 , x 2 ] è la <strong>di</strong>fferenza <strong>di</strong>visa del primo or<strong>di</strong>ne tra x 1 e x 2 da cui<br />

f [x 1 , x 2 ] − f [x 0 , x 1 ] = c 2 (x 2 − x 0 ) =⇒ c 2 = f [x 1, x 2 ] − f [x 0 , x 1 ]<br />

x 2 − x 0<br />

La quantità chiamata c 2 prende il nome <strong>di</strong> <strong>di</strong>fferenza <strong>di</strong>visa del secondo or<strong>di</strong>ne e si in<strong>di</strong>ca con<br />

f [x 0 , x 1 , x 2 ] = f [x 1, x 2 ] − f [x 0 , x 1 ]<br />

x 2 − x 0<br />

.<br />

Facendo le opportune sostituzioni si ricava c 2 = − 4 6 = − 2 3 . Quin<strong>di</strong>, p 2(x) = f (x 0 ) + f [x 0 , x 1 ](x − x 0 ) +<br />

f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ) Nell’esempio considerato: p 2 (x) = 1 + 2(x − 1) − 2 (x − 1)(x − 2)<br />

3<br />

Date le stesse coppie <strong>di</strong> punti, abbiamo visto come cambia la rappresentazione (usando come funzioni<br />

base i monomi, poi i polinomi <strong>di</strong> Lagrange e ora la formulazione <strong>di</strong> Newton) ma il polinomio finale è sempre<br />

lo stesso essendo unico il polinomio interpolatore.<br />

Da questo esempio, si può vedere come la rappresentazione secondo Newton sia <strong>di</strong> tipo ricorsivo: il polinomio<br />

p 1 (x) = f (x 0 ) + f [x 0 , x 1 ](x − x 0 ) (che si ha arrestandosi ai primi due passi del proce<strong>di</strong>mento appena<br />

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) è dato<br />

dalla somma <strong>di</strong> p 1 (x) e del termine f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ). Quin<strong>di</strong>, una volta determinato il polinomio<br />

p n−1 che interpola i primi n dati, possiamo usare questa rappresentazione per costruire p n che interpola i<br />

dati precedenti cui si aggiunge la coppia (x n , y n ).<br />

Il coefficiente c j del polinomio interpolatore <strong>di</strong> Newton si chiama <strong>di</strong>fferenza <strong>di</strong>visa <strong>di</strong> or<strong>di</strong>ne j e viene<br />

in<strong>di</strong>cata con f [x 0 , x 1 ,..., x j ].<br />

Perciò:<br />

f [x 0 ] = c 0 , f [x 0 , x 1 ] = c 1 , ..., f [x 0 , x 1 ,..., x n ] = c n<br />

La notazione utilizzata ci permette <strong>di</strong> capire anche da quali coppie <strong>di</strong> punti <strong>di</strong>pende il coefficiente c j .<br />

69


5. INTERPOLAZIONE<br />

Dati i punti x 0 , x 1 ,..., x n , per in<strong>di</strong>ci i e j arbitrari con 0 ≤ i ≤ j ≤ n, si ha<br />

f [x i ] = f (x i )<br />

f [x i ,..., x j ] = f [x i+1,... x j ] − f [x i ,..., x j −1 ]<br />

x j − x i<br />

La formula interpolatoria alle <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton è dunque data da<br />

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 ) + ...<br />

+ f [x 0 , x 1 ,..., x n ](x − x 0 )(x − x 1 )···(x − x n−1 )<br />

Da un punto <strong>di</strong> vista computazionale i coefficienti si ricavano me<strong>di</strong>ante la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise,<br />

tenendo presente che per calcolare f [x 0 , x 1 ,..., x n ] dobbiamo aver calcolato tutte le <strong>di</strong>fferenze <strong>di</strong>vise<br />

f [x j −k ,..., x j ], con 0 ≤ k ≤ j ≤ n.<br />

x i f [·] f [·,·] f [·,·,·] f [·,·,·,·] f [·,·,·,·,·]<br />

x 0 f (x 0 )<br />

f [x 0 , x 1 ] = f [x 1] − f [x 0 ]<br />

x 1 − x 0<br />

x 1 f (x 1 ) f [x 0 , x 1 , x 2 ] =<br />

= f [x 1, x 2 ] − f [x 0 , x 1 ]<br />

x 2 − x 0<br />

f [x 1 , x 2 ] = f [x 2] − f [x 1 ]<br />

x 2 − x 1<br />

f [x 0 , x 1 , x 2 , x 3 ] =<br />

= f [x 1,x 2 ,x 3 ]−f [x 0 ,x 1 ,x 2 ]<br />

x 3 −x 0<br />

x 2 f (x 2 ) f [x 1 , x 2 , x 3 ] = f [x 0 , x 1 , x 2 , x 3 , x 4 ] =<br />

= f [x 2, x 3 ] − f [x 1 , x 2 ]<br />

x 3 − x 1<br />

= f [x 1,x 2 ,x 3 ,x 4 ]−f [x 0 ,x 1 ,x 2 ,x 3 ]<br />

x 4 −x 0<br />

f [x 2 , x 3 ] = f [x 3] − f [x 2 ]<br />

x 3 − x 2<br />

f [x 1 , x 2 , x 3 , x 4 ] =<br />

x 3 f (x 3 ) f [x 2 , x 3 , x 4 ] =<br />

= f [x 3, x 4 ] − f [x 2 , x 3 ]<br />

x 4 − x 2<br />

= f [x 2,x 3 ,x 4 ]−f [x 1 ,x 2 ,x 3 ]<br />

x 4 −x 1<br />

.<br />

f [x 3 , x 4 ] = f [x 4] − f [x 3 ]<br />

x 4 − x 3<br />

. ..<br />

x 4 f (x 4 )<br />

.<br />

.<br />

.<br />

.<br />

I coefficienti della <strong>di</strong>agonale principale sono i coefficienti c j del polinomio interpolatore <strong>di</strong> Newton.<br />

70


5.3. Interpolazione polinomiale<br />

Esempio<br />

Esempio 5.3.5 Costruiamo la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise per i dati (1,1), (2,3) e (4,3).<br />

x i f [·] f [·,·] f [·,·,·]<br />

1 1<br />

3 − 1<br />

2 − 1 = 2<br />

0 − 2<br />

2 3<br />

4 − 1 = − 2 3<br />

3 − 3<br />

4 − 2 = 0<br />

4 3<br />

Il polinomio p 2 (x) si scrive: p 2 (x) = 1 + 2(x − 1) − 2 (x − 1)(x − 2).<br />

3<br />

Se vogliamo aggiungere altri dati, per esempio, la coppia (5,4), dobbiamo aggiungere una riga alla tabella<br />

della <strong>di</strong>fferenza <strong>di</strong>visa e un termine al polinomio che abbiamo già ricavato per ottenere quello <strong>di</strong><br />

grado superiore interpolante tutti i dati che abbiamo a <strong>di</strong>sposizione.<br />

x i f [·] f [·,·] f [·,·,·] f [·,·,·,·]<br />

1 1<br />

3 − 1<br />

2 − 1 = 2<br />

0 − 2<br />

2 3<br />

4 − 1 = − 2 3<br />

1<br />

3 − 3<br />

4 − 2 = 0 3 − −2<br />

3<br />

5 − 1 = 1 4<br />

1 − 0<br />

4 3<br />

5 − 2 = 1 3<br />

4 − 3<br />

5 − 4 = 1<br />

5 4<br />

Il polinomio p 3 (x) è p 3 (x) = p 2 (x) + 1 (x − 1)(x − 2)(x − 4).<br />

4<br />

Il concetto <strong>di</strong> <strong>di</strong>fferenza <strong>di</strong>visa può essere visto come un’estensione del concetto <strong>di</strong> derivata <strong>di</strong> una funzione.<br />

Si ha, infatti, che, per f derivabile, la <strong>di</strong>ffenza <strong>di</strong>visa del primo or<strong>di</strong>ne f [x 0 , x 1 ] può essere vista come<br />

un rapporto incrementale e quin<strong>di</strong>, al limite per x 1 → x 0 , si ha f ′ (x 0 ).<br />

La <strong>di</strong>fferenza <strong>di</strong>visa k-sima e la derivata k-sima <strong>di</strong> f sono legate tra loro. Si può provare, infatti, per k ≥ 1<br />

che vale la relazione<br />

f [x 0 , x 1 ,..., x k ] = f (k) (ξ)<br />

k!<br />

dove ξ è un punto appartente all’interno dell’intervallo in<strong>di</strong>viduato dagli estremi <strong>di</strong> x 0 ,..., x k . Quando i punti<br />

coincidono, si ha<br />

f [ x 0,x 0 ,...,x 0<br />

} {{ }<br />

] = f (k) (x 0 )<br />

k!<br />

k+1 volte<br />

Questa formula serve per calcolare il polinomio <strong>di</strong> interpolazione che interpola non solo una certa funzione<br />

f ma anche le sue derivate in alcuni punti assegnati (si veda l’esercizio 5.6.3 a fine Capitolo).<br />

Se al polinomio p n (x) aggiungiamo la coppia <strong>di</strong> dati (x, f (x)) si ha p n+1 (x) = f (x) = p n (x) +<br />

f [x 0 , x 1 ,..., x n , x](x − x 0 )(x − x 1 ) · ...(x − x n ). L’ultima <strong>di</strong>fferenza <strong>di</strong>visa non si può calcolare, poichè <strong>di</strong>pende<br />

da x (che è la nostra variabile), ma ci è utile per capire quanto vale l’errore che commettiamo nell’approssimare<br />

f (x) me<strong>di</strong>ante il polinomio interpolatore, applicando la rappresentazione <strong>di</strong> Newton. Inoltre, dato che<br />

Derivata<br />

k-sima della<br />

f<br />

Formula<br />

dell’errore<br />

71


5. INTERPOLAZIONE<br />

il polinomio interpolatore è unico (fissate le coppie <strong>di</strong> dati del problema), anche l’errore che si commette è lo<br />

stesso, qualunque sia la strategia utilizzata per arrivare ad esso. Quin<strong>di</strong> possiamo eguagliare l’errore trovato<br />

utilizzando i polinomi <strong>di</strong> Lagrange con l’errore trovato nella rappresentazione <strong>di</strong> Newton, ottenendo:<br />

f (n+1) (ξ(x)) n∏<br />

n∏<br />

(x − x i ) = f [x 0 , x 1 ,..., x n , x] (x − x i )<br />

(n + 1)!<br />

i=0<br />

5.4 Considerazioni sull’interpolazione polinomiale<br />

5.4.1 Fenomeno <strong>di</strong> Runge<br />

i=0<br />

Fenomeno <strong>di</strong><br />

Runge<br />

Data una funzione f , si pensa che il polinomio <strong>di</strong> interpolazione possa approssimare bene la funzione,<br />

soprattutto se si aumenta il numero dei punti <strong>di</strong> appoggio. In realtà questo non è sempre vero e un semplice<br />

e famoso esempio ce lo fa capire. Sia data la funzione <strong>di</strong> Runge 7 1<br />

f (x) = e consideriamo il polino-<br />

1 + x2 mio <strong>di</strong> interpolazione <strong>di</strong> questa funzione per valori crescenti <strong>di</strong> n prendendo punti <strong>di</strong> appoggio equi<strong>di</strong>stanti<br />

nell’intervallo [−5,5]. Partiamo da n + 1 = 2 con i punti equi<strong>di</strong>stanti x 0 = −5, x 1 = 0 e x 2 = 5. Si ha la tabella<br />

x i −5 0 5<br />

y i = f (x i ) 3.846154e − 2 1. 3.846154e − 2<br />

Costruiamo quin<strong>di</strong> il polinomio <strong>di</strong> interpolazione p 2 (x) (utilizzando l’approccio <strong>di</strong> Lagrange o <strong>di</strong> Newton, i<br />

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

Figura 5.4: Funzione <strong>di</strong> Runge e polinomi interpolanti <strong>di</strong> grado 2, 4 e 8.<br />

x 2 . Abbiamo n + 1 = 5 e i valori della tabella<br />

x i −5 −2.5 0 2.5 5<br />

y i = f (x i ) 3.846154e − 2 1.379310e − 1 1. 1.379310e − 1 3.846154e − 2<br />

Con lo stesso proce<strong>di</strong>mento, costruiamo i polinomi <strong>di</strong> interpolazione <strong>di</strong> grado 8 e 16. In Figura 5.4 sono riportati<br />

i grafici della funzione <strong>di</strong> Runge (in nero) e dei polinomi interpolanti <strong>di</strong> grado 2, 4 e 8. Si può osservare<br />

7 Carl Runge (1856-1927) fu un matematico tedesco. Fu studente <strong>di</strong> Weierstrass, Kirchhoff, Helmholtz. Iniziò poi a collaborare con<br />

Kronecker e poi si de<strong>di</strong>cò in particolare allo stu<strong>di</strong>o della soluzione numerica <strong>di</strong> equazioni algebriche e alla spettroscopia.<br />

72


5.4. Considerazioni sull’interpolazione polinomiale<br />

che solo in un sottointervallo <strong>di</strong> [−5,5] al crescere <strong>di</strong> n, i polinomi convergono alla funzione. Agli estremi<br />

dell’intervallo [−5,5] si hanno oscillazioni che aumentano sempre più al crescere <strong>di</strong> n. Infatti in Figura 5.5<br />

(a sinistra) non si riesce più a <strong>di</strong>stinguere il profilo della funzione <strong>di</strong> Runge perchè il polinomio <strong>di</strong> interpolazione<br />

<strong>di</strong> grado 16 ha delle oscillazioni molto alte. Tuttavia, se restringiamo questo grafico in un intorno<br />

dell’origine, possiamo vedere come il polinomio p 16 si avvicini bene alla funzione – si veda la Figura 5.5 (a<br />

destra)! L’esempio <strong>di</strong> Runge è utile per capire che la scelta dei no<strong>di</strong> equi<strong>di</strong>stanti non si rivela sempre la scel-<br />

Figura 5.5: Funzione <strong>di</strong> Runge e polinomio interpolante <strong>di</strong> grado 16 su tutto l’intervallo [−5,5] (a sinistra) e in<br />

un sottointervallo (a destra)<br />

ta giusta e che occorrono altre strategie nella scelta dei no<strong>di</strong> per ottenere migliori risultati. Nell’esempio <strong>di</strong><br />

Runge, infatti, il rapporto f (n+1) (ξ(x))<br />

, che compare nella formula dell’errore, cresce, al crescere <strong>di</strong> n, agli<br />

(n + 1)!<br />

estremi dell’intervallo <strong>di</strong> interpolazione, perciò aumentando il grado del polinomio <strong>di</strong> interpolazione, aumenta<br />

l’errore! Per indagare ulteriormente su questo problema, si rimanda alla letteratura specializzata del<br />

settore.<br />

5.4.2 Malcon<strong>di</strong>zionamento nell’interpolazione con funzioni base monomiali<br />

All’inizio <strong>di</strong> questo Capitolo, abbiamo introdotto il polinomio <strong>di</strong> interpolazione me<strong>di</strong>ante funzioni base<br />

monomiali: il problema dell’interpolazione veniva risolto me<strong>di</strong>ante un sistema lineare la cui matrice, <strong>di</strong><br />

Vandermonde, è malcon<strong>di</strong>zionata.<br />

Ve<strong>di</strong>amo <strong>di</strong> capire questo malcon<strong>di</strong>zionamento me<strong>di</strong>ante un esempio. Si voglia stu<strong>di</strong>are l’interpolazione<br />

dei seguenti dati<br />

x i 1010.5 1011.5 1012.5 1013 1014 1015<br />

y i 4 2.5 2.5 2 2 0<br />

Confrontando i vari algoritmi <strong>di</strong> interpolazione, osserveremo che gli algoritmi <strong>di</strong> Lagrange e delle <strong>di</strong>fferenze<br />

<strong>di</strong>vise <strong>di</strong> Newton danno buoni risultati. Al contrario, il metodo che porta alla costruzione della matrice<br />

<strong>di</strong> Vandermonde dà risultati <strong>di</strong>sastrosi, come si può vedere in Figura 5.6. Eppure, dal punto <strong>di</strong> vista teorico i<br />

risultati dovrebbero essere identici.<br />

Perchè si hanno questi risultati Bisogna tener conto <strong>di</strong> tre aspetti: il calcolo della matrice <strong>di</strong> Vandermonde;<br />

la soluzione del sistema lineare per ricavare i coefficienti del polinomio con funzioni base monomiali; il<br />

calcolo dei valori del polinomio.<br />

La matrice <strong>di</strong> Vandermonde consiste <strong>di</strong> colonne che crescono <strong>di</strong> colonna in colonna - 1, x i , x 2 i , x3 i , ...,<br />

x 5 i . Per questo caso test, si va da 1 a elementi dell’or<strong>di</strong>ne <strong>di</strong> 1015 . La matrice è molto mal con<strong>di</strong>zionata.<br />

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

73


5. INTERPOLAZIONE<br />

Figura 5.6: Effetti del malcon<strong>di</strong>zionamento<br />

polinomio interpolatore è completamente errato. Ciò porta anche al fenomeno della cancellazione numerica<br />

nel calcolo del polinomio <strong>di</strong> interpolazione, per cui si ha una significativa per<strong>di</strong>ta <strong>di</strong> accuratezza e il grafico<br />

risultante presenta un profilo altamente oscillante.<br />

5.5 Interpolazione polinomiale a tratti<br />

Abbiamo visto, nell’esempio <strong>di</strong> Runge, che l’interpolazione polinomiale con no<strong>di</strong> equi<strong>di</strong>stanti non porta<br />

a una buona interpolazione, in quanto l’errore, che <strong>di</strong>pende dalla derivata f n+1 (x), aumenta al crescere <strong>di</strong> n.<br />

Nel caso dell’esempio <strong>di</strong> Runge, una <strong>di</strong>versa scelta <strong>di</strong> no<strong>di</strong> può portare a buoni risultati, ma resta il fatto che<br />

se il rapporto f n+1<br />

aumenta al crescere <strong>di</strong> n, anche l’errore rimane elevato.<br />

(n + 1)!<br />

Aumentando il numero dei punti <strong>di</strong> appoggio, il polinomio <strong>di</strong> interpolazione porta forti e irragionevoli<br />

oscillazioni al <strong>di</strong> fuori dell’intervallo dei no<strong>di</strong>, come si può vedere in Figura 5.7<br />

Figura 5.7: Interpolazione della funzione f (x) = exp(x) con n = 20 (sinistra) e n = 40 (destra). I no<strong>di</strong> <strong>di</strong><br />

interpolazione sono nell’intervallo [0,1].<br />

A volte, se la funzione da interpolare è continua a tratti, il termine dell’errore può essere ancora grande.<br />

In Figura 5.8, sono messi a confronto il polinomio <strong>di</strong> interpolazione <strong>di</strong> grado n = 5 che interpola la funzione<br />

74


5.5. Interpolazione polinomiale a tratti<br />

f (x) = |x| + 1 prendendo 6 punti equi<strong>di</strong>stanti nell’intervallo [−1,1] e il polinomio <strong>di</strong> interpolazione della<br />

funzione f (x) = e x nello stesso intervallo e con gli stessi punti. Mentre nel caso della funzione f (x) = e x il<br />

polinomio <strong>di</strong> interpolazione, nell’intervallo dei no<strong>di</strong>, si sovrappone alla funzione interpolata, per la funzione<br />

f (x) = |x| + 1 l’errore è ben evidente.<br />

Figura 5.8: Interpolazione della funzione f (x) = |x| + 1 (a sinistra) e della funzione f (x) = e x (a destra) con<br />

n = 5 nell’intervallo [−1,1]<br />

Se, in alcuni casi, la scelta dei no<strong>di</strong>, fatta in maniera opportuna, può risolvere determinati problemi che<br />

si incontrano nell’interpolazione, altre volte il polinomio <strong>di</strong> interpolazione produce risultati comunque non<br />

buoni, in<strong>di</strong>pendentemente dalla scelta dei no<strong>di</strong>.<br />

La domanda, allora, è la seguente: come possiamo ridurre il termine dell’errore senza aumentare<br />

il grado n nell’interpolazione e, tuttavia, mantenendo un numero elevato <strong>di</strong> no<strong>di</strong> La risposta viene<br />

dall’interpolazione polinomiale a tratti.<br />

Supponiamo <strong>di</strong> voler costruire una curva che interpola dei dati che si trovano all’interno <strong>di</strong> un certo intervallo<br />

[a,b]. Prenderemo dei punti all’interno <strong>di</strong> questo intervallo, in modo che il primo e l’ultimo punto<br />

coincidano con a e b rispettivamente: a = x 1 < x 2 < ... < x m = b. Chiamiamo questi punti no<strong>di</strong>. Come si<br />

può notare, abbiamo cambiato la numerazione dei no<strong>di</strong> (non più da x 0 a x n ma da x 1 a x m ) per evitare confusioni<br />

con quanto detto prima sull’interpolazione polinomiale. A ciascun nodo è associato il valore y i da<br />

interpolare. In questo modo abbiamo m no<strong>di</strong> in [a,b] e possiamo considerare gli m − 1 sottointervalli dati<br />

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<br />

i = 1,2,...,m − 1). Su ciascun sottointervallo andremo a costruire un polinomio <strong>di</strong> interpolazione <strong>di</strong> grado<br />

basso (considereremo n = 1 e n = 3), che chiamamo s i (x). La funzione <strong>di</strong> interpolazione globale sarà una<br />

curva v(x) continua (in alcuni casi anche <strong>di</strong> classe C 1 o C 2 ) che sod<strong>di</strong>sfa la relazione<br />

v(x) = s i (x), x i ≤ x ≤ x i+1 ,i = 1,2,...,m − 1.<br />

Ci sono <strong>di</strong>versi tipi <strong>di</strong> interpolazione polinomiale a tratti.<br />

l’interpolazione lineare a tratti e le spline cubiche.<br />

Noi ne consideriamo solamente due:<br />

5.5.1 Interpolazione lineare a tratti<br />

Il caso più semplice da considerare è prendere, su ciascun sottointervallo [x i , x i+1 ] un polinomio <strong>di</strong> interpolazione<br />

lineare (grado n = 1), quin<strong>di</strong> una retta. Allora la funzione v(x) sarà continua (ma non avrà le<br />

derivate continue) in tutto l’intervallo.<br />

Nell’intervallo [x i , x i+1 ], il polinomio <strong>di</strong> interpolazione s i (x) si può costruire facilmente applicando, ad<br />

esempio, la formula delle <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton, da cui s i (x) = y i + f [x i , x i+1 ](x − x i ).<br />

Globalmente avremo v(x) tale che<br />

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.<br />

Un esempio <strong>di</strong> interpolazione lineare a tratti si ha in Figura 5.9. Il grande vantaggio <strong>di</strong> usare questo tipo<br />

<strong>di</strong> interpolazione è la sua semplicità e facilità. Tuttavia spesso questo tipo <strong>di</strong> interpolazione non è sufficiente<br />

75


5. INTERPOLAZIONE<br />

Figura 5.9: Esempio <strong>di</strong> interpolazione lineare a tratti<br />

perchè non è abbastanza regolare (c’è <strong>di</strong>scontinuità nelle derivate ai punti <strong>di</strong> appoggio) e in molte applicazioni,<br />

invece, serve che ci sia continuità anche nelle derivate. Per avere maggiore continuità, vogliamo ad<br />

esempio che la funzione <strong>di</strong> interpolazione v(x) sia <strong>di</strong> classe C 1 o C 2 , si deve aumentare il grado del polinomio<br />

s i (x) su ciascun sottointervallo. La scelta più <strong>di</strong>ffusa è quella <strong>di</strong> usare polinomi cubici. Tra i polinomi cubici<br />

c’è l’interpolazione cubica <strong>di</strong> Hermite a tratti (che non descriviamo) e l’interpolazione spline cubica (che<br />

vedremo più nei dettagli).<br />

5.5.2 Interpolazione spline cubica<br />

Su ciascun sottointervallo, consideriamo un polinomio <strong>di</strong> terzo grado (n = 3), da cui la funzione globale<br />

v(x) sarà:<br />

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<br />

Quin<strong>di</strong> su ciascun sottointervallo abbiamo un polinomio cubico, che <strong>di</strong>pende da quattro coefficienti<br />

(a i ,b i ,c i ,d i ). Per ora, questi coefficienti sono incogniti, e poichè abbiamo 4 incognite su m − 1 sottointervalli,<br />

abbiamo un totale <strong>di</strong> 4(m − 1) incognite. Come determinare queste incognite Imponendo non solo le<br />

con<strong>di</strong>zioni <strong>di</strong> interpolazione (ricor<strong>di</strong>amo che noi abbiamo non solo le ascisse x i ma anche le or<strong>di</strong>nate y i e<br />

la con<strong>di</strong>zione <strong>di</strong> interpolazione si legge come v(x i ) = y i ), ma anche la continuità della derivata prima e della<br />

derivata seconda nei punti <strong>di</strong> raccordo tra un sottointervallo e il successivo. Abbiamo quin<strong>di</strong> le seguenti<br />

con<strong>di</strong>zioni da imporre:<br />

s i (x i ) = y i , i = 1,2,...,m − 1<br />

s i (x i+1 ) = y i+1 , i = 1,2,...,m − 1<br />

s ′ i (x i+1) = s ′ i+1 (x i+1), i = 1,2,...,m − 2<br />

s ′′<br />

i (x i+1) = s ′′<br />

i+1 (x i+1), i = 1,2,...,m − 2<br />

Osserviamo che le con<strong>di</strong>zioni <strong>di</strong> continuità delle derivate prime e seconde le possiamo imporre solo nei<br />

punti interni, e non in x 1 e x m , il primo e l’ultimo punto. Le con<strong>di</strong>zioni che abbiamo appena scritto sono<br />

2(m − 1) + 2(m − 2) = 4(m − 1) − 2. Abbiamo 2 con<strong>di</strong>zioni in meno rispetto alle 4(m − 1) incognite che dobbiamo<br />

determinare! Le due con<strong>di</strong>zioni che mancano vengono imposte su punti finali x 1 e x m e, in base alle<br />

con<strong>di</strong>zioni imposte si hanno le cosiddette spline naturali, complete e not-a-knot. Nelle spline naturali si<br />

richiede s<br />

1 ′′(x<br />

1) = s<br />

m−1 ′′ (x m) = 0. Nelle spline complete, vengono specificati i valori delle derivate prime per<br />

s<br />

1 ′ (x 1) e per s<br />

m−1 ′ (x m). Invece per le spline not-a-knot si richiede la continuità della derivata terza <strong>di</strong> s 1 e <strong>di</strong><br />

76


5.5. Interpolazione polinomiale a tratti<br />

s m−1 in x 2 e in x m−1 rispettivamente: poichè la derivata terza è una costante (stiamo lavorando con polinomi<br />

cubici), questa con<strong>di</strong>zione 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<br />

sono attivi.<br />

Nel seguito, tratteremo solamente il caso delle spline cubiche naturali, per la loro semplicità <strong>di</strong> implementazione.<br />

Da un punto <strong>di</strong> visto storico, il termine spline deriva da un sottile e flessibile strumento per<br />

<strong>di</strong>segnare curve, fatto <strong>di</strong> legno o metallo, utilizzato prima dell’avvento dei computer, soprattutto nell’industria<br />

navale. Per poter passare per determinati punti, la spline era tenuta ferma da alcuni pesi, mentre alle<br />

estremità non aveva costrizioni (quin<strong>di</strong> derivata seconda nulla, come accade nelle spline naturali). La spline<br />

naturale minimizza l’energia <strong>di</strong> tensione tra tutte le funzioni che sono costrette a passare per quei punti e con<br />

la stessa continuità.<br />

Figura 5.10: Esempio <strong>di</strong> interpolazione spline cubica<br />

Passiamo ora a capire come si ricavano i coefficienti incogniti.<br />

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 ].<br />

Dalla relazione <strong>di</strong> interpolazione s i (x i ) = y i si ricava facilmente<br />

a i = y i , i = 1,2,...,m − 1<br />

Dall’altra relazione <strong>di</strong> interpolazione s i (x i+1 ) = y i+1 si ricava<br />

a i + b i h i + c i h 2 i + d i h 3 i = y i+1<br />

cioè (sostituendo il valore per a i ):<br />

y i + b i h i + c i h 2 i + d i h 3 i = y i+1, i = 1,2,...,m − 1 (5.1)<br />

Useremo l’equazione (5.1) successivamente.<br />

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

s ′ i (x) = b i + 2c i (x − x i ) + 3d i (x − x i ) 2<br />

s ′′<br />

i (x) = 2c i + 6d i (x − x i )<br />

A questo punto, dalla relazione s ′ i (x i+1) = s ′ i+1 (x i+1), i = 1,2,...,m − 2 ricaviamo (osserviamo che a destra<br />

dobbiamo valutare s ′ i+1 (x i+1):<br />

b i + 2c i h i + 3d i h 2 i = b i+1, i = 1,2,...,m − 2 (5.2)<br />

77


5. INTERPOLAZIONE<br />

Dalla relazione s ′′<br />

i (x i+1) = s ′′<br />

i+1 (x i+1), i = 1,2,...,m − 2 ricaviamo<br />

2c i + 6d i h i = 2c i+1 , i = 1,2,...,m − 2<br />

che si semplifica in<br />

c i + 3d i h i = c i+1 , i = 1,2,...,m − 2<br />

Da quest’ultima relazione otteniamo<br />

d i = c i+1 − c i<br />

3h i<br />

, i = 1,2,...,m − 2 (5.3)<br />

Adesso i coefficienti d i sono in funzione dei coefficienti c i . Sostituiamo il valore <strong>di</strong> d i appena ricavato<br />

nell’equazione (5.1) e ricaviamo b i in funzione dei coefficienti c i . abbiamo<br />

y i + b i h i + c i h 2 i + d i h 3 i = y i+1<br />

b i h i + c i h 2 i + ( c i+1 − c i<br />

)h 3 i<br />

3h = y i+1 − y i<br />

i<br />

<strong>di</strong>vi<strong>di</strong>amo tutto per h i e per compattare i termini utlizziamo le <strong>di</strong>fferenze <strong>di</strong>vise dove servono<br />

b i + c i h i + ( c i+1 − c i<br />

3<br />

)h i = f [x i , x i+1 ]<br />

Otteniamo, per b i , la relazione<br />

b i = f [x i , x i+1 ] − (2c i + c i+1 )h i<br />

3<br />

Sostituiamo ora i valori per b i e per d i nell’equazione (5.2):<br />

f [x i , x i+1 ] − (2c i + c i+1 )h i<br />

3<br />

, i = 1,...,m − 1 (5.4)<br />

b i + 2c i h i + 3d i h 2 i = b i+1, i = 1,2,...,m − 2<br />

+ 2c i h i + 3 c i+1 − c i<br />

h 2 i<br />

3h = f [x i+1, x i+2 ] − (2c i+1 + c i+2 )h i+1<br />

i 3<br />

raccogliendo i termini in h i a sinistra<br />

f [x i , x i+1 ] + (c i + 2c i+1 )h i<br />

= f [x i+1 , x i+2 ] − (2c i+1 + c i+2 )h i+1<br />

3<br />

3<br />

moltiplichiamo ambo i membri per 3 e portiamo le <strong>di</strong>fferenze <strong>di</strong>vise a destra<br />

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)<br />

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

c 1 ,c 2 ,...,c m . Aggiungiamo, allora, le con<strong>di</strong>zioni per le spline naturali: deve essere s<br />

1 ′′(x<br />

1) = s<br />

m−1 ′′ (x m) = 0.<br />

Si ha<br />

s ′′<br />

1 (x 1) = 2c 1 = 0<br />

s ′′ m−1 (x m) = 2c m−1 + 6d m−1 h m−1 = 0<br />

da cui c 1 = 0 e, d m−1 = − c m−1<br />

3h m−1<br />

. Di conseguenza, ponendo c m = 0 possiamo estendere all’in<strong>di</strong>ce i = m − 1 la<br />

relazione (5.3) per i coefficienti d i : d m−1 = c m − c m−1<br />

3h m−1<br />

.<br />

78


5.5. Interpolazione polinomiale a tratti<br />

Osserviamo che, dalla relazione s ′′<br />

i (x i ) = 2c i si ricava il significato geometrico dei coefficienti c i =<br />

s ′′<br />

i (x i )<br />

. Inoltre, con la posizione c 1 = c m = 0 le equazioni (5.5), per i = 1 e per i = m − 2 si semplificano,<br />

2<br />

rispettivamente, in<br />

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

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)<br />

Perciò il sistema da risolvere per trovare i coefficienti c 2 ,c 3 ,...,c m−1 , mettendo insieme le equazioni (5.5),<br />

(5.6),(5.7), è dato da Ac = β dove<br />

⎛<br />

⎞<br />

2(h 1 + h 2 ) h 2 0 ··· 0<br />

h 2 2(h 2 + h 3 ) h 3 0<br />

.<br />

0 h 3 2(h 3 + h 4 ) h 4 ...<br />

A =<br />

. 0<br />

.. . .. . .. 0<br />

⎜<br />

⎝<br />

⎟<br />

. h m−3 2(h m−3 + h m−2 ) h m−2<br />

⎠<br />

0 ··· 0 h m−2 2(h m−2 + h m−1 )<br />

⎛ ⎞<br />

c 2<br />

c 3<br />

c =<br />

⎜<br />

⎝<br />

⎟<br />

. ⎠<br />

c m−1<br />

⎛<br />

⎞<br />

3(f [x 2 , x 3 ] − f [x 1 , x 2 ])<br />

3(f [x 3 , x 4 ] − f [x 2 , x 3 ])<br />

β =<br />

⎜<br />

⎝<br />

⎟<br />

.<br />

⎠<br />

3(f [x m−1 , x m ] − f [x m−2 , x m−1 ])<br />

Una volta ricavati i coefficienti c i , usando le equazioni (5.3) e (5.4), per i = 1,...,m − 1, si trovano tutti i<br />

coefficienti delle cubiche s i .<br />

Ricapitolando, per trovare i coefficienti delle spline cubiche naturali si deve:<br />

1. risolvere il sistema Ac = ψ che, risolto, fornisce i coefficienti c 2 ,c 3 ,...,c m−1<br />

delle spline;<br />

2. aggiungere al vettore c, i valori c 1 = c m = 0<br />

3. applicare, per i = 1,...,m − 1 le relazioni<br />

a i = y i<br />

b i = f [x i , x i+1 ] − (2c i + c i+1 )h i<br />

3<br />

d i = c i+1 − c i<br />

3h i<br />

5.5.3 Curve parametriche<br />

Supponiamo <strong>di</strong> avere un insieme <strong>di</strong> punti in cui le ascisse possono ripetersi e in cui si vuole che i punti<br />

vengano messi insieme per formare una particolare curva. In Figura 5.11 ve<strong>di</strong>amo un esempio <strong>di</strong> punti e<br />

<strong>di</strong> curva che vogliamo ottenere: in questo caso an<strong>di</strong>amo a unire i punti nell’or<strong>di</strong>ne considerato me<strong>di</strong>ante<br />

segmenti <strong>di</strong> retta. Questa curva, tuttavia, non può essere espressa come funzione <strong>di</strong> x o <strong>di</strong> y perchè non è una<br />

funzione (ad ogni valore <strong>di</strong> x non corrisponde un solo valore sull’asse delle or<strong>di</strong>nate, come deve accadere<br />

per funzioni del tipo y = f (x)). Ci troviamo <strong>di</strong> fronte ad un esempio <strong>di</strong> curva. Possiamo pensare alla curva<br />

come il percorso <strong>di</strong> una particella che si muove in funzione del tempo t e, <strong>di</strong> conseguenza, le coor<strong>di</strong>nate della<br />

particella sono funzioni <strong>di</strong> t (x = x(t), y = y(t)). Abbiamo le cosiddette equazioni parametriche <strong>di</strong> una curva.<br />

79


5. INTERPOLAZIONE<br />

Figura 5.11: Esempio <strong>di</strong> curva parametrica.<br />

Per poter costruire la curva <strong>di</strong> interpolazione, come nell’esempio proposto, dobbiamo, quin<strong>di</strong>,<br />

parametrizzare le coor<strong>di</strong>nate (x i , y i ), i = 1,2,...,m.<br />

Dobbiamo cercare, quin<strong>di</strong> dei valori t 1 , t 2 ,... t m tali che x i è il risultato <strong>di</strong> una certa funzione x al tempo<br />

t i mentre y i è il risultato <strong>di</strong> una certa funzione y allo stesso tempo t i . Dobbiamo dunque avere una<br />

rappresentazione del tipo:<br />

(t 1 , x 1 ), (t 2 , x 2 ) ... (t m , x m )<br />

(t 1 , y 1 ), (t 2 , y 2 ) ... (t m , y m )<br />

In tal caso, possiamo approssimare la curva x me<strong>di</strong>ante le con<strong>di</strong>zioni <strong>di</strong> interpolazione x(t i ) = x i mentre la<br />

curva y dovrà verificare y(t i ) = y i .<br />

Se abbiamo m punti a <strong>di</strong>sposizione, possiamo fissare i valori t i come t i = i , per i = 1,2,...,m (si può anche<br />

scegliere t i = i ): l’importante è avere dei valori crescenti per la variabile t.<br />

m<br />

La curva in forma parametrica è dunque espressa da (x(t), y(t)). Per costruire x(t) e y(t) usiamo le tecniche<br />

<strong>di</strong> interpolazione a tratti (per esempio <strong>di</strong> interpolazione lineare a tratti o <strong>di</strong> spline cubiche a tratti) in<br />

modo da ottenere il risultato finale. In figura 5.12 ve<strong>di</strong>amo un esempio <strong>di</strong> interpolazione lineare a tratti con<br />

gli stessi no<strong>di</strong> usati per ottenere la curva <strong>di</strong> figura 5.11.<br />

Figura 5.12:<br />

figura 5.11.<br />

Esempio <strong>di</strong> curva parametrica con interpolazione spline cubica a tratti (stessi no<strong>di</strong> della<br />

80


5.6. <strong>Esercizi</strong><br />

5.6 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 5.6.1 Sia data la tabella seguente:<br />

x i -1 0 2 3 4<br />

f (x i ) 9 0 0 15 84<br />

(a) Scrivere la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise.<br />

(b) Trovare il polinomio interpolatore (con la formula <strong>di</strong> Newton) <strong>di</strong> grado non superiore a 4.<br />

Svolgimento<br />

(a) La tabella delle <strong>di</strong>fferenza <strong>di</strong>vise è:<br />

x i f (x i ) f (·,·) f (·,·,·) f (·,·,·,·) f (·,·,·,·,·)<br />

-1 9<br />

0 0<br />

0 − 9<br />

0 − (−1) = −9<br />

2 0<br />

3 15<br />

4 84<br />

0 − 0<br />

2 − 0 = 0 0 + 9<br />

2 − (−1) = 3<br />

15 − 0<br />

3 − 2 = 15 15 − 0<br />

3 − 0 = 5 5 − 3<br />

3 − (−1) = 0.5<br />

84 − 15<br />

4 − 3 = 69 69 − 15<br />

4 − 2 = 27 27 − 5<br />

4 − 0 = 11 2<br />

11/2 − 1/2<br />

= 1<br />

4 − (−1)<br />

(b) Il polinomio <strong>di</strong> Newton <strong>di</strong> grado 4 che interpola i dati assegnati è dunque (prendendo i valori della<br />

<strong>di</strong>agonale principale della tabella)<br />

p(x) = 9 − 9(x + 1) + 3(x + 1)x + 0.5(x + 1)x(x − 2) + (x + 1)x(x − 2)(x − 3) =<br />

= x 4 − 3.5x 3 + 3.5x 2 − x<br />

<strong>Esercizi</strong>o 5.6.2 Sia data la tabella seguente:<br />

x i 0 0.1 0.8 1.2<br />

f (x i ) 1 0.48 1.32 5.32<br />

(a) Scrivere la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise.<br />

(b) Usando i quattro punti in successione, scrivere i polinomi interpolanti (<strong>di</strong> Newton) p n (x) <strong>di</strong> grado<br />

non superiore ad n (con n=0,1,2,3); commentare il risultato.<br />

(c) Usando p n (x) stimare, per ogni n, f (0.6) e f ′ (0.6).<br />

(d) scrivere il polinomio p 2 (x) con la formula <strong>di</strong> Lagrange.<br />

Svolgimento<br />

81


5. INTERPOLAZIONE<br />

x i f (x i ) f (·,·) f (·,·,·) f (·,·,·,·)<br />

0 1<br />

0.1 0.48<br />

0.48 − 1<br />

= −5.2<br />

0.1<br />

0.8 1.32<br />

1.32 − 0.48<br />

= 1.2<br />

0.7<br />

1.2 + 5.2<br />

= 8<br />

0.8<br />

1.2 5.32<br />

5.32 − 1.32<br />

= 10<br />

0.4<br />

10 − 1.2<br />

= 8<br />

1.1<br />

8 − 8<br />

1.2 = 0<br />

(a) La tabella delle <strong>di</strong>fferenza <strong>di</strong>vise è:<br />

(b) I polinomi <strong>di</strong> Newton <strong>di</strong> grado 0,1,2 e 3 sono:<br />

p 0 (x) = 1<br />

p 1 (x) = 1 − 5.2x<br />

p 2 (x) = 1 − 5.2x + 8x(x − 0.1) = 8x 2 − 6x + 1<br />

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)<br />

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<br />

<strong>di</strong> 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 )).<br />

(c) Per le derivate <strong>di</strong> p n (x), n = 0,1,2 si ha<br />

p ′ 0 (x) = 0<br />

p 1 ′ (x) = −5.2<br />

p 2 ′ (x) = 16x − 6<br />

La stima <strong>di</strong> f (0.6) e f ′ (0.6) è:<br />

n p n (0.6) p n ′ (0.6)<br />

0 1 0<br />

1 -2.12 -5.2<br />

2 0.28 3.6<br />

(d) I polimoni <strong>di</strong> Lagrange per ricavare il polinomio p 2 sono dati considerando i valori x 0 , x 1 e x 2 :<br />

(x − 0.1)(x − 0.8)<br />

L 0 (x) =<br />

(−0.1)(−0.8)<br />

L 1 (x) =<br />

L 2 (x) =<br />

x(x − 0.8)<br />

0.1(0.1 − 0.8) = x2 − 0.8x<br />

−0.07<br />

x(x − 0.1)<br />

0.8(0.8 − 0.1) = x2 − 0.1x<br />

0.56<br />

= x2 − 0.9x + 0.08<br />

0.08<br />

Il polinomio è:<br />

p 2 (x) = 1L 0 (x) + 0.48L 1 (x) + 1.32L 2 (x)<br />

= x2 − 0.9x + 0.08<br />

− 0.48 x2 − 0.8x<br />

+ 1.32 x2 − 0.1x<br />

0.08<br />

0.07<br />

0.56<br />

= 12.5(x 2 − 0.9x + 0.08) − 6.857142857(x 2 − 0.8x) + 2.357142857(x 2 − 0.1x)<br />

82


5.6. <strong>Esercizi</strong><br />

e raccogliendo i termini<br />

p 2 (x) = 8x 2 − 6x + 1<br />

<strong>Esercizi</strong>o 5.6.3 Trovare il polinomio <strong>di</strong> grado non superiore a 4 che interpola i dati seguenti: f (0) =<br />

2, f ′ (0) = 7, f ′′ (0) = 18, f (1) = 27 f ′ (1) = 60. Stimare f (0.2) e f ′ (0.2).<br />

Svolgimento<br />

Costruiamo la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise tenendo presente che le derivate <strong>di</strong> una funzione f si possono<br />

avere come limite delle <strong>di</strong>fferenze <strong>di</strong>vise:<br />

f [0,0] = f ′ (0) = 7 f [0,0,0] = f ′′ (0)<br />

2!<br />

= 9 f [1,1] = f ′ (1) = 60<br />

Tenendo conto <strong>di</strong> queste relazioni tra <strong>di</strong>fferenze <strong>di</strong>vise e derivate, nella tabella delle <strong>di</strong>fferenzi <strong>di</strong>vise,<br />

dobbiamo ripetere per tre volte l’ascissa 0 e due volte l’ascissa 1. Si ottiene:<br />

0 2<br />

f ′ (0)=7<br />

0 2 f ′′ (0)/2=9<br />

0 2<br />

1 27<br />

1 27<br />

f ′ (0)=7<br />

18 − 9<br />

1 − 0 =9<br />

25 − 7<br />

1 − 0 =18 17 − 9<br />

1 − 0 =8<br />

27 − 2<br />

1 − 0 =25 35 − 18<br />

1 − 0 =17<br />

60 − 25<br />

1 − 0 =35<br />

f ′ (1)= 60<br />

Il polinomio è dunque p(x) = 2 + 7x + 9x 2 + 9x 3 + 8x 3 (x − 1), vale a <strong>di</strong>re<br />

p(x) = 8x 4 + x 3 + 9x 2 + 7x + 2.<br />

La stima <strong>di</strong> f (0.2) è data da: f (0.2) ≈ p(0.2) = 3.7808.<br />

Per stimare f ′ (0.2) dobbiamo prima calcolare la derivata prima <strong>di</strong> p. Si ha<br />

p ′ (x) = 32x 3 + 3x 2 + 18x + 7,<br />

da cui f ′ (0.2) ≈ p ′ (0.2) = 12.056.<br />

83


CAPITOLO 6<br />

Approssimazione<br />

I numeri governano il mondo.<br />

Platone<br />

6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />

6.2 Retta <strong>di</strong> regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86<br />

6.3 Approssimazione polinomiale ai minimi quadrati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88<br />

6.4 Approssimazioni <strong>di</strong> tipo esponenziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89<br />

6.5 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90<br />

6.1 Introduzione<br />

La legge <strong>di</strong> Hooke stabilisce che l’allungamento subito da una molla, costruita con materiale uniforme,<br />

è <strong>di</strong>rettamente proporzionale alla forza applicata: F (x) = kx dove k è la costante <strong>di</strong> proporzionalità, detta<br />

costante elastica, e x rappresenta l’allungamento della molla.<br />

Supponiamo <strong>di</strong> voler determinare k per una molla che, quando è a riposo, esercita una forza <strong>di</strong><br />

1.4724811N . Se applichiamo una forza pari a 2.418165N si misura un allungamento pari a 0.042m. Siano<br />

effettuate <strong>di</strong>verse misure, ricavando i dati <strong>di</strong> Tabella 6.1. I dati raccolti non giacciono esattamente su una<br />

x 0.00000 0.04200 0.08000 0.11800 0.15600<br />

F 1.472481 2.418165 3.363849 4.309533 5.255217<br />

Tabella 6.1: Dati sperimentali per la legge <strong>di</strong> Hooke<br />

linea retta. Per approssimare la costante elastica k, potremmo prendere una qualunque coppia <strong>di</strong> dati e fare<br />

il rapporto tra la forza e l’allungamento. In questo modo, tuttavia, non terremmo conto <strong>di</strong> tutte le misure<br />

effettuate. È più ragionevole trovare la linea retta che meglio approssima tutti i dati sperimentali e utilizzarla<br />

per approssimare il valore <strong>di</strong> k. Questo tipo <strong>di</strong> approssimazione sarà l’argomento <strong>di</strong> questo Capitolo.<br />

A <strong>di</strong>fferenza dell’interpolazione, in cui si cerca una funzione che passi esattamente per i dati assegnati,<br />

nell’approssimazione si cerca una funzione (più semplice <strong>di</strong> quella data, se vi è una funzione <strong>di</strong> partenza) che<br />

approssimi al meglio i dati assegnati, senza passare esattamente per questi.<br />

Alcuni dei motivi che spingono a cercare una funzione <strong>di</strong> approssimazione piuttosto che <strong>di</strong> interpolazione<br />

sono questi:<br />

G i dati a <strong>di</strong>sposizione sono affetti da errore;<br />

G siamo interessati a vedere l’andamento dei dati su lunga scala, in una visione globale 1<br />

1 Se si hanno a <strong>di</strong>sposizione n = 100 dati, anche molto accurati, una funzione interpolante può dare una buona idea localmente,<br />

mentre una funzione approssimante data da una retta fornisce una migliore idea del comportamento su lunga scala dei dati.<br />

85


6. APPROSSIMAZIONE<br />

Figura 6.1: Legge <strong>di</strong> Hooke: i dati sperimentali<br />

x i 1 2 3 4 5 6 7 8 9 10<br />

y i 1.2 2.3 4.5 5.1 7 8.5 10.2 13.1 12.5 16.5<br />

Tabella 6.2: Dati sperimentali<br />

G vogliamo che la funzione <strong>di</strong>penda da pochi parametri, sebbene questi siano determinati considerando<br />

tutti i dati a <strong>di</strong>sposizione.<br />

Nel seguito stu<strong>di</strong>eremo l’approssimazione ai minimi quadrati.<br />

6.2 Retta <strong>di</strong> regressione lineare<br />

Supponiamo <strong>di</strong> avere i 10 dati sperimentali della Tabella 6.2 (quin<strong>di</strong> n + 1 = 10). La Figura 6.2 (a sinistra)<br />

mostra il grafico delle coppie <strong>di</strong> punti: appare evidente che la relazione tra x e y è <strong>di</strong> tipo lineare. Il motivo<br />

per cui i dati non sono esattamente su una retta è dovuto ad errori nei dati. Non ha senso, quin<strong>di</strong>, cercare una<br />

funzione che passi esattamente per i dati assegnati (come accade nell’interpolazione), perchè una funzione<br />

del genere introdurrebbe oscillazioni prive <strong>di</strong> significato fisico: lo ve<strong>di</strong>amo andando a costruire il polinomio<br />

<strong>di</strong> interpolazione <strong>di</strong> grado 9 che passa esattamente per i dati e che ve<strong>di</strong>amo in Figura 6.2 (a destra). Cerchiamo<br />

allora una retta (funzione lineare, poichè abbiamo visto che i dati hanno una relazione <strong>di</strong> tipo lineare) che<br />

meglio approssima i dati senza dover coincidere con essi. Sia p 1 (x) = a 0 + a 1 x la retta che an<strong>di</strong>amo cercando<br />

(dobbiamo quin<strong>di</strong> 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<br />

rappresenta il valore sulla retta che deve approssimare il valore y i dato dal problema. Per ogni dato sperimentale,<br />

per i = 0,1,...,n, possiamo misurare lo scarto che scaturisce dall’approssimare y i me<strong>di</strong>ante a 0 + a 1 x i .<br />

Nell’approccio ai minimi quadrati, si cerca <strong>di</strong> minimizzare la somma dei quadrati delle <strong>di</strong>fferenze tra i valori<br />

dati y i e i valori corrispondenti p 1 (x i ) sulla retta; si cerca, cioè, <strong>di</strong> minimizzare la somma dei quadrati <strong>degli</strong><br />

scarti. Introduciamo, quin<strong>di</strong> la funzione che <strong>di</strong>pende dai coefficienti incogniti a 0 e a 1 .<br />

S(a 0 , a 1 ) =<br />

n∑ [ ] 2<br />

(a0 + a 1 x i ) − y i<br />

i=0<br />

86


6.2. Retta <strong>di</strong> regressione lineare<br />

Figura 6.2: Dati sperimentali (a sinistra) della Tabella 6.2 e polinomio <strong>di</strong> interpolazione (a destra).<br />

Per minimizzare questa funzione, occorre porre le derivate parziali della S rispetto ad a 0 e a 1 uguali a zero. 2<br />

Si pone dunque<br />

0 = ∂S(a 0, a 1 )<br />

∂a 0<br />

= ∂<br />

∂a 0<br />

0 = ∂S(a 0, a 1 )<br />

∂a 1<br />

= ∂<br />

∂a 1<br />

n∑ [ ] 2<br />

n∑ [ ]<br />

(a0 + a 1 x i ) − y i = 2 (a0 + a 1 x i ) − y i<br />

i=0<br />

i=0<br />

n∑ [ ] 2<br />

n∑ [ ]<br />

(a0 + a 1 x i ) − y i = 2 (a0 + a 1 x i ) − y i xi<br />

i=0<br />

Queste equazioni si semplificano nel sistema delle cosiddette equazioni normali:<br />

{<br />

(n + 1)a0 + a 1<br />

∑ n<br />

i=0 x i = ∑ n<br />

i=0 y i<br />

a 0<br />

∑ n<br />

i=0 x i + a 1<br />

∑ n<br />

i=0 x2 i = ∑ n<br />

i=0 x i y i<br />

i=0<br />

Introducendo la notazione A 12 = ∑ n<br />

i=0 x i , A 22 = ∑ n<br />

i=0 x2 i , b 1 = ∑ n<br />

i=0 y i e b 2 = ∑ n<br />

i=0 x i y i e osservando che la<br />

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

a 0 = A 22b 1 − A 12 b 2<br />

(n + 1)A 22 − A 2 12<br />

a 1 = (n + 1)b 2 − A 12 b 1<br />

(n + 1)A 22 − A 2 12<br />

Nell’esempio proposto, per calcolare la retta <strong>di</strong> approssimazione ai minimi quadrati, dobbiamo calcolare<br />

i coefficienti delle equazioni normali. In Tabella 6.3 poniamo i valori che servono per risolvere il sistema: la<br />

soluzione è a 0 = −0.87333333 e a 1 = 1.62969697. La retta è rappresentata in Figura 6.3.<br />

La retta che abbiamo appena costruito è la retta che minimizza gli scarti verticali, supponendo affetti<br />

da errore le or<strong>di</strong>nate delle coppie <strong>di</strong> punti a <strong>di</strong>sposizione. Essa prende pure il nome <strong>di</strong> retta <strong>di</strong> regressione<br />

lineare sugli scarti verticali.<br />

Osserviamo che il baricentro dei punti assegnati giace sulla retta ai minimi quadrati, in quanto considerando<br />

la prima equazione del sistema si ha, per X = ∑ n<br />

i=0 x i /(n + 1) e Y = ∑ n<br />

i=0 y i /(n + 1) (le coor<strong>di</strong>nate del<br />

baricentro dei punti assegnati):<br />

Sul<br />

baricentro<br />

a 0 + a 1 X = Y<br />

Se invece sono affetti da errore le ascisse delle coppie <strong>di</strong> punti, si può cercare la retta che minimizza gli<br />

scarti orizzontali, detta anche retta <strong>di</strong> regressione lineare sugli scarti orizzontali, (basta scambiare il ruolo<br />

delle x con quello delle y per ricavare, con lo stesso proce<strong>di</strong>mento, la retta p 1 (y) = b 0 + b 1 y). Il baricentro dei<br />

punti assegnati giace anche su questa retta, da cui possiamo concludere che esso è il punto <strong>di</strong> intersezione<br />

delle due rette che minimizzano gli scarti verticali e orizzontali.<br />

2 Per funzioni f (x) <strong>di</strong> una variabile reale, i punti <strong>di</strong> massimo o minimo si trovano tra i punti critici della f , per i quali f ′ (x) = 0,<br />

stu<strong>di</strong>ando il segno della f ′′ . Analogo proce<strong>di</strong>mento si segue per funzioni <strong>di</strong> due variabili. Per la funzione S(a 0 , a 1 ) che stiamo stu<strong>di</strong>ando,<br />

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<br />

argomento viene approfon<strong>di</strong>to nei corsi <strong>di</strong> Analisi Matematica.<br />

87


6. APPROSSIMAZIONE<br />

x i y i x 2 x<br />

i i y i<br />

1 1.2 1 1.2<br />

2 2.3 4 4.6<br />

3 4.5 9 13.5<br />

4 5.1 16 20.4<br />

5 7 25 35<br />

6 8.5 36 51<br />

7 10.2 49 71.4<br />

8 13.1 64 104.8<br />

9 12.5 81 112.5<br />

10 16.5 100 165<br />

A 12 = 55 b 1 = 80.9 A 22 = 385 b 2 = 579.4<br />

Tabella 6.3: Tabella per il calcolo della retta <strong>di</strong> approssimazione ai minimi quadrati<br />

Figura 6.3: Retta <strong>di</strong> approssimazione sugli scarti verticali.<br />

6.3 Approssimazione polinomiale ai minimi quadrati<br />

In generale, avendo a <strong>di</strong>sposizione n+1 coppie <strong>di</strong> punti, il problema <strong>di</strong> approssimazione si può ricondurre<br />

alla ricerca <strong>di</strong> un polinomio <strong>di</strong> approssimazione <strong>di</strong> grado m, p m (x) = a 0 + a 1 x + a 2 x 2 + ...+ a m x m con m < n.<br />

Quando n = m il polinomio d’approssimazione coincide con quello d’interpolazione.<br />

La funzione da minimizzare è<br />

S(a 0 , a 1 ,..., a m ) =<br />

n∑ [<br />

(a0 + a 1 x i + a 2 x 2 i + ... + a m x m ] 2<br />

i<br />

) − y i<br />

i=0<br />

La procedura seguita per la retta viene generalizzata. Questa volta bisogna porre uguali a zero le m+1 derivate<br />

parziali della S rispetto ai coefficienti del polinomio p m .<br />

∂S<br />

∂a j<br />

= 0<br />

j = 0,1,...,m<br />

88


6.4. Approssimazioni <strong>di</strong> tipo esponenziale<br />

Ricaviamo, quin<strong>di</strong><br />

2<br />

n∑<br />

(a 0 + a 1 x i + ... + a m x m i<br />

− y i )x j = 0 per j = 0,1,...,m<br />

i<br />

i=0<br />

In forma estesa possiamo scrivere<br />

n∑<br />

n∑<br />

x j i + a 1<br />

a 0<br />

i=0<br />

x j +1<br />

i=0<br />

i<br />

+ ... + a m<br />

n∑<br />

x j +m =<br />

i<br />

i=0<br />

i=0<br />

n∑<br />

x j i y i<br />

per j = 0,1,...,m<br />

Poichè queste equazioni si hanno per j = 0,1...,m, si ha da risolvere un sistema, che, scritto in forma<br />

matriciale, è:<br />

A T Aa = A T b<br />

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

⎛<br />

1 x 0 x0 2 ... x m ⎞<br />

0<br />

1 x 1 x1 2 ... x m 1<br />

A =<br />

⎜<br />

⎝<br />

.<br />

.<br />

.<br />

⎟<br />

. ⎠<br />

1 x n xn 2 ... xn<br />

m<br />

Le equazioni del sistema sono dette equazioni normali. Si può provare che la matrice Q = A T A è<br />

simmetrica, definita positiva 3 ed è non singolare, quin<strong>di</strong> il sistema ammette soluzione.<br />

6.4 Approssimazioni <strong>di</strong> tipo esponenziale<br />

Può capitare che i dati sperimentali abbiano un andamento <strong>di</strong> tipo esponenziale o ricor<strong>di</strong>no una funzione<br />

potenza della variabile x. Allora si può richiedere che la funzione approssimante abbia una delle due forme<br />

seguenti (e, a seconda della rappresentazione, si ha un <strong>di</strong>verso modello):<br />

y(x) = ae bx<br />

y(x) = ax b<br />

modello esponenziale<br />

modello potenza<br />

con a e b opportune costanti. Per ricavare a e b si passa ai logaritmi ricavando l’equazione <strong>di</strong> una retta i cui<br />

coefficienti sono ottenuti con la procedura <strong>di</strong> minimizzazione ai minimi quadrati. Da questi, si ritorna poi ai<br />

coefficienti delle funzioni <strong>di</strong> partenza. Ve<strong>di</strong>amo come.<br />

G Nel caso del modello esponenziale, passando ai logaritmi (in base naturale) si ha:<br />

ln(y) = ln(a) + bx<br />

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 .<br />

Quin<strong>di</strong>, dalle coppie <strong>di</strong> dati (x i , y i ) i = 0,1,...,n, si deve passare alle coppie (X i = x i , Y i = ln(y i ))<br />

e su queste coppie si costruisce la retta <strong>di</strong> approssimazione ai minimi quadrati con la procedura che<br />

abbiamo stu<strong>di</strong>ato in Sezione 9.3. Una volta ricavati i coefficienti a 0 e a 1 , si ha a = e a 0<br />

e b = a 1 .<br />

G Nel caso del modello potenza, passando ai logaritmi (qualunque sia la base usata, il risultato non<br />

cambia) si ha:<br />

log(y) = log(a) + b log(x)<br />

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 .<br />

Quin<strong>di</strong>, dalle coppie <strong>di</strong> dati (x i , y i ) i = 0,1,...,n, si deve passare alle coppie (X i = log(x i ), Y i =<br />

log(y i )) e su queste coppie si costruisce la retta <strong>di</strong> approssimazione ai minimi quadrati. Una volta<br />

ricavati i coefficienti a 0 e a 1 , si ha b = a 1 mentre, con gli opportuni passaggi, si trova il valore <strong>di</strong> a.<br />

3 Le definizioni <strong>di</strong> matrice simmetrica e matrice definita positiva sono date nel Capitolo 7.<br />

89


6. APPROSSIMAZIONE<br />

6.5 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 6.5.1 Sia data la tabella seguente:<br />

x i -1 0 2 3 4<br />

f (x i ) 9 0 0 15 84<br />

(a) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati <strong>degli</strong> scarti verticali.<br />

(b) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati <strong>degli</strong> scarti orizzontali.<br />

(c) Calcolare il punto <strong>di</strong> intersezione delle due rette e <strong>di</strong>re <strong>di</strong> che punto si tratta.<br />

Svolgimento<br />

(a) Il sistema da risolvere per ottenere la retta <strong>di</strong> approssimazione ai minimi quadrati è:<br />

{<br />

(n + 1)a0 + ∑ n<br />

i=0 x i a 1 = ∑ n<br />

i=0 y i<br />

∑ n<br />

i=0 x i a 0 + ∑ n<br />

i=0 x2 i a 1 = ∑ n<br />

i=0 x i y i<br />

dove n + 1 = 5. Poichè ∑ 4<br />

i=0 x i = 8, ∑ 4<br />

i=0 x2 i = 30, ∑ 4<br />

i=0 y i = 108 e ∑ 4<br />

i=0 x i y i = 372, si ha il sistema<br />

{<br />

5a0 + 8a 1 = 108<br />

8a 0 + 30a 1 = 372<br />

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

scarti verticali è: y = 3.069767442 + 11.581395349x.<br />

(b) Ricaviamo la retta <strong>di</strong> approssimazione che minimizza gli scarti orizzontali.<br />

{<br />

(n + 1)b0 + ∑ n<br />

i=0 y i b 1 = ∑ n<br />

i=0 x i<br />

∑ n<br />

i=0 y i b 0 + ∑ n<br />

i=0 y 2 i b 1 = ∑ n<br />

i=0 y i x i<br />

dove n + 1 = 5. Poichè ∑ 4<br />

i=0 y i = 108, ∑ 4<br />

i=0 y 2 i = 7362, ∑ 4<br />

i=0 x i = 8 e ∑ 4<br />

i=0 x i y i = 372, si ha il sistema<br />

{<br />

5b0 + 108b 1 = 8<br />

108b 0 + 7362b 1 = 372<br />

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

scarti orizzontali è: x = 0.744452398 + 0.03960868528y.<br />

(c) Troviamo il punto <strong>di</strong> intersezione delle due rette:<br />

{<br />

y = 3.069767442 + 11.581395349x<br />

x = 0.744452398 + 0.03960868528y<br />

Ricaviamo x = 1.6 e y = 21.6<br />

Se calcoliamo il baricentro dei punti assegnati, troviamo<br />

X =<br />

∑ 4<br />

i=0 x i<br />

5<br />

= −1 + 2 + 3 + 4<br />

5<br />

∑ 4<br />

i=0<br />

= 1.6 Y =<br />

y i 9 + 15 + 84<br />

= ) = 21.6<br />

5<br />

5<br />

Il punto <strong>di</strong> intersezione delle due rette è il baricentro dei punti assegnati.<br />

90


6.5. <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 6.5.2 Sono assegnati i seguenti dati sperimentali<br />

x i 4.0 4.2 4.5 4.7 5.1 5.5 5.9 6.3 6.8 7.1<br />

y i 102.56 113.18 131.2 142 168 196.2 225 256.8 299.51 325.6<br />

Costruire la curva <strong>di</strong> approssimazione ai minimi quadrati della forma ax b .<br />

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

log(y) = log(ax b ) = log(a) + b log(x)<br />

In questo modo ci riconduciamo ad una retta <strong>di</strong> approssimazione ai minimi quadrati sui logaritmi dei punti<br />

assegnati. Consideriamo il logaritmo naturale (ma i risultati non cambiano con i logaritmi in un’altra base).<br />

I dati su cui lavorare sono dunque:<br />

log(x i ) log(y i )<br />

1.386294361 4.630447993<br />

1.435084525 4.728979472<br />

1.504077397 4.876722876<br />

1.547562509 4.955827058<br />

3.931825633 5.123963980<br />

1.704748092 5.279134547<br />

1.774952351 5.416100402<br />

1.840549633 5.548297572<br />

1.916922612 5.702147806<br />

1.960094784 5.785669634<br />

Calcoliamo la retta <strong>di</strong> approssimazione ai minimi quadrati, ponendo X i = log(x i ) e Y i = log(y i ). Il sistema<br />

da risolvere è<br />

{<br />

(n + 1)a0 + ∑ n<br />

i=0 X i a 1 = ∑ n<br />

i=0 Y i<br />

∑ n<br />

i=0 X i a 0 + ∑ n<br />

i=0 X 2 i a 1 = ∑ n<br />

i=0 X i Y i<br />

dove n + 1 = 10.<br />

Si ha ∑ n<br />

i=0 X i = 16.6995268, ∑ n<br />

i=0 X 2 = 28.2537116, ∑ n<br />

i i=0 Y i = 52.0472913, ∑ n<br />

i=0 X i Y i = 87.6541085<br />

Il sistema da risolvere <strong>di</strong>venta<br />

{<br />

10a0 + 16.6995268a 1 = 52.0472913<br />

16.6995268a 0 + 28.2537116a 1 = 87.6541085<br />

che ha come soluzione a 0 = 1.84197978 e a 1 = 2.013679425.<br />

Ora a 0 = log(a) da cui a = e a 0<br />

= 6.30901637 Invece a 1 = b. Il modello y = ax b <strong>di</strong>venta quin<strong>di</strong> y =<br />

6.30901637x 2.013679425 .<br />

91


CAPITOLO 7<br />

Meto<strong>di</strong> <strong>di</strong>retti per la soluzione <strong>di</strong> sistemi<br />

lineari<br />

All’inizio e alla fine abbiamo il<br />

mistero. Potremmo <strong>di</strong>re che<br />

abbiamo il <strong>di</strong>segno <strong>di</strong> Dio. A questo<br />

mistero la matematica si avvicina,<br />

senza penetrarlo.<br />

Ennio De Giorgi<br />

7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

7.2 Elementi <strong>di</strong> Algebra Lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

7.3 Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />

7.3.1 Sostituzione all’in<strong>di</strong>etro e in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />

7.3.2 Eliminazione <strong>di</strong> Gauss: esempio particolare . . . . . . . . . . . . . . . . . . . . . . . . . . . 99<br />

7.3.3 Eliminazione <strong>di</strong> Gauss: caso generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101<br />

7.4 Strategie <strong>di</strong> pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102<br />

7.5 Fattorizzazione triangolare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104<br />

7.5.1 Fattorizzazione LDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104<br />

7.5.2 Fattorizzazione <strong>di</strong> Gauss senza pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106<br />

7.5.3 Fattorizzazione <strong>di</strong> Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108<br />

7.6 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />

7.1 Introduzione<br />

Si consideri la capacità C <strong>di</strong> un conduttore. Dall’elettrostatica, sappiamo che vale q = Cφ dove q rappresenta<br />

la carica del conduttore e φ il suo potenziale elettrostatico, quando il conduttore è isolato. Nel caso in<br />

cui il conduttore non sia isolato, la situazione cambia. Supponiamo <strong>di</strong> avere 4 conduttori in equilibrio elettrostatico<br />

all’interno <strong>di</strong> una cavità collegata a terra (a terra il potenziale elettrostatico vale zero). Supponendo<br />

<strong>di</strong> collegare i conduttori 2, 3 e 4 a terra, si ha φ 2 = φ 3 = φ 4 = 0 e φ 1 ≠ 0. Il conduttore 1 induce carica sugli altri<br />

conduttori, per cui, per ciascun conduttore vale, rispettivamente:<br />

q 1 = C 11 φ 1<br />

q 2 = C 21 φ 1<br />

q 3 = C 31 φ 1<br />

q 4 = C 41 φ 1<br />

93


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Si ripete lo stesso <strong>di</strong>scorso supponendo φ 2 ≠ 0 e tutti gli altri potenziali nulli. Poi sia φ 3 ≠ 0 e gli altri potenziali<br />

nulli. Infine φ 4 ≠ 0 e tutti gli altri nulli.<br />

La sovrapposizione dei 4 stati considerati corrisponde alla situazione in cui φ 1 ,φ 2 ,φ 3 ,φ 4 sono tutti <strong>di</strong>versi<br />

da zero. Si ha perciò:<br />

q 1 = C 11 φ 1 +C 12 φ 2 +C 13 φ 3 +C 14 φ 4<br />

q 2 = C 21 φ 1 +C 22 φ 2 +C 23 φ 3 +C 24 φ 4<br />

q 3 = C 31 φ 1 +C 32 φ 2 +C 33 φ 3 +C 34 φ 4<br />

q 4 = C 41 φ 1 +C 42 φ 2 +C 43 φ 3 +C 44 φ 4<br />

I coefficienti C i i si chiamano coefficienti <strong>di</strong> capacità, mentre i coefficienti C i j , con j ≠ i si chiamano<br />

coefficienti <strong>di</strong> induzione.<br />

Si può presentare il problema inverso: note le cariche q i , si vuole determinare il valore dei φ i . Si deve<br />

quin<strong>di</strong> risolvere un sistema lineare <strong>di</strong> 4 equazioni in 4 incognite.<br />

In questo Capitolo stu<strong>di</strong>eremo meto<strong>di</strong> <strong>di</strong>retti per la soluzione <strong>di</strong> sistemi lineari del tipo<br />

⎧<br />

a 11 x 1 + a 12 x 2 + ... + a 1n x n = b 1<br />

a ⎪⎨ 21 x 1 + a 22 x 2 + ... + a 2n x n = b 2<br />

a 31 x 1 + a 32 x 2 + ... + a 3n x n = b 3<br />

(7.1)<br />

. = . .<br />

⎪⎩<br />

a n1 x 1 + a n2 x 2 + ... + a nn x n = b n<br />

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 sono<br />

x 1 , x 2 ,..., x n . I meto<strong>di</strong> <strong>di</strong>retti sono meto<strong>di</strong> che risolvono il problema in un numero fissato <strong>di</strong> passi,<br />

introducendo un errore dovuto solo all’arrotondamento.<br />

7.2 Elementi <strong>di</strong> Algebra Lineare<br />

Matrice<br />

Sia dato un sistema lineare come in (7.1).<br />

Per poterlo semplificare, possiamo eseguire le seguenti<br />

operazioni (trasformazioni elementari) :<br />

G L’i -sima equazione del sistema può essere moltiplicata per una qualunque costante λ ≠ 0 e l’equazione<br />

risultante può essere usata al posto <strong>di</strong> quella <strong>di</strong> partenza: la soluzione del sistema non cambia.<br />

G L’equazione j -sima, moltiplicata per una qualunque costante λ ≠ 0 e sommata all’equazione i -sima,<br />

può essere usata al posto dell’equazione i -sima <strong>di</strong> partenza: la soluzione del sistema non cambia.<br />

G Le equazioni i -sima e j -sima possono essere scambiate: la soluzione del sistema non cambia.<br />

In questa maniera, un sistema lineare può essere trasformato in uno <strong>di</strong> più facile soluzione, come<br />

vedremo nell’algoritmo <strong>di</strong> eliminazione <strong>di</strong> Gauss.<br />

Poichè le operazioni da fare coinvolgono i coefficienti a i j e b i , conviene scrivere il sistema <strong>di</strong> equazioni<br />

lineari utilizzando una forma compatta me<strong>di</strong>ante matrici e vettori.<br />

Definizione 7.2.1 Una matrice n × m è una griglia rettangolare (o array) <strong>di</strong> elementi <strong>di</strong>sposti su n righe e m<br />

colonne.<br />

Generalmente, una matrice si denota con una lettera maiuscola, per esempio A, mentre i suoi valori si<br />

in<strong>di</strong>cano con la corrispondente lettera minuscola e i pe<strong>di</strong>ci che si riferiscono alla riga e colonna in cui si trova<br />

quel valore, per esempio a i j si riferisce all’elemento <strong>di</strong> riga i e colonna j della matrice A.<br />

94


7.2. Elementi <strong>di</strong> Algebra Lineare<br />

⎛<br />

⎞<br />

a 11 a 12 a 13 ... a 1n<br />

A = [ a 21 a 22 a 23 ... a 2n<br />

] a i j = a 31 a 32 a 33 ... a 3n<br />

⎜<br />

⎝<br />

.<br />

.<br />

. ...<br />

⎟<br />

. ⎠<br />

a n1 a n2 a n3 ... a nn<br />

Esempio<br />

Esempio 7.2.1<br />

A =<br />

( 2 10<br />

) 5<br />

3 1 0<br />

è 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.<br />

Per in<strong>di</strong>care che una matrice A ha n righe e m colonne, <strong>di</strong>remo che A ha <strong>di</strong>mensione n × m. Quando<br />

lavoreremo con matrici quadrate <strong>di</strong> n righe e n colonne, parleremo <strong>di</strong> <strong>di</strong>mensione n della matrice per in<strong>di</strong>care<br />

che il numero <strong>di</strong> righe è uguale al numero <strong>di</strong> colonne e vale n.<br />

I vettori si possono vedere come un caso particolare delle matrici. Si parla <strong>di</strong> vettore riga se ci riferiamo a<br />

una matrice 1 × n e si parla <strong>di</strong> vettore colonna se ci si riferisce a una matrice n × 1.<br />

Per in<strong>di</strong>care un vettore colonna e un vettore riga si usa, rispettivamente, la notazione<br />

⎛ ⎞<br />

x 1<br />

x 2<br />

x =<br />

x 3<br />

⎜<br />

⎝<br />

⎟<br />

. ⎠<br />

x n<br />

x = ( x 1 x 2 x 3 ... x n<br />

)<br />

Vettori<br />

Ve<strong>di</strong>amo, nel seguito, alcune importanti definizioni e proprietà delle matrici.<br />

G Due matrici A e B, <strong>di</strong> <strong>di</strong>mensione n × m, sono uguali se hanno lo stesso numero <strong>di</strong> righe e <strong>di</strong> colonne,<br />

e, inoltre, vale, a i j = b i j per i ,= 1,2,...,n e j = 1,2,...,m.<br />

G Date due matrici A e B, entrambe n × m, si definisce la matrice somma <strong>di</strong> A e B la matrice n × m A + B<br />

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

G Se A è una matrice n ×m e λ è un numero reale, la moltiplicazione scalare <strong>di</strong> λ per A, denotata con λA,<br />

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

G In<strong>di</strong>chiamo con O la matrice i cui elementi sono tutti uguali a zero.<br />

G Data la matrice A, n × m, in<strong>di</strong>chiamo con −A la matrice i cui elementi sono −a i j .<br />

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

G A + B = B + A G(A + B) +C = A + (B +C )<br />

G A +O = O + A = A G A + (−A) = −A + A = O<br />

Gλ(A + B) = λA + λB G(λ + µ)A = λA + µA<br />

Gλ(µA) = (λµ)A G1A = A<br />

95


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Matrice<br />

prodotto<br />

G Date due matrici A <strong>di</strong> <strong>di</strong>mensione n×m e B <strong>di</strong> <strong>di</strong>mensione m×p, la matrice prodotto <strong>di</strong> A e B, denotata<br />

con C = AB, è una matrice i cui elementi c i j sono dati da:<br />

c i j =<br />

m∑<br />

a i k b k j = a i 1 b 1j + a i 2 b 2j + ... + a i m b m j<br />

k=1<br />

per i = 1,2,...,n e j = 1,2,..., p.<br />

Prodotto<br />

matricevettore<br />

G Data una matrice A <strong>di</strong> <strong>di</strong>mensione n e un vettore colonna x <strong>di</strong> lunghezza n, si definisce il vettore y = Ax<br />

prodotto della matrice A per il vettore x, il vettore le cui componenti sono date da<br />

n∑<br />

y i = a i j x j per i = 2,...,n<br />

j =1<br />

Dati due vettori x e y si definisce prodotto scalare x T y = ∑ n<br />

Prodotto<br />

i=1 x i y i .<br />

scalare tra<br />

G In generale, AB ≠ B A.<br />

vettori<br />

Matrice<br />

<strong>di</strong>agonale<br />

G Una matrice D si <strong>di</strong>ce <strong>di</strong>agonale se è quadrata con d i j = 0 per i ≠ j . Gli elementi <strong>di</strong>versi da zero si<br />

trovano quin<strong>di</strong> sulla <strong>di</strong>agonale (detta <strong>di</strong>agonale principale) che si può tracciare partendo dall’elemento<br />

in alto a sinistra (<strong>di</strong> posto 11) e arrivando all’elemento in basso a destra (<strong>di</strong> posto nn).<br />

Esempio:<br />

⎛<br />

⎞<br />

1 0 0 0<br />

D = ⎜0 2 0 0<br />

⎟<br />

⎝0 0 5 0 ⎠<br />

0 0 0 −1<br />

Matrice<br />

Identità<br />

Matrice<br />

tri<strong>di</strong>agonale<br />

Matrice<br />

triangolare<br />

superiore<br />

Matrice<br />

triangolare<br />

inferiore<br />

G Si chiama matrice identità e si in<strong>di</strong>ca con I , una matrice <strong>di</strong>agonale i cui elementi <strong>di</strong>agonali valgono 1.<br />

Esempio:<br />

⎛<br />

⎞<br />

1 0 0 0<br />

I = ⎜0 1 0 0<br />

⎟<br />

⎝0 0 1 0⎠<br />

0 0 0 1<br />

G Una matrice si <strong>di</strong>ce tri<strong>di</strong>agonale se gli elementi non nulli si trovano sulla <strong>di</strong>agonale principale e sugli<br />

elementi delle <strong>di</strong>agonali che si trovano sopra e sotto la <strong>di</strong>agonale principale.<br />

Esempio:<br />

⎛<br />

⎞<br />

−2 1 0 0 0<br />

1 −2 1 0 0<br />

A =<br />

⎜ 0 1 −2 1 0<br />

⎟<br />

⎝ 0 0 1 −2 1 ⎠<br />

0 0 0 1 −2<br />

G Una matrice si <strong>di</strong>ce triangolare se ha tutti gli elementi nulli ad eccezione <strong>di</strong> quelli che si trovano tutti<br />

sopra (o tutti sotto) la <strong>di</strong>agonale principale.<br />

– Si definisce matrice triangolare superiore U (U sta per upper) <strong>di</strong> <strong>di</strong>mensione n, la matrice per la<br />

quale, per j = 1,2,...,n, si ha<br />

u i j = 0 per i = j + 1, j + 2,...,n<br />

– Si definisce matrice triangolare inferiore L (L sta per lower) <strong>di</strong> <strong>di</strong>mensione n, la matrice per la<br />

quale, per i = 1,2,...,n, si ha<br />

l i j = 0 per j = i + 1,i + 2,...,n<br />

96


7.2. Elementi <strong>di</strong> Algebra Lineare<br />

Esempi<br />

⎛<br />

1 −2<br />

⎞<br />

5.3<br />

⎛<br />

1 0<br />

⎞<br />

0<br />

U = ⎝0 3.2 −4⎠ L = ⎝ 2 −21 0 ⎠<br />

0 0 10<br />

−3.4 5.7 −4<br />

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<br />

identità, rispettivamente <strong>di</strong> <strong>di</strong>mensione m e s, e λ e µ due numeri reali, valgono le seguenti proprietà:<br />

G A(BC ) = (AB)C G A(B + D) = AB + AD<br />

GI m B = B B I s = B Gλ(AB) = (λA)B = A(λB).<br />

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

Ax = b<br />

Collegata alla soluzione <strong>di</strong> un sistema lineare è l’inversa <strong>di</strong> una matrice.<br />

Definizione 7.2.2 Data una matrice A <strong>di</strong> <strong>di</strong>mensione n, A si <strong>di</strong>ce nonsingolare (o invertibile o regolare) se<br />

esiste una matrice, che in<strong>di</strong>chiamo come A −1 <strong>di</strong> <strong>di</strong>mensione n tale che<br />

Matrice<br />

inversa<br />

A A −1 = A −1 A = I<br />

La matrice A −1 si chiama matrice inversa della A. Una matrice che non ha inversa si <strong>di</strong>ce, invece, singolare (o<br />

non invertibile).<br />

Teorema 7.2.3 Per ogni matrice A <strong>di</strong> <strong>di</strong>mensione n nonsingolare si ha:<br />

G A −1 è unica<br />

G A −1 è nonsigolare e (A −1 ) −1 = A<br />

G Se B è non singolare, <strong>di</strong> <strong>di</strong>mensione n, allora (AB) −1 = B −1 A −1<br />

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

Un’altra importante matrice associata ad un’assegnata matrice A è la sua trasposta.<br />

Definizione 7.2.3 La trasposta <strong>di</strong> una matrice A <strong>di</strong> <strong>di</strong>mensione n × m è la matrice in<strong>di</strong>cata con A T , <strong>di</strong> <strong>di</strong>mensione<br />

m × n, per la quale la colonna i della trasposta coincide con la riga i della matrice A <strong>di</strong> partenza:<br />

a T i j = a j i .<br />

Trasposta <strong>di</strong><br />

una matrice<br />

Esempio:<br />

A =<br />

( 1 2<br />

) 3<br />

2 5 6<br />

⎛<br />

1<br />

⎞<br />

2<br />

A T = ⎝2 5⎠<br />

3 6<br />

Legata alla trasposta <strong>di</strong> una matrice è la seguente definizione.<br />

Definizione 7.2.4 Una matrice quadrata si <strong>di</strong>ce simmetrica se A = A T .<br />

Esempio:<br />

⎛<br />

1 4<br />

⎞<br />

8<br />

⎛<br />

1 4<br />

⎞<br />

8<br />

A = ⎝4 2 6⎠ A T = ⎝4 2 6⎠<br />

8 6 5<br />

8 6 5<br />

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

97


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Determinante<br />

<strong>di</strong> una<br />

matrice<br />

G(A T ) T = A<br />

G(AB) T = B T A T<br />

G(A + B) T = A T + B T<br />

GSe esiste A −1 allora (A −1 ) T = (A T ) −1<br />

Il determinante <strong>di</strong> una matrice permette <strong>di</strong> stabilire esistenza e unicità della soluzione nei sistemi lineari.<br />

Data una matrice quadrata A, il suo determinante si in<strong>di</strong>ca me<strong>di</strong>ante la notazione det(A) o |A|.<br />

G Se A = [a] è una matrice 1 × 1, allora det(A) = a.<br />

G Se A è una matrice <strong>di</strong> <strong>di</strong>mensione n, si definisce minore M i j il determinante della sottomatrice <strong>di</strong><br />

<strong>di</strong>mensione n − 1 ottenuta cancellando la i -sima riga e la j -sima colonna da A.<br />

G Il determinante <strong>di</strong> A è dato dalla formula<br />

det(A) =<br />

det(A) =<br />

n∑<br />

(−1) i+j a i j M i j<br />

j =1<br />

n∑<br />

(−1) i+j a i j M i j<br />

i=1<br />

(fissato un qualunque i = 1,2,...,n)<br />

(fissato un qualunque j = 1,2,...,n)<br />

Il calcolo del determinante <strong>di</strong> una matrice <strong>di</strong> <strong>di</strong>mensione n richiede O (n!) moltiplicazioni. Quin<strong>di</strong>, anche per<br />

valori piccoli <strong>di</strong> n, le operazioni da fare <strong>di</strong>ventanto proibitive.<br />

Teorema 7.2.5 Sia assegnata A una matrice quadrata <strong>di</strong> <strong>di</strong>mensione n.<br />

Se una riga o una colonna <strong>di</strong> A ha elementi tutti nulli, allora det(A) = 0.<br />

Se A ha due righe o due colonne con gli stessi elementi, allora det(A) = 0.<br />

G Denotata con à la matrice ottenuta scambiando due righe <strong>di</strong> A, si ha det(Ã) = −det(A).<br />

G Denotata con à la matrice ottenuta da A moltiplicando una sua riga per un numero reale λ, si ha<br />

det(Ã) = λdet(A).<br />

G Denotata con à la matrice ottenuta da A sommando una sua riga per un’altra che è stata moltiplicata<br />

per λ, si ha det(Ã) = det(A).<br />

G Se B è un’altra matrice <strong>di</strong> <strong>di</strong>mensione n, si ha det(AB) = det(A)det(B)<br />

G det(A T ) = det(A)<br />

G Se esiste A −1 , si ha det(A −1 1<br />

) =<br />

det(A)<br />

G Se A è una matrice triangolare superiore o triangolare inferiore o <strong>di</strong>agonale, allora det(A) = ∏ n<br />

i=1 a i i<br />

7.3 Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss<br />

Ritorniamo al sistema <strong>di</strong> equazioni (7.1), che possiamo scrivere in forma matriciale come Ax = b.<br />

Nel metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss 1 il sistema lineare <strong>di</strong> partenza viene trasformato in uno equivalente<br />

<strong>di</strong> più facile soluzione in quanto la matrice del nuovo sistema ha forma triangolare (superiore o inferiore) e<br />

può essere risolto facilmente me<strong>di</strong>ante sostituzione (all’in<strong>di</strong>etro o in avanti).<br />

Ve<strong>di</strong>amo nel dettaglio come si risolve un sistema lineare con queste tecniche.<br />

7.3.1 Sostituzione all’in<strong>di</strong>etro e in avanti<br />

La matrice A sia nonsingolare e triangolare superiore, cioè<br />

⎛<br />

⎞<br />

a 11 a 12 ... a 1n<br />

. a .. 22 a2n<br />

A =<br />

⎜<br />

.<br />

⎝<br />

..<br />

. .. ⎟<br />

⎠<br />

a nn<br />

1 Carl Friedrich Gauss fu un matematico e fisico tedesco (1777-1855) che ha dato il suo contribuito in maniera significativa in<br />

numerosi campi: teoria dei numeri, analisi, geometria <strong>di</strong>fferenziale, geodesia, magnetismo, astronomia, ottica. Al pari <strong>di</strong> Eulero, Newton<br />

e Archimede è considerato uno dei più gran<strong>di</strong> matematici della storia.<br />

In suo onore è stato dato il suo nome a una nave <strong>di</strong> ricerca tedesca, a una montagna (Gaussberg) in Antartide, a un cratere sulla luna,<br />

e all’unità <strong>di</strong> misura della densità <strong>di</strong> flusso magnetico o <strong>di</strong> induzione magnetica.<br />

98


7.3. Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss<br />

La soluzione del sistema Ax = b può dunque procedere dal basso verso l’alto, a partire dall’ultima riga. Le<br />

equazioni, infatti, sono<br />

a 11 x 1 + a 12 x 2 + a 13 x 3 + ... a 1n x n = b 1<br />

a 22 x 2 + a 23 x 3 + ... a 2n x n = b 2<br />

a 33 x 3 + ... a 3n x n = b 2<br />

. = . . .<br />

a nn x n = b n<br />

L’ultima riga si legge come a nn x n = b n . Quin<strong>di</strong> possiamo ricavare x n = b n /a nn .<br />

Noto il valore <strong>di</strong> x n , possiamo ricavare x n−1 dalla riga n − 1 del sistema:<br />

1<br />

a n−1n−1 x n−1 + a n−1n x n = b n−1 . Si ha x n−1 = (b n−1 − a n−1n x n ).<br />

a n−1n−1<br />

Si procede a ritroso in questo modo arrivando fino alla prima equazione che ci permette <strong>di</strong> calcolare il valore<br />

<strong>di</strong> x 1 . Osserviamo che tutte le <strong>di</strong>visioni per i coefficienti a i i sono possibili in quanto stiamo supponendo<br />

A non singolare e, poichè det(A) = ∏ n<br />

i=1 a i i ≠ 0, necessariamente ciascun a i i ≠ 0.<br />

Possiamo dunque scrivere l’algoritmo <strong>di</strong> sostituzione all’in<strong>di</strong>etro:<br />

Per i = n fino a i = 1, procedendo all’in<strong>di</strong>etro con passo −1<br />

x i =<br />

b i − ∑ n<br />

j =i+1 a i j x j<br />

a i i<br />

Un analogo algoritmo si ricava quando la matrice è triangolare inferiore. In tal caso, si parte dalla prima<br />

equazione per ricavare x 1 e poi si va avanti nell’equazione successiva.<br />

Si ha l’algoritmo <strong>di</strong> sostituzione in avanti:<br />

Per i = 1 fino a i = n, procedendo in avanti con passo 1<br />

x i =<br />

b i − ∑ i−1<br />

j =1 a i j x j<br />

a i i<br />

7.3.2 Eliminazione <strong>di</strong> Gauss: esempio particolare<br />

Il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss trasforma il sistema <strong>di</strong> partenza in uno ad esso equivalente ma più<br />

facile da risolvere, perchè la matrice del sistema è <strong>di</strong> forma triangolare superiore, in modo da poter applicare<br />

il metodo <strong>di</strong> sostituzione all’in<strong>di</strong>etro.<br />

Per capire come si applica questo metodo consideriamo un semplice esempio <strong>di</strong> sistema <strong>di</strong> 3 equazioni<br />

in 3 incognite, Ax = b dove<br />

⎛ ⎞ ⎛ ⎞<br />

2 1 2<br />

10<br />

A = ⎝<br />

4 1 2<br />

1 2 5<br />

⎠ b = ⎝<br />

12<br />

20<br />

Le equazioni del sistema sono, dunque,<br />

2x 1 + x 2 + 2x 3 = 10<br />

4x 1 + x 2 + 2x 3 = 12<br />

x 1 + 2x 2 + 5x 3 = 20<br />

⎠<br />

99


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

G Al primo passo del metodo, cerchiamo <strong>di</strong> annullare tutti i coefficienti dell’incognita x 1 nella seconda e<br />

terza equazione.<br />

– Divi<strong>di</strong>amo il coefficiente 4 che moltiplica x 1 nella seconda equazione con il coefficiente 2 che<br />

moltiplica x 1 nella prima equazione. Otteniamo il valore 4 = 2. Adesso moltiplichiamo per questo<br />

2<br />

valore (2) la prima equazione, ricavando<br />

2(2x 1 + x 2 + 2x 3 = 10) =⇒ 4x 1 + 2x 2 + 4x 3 = 20<br />

Se ora facciamo la sottrazione tra la seconda equazione del sistema e questa che abbiamo ricavato<br />

otteniamo<br />

4x 1 + x 2 + 2x 3 = 12<br />

−<br />

4x 1 + 2x 2 + 4x 3 = 20 =<br />

−x 2 − 2x 3 = −8<br />

Sostituiamo questa equazione alla seconda del sistema (il sistema rimane equivalente), ricavando<br />

2x 1 + x 2 + 2x 3 = 10<br />

−x 2 − 2x 3 = −8<br />

x 1 + 2x 2 + 5x 3 = 20<br />

Abbiamo eliminato, in questo modo, il coefficiente <strong>di</strong> x 1 nella seconda equazione.<br />

– Alla stessa maniera, <strong>di</strong>vi<strong>di</strong>amo il coefficiente <strong>di</strong> x 1 nella terza equazione (che vale 1) con il coefficiente<br />

<strong>di</strong> x 1 nella prima equazione: abbiamo 1 2 . Moltiplichiamo la prima equazione per 1 2 e poi<br />

facciamo la sottrazione tra la terza equazione e la prima moltiplicata per 1 2 :<br />

x 1 + 2x 2 + 5x 3 = 20<br />

1<br />

2 (2x 1 + x 2 + 2x 3 = 10) ⇐⇒x 1 + 1 2 x 2 + x 3 = 5 =<br />

3<br />

2 x 2 + 4x 3 = 15<br />

Sostituiamo questa equazione alla terza del sistema.<br />

– A questo punto il sistema è<br />

2x 1 + x 2 + 2x 3 = 10<br />

−x 2 − 2x 3 = −8<br />

3<br />

2 x 2 + 4x 3 = 15<br />

−<br />

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

G Per poter arrivare ad un sistema <strong>di</strong> equazioni triangolare inferiore, dobbiamo eliminare il coefficiente <strong>di</strong><br />

x 2 nella terza equazione del sistema. Ripetiamo il ragionamento appena fatto, lavorando sulla seconda<br />

e terza equazione.<br />

– Consideriamo il coefficiente <strong>di</strong> x 2 della terza equazione ( 3 ) e lo <strong>di</strong>vi<strong>di</strong>amo per il coefficiente<br />

2<br />

<strong>di</strong> x 2 della seconda equazione ( che vale −1). Moltiplichiamo la seconda equazione per questo<br />

100


7.3. Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss<br />

coefficiente (cioè per − 3 2 ) e poi sottraiamo la terza equazione dalla seconda moltiplicata per − 3 2 :<br />

3<br />

2 x 2 + 4x 3 = 15 −<br />

− 3 2 (−x 2 − 2x 3 = −8) ⇐⇒ 3 2 x 2 + 3x 3 = 12 =<br />

x 3 = 3<br />

– Sostituiamo questa equazione alla terza del sistema, ricavando il sistema equivalente<br />

2x 1 + x 2 + 2x 3 = 10<br />

−x 2 − 2x 3 = −8<br />

x 3 = 3<br />

Con tutte le trasformazioni effettuate, abbiamo trasformato il sistema <strong>di</strong> partenza in uno equivalente, che<br />

si può risolvere facilmente me<strong>di</strong>ante sostituzioni all’in<strong>di</strong>etro. Dall’ultima equazione abbiamo x 3 = 3. Sostituendo<br />

questo valore nella seconda equazione otteniamo −x 2 − 6 = −8 da cui x 2 = 2. Infine, sostituendo i<br />

valori <strong>di</strong> x 3 e x 2 nella prima equazione abbiamo 2x 1 + 2 + 6 = 10 da cui x 1 = 1.<br />

7.3.3 Eliminazione <strong>di</strong> Gauss: caso generale<br />

Sia dato un sistema <strong>di</strong> n equazioni, in cui la matrice A è piena (o densa, cioè abbia quasi tutti gli elementi<br />

non nulli). Applichiamo trasformazioni elementari per riga in modo da ridurre il sistema <strong>di</strong> partenza in uno<br />

equivalente <strong>di</strong> forma triangolare superiore, che potremo risolvere me<strong>di</strong>ante sostituzione all’in<strong>di</strong>etro.<br />

La soluzione del problema Ax = b, infatti, non cambia se moltiplichiamo una riga per una costante, se<br />

sottraiamo il multiplo <strong>di</strong> una riga da un’altra riga o se facciamo scambi <strong>di</strong> righe, come abbiamo detto all’inizio<br />

della Sezione 7.2.<br />

Supponiamo, per il momento, che tutti gli elementi della <strong>di</strong>agonale principale <strong>di</strong> A siano non nulli.<br />

G Al primo passo vogliamo eliminare gli elementi della prima colonna al <strong>di</strong> sotto della <strong>di</strong>agonale<br />

principale:<br />

– sottraiamo la prima equazione moltiplicata per a 21<br />

a 11<br />

dalla seconda equazione:<br />

a 21 x 1 + a 22 x 2 + a 23 x 3 + ... + a 2n x n = b 2 −<br />

a 21<br />

(a 11 x 1 + a 12 x 2 + a 13 x 3 + ... + a 1n x n ) = a 21<br />

b 1 =<br />

a 11 a 11<br />

(a 22 − a 21<br />

a 11<br />

a 12 )x 2 + (a 23 − a 21<br />

a 11<br />

a 13 )x 3 + ... + (a 2n − a 21<br />

a 11<br />

a 1n )x n = b 2 − a 21<br />

a 11<br />

b 1<br />

– sottraiamo la prima equazione moltiplicata per a 31<br />

a 11<br />

dalla terza equazione.<br />

– ...<br />

– sottraiamo la prima equazione moltiplicata per a n1<br />

a 11<br />

dalla n-sima equazione.<br />

Come risultato <strong>di</strong> questa operazione avremo una nuova matrice con gli elementi della prima<br />

colonna, eccetto quello <strong>di</strong> posto 11, tutti uguali a zero.<br />

⎛<br />

⎞⎛<br />

⎞ ⎛ ⎞<br />

a 11 a 12 ... a 1n x 1 b 1<br />

0 a (1)<br />

22<br />

... a (1)<br />

2n<br />

x 2<br />

⎜<br />

⎝<br />

.<br />

. ...<br />

⎟⎜<br />

. ⎠⎝<br />

⎟<br />

. ⎠ = b (1)<br />

2 ⎜ ...<br />

⎟<br />

⎝ ⎠<br />

0 a (1)<br />

n2<br />

... a nn<br />

(1) x n b n<br />

(1)<br />

101


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

G Al secondo passo, consideriamo il sistema ridotto che si ha ignorando la prima equazione del sistema<br />

e la prima colonna della nuova matrice che abbiamo ottenuta (che ha tutti 0 al <strong>di</strong> sotto dell’elemento<br />

<strong>di</strong>agonale).<br />

A questa sottomatrice applichiamo lo stesso proce<strong>di</strong>mento <strong>di</strong> prima, sottraendo, quin<strong>di</strong>, la prima<br />

equazione della sottomatrice moltiplicata per a(1) 32<br />

a (1)<br />

22<br />

via.<br />

Dopo questo passo, il sistema sarà equivalente a:<br />

⎛<br />

⎞<br />

a 11 a 12 ... ... a ⎛ ⎞ ⎛ ⎞<br />

1n<br />

0 a (1)<br />

22<br />

a (1)<br />

23<br />

... a (1) x 1<br />

b 1<br />

2n<br />

x 2<br />

b (1)<br />

2<br />

. 0 a (2)<br />

33<br />

... a (2)<br />

3n<br />

x 3<br />

⎜<br />

⎝<br />

.<br />

.<br />

. ...<br />

⎟⎜<br />

=<br />

b (2)<br />

3 . ⎠⎝<br />

⎟ ⎜ ... ⎟<br />

. ⎠ ⎝ ⎠<br />

0 0 a (2)<br />

n3<br />

... a nn<br />

(2) x n b n<br />

(1)<br />

dalla seconda equazione della sottomatrice, e così<br />

G Dopo aver applicato questo proce<strong>di</strong>mento n − 1 volte, avremo un sistema triangolare superiore<br />

semplice da risolvere utilizzando l’algoritmo <strong>di</strong> sostituzione all’in<strong>di</strong>etro.<br />

⎛<br />

⎞<br />

a 11 a 12 ... ... a ⎛ ⎞ ⎛<br />

1n<br />

0 a (1)<br />

22<br />

a (1)<br />

23<br />

... a (1) x 1<br />

2n<br />

x 2<br />

. 0 a (2)<br />

33<br />

... a (2)<br />

3n<br />

x 3<br />

⎜<br />

⎝<br />

.<br />

. ... ...<br />

⎟⎜<br />

=<br />

. ⎠⎝<br />

⎟ ⎜<br />

. ⎠ ⎝<br />

0 0 ... 0 a nn<br />

(n−1) x n<br />

7.4 Strategie <strong>di</strong> pivoting<br />

b 1<br />

b (1)<br />

2<br />

b (2)<br />

3<br />

...<br />

b (n−1)<br />

n<br />

Gli elementi <strong>di</strong>agonali generati ad ogni passo del metodo <strong>di</strong> eliminazione a (k) sono detti elementi<br />

i i<br />

pivotali.<br />

Nel descrivere il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss abbiamo supposto, per semplicità, che tutti gli elementi<br />

<strong>di</strong>agonali fossero <strong>di</strong>versi da zero. Ma una matrice può essere non singolare senza che gli elementi della<br />

<strong>di</strong>agonale principale siano tutti <strong>di</strong>versi da zero.<br />

Inoltre, andando avanti nel proce<strong>di</strong>mento <strong>di</strong> eliminazione, può succedere che un elemento pivotale <strong>di</strong>venti<br />

nullo – e quin<strong>di</strong> la corrispondente incognita non può essere eliminata attraverso quella equazione nel<br />

proce<strong>di</strong>mento <strong>di</strong> sostituzione all’in<strong>di</strong>etro.<br />

C’è, infine, da considerare il fatto che si possono avere grossi errori numerici quando un elemento<br />

pivotale è molto piccolo.<br />

Cosa fare in queste circostanze In che modo applicare l’eliminazione <strong>di</strong> Gauss<br />

Si hanno le cosiddette strategie <strong>di</strong> pivoting:<br />

G pivoting parziale<br />

Mano mano che si va avanti nell’eliminazione, per i = 1,2,...,n −1 a ciascuno sta<strong>di</strong>o si sceglie il più<br />

piccolo intero q tale che<br />

|a (i−1) | = max<br />

qi<br />

i≤j ≤n |a(i−1) |<br />

j i<br />

e si scambiano le righe i e q.<br />

Si opera, dunque, un controllo sulla colonna i -sima dalla posizione i fino alla posizione n, andando<br />

a cercare il coefficiente massimo in modulo.<br />

G pivoting totale<br />

Nel pivoting totale, invece, la ricerca dell’elemento più grande avviene in tutta la sottomatrice che<br />

si ha considerando le colonne e le righe rispettivamente a destra e sotto l’elemento <strong>di</strong>agonale i -simo.<br />

⎞<br />

⎟<br />

⎠<br />

102


7.4. Strategie <strong>di</strong> pivoting<br />

Si vanno quin<strong>di</strong> a cercare i più piccoli interi q e r tali che<br />

|a qr<br />

(i−1) | = max<br />

i≤k,j ≤n |a(i−1) j k<br />

|<br />

Si opera, quin<strong>di</strong>, uno scambio non solo <strong>di</strong> righe ma anche <strong>di</strong> colonne in modo da portare l’elemento<br />

pivotale dalla riga e colonna qr al posto i i . Di questo scambio <strong>di</strong> colonne bisogna conservare<br />

traccia perchè vengono scambiate anche le componenti del vettore soluzione, in modo da effettuare lo<br />

scambio inverso una volta risolto il sistema.<br />

Il maggiore sforzo computazionale garantisce maggiore accuratezza e stabilità nei risultati, nel senso che<br />

gli errori <strong>di</strong> arrotondamento non sono così amplificati come potrebbe succedere senza l’adozione <strong>di</strong> una<br />

tecnica <strong>di</strong> pivoting.<br />

Esempio<br />

Esempio 7.4.1 Consideriamo il sistema<br />

x 1 + x 2 +x 3 = 1<br />

x 1 + 1.0001x 2 + 2x 3 = 2<br />

x 1 + 2x 2 + 2x 3 = 1<br />

L’esatta soluzione, corretta a 4 cifre decimali, è x = (1, −1.0001, 1.0001) T .<br />

L’eliminazione <strong>di</strong> Gauss senza pivoting porta al sistema<br />

x 1 + x 2 +x 3 = 1<br />

0.0001x 2 + 1x 3 = 1<br />

1x 2 + 1x 3 = 0<br />

e, infine, a<br />

x 1 + x 2 +x 3 = 1<br />

0.0001x 2 + 1x 3 = 1<br />

−9999x 3 = −10000<br />

Se usiamo un’aritmetica in base 10 con 3 cifre decimali, allora la sostituzione all’in<strong>di</strong>etro ci darà<br />

x 3 = −10000<br />

−9999 = 1.000, x 2 = 1 − 1<br />

0.0001 = 0, x 1 = 0.<br />

La soluzione è completamente sbagliata.<br />

Se, invece, facciamo lo scambio della seconda e terza riga adottando il pivoting parziale, allora avremo<br />

il sistema:<br />

x 1 + x 2 +x 3 = 1<br />

1x 2 + 1x 3 = 0<br />

0.0001x 2 + 1x 3 = 1<br />

103


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

e, infine,<br />

x 1 + x 2 +x 3 = 1<br />

1x 2 + 1x 3 = 0<br />

0.9999x 3 = 1<br />

Questa volta si ha (sempre lavorando con 3 cifre decimali) x 3 = 1.000, x 2 = −1.000, x 1 = 1.000, che è la<br />

soluzione corretta a 3 cifre decimali.<br />

7.5 Fattorizzazione triangolare<br />

Il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss, visto in forma matriciale, decompone la matrice<br />

A nel prodotto LU <strong>di</strong> due matrici L, triangolare inferiore, e U , triangolare superiore.<br />

Basta considerare, ad ogni passo, la matrice<br />

⎛<br />

1<br />

0 1<br />

. 0 1<br />

.<br />

. 0 1<br />

M (k) .<br />

.<br />

. − a(k−1) k+1k<br />

=<br />

a (k−1)<br />

kk<br />

.<br />

.<br />

. − a(k−1) k+2k<br />

a (k−1)<br />

kk<br />

.<br />

.<br />

.<br />

.<br />

⎜<br />

⎝<br />

.<br />

.<br />

. − a(k−1) n k<br />

a (k−1)<br />

kk<br />

1<br />

. ..<br />

Si considera quin<strong>di</strong> la matrice A (k) = M (k) A (k−1) = M (k) M (k−1) ... M (1) A e il vettore<br />

b (k) = M (k) b (k−1) = M (k) M (k−1) ··· M (1) b.<br />

Dopo n − 1 passi, avremo<br />

U = A (n−1) = M (n−1) ... M (2) M (1) A<br />

con U matrice triangolare superiore. Otteniamo quin<strong>di</strong> A = LU , con<br />

L = (M (n−1) ··· M (2) M (1) ) −1 = [M (1) ] −1 ···[M (n−2) ] −1 [M (n−1) ] −1<br />

. ..<br />

⎞<br />

⎟<br />

1<br />

⎠<br />

L è triangolare inferiore con elementi dati dal prodotto delle matrici M (k)<br />

l’eliminazione <strong>di</strong> Gauss.<br />

generate durante<br />

7.5.1 Fattorizzazione LDU<br />

L’eliminazione <strong>di</strong> Gauss è un caso particolare <strong>di</strong> fattorizzazione LDU , nella quale la matrice A viene decomposta<br />

nel prodotto <strong>di</strong> 3 matrici, la L che è triangolare inferiore con elementi sulla <strong>di</strong>agonale principale<br />

104


7.5. Fattorizzazione triangolare<br />

(elementi <strong>di</strong>agonali) uguali a 1, la D che è una matrice <strong>di</strong>agonale e la U che è una triangolare superiore con<br />

elementi <strong>di</strong>agonali uguali a 1.<br />

Nell’eliminazione <strong>di</strong> Gauss vista prima, nella U abbiamo inglobato anche la matrice D, per cui abbiamo<br />

una fattorizzazione LU .<br />

La decomposizione LDU è assicurata dal teorema LDU . Prima <strong>di</strong> vedere il teorema, definiamo i minori<br />

principali <strong>di</strong> una matrice A.<br />

Definizione 7.5.1 Data una matrice A si definisce minore principale <strong>di</strong> <strong>di</strong>mensione k (con 1 ≤ k ≤ n), la<br />

sottomatrice che si ha prendendo le prime k righe e k colonne <strong>di</strong> A.<br />

⎛<br />

⎞<br />

a 11 ... a 1k<br />

⎜<br />

⎝<br />

.<br />

⎟<br />

. ⎠<br />

a k1 ... a kk<br />

Minore<br />

principale<br />

Teorema 7.5.1 (LDU ) Nell’ipotesi che tutti i minori principali <strong>di</strong> A, (per i = 1,2,...,n) siano non-singolari,<br />

allora la matrice A è decomponibile in maniera univoca nel prodotto A = LDU<br />

Qualsiasi matrice non singolare può essere condotta sotto una forma tale da sod<strong>di</strong>sfare il teorema LDU<br />

me<strong>di</strong>ante opportuni scambi <strong>di</strong> righe e <strong>di</strong> colonne (abbiamo visto cosa fare quando un elemento pivotale è<br />

nullo). Fare uno scambio <strong>di</strong> righe o <strong>di</strong> colonne significa moltiplicare la matrice A con un’opportuna matrice<br />

<strong>di</strong> permutazione.<br />

Una matrice <strong>di</strong> permutazione P è una matrice ottenuta dalla matrice identità operando scambi <strong>di</strong> righe o<br />

<strong>di</strong> colonne in modo che la matrice risultante abbia esattamente un unico valore <strong>di</strong>verso da zero su ogni riga<br />

e colonna, e tale valore sia uguale a 1.<br />

Esempio<br />

Esempio 7.5.1 Si consideri la matrice <strong>di</strong> permutazione P <strong>di</strong> <strong>di</strong>mensione 3 data da<br />

⎛<br />

1 0<br />

⎞<br />

0<br />

P = ⎝0 0 1⎠<br />

0 1 0<br />

Matrice <strong>di</strong><br />

permutazione<br />

Qualunque sia la matrice A, <strong>di</strong> <strong>di</strong>mensione 3, moltiplicandola a sinistra per P si ottiene lo scambio della<br />

seconda e terza riga <strong>di</strong> A; invece, moltiplicandola a destra per P si ottiene lo scambio della seconda e<br />

terza colonna <strong>di</strong> A:<br />

⎛ ⎞⎛<br />

⎞ ⎛<br />

⎞<br />

1 0 0 a 11 a 12 a 13 a 11 a 12 a 13<br />

PA = ⎝0 0 1⎠⎝a 21 a 22 a 23<br />

⎠ = ⎝a 31 a 32 a 33<br />

⎠<br />

0 1 0 a 31 a 32 a 33 a 21 a 22 a 23<br />

⎛<br />

⎞⎛<br />

⎞ ⎛<br />

⎞<br />

a 11 a 12 a 13 1 0 0 a 11 a 13 a 12<br />

AP = ⎝a 21 a 22 a 23<br />

⎠⎝0 0 1⎠ = ⎝a 21 a 23 a 22<br />

⎠<br />

a 31 a 32 a 33 0 1 0 a 31 a 33 a 32<br />

Quin<strong>di</strong>, il teorema LDU si può applicare alla matrice A o ad un’opportuna matrice PA, se si effettua il<br />

pivoting parziale, o a PAQ se si effettua il pivoting totale (e quin<strong>di</strong> si considerano due matrici <strong>di</strong> permutazioni<br />

P e Q).<br />

In genere, la matrice D viene inglobata nella L o nella U (post-moltiplicando o pre-moltiplicando le L e le<br />

U definite prima per la D).<br />

G Nel caso in cui la matrice D viene inglobata nella matrice L, la L ha elementi <strong>di</strong>agonali l i i ≠ 0, mentre<br />

la U ha elementi <strong>di</strong>agonali unitari. Si parla <strong>di</strong> fattorizzazione <strong>di</strong> Crout.<br />

105


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

G Nel caso in cui la matrice D viene inglobata nella matrice U , la U ha elementi <strong>di</strong>agonali u i i ≠ 0, mentre<br />

la L ha elementi <strong>di</strong>agonali unitari. Si parla <strong>di</strong> fattorizzazione <strong>di</strong> Doolittle.<br />

Scriviamo in forma estesa il prodotto tra matrici, nell’ipotesi <strong>di</strong> operare la fattorizzazione <strong>di</strong> Crout:<br />

⎛<br />

⎞ ⎛<br />

⎞⎛<br />

⎞<br />

a 11 a 12 ... a 1n l 11 0 ... 0 1 u 12 ... u 1n<br />

a 21 a 22 ... a 2n<br />

⎜<br />

⎝<br />

.<br />

.<br />

⎟<br />

. ⎠ = l 21 l 22 ... 0<br />

0 1 ... u 2n<br />

⎜<br />

⎝<br />

.<br />

.<br />

⎟⎜<br />

. ⎠⎝<br />

.<br />

.<br />

⎟<br />

. ⎠<br />

a n1 a n2 ... a nn l n1 l n2 ... l nn 0 0 ... 1<br />

Moltiplichiamo la prima riga <strong>di</strong> L per le colonne <strong>di</strong> U ed eguagliamo i termini con gli elementi della prima<br />

riga <strong>di</strong> A. Otteniamo:<br />

l 11 · 1 = a 11<br />

l 11 · u 1k = a 1k , k = 2,...,n<br />

Quin<strong>di</strong>: l 11 = a 11 e u 1k = a 1k /l 11 . Abbiamo ricavato gli elementi della prima riga <strong>di</strong> L e U .<br />

Moltiplicando le successive righe <strong>di</strong> L per le colonne <strong>di</strong> U ed uguagliando i termini ai corrispondenti<br />

termini <strong>di</strong> A, abbiamo:<br />

l i j = a i j −<br />

j −1 ∑<br />

m=1<br />

u i j = 1 (a i j −<br />

l i i<br />

l i m u m j i = 1,2,...n j = 1,2,...,i<br />

i−1 ∑<br />

m=1<br />

l i m u m j ) i = 1,2,...,n − 1 j = i + 1,...n<br />

Si calcolano prima gli elementi della riga i -sima <strong>di</strong> L e poi quelli della riga i -sima <strong>di</strong> U , per i = 1,2,...,n.<br />

Trovate le matrici L e U , il sistema <strong>di</strong> partenza Ax = b è equivalente a LU x = b.<br />

Si pone, dunque, y = U x, ottenendo il sistema Ly = b. Si ricava facilmente y me<strong>di</strong>ante sostituzione in<br />

avanti e da U x = y si ricava x me<strong>di</strong>ante sostituzione all’in<strong>di</strong>etro.<br />

Lo sforzo computazionale maggiore è quin<strong>di</strong> quello per il calcolo dei coefficienti <strong>di</strong> L e U .<br />

Nell’eliminazione <strong>di</strong> Gauss noi ricaviamo espressamente solo la U mentre le mo<strong>di</strong>fiche operate sulla<br />

colonna dei termini noti è equivalente al prodotto L −1 b (quin<strong>di</strong> da LU x = b risolviamo U x = L −1 b).<br />

7.5.2 Fattorizzazione <strong>di</strong> Gauss senza pivoting<br />

Matrice <strong>di</strong>agonalmente<br />

dominante in<br />

senso stretto<br />

per righe<br />

Matrice <strong>di</strong>agonalmente<br />

dominante in<br />

senso stretto<br />

per colonne<br />

Abbiamo visto che, a volte, il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss richiede scambi <strong>di</strong> righe per evitare <strong>di</strong>visioni<br />

per zero. Allo stesso modo, il teorema <strong>di</strong> fattorizzazione LDU vale su matrici A non singolari o su matrici<br />

ottenute da A me<strong>di</strong>ante moltiplicazioni a sinistra o a destra con opportune matrici <strong>di</strong> permutazione.<br />

Ci chie<strong>di</strong>amo se esistono matrici per le quali il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss possa essere implementato<br />

senza scambi <strong>di</strong> righe e per le quali l’algoritmo <strong>di</strong> eliminazione <strong>di</strong> Gauss sia stabile rispetto ad una crescita<br />

<strong>di</strong> errori <strong>di</strong> arrotondamento.<br />

Ve<strong>di</strong>amo, nel seguito, alcune speciali classi <strong>di</strong> matrici per cui valgono le nostre richieste.<br />

Una matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce <strong>di</strong>agonalmente dominante in senso stretto per righe se vale la<br />

relazione<br />

|a i i | ><br />

n∑<br />

|a i j | per ogni i = 1,2,...,n.<br />

j =0<br />

j ≠i<br />

Una matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce <strong>di</strong>agonalmente dominante in senso stretto per colonne se vale la<br />

relazione<br />

|a j j | ><br />

n∑<br />

|a i j | per ogni j = 1,2,...,n.<br />

i=0<br />

i≠j<br />

106


7.5. Fattorizzazione triangolare<br />

Esempio<br />

Esempio 7.5.2<br />

⎛<br />

7 3<br />

⎞<br />

1<br />

A = ⎝2 10 −2⎠<br />

5 0 6<br />

A è una matrice <strong>di</strong>agonalmente dominante in senso stretto per righe poichè vale:|7| > |3| + |1| = 4, |10| ><br />

|2|+|−2| = 4 e |6| > |5|+|0|. Non è <strong>di</strong>agonalmente dominante in senso stretto per colonne in quanto sulla<br />

prima colonna si ha |7| = |2| + |5|.<br />

Esempio<br />

Esempio 7.5.3<br />

⎛<br />

6 3<br />

⎞<br />

−4<br />

A = ⎝ 3 9 5 ⎠<br />

−4 5 11<br />

A non è <strong>di</strong>agonalmente dominante in senso stretto per righe poichè, sulla prima riga si ha |6| < |3|+|−4| =<br />

7. Essendo simmetrica, la matrice non può essere neanche <strong>di</strong>agonalmente dominante in senso stretto per<br />

colonne, perchè la relazione che abbiamo sulla prima riga vale sulla prima colonna.<br />

Le definizioni appena date si possono rilassare, definendo le matrici <strong>di</strong>agonalmente dominanti.<br />

Una matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce <strong>di</strong>agonalmente dominante per righe se vale la relazione<br />

|a i i | ≥<br />

n∑<br />

|a i j | per ogni i = 1,2,...,n.<br />

j =0<br />

j ≠i<br />

Analoga è la definizione <strong>di</strong> matrice <strong>di</strong>agonalmente dominante per colonne (basta applicare la definizione<br />

<strong>di</strong> matrice <strong>di</strong>agonalmente dominante per righe sulla matrice A T )<br />

Si hanno i seguenti teoremi.<br />

Matrice <strong>di</strong>agonalmente<br />

dominante<br />

Teorema 7.5.2 Se A è una matrice <strong>di</strong>agonalmente dominante e non singolare, allora il metodo <strong>di</strong> eliminazione<br />

<strong>di</strong> Gauss può essere implementato senza alcuno scambio <strong>di</strong> righe e <strong>di</strong> colonne e i calcoli sono stabili rispetto<br />

alla crescita <strong>degli</strong> errori <strong>di</strong> arrotondamento.<br />

Teorema 7.5.3 Se A è una matrice <strong>di</strong>agonalmente dominante in senso stretto (per righe o per colonne), allora<br />

A è non singolare. In questo caso il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss può essere implementato senza alcuno<br />

scambio <strong>di</strong> righe e <strong>di</strong> colonne e i calcoli sono stabili rispetto alla crescita <strong>degli</strong> errori <strong>di</strong> arrotondamento.<br />

Un’altra importante classe <strong>di</strong> matrici è data dalle matrici definite positive.<br />

Una matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce<br />

G definita positiva se è simmetrica e vale x T Ax > 0 qualunque sia il vettore x ≠ 0<br />

G semidefinita positiva se x T Ax ≥ 0 qualunque sia il vettore x,<br />

G indefinita altrimenti. 2<br />

Si ha un’analoga definizione per matrici definite negative e semidefinite negative.<br />

<strong>di</strong>mensione n si <strong>di</strong>ce<br />

definita negativa se è simmetrica e vale x T Ax < 0 qualunque sia il vettore x ≠ 0,<br />

G semidefinita negativa se x T Ax ≤ 0 qualunque sia il vettore x.<br />

Una matrice A <strong>di</strong><br />

2 Osserviamo che non tutti gli autori richiedono la simmetria per definire una matrice definita positiva, e <strong>di</strong>stinguono tra matrici<br />

definite positive e matrici simmetriche definite positive.<br />

Matrice<br />

definita<br />

positiva<br />

Matrice<br />

definita<br />

negativa<br />

107


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Dalla definizione <strong>di</strong> matrice definita positiva, deve essere x T Ax > 0 qualunque sia il vettore x, vale a <strong>di</strong>re:<br />

⎛<br />

⎞⎛<br />

⎞<br />

a 11 a 12 ... a 1n x 1<br />

( )<br />

a 21 a 22 ... a 2n<br />

x 2<br />

x1 x 2 ... x m ⎜<br />

⎝<br />

.<br />

. ...<br />

⎟⎜<br />

. ⎠⎝<br />

⎟<br />

. ⎠<br />

a n1 a n2 ... a nn x m<br />

⎛∑ n<br />

j =1 a ⎞<br />

1j x j<br />

= ( ∑ n<br />

)<br />

j =1<br />

x 1 x 2 ... x m a 2j x j<br />

n∑ n∑<br />

⎜<br />

⎝<br />

⎟<br />

. ⎠ = a i j x i x j > 0<br />

i=1 j =1<br />

∑ n<br />

j =1 a n j x j<br />

Basarsi sulla definizione per verificare che una matrice sia o meno definita positiva può essere molto<br />

<strong>di</strong>fficile. Fortunatamente, ci sono molti criteri che ci permettono <strong>di</strong> <strong>di</strong>re se una matrice è definita positiva<br />

oppure no.<br />

IL seguente risultato ci permette <strong>di</strong> eliminare certe matrici dalla classe delle matrici definite positive, se<br />

non sod<strong>di</strong>sfano certi requisiti.<br />

Teorema 7.5.4 Se una matrice A <strong>di</strong> <strong>di</strong>mensione n è definita positiva, allora<br />

G A ammette la matrice inversa;<br />

G a i i > 0 per ogni i = 1,2,...,n<br />

Quin<strong>di</strong> se una matrice ha elementi a i i ≤ 0, non è una matrice definita positiva, perché, se lo fosse, in base al<br />

teorema avrebbe elementi <strong>di</strong>agonali tutti positivi.<br />

Ve<strong>di</strong>amo ora una con<strong>di</strong>zione necessaria e sufficiente per matrici definite positive.<br />

Teorema 7.5.5 Una matrice A simmetrica <strong>di</strong> <strong>di</strong>mensione n è definita positiva se e solo se tutti i suoi minori<br />

principali hanno determinante positivo.<br />

Teorema 7.5.6 Una matrice A simmetrica <strong>di</strong> <strong>di</strong>mensione n con elementi <strong>di</strong>agonali tutti positivi e<br />

<strong>di</strong>agonalmente dominante è definita positiva.<br />

Anche per matrici simmetriche definite positive, si può applicare il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss<br />

senza operare scambi <strong>di</strong> righe e <strong>di</strong> colonne e i calcoli rimangono stabili rispetto alla crescita <strong>degli</strong> errori <strong>di</strong><br />

arrotondamento. Questo risultato ci serve per la fattorizzazione <strong>di</strong> Cholesky.<br />

7.5.3 Fattorizzazione <strong>di</strong> Cholesky<br />

Nel caso in cui la matrice A sia simmetrica, il teorema LDU si presenta nel seguente modo<br />

Teorema 7.5.7 (LDU per matrici simmetriche) Se A è una matrice simmetrica e nessuno dei suoi minori<br />

principali è singolare, allora A si può decomporre nel prodotto A = LDL T , dove L è triangolare inferiore con<br />

elementi <strong>di</strong>agonali unitari ed è univocamente determinata, L T è la sua trasposta e D è matrice <strong>di</strong>agonale.<br />

Dimostrazione. Intanto valgono le ipotesi del teorema LDU e quin<strong>di</strong> si può scrivere in maniera univoca<br />

A = LDU con L matrice triangolare inferiore, D <strong>di</strong>agonale e U triangolare superiore. Inoltre, poichè A è<br />

simmetrica, e quin<strong>di</strong> A = A T , si ha pure LDU = (LDU ) T vale a <strong>di</strong>re LDU = U T D T L T = U T DL T . Si deduce,<br />

dall’uguaglianza, che U = L T e la decomposizione <strong>di</strong>venta A = LDL T . ✔<br />

Nel caso particolare in cui A sia simmetrica e definita positiva, da x T Ax > 0 vale pure<br />

x T Ax = x T LDL T x = (L T x) T DL T x = y T Dy > 0 con y = L T x per ogni x > 0.<br />

Essendo A è definita positiva, risulta anche D definita positiva. Perciò gli elementi <strong>di</strong> D (che è una matrice<br />

<strong>di</strong>agonale) devono necessariamente essere tutti positivi. In tal caso, si considera la matrice D 1/2 che è la<br />

108


7.6. <strong>Esercizi</strong><br />

matrice <strong>di</strong>agonale con elementi dati dalle ra<strong>di</strong>ci quadrate <strong>degli</strong> elementi <strong>di</strong>agonali <strong>di</strong> D (si prende il valore<br />

positivo della ra<strong>di</strong>ce quadrata, e il risultato è un numero reale in virtù del fatto che gli elementi <strong>di</strong>agonali <strong>di</strong><br />

D sono tutti positivi). Si pone, quin<strong>di</strong>, M = LD 1/2 e si ottiene A = M M T : abbiamo il prodotto <strong>di</strong> una matrice<br />

triangolare inferiore con coefficienti tutti reali per la sua trasposta. Se D non fosse definita positiva (ma avesse<br />

qualche elemento negativo), allora neanche A sarebbe definita positiva e la matrice M sarebbe non reale.<br />

Quin<strong>di</strong> se A è simmetrica, si ha la decomposizione nel prodotto LL T (chiamiamo <strong>di</strong> nuovo con L la<br />

matrice M) con L reale se e solo se A è definita positiva.<br />

I coefficienti della matrice L si trovano facendo il prodotto righe per colonne ed eguagliando i termini ai<br />

corrispondenti elementi <strong>di</strong> A.<br />

Si ricava:<br />

l 11 = a 11<br />

l i 1 = a i 1 /l 11 i = 2,3,...,n<br />

i−1 ∑<br />

l i i = √ (ai i − l 2 i k ) i = 2,3,...,n<br />

k=1<br />

l i j = 1 j∑<br />

−1<br />

(a i j − l i k l j k ) j = 2,...,n i = j + 1,...,n<br />

l i i<br />

k=1<br />

Tale fattorizzazione prende il nome <strong>di</strong> fattorizzazione <strong>di</strong> Cholesky 3 .<br />

7.6 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 7.6.1 ⎛ Sia data ⎞ la matrice<br />

1 0 2<br />

A = ⎝0 4 8 ⎠<br />

2 8 29<br />

Provare che verifica le con<strong>di</strong>zioni del teorema LDU e trovare i fattori L e L T tali che A = LL T .<br />

( ) 1 0<br />

Svolgimento La matrice A è simmetrica e sod<strong>di</strong>sfa le ipotesi del teorema LDU ( infatti |a 11 | = 1, det =<br />

0 4<br />

4 e det(A) = 116 − 16 − 64 = 36) per cui è possibile scrivere la matrice A come A = LL T . Si ha, quin<strong>di</strong>:<br />

⎛<br />

⎞⎛<br />

⎞ ⎛<br />

l 11 0 0 l 11 l 21 l 31 l 2 ⎞<br />

11<br />

l 11 l 21 l 11 l 31<br />

⎝l 21 l 22 0 ⎠⎝<br />

0 l 22 l 32<br />

⎠ = ⎝l 21 l 11 l21 2 + l 22 2 l 21 l 31 + l 22 l 32<br />

⎠<br />

l 31 l 32 l 33 0 0 l 33 l 31 l 11 l 31 l 21 + l 32 l 22 l31 2 + l 32 2 + l 33<br />

2<br />

Devono quin<strong>di</strong> valere le relazioni:<br />

l 2 11 = 1 =⇒ l 11 = 1<br />

l 21 l 11 = 0 =⇒ l 21 = 0<br />

l 31 l 11 = 2 =⇒ l 31 = 2<br />

l 2 21 + l 2 22 = 4 =⇒ l 22 = 4 − 0 = 2<br />

l 21 l 31 + l 22 l 32 = 8 =⇒ l 32 = 8/2 = 4<br />

√<br />

l31 2 + l 32 2 + l 33 2 = 29 =⇒ l 33 = 29 − 2 2 − 4 2 = 29 − 4 − 16 = 9 = 3<br />

3 André-Louis Cholesky (1875-1918) fu un matematico francese. Fu ufficiale ingegnere e morì alla fine della prima guerra mon<strong>di</strong>ale.<br />

109


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

La matrice L è dunque<br />

⎛<br />

1 0<br />

⎞<br />

0<br />

⎝0 2 0⎠<br />

2 4 3<br />

<strong>Esercizi</strong>o 7.6.2 ⎛ Data la matrice ⎞<br />

0.2 1 0.2<br />

A = ⎝ 1 6.5 1.75⎠<br />

0 2 2.25<br />

(a) verificare che A sod<strong>di</strong>sfa le con<strong>di</strong>zioni del teorema LDU ;<br />

(b) fattorizzare secondo Crout A = LU (prendendo u i i = 1);<br />

(c) usare la fattorizzazione per calcolare det(A −2 );<br />

(d) usare la fattorizzazione per risolvere il sistema Ax = b, con b T = (2.8 19.25 10.75) T .<br />

Svolgimento<br />

(a) La matrice verifica le con<strong>di</strong>zioni del teorema LDU in quanto i minori principali costruiti a partire<br />

dall’angolo superiore sinistro hanno tutti determinante <strong>di</strong>verso da zero:<br />

a 11 = 0.2 ≠ 0<br />

( ) 0.2 1<br />

det = 0.3 ≠ 0 det A = 0.375 ≠ 0<br />

1 6.5<br />

(b) La fattorizzazione <strong>di</strong> A come A = LU si costruisce imponendo:<br />

⎛<br />

⎞ ⎛<br />

⎞⎛<br />

⎞<br />

0.2 1 0.2<br />

l 11 0 0 1 u 12 u 13<br />

A = ⎝ 1 6.5 1.75⎠ = LU = ⎝l 21 l 22 0 ⎠⎝0 1 u 23<br />

⎠<br />

0 2 2.25<br />

l 31 l 32 l 33 0 0 1<br />

Usando le formule <strong>di</strong> pag. 106, si ottiene<br />

l 11 = 0.2<br />

0.2u 12 = 1 =⇒ u 12 = 5<br />

0.2u 13 = 0.2 =⇒ u 13 = 1<br />

l 21 = 1<br />

1 · 5 + l 22 = 6.5 =⇒ l 22 = 1.5<br />

1 · 1 + 1.5u 23 = 1.75 =⇒ u 23 = 0.5<br />

l 31 = 0<br />

0 · 5 + l 32 = 2 =⇒ l 32 = 2<br />

0 · 1 + 2 · 0.5 + l 33 = 2.25 =⇒ l 33 = 1.25<br />

Le matrici L e U sono:<br />

⎛<br />

0.2 0 0<br />

⎞<br />

⎛<br />

1 5<br />

⎞<br />

1<br />

L = ⎝ 1 1.5 0 ⎠ U = ⎝0 1 0.5⎠<br />

0 2 1.25<br />

0 0 1<br />

(c) Si ha det A = detLU = detL detU = detL = 0.375. Quin<strong>di</strong> det(A −2 ) = det(A) −2 = 0.375 −2 = 7.11111111.<br />

110


7.6. <strong>Esercizi</strong><br />

(d) Da Ax = b si ha LU x = b.<br />

Si pone U x = y e si hanno i due sistemi da risolvere per sostituzione in avanti e all’in<strong>di</strong>etro: Ly = b e<br />

U x = y.<br />

⎛<br />

⎞⎛<br />

⎞ ⎛ ⎞ ⎧<br />

0.2 0 0 y 1 2.8 ⎪⎨ y 1 = 2.8/0.2 = 14<br />

⎝ 1 1.5 0 ⎠⎝y 2<br />

⎠ = ⎝19.25⎠ =⇒ y 2 = (19.25 − 14)/1.5 = 3.5<br />

0 2 1.25 y 3 10.75<br />

⎪⎩<br />

y 3 = (10.75 − 2 · 3.5)1.25 = 3<br />

⎛ ⎞⎛<br />

⎞ ⎛ ⎞ ⎧<br />

1 5 1 x 1 14 ⎪⎨ x 3 = 3<br />

⎝0 1 0.5⎠⎝x 2<br />

⎠ = ⎝3.5⎠ =⇒ x 2 = 3.5 − 3 · 0.5 = 2<br />

0 0 1 x 3 3<br />

⎪⎩<br />

x 1 = 14 − 3 − 5 · 2 = 1<br />

Quin<strong>di</strong> x = (1, 2, 3) T .<br />

<strong>Esercizi</strong>o 7.6.3 ⎛ È dato il sistema ⎞ lineare ⎛ Ax = ⎞ b dove:<br />

16 −8 4<br />

20<br />

A = ⎝−8 20 4 ⎠ b = ⎝ 28 ⎠<br />

4 4 12.25<br />

28.25<br />

(a) Provare che la matrice è definita positiva.<br />

(b) Fattorizzare la matrice secondo Cholesky: A = LL T .<br />

(c) Usare la fattorizzazione per risolvere il sistema Ax = b e per calcolare det(A 3 ).<br />

Soluzione<br />

(a) La matrice è simmetrica, definita positiva in quanto gli elementi della <strong>di</strong>agonale principale sono tutti<br />

positivi e la matrice è <strong>di</strong>agonalmente dominante in senso stretto:<br />

16 > | − 8| + |4| = 12<br />

20 > | − 8| + |4| = 12<br />

12.25 > |4| + |4| = 8<br />

(b) Ponendo A = LL T si ricava:<br />

l 2 11 = 16 =⇒ l 11 = 4<br />

l 21 l 11 = −8 =⇒ l 21 = −2<br />

l 31 l 11 = 4 =⇒ l 31 = 1<br />

l 2 21 + l 2 22 = 20 =⇒ l 22 = 20 − 4 = 4<br />

l 21 l 31 + l 22 l 32 = 4 =⇒ l 32 = (4 + 2)/4 = 1.5<br />

l 2 31 + l 2 32 + l 2 33 = 12.25 =⇒ l 33 = 12.25 − 1 − 2.25 = 9 = 3<br />

La matrice L è dunque<br />

⎛<br />

4 0<br />

⎞<br />

0<br />

L = ⎝−2 4 0⎠<br />

1 1.5 3<br />

111


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

(c) Per risolvere il sistema Ax = b, adoperiamo il metodo <strong>di</strong> sostituzione in avanti e all’in<strong>di</strong>etro risolvendo<br />

i sistemi: Ly = b e poi L T x = y.<br />

Il primo sistema dà:<br />

⎛<br />

⎞⎛<br />

⎞ ⎛ ⎞<br />

4 0 0 y 1 20<br />

⎝−2 4 0⎠⎝y 2<br />

⎠ = ⎝ 28 ⎠<br />

1 1.5 3 y 3 28.25<br />

e otteniamo y 1 = 20/4 = 5, y 2 = (28 + 10)/4 = 9.5, y 3 = (28.25 − 5 − 14.25)/3 = 3.<br />

Nel risolvere il sistema L T x = y si ha<br />

⎛<br />

⎞⎛<br />

⎞ ⎛ ⎞<br />

4 −2 1 x 1 5<br />

⎝0 4 1.5⎠⎝x 2<br />

⎠ = ⎝9.5⎠<br />

0 0 3 x 3 3<br />

da cui x 3 = 1, x 2 = (9.5 − 1.5)/4 = 2, x 1 = (5 − 1 + 4)/4 = 2, quin<strong>di</strong> x = (2, 2, 1).<br />

Inoltre, da det(A) = det(LL T ) = det(L) 2 = (4 · 4 · 3) 2 = 48 2 = 2304 e da det(A 3 ) = (det(A)) 3 si ha<br />

det(A 3 ) = 2304 3 = 12230590464.<br />

112


CAPITOLO 8<br />

Meto<strong>di</strong> Iterativi per la soluzione <strong>di</strong> sistemi<br />

lineari<br />

Mi spiace ammettere che la materia<br />

che mi è piaciuta <strong>di</strong> meno è stata la<br />

matematica. Ci ho pensato su, e<br />

credo che la ragione sia che la<br />

matematica non lascia spazio alle<br />

<strong>di</strong>scussioni. Se fai un errore, non<br />

puoi scamparla.<br />

Malcom X<br />

8.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113<br />

8.2 Meto<strong>di</strong> iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />

8.3 Norme <strong>di</strong> vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />

8.4 Norme <strong>di</strong> matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115<br />

8.5 Autovalori e autovettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116<br />

8.6 Meto<strong>di</strong> classici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118<br />

8.6.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118<br />

8.6.2 Controllo della convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119<br />

8.6.3 I meto<strong>di</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121<br />

8.6.4 Convergenza dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamento . . . . . . . . . . . . . . . . 125<br />

8.7 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128<br />

8.1 Introduzione<br />

L’equazione che governa la conduzione del calore in una piastra metallica piana, omogenea e isotropa<br />

prende il nome <strong>di</strong> equazione <strong>di</strong> Poisson e si scrive come<br />

∂ 2 T<br />

∂x 2 + ∂2 T f (x, y)<br />

=<br />

∂y<br />

2<br />

ρcK H<br />

Si tratta <strong>di</strong> un’equazione alle derivate parziali dove T [ o C ] è la temperatura, K H [m 2 /s] è il coefficiente <strong>di</strong> <strong>di</strong>ffusività<br />

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<br />

calore aggiunto o sottratto alla piastra per unità <strong>di</strong> tempo e <strong>di</strong> area. In letteratura <strong>di</strong>verse tecniche numeriche<br />

permettono <strong>di</strong> risolvere il problema (ricor<strong>di</strong>amo i meto<strong>di</strong> alle <strong>di</strong>fferenze finite e i meto<strong>di</strong> agli elementi finiti),<br />

in determinati punti (detti no<strong>di</strong>) della piastra. Qualunque sia il metodo utilizzato, si arriva ad un sistema <strong>di</strong><br />

equazioni lineari del tipo<br />

HT = q<br />

113


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

dove H rappresenta la matrice <strong>di</strong> <strong>di</strong>scretizzazione del metodo, T rappresenta il vettore delle temperature nei<br />

no<strong>di</strong> e q è il vettore dei termini noti che deriva dal metodo applicato.<br />

La matrice H puó avere una <strong>di</strong>mensione molto elevata ma ha la caratteristica <strong>di</strong> essere sparsa, cioè <strong>di</strong><br />

avere pochi elementi <strong>di</strong>versi da zero per ogni riga.<br />

Per risolvere sistemi lineari <strong>di</strong> questo tipo, si preferisce usare meto<strong>di</strong> iterativi piuttosto che <strong>di</strong>retti. In<br />

questo Capitolo presentiamo alcuni dei meto<strong>di</strong> iterativi per la risoluzione <strong>di</strong> sistemi lineari.<br />

8.2 Meto<strong>di</strong> iterativi<br />

Per risolvere un sistema <strong>di</strong> equazioni lineari Ax = b, applicando un metodo <strong>di</strong>retto, e trascurando gli<br />

errori <strong>di</strong> arrotondamento, si ottiene la soluzione esatta del problema in un numero finito (e noto a priori)<br />

<strong>di</strong> operazioni. Nei meto<strong>di</strong> iterativi, invece, si parte da un’approssimazione iniziale che viene migliorata,<br />

me<strong>di</strong>ante un proce<strong>di</strong>mento iterativo, fino ad ottenere una approssimazione sufficientemente accurata della<br />

soluzione. L’idea <strong>di</strong> risolvere sistemi lineri con meto<strong>di</strong> iterativi risale ai tempi <strong>di</strong> Gauss (1823), ma solo con<br />

l’avvento dei computers (negli anni cinquanta) si può osservare il loro sviluppo, visto che <strong>di</strong>venta possibile<br />

risolvere sistemi lineari dove la matrice A è sparsa e <strong>di</strong> gran<strong>di</strong> <strong>di</strong>mensioni – un particolare tipo <strong>di</strong> problema<br />

improponibile per i meto<strong>di</strong> <strong>di</strong>retti. Difatti, nei meto<strong>di</strong> <strong>di</strong>retti, il processo <strong>di</strong> eliminazione <strong>di</strong> Gauss (o la<br />

decomposizione della matrice <strong>di</strong> partenza nel prodotto LU con L triangolare inferiore e U triangolare superiore)<br />

porta all’introduzione del cosiddetto fill-in, cioè a matrici L e U con elementi <strong>di</strong>versi da zero là dove<br />

la matrice <strong>di</strong> partenza A ha elementi nulli. I meto<strong>di</strong> <strong>di</strong>retti <strong>di</strong>ventano quin<strong>di</strong> proibitivi perchè troppo costosi<br />

per quanto riguarda il numero <strong>di</strong> operazioni aritmetiche e l’occupazione <strong>di</strong> dati che devono essere salvati per<br />

l’implementazione numerica del metodo stesso. I meto<strong>di</strong> iterativi, al contrario, lavorano <strong>di</strong>rettamente sulla<br />

matrice A e, dal momento che A viene coinvolta solo in termini <strong>di</strong> prodotti matrice-vettore, non c’è neanche<br />

bisogno <strong>di</strong> memorizzare tutta la matrice (in genere, quando la matrice è sparsa, si lavora su memorizzazioni<br />

in forma compatta delle matrici, memorizzando solo gli elementi non nulli che servono per il prodotto<br />

matrice-vettore).<br />

Quando abbiamo stu<strong>di</strong>ato gli zeri <strong>di</strong> funzione nel Capitolo 4, data un’approssimazione iniziale, si procedeva<br />

nell’algoritmo iterativo fino a quando lo scarto tra due approssimazioni successive non <strong>di</strong>ventava<br />

minore <strong>di</strong> una prefissata tolleranza.<br />

Nel caso dei sistemi lineari, l’approccio è simile. Si parte da un vettore iniziale che approssima la soluzione<br />

del sistema e, me<strong>di</strong>ante un certo proce<strong>di</strong>mento ricorsivo, si calcola una nuova approssimazione (un<br />

vettore). Dobbiamo dunque essere capaci <strong>di</strong> misurare lo scarto tra due vettori in modo da capire quando la<br />

successione dei vettori generati dall’algoritmo tende al vettore soluzione del sistema lineare.<br />

Abbiamo perciò bisogno <strong>di</strong> definire le norme <strong>di</strong> vettori e <strong>di</strong> matrici. Nel seguito, tratteremo solo norme <strong>di</strong><br />

matrici e vettori definite nello spazio dei numeri reali (e non complessi).<br />

Norma<br />

Norme 1, ∞,<br />

8.3 Norme <strong>di</strong> vettori<br />

Il concetto <strong>di</strong> norma generalizza quello <strong>di</strong> valore assoluto (o modulo) <strong>di</strong> un numero reale (o complesso).<br />

Sia R n lo spazio dei vettori colonna <strong>di</strong> lunghezza n. La norma <strong>di</strong> un vettore x ∈ R n è una funzione, ‖ · ‖,<br />

definita in R n e a valori in R, che gode delle seguenti proprietà:<br />

G ‖x‖ > 0 per ogni x ≠ 0<br />

G ‖x‖ = 0 se e solo se x = 0<br />

G ‖αx‖ = |α|‖x‖ dove α è un reale (o complesso) arbitrario<br />

G ‖x + y‖ ≤ ‖x‖ + ‖y‖<br />

Le principali norme vettoriali sono:<br />

2<br />

G Norma assoluta (o norma l 1 ), in<strong>di</strong>cata con ‖ · ‖ 1 : ‖x‖ 1 = ∑ n<br />

i=1 |x i |<br />

G Norma massima (o norma infinito, l ∞ ), in<strong>di</strong>cata con ‖ · ‖ ∞ : ‖x‖ ∞ = max 1≤i≤n |x i |<br />

G Norma euclidea (o norma l 2 ), in<strong>di</strong>cata con ‖ · ‖ 2 : ‖x‖ 2 = √ ∑n<br />

x T x =<br />

i=1 |x i | 2<br />

114


8.4. Norme <strong>di</strong> matrici<br />

Figura 8.1: Vettori in R 2 con norma unitaria nelle norme 1, ∞ e 2.<br />

Tra le norme 1, ∞ e 2 valgono le seguenti relazioni (che pongono un’equivalenza tra esse). Dato un vettore<br />

x ∈ R n :<br />

‖x‖ ∞ ≤ ‖x‖ 2 ≤ n‖x‖ ∞<br />

‖x‖ ∞ ≤ ‖x‖ 1 ≤ n‖x‖ ∞<br />

Esempio<br />

Esempio 8.3.1 Il vettore x = (1,5,−20) T ha norme:<br />

‖x‖ 1 = |1| + |5| + | − 20| = 26<br />

‖x‖ ∞ = max(|1|,|5|,| − 20|) = 20<br />

√<br />

‖x‖ 2 = (1 2 + 5 2 + (−20) 2 ) = 426 = 20.639767441<br />

Per la norma euclidea vale la <strong>di</strong>seguaglianza <strong>di</strong> Cauchy-Schwarz:<br />

Diseguaglianza<br />

<strong>di</strong> Cauchy-<br />

Schwarz<br />

x T y ≤ ‖x‖ 2 ‖y‖ 2<br />

Dati due vettori x e y ∈ R n , si definisce <strong>di</strong>stanza tra i due vettori la norma della <strong>di</strong>fferenza tra i vettori.<br />

Quin<strong>di</strong>:<br />

Distanza tra<br />

vettori<br />

‖x − y‖ 1 =<br />

n∑<br />

|x i − y i |<br />

i=1<br />

‖x − y‖ ∞ = max |x i − y i |<br />

1≤i≤n<br />

√ n∑<br />

‖x − y‖ 2 = |x i − y i | 2<br />

i=1<br />

Il concetto <strong>di</strong> <strong>di</strong>stanza serve per definire il limite <strong>di</strong> una successione <strong>di</strong> vettori.<br />

Data una successione <strong>di</strong> vettori in R n , x (k) , per k = 1,2,...,∞, si <strong>di</strong>ce che la successione converge ad un<br />

vettore x <strong>di</strong> R n e si scrive lim k→∞ x (k) = x se, per ogni ɛ > 0, esiste un intero m tale che<br />

‖x (k) − x‖ < ɛ per tutti gli in<strong>di</strong>ci k ≥ m<br />

Limite <strong>di</strong> una<br />

successione<br />

<strong>di</strong> vettori<br />

8.4 Norme <strong>di</strong> matrici<br />

Analogamente alla definizione <strong>di</strong> norma vettoriale, la norma <strong>di</strong> matrici quadrate <strong>di</strong> <strong>di</strong>mensione n è una<br />

funzione, che in<strong>di</strong>chiamo con ‖ · ‖ che, per tutte le matrici A e B <strong>di</strong> <strong>di</strong>mensione n e per tutti i numeri reali (o<br />

complessi) α, sod<strong>di</strong>sfa le seguenti proprietà:<br />

G ‖A‖ > 0 per ogni A ≠ 0<br />

115


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Norma<br />

compatibile<br />

Norma<br />

naturale<br />

traccia <strong>di</strong> una<br />

matrice<br />

G ‖A‖ = 0 se e solo se A = 0<br />

G ‖αA‖ = |α|‖A‖<br />

G ‖A + B‖ ≤ ‖A‖ + ‖B‖<br />

G ‖AB‖ ≤ ‖A‖‖B‖<br />

Una proprietà importante che si richiede alle norme su matrici è che siano compatibili con norme vettoriali:<br />

la norma ‖A‖ <strong>di</strong> una matrice A si <strong>di</strong>ce compatibile con la norma ‖x‖ <strong>di</strong> un vettore x se vale la<br />

relazione<br />

‖Ax‖ ≤ ‖A‖‖x‖<br />

Alcune norme su matrici sono generate da norme su vettori: si parla allora <strong>di</strong> norma naturale o indotta<br />

dalla norma <strong>di</strong> vettori. In particolare, se ‖ · ‖ è una norma su vettori in R n , allora ‖A‖ = max ‖x‖=1 ‖Ax‖ è la<br />

norma naturale o indotta dalla norma ‖ · ‖ su vettori.<br />

Le norme <strong>di</strong> matrici indotte dalla norma 1 e dalla norma infinito su vettori sono:<br />

G Norma 1: ‖A‖ 1 = max j<br />

∑ n<br />

i=1 |a i j | (data dal massimo sulla somma delle colonne)<br />

G Norma infinito: ‖A‖ ∞ = max i<br />

∑ n<br />

j =1 |a i j | (data dal massimo sulla somma delle righe)<br />

La norma <strong>di</strong> matrice indotta dalla norma 2 è più complicata e vedremo in seguito come è definita.<br />

È facile vedere che le norme naturali sono norme compatibili con la norma <strong>di</strong> vettori da cui sono costruite.<br />

Una norma <strong>di</strong> matrici, che non è indotta, ma compatibile con la norma 2 è la cosiddetta norma euclidea<br />

(o <strong>di</strong> Frobenius). Tenendo presente che, data una matrice A, si chiama traccia della matrice o tr (A) la somma<br />

<strong>degli</strong> elementi della <strong>di</strong>agonale principale <strong>di</strong> A, la norma euclidea è data da<br />

G N (A) = √ tr (A T A) = √ √ ∑n<br />

tr (A A T ) =<br />

i=1<br />

|a i j | 2 .<br />

j =1<br />

8.5 Autovalori e autovettori<br />

Data una matrice quadrata A <strong>di</strong> or<strong>di</strong>ne n, se esiste un numero (reale o complesso) λ e un vettore x ≠ 0 tali<br />

che<br />

Ax = λx<br />

Autovalore e<br />

autovettore<br />

allora λ è un autovalore e x il corrispondente autovettore della matrice A.<br />

Scritta in maniera equivalente, la relazione definisce il sistema lineare<br />

(A − λI )x = 0<br />

Poichè x ≠ 0 e il termine noto del sistema è il vettore <strong>di</strong> tutti zeri, il determinante della matrice del sistema<br />

deve necessariamente essere uguale a zero, cioè det(A − λI ) = 0.<br />

Lo sviluppo del determinante porta a un polinomio <strong>di</strong> grado n nell’incognita λ:<br />

λ n − tr (A)λ n−1 + ... + (−1) n det(A) = 0<br />

Polinomio Questo polinomio si chiama polinomio caratteristico. Le sue n ra<strong>di</strong>ci, che chiamiamo λ 1 ,λ 2 ,...,λ n , sono gli<br />

caratteristico n autovalori della matrice A.<br />

Per le proprietà dei polinomi vale:<br />

n∑<br />

λ i = tr (A) = a 11 + a 22 + ... + a nn<br />

i=1<br />

e<br />

n∏<br />

λ i = det(A)<br />

i=1<br />

116<br />

Alcune proprietà sugli autovalori e autovettori sono le seguenti:<br />

G Se λ è autovalore della matrice A, allora λ k è autovalore della matrice potenza A k (cioè A · A ··· A k<br />

volte).<br />

G Se λ è autovalore della matrice A, e A è regolare, allora λ −1 è autovalore della matrice inversa A −1 .


8.5. Autovalori e autovettori<br />

Figura 8.2: Autovalori e autovettori<br />

G Gli autovalori <strong>di</strong> una matrice A e della sua trasposta A T sono gli stessi (ma gli autovettori sono, in<br />

genere, <strong>di</strong>versi).<br />

G Se A e B sono due matrici arbitrarie regolari, allora gli autovalori <strong>di</strong> AB sono gli stessi <strong>di</strong> B A.<br />

Se x è un autovettore associato alla matrice A, allora Ax = λx: la matrice A trasforma il vettore x in un<br />

vettore le cui componenti sono moltiplicate per λ: se λ > 1, allora A ha l’effetto <strong>di</strong> allungare x <strong>di</strong> un fattore λ;<br />

se invece 0 < λ < 1, allora x si restringe <strong>di</strong> un fattore λ; gli effetti sono simili, ma il verso del vettore risultante<br />

Ax è opposto, quando λ < 0. I quattro casi che si possono presentare sono illustrati in Figura 8.2.<br />

Altre proprietà da tenere presenti sono le seguenti:<br />

G Se tutti gli n autovalori <strong>di</strong> una matrice A sono <strong>di</strong>stinti, allora gli n autovettori u (1) , u (2) ,...u (n) sono<br />

linearmente in<strong>di</strong>pendenti. 1<br />

G Se A è una matrice simmetrica reale definita positiva, allora i suoi autovalori sono tutti reali e positivi.<br />

Introduciamo ora il raggio spettrale <strong>di</strong> una matrice A .<br />

Definizione 8.5.1 Il raggio spettrale ρ(A) <strong>di</strong> una matrice A è definito da<br />

ρ(A) = max |λ|<br />

λ autovalore <strong>di</strong> A<br />

Quin<strong>di</strong> il raggio spettrale è il massimo, in modulo, <strong>degli</strong> autovalori <strong>di</strong> A (ricor<strong>di</strong>amo che se λ è un<br />

complesso, λ = α + iβ, con i = −1, si ha |λ| = √ α 2 + β 2 ).<br />

Possiamo ora definire la norma 2 su matrici indotta dalla norma 2 su vettori. Si può, infatti, provare che<br />

√<br />

G ‖A‖ 2 = ρ(A T A).<br />

Inoltre, per ogni norma naturale, vale il risultato<br />

Raggio<br />

spettrale<br />

Norma 2 su<br />

matrici<br />

ρ(A) ≤ ‖A‖<br />

Nello stu<strong>di</strong>are i meto<strong>di</strong> iterativi per risolvere i sistemi lineari, sarà <strong>di</strong> particolare importanza sapere quando<br />

le potenze <strong>di</strong> una matrice tendono alla matrice nulla. Matrici A, per cui (A k ) i j → 0 per k → ∞, qualunque<br />

sia i , j = 1,2,...,n, (consideriamo A · A ··· A k volte e gli elementi della matrice risultante tendono a zero per<br />

k → ∞) si <strong>di</strong>cono matrici convergenti. Diciamo che una matrice A <strong>di</strong> <strong>di</strong>mensione n è convergente se<br />

lim<br />

k→∞ (Ak ) i j = 0, i , j = 1,2,...,n<br />

Si ha il seguente teorema.<br />

Matrice<br />

convergente<br />

Teorema 8.5.1 Data una matrice A <strong>di</strong> <strong>di</strong>mensione n, sono equivalenti le seguenti proposizioni<br />

1. A è una matrice convergente.<br />

2. lim k→∞ ‖A k ‖ = 0, per qualche norma naturale.<br />

3. lim k→∞ ‖A k ‖ = 0, per tutte le norme naturali.<br />

4. ρ(A) < 1.<br />

5. lim k→∞ A k x = 0, qualunque sia il vettore x.<br />

1 Dati n vettori linearmente in<strong>di</strong>pendenti <strong>di</strong> R n , u (1) , u (2) ,...u (n) , ogni vettore <strong>di</strong> R n si può scrivere come una loro combinazione<br />

lineare. Quin<strong>di</strong> esistono n coefficienti α 1 ,α 2 ,...,α n per cui x = α 1 u (1) +α 2 u (2) +...+α n u (n) . Inoltre, per vettori linearmente in<strong>di</strong>pendenti<br />

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.<br />

117


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

8.6 Meto<strong>di</strong> classici<br />

I meto<strong>di</strong> iterativi classici per la risoluzione <strong>di</strong> un sistema <strong>di</strong> equazioni lineari del tipo Ax = b si basano su<br />

un’idea molto semplice.<br />

G Si parte da un’approssimazione iniziale x (0) , commettendo un’errore e (0) = x − x (0) . L’errore e (0) è soluzione<br />

del sistema Ae (0) = b − Ax (0) = r (0) , dove r (0) è il residuo (ciò che resta fuori, ci <strong>di</strong>ce <strong>di</strong> quanto il<br />

vettore Ax (0) si <strong>di</strong>scosta da b).<br />

G Successivamente si definisce il passo x (1) come x (1) = x (0) + p (0) , dove ora p (0) è soluzione del sistema<br />

Mp (0) = r 0 , in cui la matrice M è più semplice della A e, allo stesso tempo, M −1 approssima in qualche<br />

modo A −1 .<br />

G Il proce<strong>di</strong>mento viene iterato fino a convergenza.<br />

Da queste richieste tra loro contrad<strong>di</strong>torie, si sviluppa una strategia che porta alla soluzione esatta x come<br />

limite della successione dei valori approssimati x (k) .<br />

Il processo iterativo si legge, infatti, come:<br />

x (k+1) = x (k) + M −1 (b − Ax (k) ) k = 0,1,....<br />

O, equivalentemente,<br />

x (k+1) = (I − M −1 A)x (k) + M −1 b k = 0,1,...<br />

Notiamo che, ad ogni passo, non dobbiamo calcolare esplicitamente M −1 , perchè risolviamo problemi del<br />

tipo Mp (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 <strong>di</strong><br />

iterazione del metodo. Nel seguito, per semplicità, poniamo q = M −1 b.<br />

Lo schema iterativo appena descritto è un metodo stazionario (cioè non <strong>di</strong>pende dall’iterazione k) e<br />

può essere visto come caso particolare <strong>di</strong> uno schema <strong>di</strong> punto fisso per equazioni nonlineari: la funzione<br />

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<br />

equivalentemente da g (x) = Ex (k) + q.<br />

8.6.1 Convergenza<br />

Per stu<strong>di</strong>are la convergenza <strong>di</strong> un metodo iterativo, consideriamo, per ogni vettore x (k) , il residuo r (k) =<br />

b − Ax (k) e l’errore e (k) = x − x (k) . Osserviamo che si ha la relazione r (k) = Ae (k) . Infatti<br />

Ae (k) = A(x − x (k) ) = Ax − Ax (k) = b − Ax (k) = r (k)<br />

Lo schema converge quando la successione x (k) converge alla soluzione x per k → ∞, ovvero quando<br />

lim k→∞ e (k) = 0 qualunque sia il vettore iniziale x (0) .<br />

Consideriamo lo schema iterativo x (k+1) = Ex (k) + q.<br />

È facile vedere che per la soluzione esatta x vale la relazione x = Ex + q.<br />

Consideriamo x − x (k) . Si ha<br />

x = Ex + q<br />

x (k) = Ex k−1 + q<br />

e sottraendo si ricava<br />

e (k) = Ee (k−1)<br />

La relazione appena trovata vale, alla stessa maniera, tra l’errore e (k−1) e l’errore e (k−2) per cui possiamo<br />

scrivere e (k−1) = Ee (k−2) .<br />

Scriviamo queste relazioni dall’iterazione k fino ad arrivare all’iterazione 0.<br />

118


8.6. Meto<strong>di</strong> classici<br />

e (k) = Ee (k−1)<br />

e (k−1) = Ee (k−2)<br />

e (k−2) = Ee (k−3)<br />

. = . . .<br />

e (2) = Ee (1)<br />

e (1) = Ee (0)<br />

Partendo, ora, dalla prima relazione e, andando a sostituire, ogni volta, a secondo membro, la relazione<br />

successiva, si ha:<br />

e (k) = Ee (k−1) = E(Ee (k−2) ) = E 2 e (k−2) = E 2 (Ee (k−3) ) = E 3 e (k−3) = ... = E k e (0)<br />

Osserviamo che E k rappresenta la potenza k della matrice E, cioè la E · E ···E k volte.<br />

Il metodo converge se e (k) → 0 per k → ∞. Poichè l’errore iniziale è arbitrario, si ha che lim k→∞ e (k) =<br />

lim k→∞ E k e (0) = 0 se e solo se lim k→∞ E k = 0.<br />

Per il teorema sulla convergenza <strong>di</strong> matrici (si veda pag. 117), questo si ha se e solo se ρ(E) < 1. Si può<br />

dunque stabilire il seguente teorema.<br />

Teorema 8.6.1 Lo schema iterativo<br />

x (k+1) = Ex (k) + q k ≥ 0<br />

converge qualunque sia il vettore iniziale x 0 al vettore x = Ex + q = A −1 b se e solo se ρ(E) < 1.<br />

Questo risultato lo si può provare facilmente, nel caso in cui la matrice <strong>di</strong> iterazione E abbia n autovalori<br />

<strong>di</strong>stinti e, quin<strong>di</strong>, possieda n autovettori linearmente in<strong>di</strong>pendenti, per cui l’errore iniziale e (0) si può scrivere<br />

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<br />

gli autovettori associati, rispettivamente, a λ 1 , λ 2 ,...,λ n . Supponiamo che gli autovalori siano in or<strong>di</strong>ne decrescente<br />

in modulo, cioè: |λ 1 | > |λ 2 | > ... > |λ n |, per cui ρ(E) = |λ 1 |. In tal caso si può scrivere (ricordando<br />

che, se λ è un autovalore associato alla matrice A, con u un autovettore ad esso associato, si ha A k u = λ k u)<br />

e (k) = E k e (0) = E k (α 1 u (1) + α 2 u (2) + ... + α n u (n) )<br />

= α 1 E k u (1) + α 2 E k u (2) + ... + α n E k u (n)<br />

= α 1 λ k 1 u(1) + α 2 λ k 2 u(2) + ... + α n λ k n u(n)<br />

mettiamo in evidenza λ k 1<br />

(<br />

= λ k 1<br />

α 1 u (1) + α 2<br />

λ k 2<br />

λ k 1<br />

)<br />

u (2) λ k n<br />

+ ... + α n<br />

λ k u (n)<br />

1<br />

per k → ∞ si ha λk i<br />

λ k → 0 per i = 2,3,...,n<br />

1<br />

≈ λ k 1 α 1u (1)<br />

Perciò lim k→∞ e (k) = lim k→∞ λ k 1 α 1u (1) = 0 se e solo se λ k 1 → 0 e questo si ha se e solo se |λ 1| < 1. Ma |λ 1 | = ρ(E):<br />

ritroviamo il risultato visto prima.<br />

8.6.2 Controllo della convergenza<br />

Oltre a sapere che lo schema iterativo converge, è importante conoscere quanto velocemente lo schema<br />

converge. A tal proposito osserviamo che, in con<strong>di</strong>zioni asintotiche (per k → +∞) vale il seguente risultato 2<br />

‖e (k) ‖ ≈ ρ(E) k ‖e (0) ‖ (8.1)<br />

2 Questa relazione vale anche per matrici con autovalori non <strong>di</strong>stinti tra loro.<br />

119


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Scrivendo l’equazione (8.1) per l’iterazione k − 1 e facendo il rapporto tra le norme <strong>degli</strong> errori a due passi<br />

successivi si ha:<br />

‖e (k) ‖<br />

‖e (k−1) ‖ ≈ ρ(E)<br />

Ricaviamo, quin<strong>di</strong>, che il metodo iterativo ha convergenza lineare con costante asintotica uguale al raggio<br />

spettrale della matrice <strong>di</strong> iterazione.<br />

La relazione appena trovata è utile per stabilire quanto veloce è il metodo iterativo per approssimare la<br />

soluzione del sistema con una certa accuratezza. Ad esempio, vogliamo stabilire a priori quante iterazioni<br />

occorrono per ridurre la norma dell’errore iniziale <strong>di</strong> un certo fattore, ad esempio 10 (il che vuol <strong>di</strong>re ridurre<br />

l’errore <strong>di</strong> un or<strong>di</strong>ne <strong>di</strong> grandezza). Vogliamo dunque capire quale deve essere il valore <strong>di</strong> k per cui ‖e (k) ‖ =<br />

‖e (0) ‖<br />

10 . Ma ‖e(k) ‖ ≈ ρ(E) k ‖e (0) ‖ da cui<br />

ρ(E) k ‖e (0) ‖ ≈ ‖e(0) ‖<br />

10 =⇒ ρ(E)k ≈ 1<br />

10<br />

Applicando il logaritmo in base 10 ad ambo i membri si ha<br />

1<br />

k log 10 (ρ(E)) ≈ −1 =⇒ k ≈ −<br />

log 10 (ρ(E))<br />

Velocità<br />

asintotica <strong>di</strong><br />

convergenza<br />

cioè occorrono k iterazioni con k dato dal più piccolo intero che sod<strong>di</strong>sfa la relazione appena scritta. Meno<br />

iterazioni occorrono fare, più veloce è il metodo.<br />

Si definisce perciò velocità asintotica <strong>di</strong> convergenza<br />

R = −log 10 (ρ(E)) = −log 10 (ρ(E k ))<br />

k<br />

Osserviamo che, essendo ρ(E) < 1, nelle ipotesi in cui il metodo converge, log 10 (ρ(E)) < 0 e, <strong>di</strong> conseguenza,<br />

R > 0. Se vogliamo ridurre l’errore iniziale <strong>di</strong> una certa quantità ɛ, rifacendo i conti come prima, da una parte<br />

vogliamo che sia ‖e (k) ‖ ≤ ɛ‖e (0) ‖, dall’altra sappiamo che ‖e (k) ‖ ≈ ρ(E) k ‖e (0) ‖. Uguagliando i termini abbiamo<br />

ρ(E) k ‖e (0) ‖ ≤ ɛ‖e (0) ‖ =⇒ ρ(E) k ≤ ɛ<br />

Passando ai logaritmi (<strong>di</strong> quantità minori <strong>di</strong> uno) si ha<br />

k log 10 (ρ(E)) ≤ log 10 (ɛ) =⇒ −k log 10 (ρ(E)) ≥ −log 10 (ɛ) =⇒ k ≥ −log 10 (ɛ)<br />

R<br />

Troviamo in questo modo quante iterazioni (il primo intero k che verifica la relazione precedente) occorre<br />

fare per poter ridurre l’errore iniziale <strong>di</strong> ɛ.<br />

Se si traccia un grafico semilogaritmico del profilo <strong>di</strong> convergenza dello schema iterativo, ponendo sull’asse<br />

delle ascisse il numero delle iterazioni e sull’asse delle or<strong>di</strong>nate la norma dell’errore, si può vedere che<br />

la velocità asintotica <strong>di</strong> convergenza è legata alla pendenza della retta. Infatti, riconducendoci, per semplicità,<br />

al caso in cui la matrice <strong>di</strong> iterazione abbia n autovalori <strong>di</strong>stinti tra loro e or<strong>di</strong>nati in senso crescente, dalla<br />

relazione (vista a pag. 119)<br />

e (k) ≈ λ k 1 α 1u (1)<br />

passando alle norme e ai logaritmi in base 10 si ha<br />

log 10 ‖e (k) ‖ ≈ k log 10 |λ 1 | + costante<br />

La pendenza del grafico è l’opposto della velocità asintotica <strong>di</strong> convergenza R.<br />

Nel caso in cui non è nota la soluzione esatta x, poichè ‖e (k) ‖ ≈ ‖x (k) − x (k−1) ‖ = ‖d (k) ‖ (valgono le stesse<br />

considerazioni viste per gli schemi iterativi per funzioni non lineari a pag. 52), ritroviamo lo stesso risultato<br />

sul profilo <strong>di</strong> convergenza semilogaritmico in cui si pone sull’asse delle ascisse il numero delle iterazioni e<br />

sull’asse delle or<strong>di</strong>nate la norma <strong>degli</strong> scarti.<br />

120


8.6. Meto<strong>di</strong> classici<br />

Figura 8.3: La matrice A come somma delle matrici L, D e U .<br />

8.6.3 I meto<strong>di</strong><br />

Si scriva la matrice A come somma della matrice che ha i soli elementi <strong>di</strong>agonali <strong>di</strong> A (che chiamiamo<br />

D), della matrice costituita dai soli elementi della parte triangolare bassa <strong>di</strong> A (che chiamiamo L) e dai soli<br />

elementi della parte triangolare alta <strong>di</strong> A (che denotiamo con U ),<br />

A = L + D +U<br />

In questo modo è facile ricavare i meto<strong>di</strong> iterativi <strong>di</strong> Jacobi, Gauss-Seidel e <strong>di</strong> rilassamento, che sono i meto<strong>di</strong><br />

iterativi classici per la soluzione <strong>di</strong> sistemi lineari.<br />

L’ipotesi da fare è che A abbia elementi <strong>di</strong>agonali <strong>di</strong>versi da zero (a i i ≠ 0 per i = 1,2,...,n,n, da cui la<br />

matrice <strong>di</strong>agonale D è invertibile).<br />

Se la matrice A è simmetrica, definita positiva, necessariamente a i i ≠ 0. Altrimenti, poichè A è non singolare<br />

(se così non fosse non potremmo risolvere il sistema), le equazioni del sistema possono essere rior<strong>di</strong>nate<br />

in modo da avere la matrice risultante con elementi <strong>di</strong>agonali <strong>di</strong>versi da zero.<br />

Il metodo <strong>di</strong> Jacobi<br />

Il metodo <strong>di</strong> Jacobi 3 (o <strong>degli</strong> spostamenti simultanei - o rilassamento simultaneo) si ha ponendo M = D<br />

da cui la matrice <strong>di</strong> iterazione <strong>di</strong>venta E J = I − D −1 A = I − D −1 (L + D +U ) = −D −1 (L +U ).<br />

Scrivendo lo schema iterativo per Jacobi, si ha, in forma matriciale:<br />

x (k+1) = E J x (k) + D −1 b<br />

x (k+1) = −D −1 (L +U )x (k) + D −1 b<br />

Per ricavare questo schema, si può partire dal sistema lineare Ax = b e scrivere la matrice A come L+D+U .<br />

Si ha<br />

(L + D +U )x = b<br />

si porta a secondo membro (L +U )x<br />

Dx = −(L +U )x + b<br />

si moltiplicano ambo i membri per l’inversa della matrice D<br />

x = −D −1 (L +U )x + D −1 b<br />

si innesca il metodo iterativo considerando il vettore x a primo membro dell’equazione<br />

all’iterazione k + 1 e quello a destra all’iterazione k<br />

x (k+1) = −D −1 (L +U )x (k) + D −1 b<br />

3 Carl Gustav Jacob Jacobi (1804-1851) fu un grande matematico tedesco. Tra i suoi numerosi stu<strong>di</strong> ricor<strong>di</strong>amo quelli sulle funzioni<br />

ellittiche, sulla teoria dei numeri e sulla meccanica celeste.<br />

121


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

Componente per componente, il metodo <strong>di</strong> Jacobi si scrive, per i = 1,2,...,n, come<br />

⎡<br />

⎤<br />

x (k+1)<br />

i<br />

=<br />

(D −1 ) i i<br />

1<br />

a i i<br />

⇑<br />

o, equivalentemente,<br />

⎢<br />

⎣ b i −<br />

((L+U )x (k) ) i<br />

n∑<br />

j =1,j ≠i<br />

⇑<br />

a i j x (k)<br />

⎥<br />

j ⎦<br />

x (k+1)<br />

i<br />

=<br />

(D −1 ) i i<br />

1<br />

a i i<br />

⇑<br />

⎡<br />

⎢<br />

⎣ b i −<br />

(Lx (k) ) i<br />

i−1<br />

∑<br />

j =1<br />

a i j x (k)<br />

j<br />

⇑<br />

−<br />

n∑<br />

(U x (k) ) i<br />

j =i+1<br />

⇑<br />

⎤<br />

a i j x (k)<br />

⎥<br />

j ⎦<br />

per i = 1,...,n<br />

La formula la si può ricavare <strong>di</strong>rettamente, scrivendo, equazione per equazione, il sistema da risolvere<br />

Ax = b:<br />

a 11 x 1 + a 12 x 2 + a 13 x 3 + ... + a 1n x n = b 1<br />

a 21 x 1 + a 22 x 2 + a 23 x 3 + ... + a 2n x n = b 2<br />

. = . . .<br />

a i 1 x 1 + a i 2 x 2 + a i 3 x 3 + ... + a i n x n = b i<br />

. = . . .<br />

a n1 x 1 + a n2 x 2 + a n3 x 3 + ... + a nn x n = b n<br />

Dalla prima equazione “isoliamo” la prima incognita rispetto a tutte le altre; dalla seconda equazione<br />

“isoliamo” la seconda incognita e così via per le altre equazioni, ottenendo:<br />

a 11 x 1 = b 1 − (a 12 x 2 + a 13 x 3 + ... + a 1n x n )<br />

a 22 x 2 = b 2 − (a 21 x 1 + a 23 x 3 + ... + a 2n x n )<br />

. =<br />

.<br />

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 )<br />

. =<br />

.<br />

a nn x n = b n − (a n1 x 1 + a n2 x 2 + a n3 x 3 + ... + a nn−1 x n−1 )<br />

Dividendo l’i -sima equazione per il coefficiente a i i , per i = 1,2,...,n, ricaviamo<br />

122<br />

x 1 = 1<br />

a 11<br />

[b 1 − (a 12 x 2 + a 13 x 3 + ... + a 1n x n )]<br />

x 2 = 1<br />

a 22<br />

[b 2 − (a 21 x 1 + a 23 x 3 + ... + a 2n x n )]<br />

. =<br />

.<br />

x i = 1<br />

a i i<br />

[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 )]<br />

. =<br />

.<br />

x n = 1<br />

a nn<br />

[b n − (a n1 x 1 + a n2 x 2 + a n3 x 3 + ... + a nn−1 x n−1 )]


8.6. Meto<strong>di</strong> classici<br />

Se pensiamo <strong>di</strong> partire da un vettore inziale x (0) , il vettore x (1) si ottiene dalle equazioni precedenti, ponendo<br />

a secondo membro <strong>di</strong> ciascuna equazione le componenti del vettore x (0) . Si ricava, in tal modo, la<br />

formula ricorsiva dello schema <strong>di</strong> Jacobi:<br />

x (k+1)<br />

1<br />

= 1 [ (<br />

)]<br />

b 1 − a 12 x (k)<br />

2<br />

+ a 13 x (k)<br />

3<br />

+ ... + a 1n x n<br />

(k)<br />

a 11<br />

)]<br />

x (k+1)<br />

2<br />

= 1<br />

a 22<br />

[<br />

b 2 −<br />

. =<br />

x (k+1)<br />

i<br />

= 1<br />

a i i<br />

[<br />

b i −<br />

. =<br />

x (k+1)<br />

n = 1<br />

a nn<br />

[<br />

b n −<br />

(<br />

a 21 x (k)<br />

1<br />

+ a 23 x (k)<br />

3<br />

+ ... + a 2n x n<br />

(k)<br />

.<br />

(<br />

a i 1 x (k)<br />

1<br />

+ a i 2 x (k)<br />

2<br />

+ ... + a i i−1 x (k)<br />

i−1 + a i i+1x (k)<br />

i+1 + ... + a i n x n<br />

(k)<br />

.<br />

(<br />

a n1 x (k)<br />

1<br />

+ a n2 x (k)<br />

2<br />

+ a n3 x (k)<br />

3<br />

+ ... + a nn−1 x (k)<br />

n−1<br />

Ritroviamo, dunque, la formula scritta prima in forma compatta.<br />

La formula in funzione del residuo r (k) = b − Ax (k) è data invece da x (k+1) = x (k) + D −1 r (k) .<br />

)]<br />

)]<br />

Il Metodo <strong>di</strong> Gauss-Seidel<br />

Nell’algoritmo <strong>di</strong> Gauss-Seidel 4 si pone M = D + L ottenendo la matrice E S = I − (D + L) −1 A = I − (D +<br />

L) −1 (L + D +U ) = −(D + L) −1 U . Lo schema iterativo è:<br />

x (k+1) = E S x (k) + (D + L) −1 b<br />

Lo schema <strong>di</strong> Gauss-Seidel si può ricavare a partire dal sistema lineare Ax = b nel modo seguente:<br />

Ax = b<br />

(L + D +U )x = b<br />

si porta a secondo membro U x<br />

(D + L)x = −U x + b<br />

si moltiplicano ambo i membri per l’inversa della matrice (D + L)<br />

x = −(D + L) −1 U x + (D + L) −1 b<br />

si innesca il metodo iterativo considerando il vettore x a primo membro dell’equazione<br />

all’iterazione k + 1 e quello a destra all’iterazione k<br />

x (k+1) = −(D + L) −1 U x (k) + (D + L) −1 b<br />

Moltiplicando ambo i membri per (D + L) si ha<br />

da cui<br />

(D + L)x (k+1) = b −U x (k)<br />

Dx (k+1) = b − Lx (k+1) −U x (k)<br />

x (k+1) = D −1 ( b − Lx (k+1) −U x (k))<br />

Componente per componente si ha<br />

4 Philipp Ludwig von Seidel (1821-1896) fu un matematico tedesco. Il suo lavoro più importante riguarda le aberrazioni ottiche.<br />

123


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

[<br />

x (k+1) = 1<br />

i<br />

a i i<br />

i−1 ∑<br />

b i −<br />

j =1<br />

a i j x (k+1)<br />

j<br />

−<br />

n∑<br />

j =i+1<br />

a i j x (k)<br />

j<br />

]<br />

per i = 1,...,n<br />

Il metodo è detto anche <strong>degli</strong> spostamenti successivi, in quanto il calcolo delle componenti del vettore<br />

x (k+1) è fatto utilizzando le componenti già calcolate del vettore stesso. Infatti, per i > 1, è ragionevole pensare<br />

che i valori già calcolati x (k+1)<br />

1<br />

, x (k+1)<br />

2<br />

,..., x (k+1) possano essere utilizzati per dare una migliore approssimazione<br />

del valore x (k+1) . Dalle equazioni del sistema, ragionando come per il metodo <strong>di</strong> Jacobi, possiamo quin<strong>di</strong><br />

i−1<br />

i<br />

scrivere:<br />

(<br />

)<br />

a 11 x (k+1)<br />

1<br />

= b 1 − a 12 x (k)<br />

2<br />

+ a 13 x (k)<br />

3<br />

+ ... + a 1n x n<br />

(k)<br />

(<br />

)<br />

a 22 x (k+1)<br />

2<br />

= b 2 − a 21 x (k+1)<br />

1<br />

+ a 23 x (k)<br />

3<br />

+ ... + a 2n x n<br />

(k)<br />

. =<br />

a i i x (k+1) = b<br />

i<br />

i −<br />

. =<br />

a nn x n<br />

(k+1) = b n −<br />

.<br />

(<br />

a i 1 x (k+1)<br />

1<br />

+ a i 2 x (k+1)<br />

.<br />

2<br />

+ ... + a i i−1 x (k+1)<br />

i−1<br />

)<br />

+ a i i+1 x (k)<br />

i+1 + ... + a i n x n<br />

(k)<br />

(<br />

a n1 x (k+1)<br />

1<br />

+ a n2 x (k+1)<br />

2<br />

+ a n3 x (k+1)<br />

3<br />

+ ... + a nn−1 x (k+1)<br />

n−1<br />

Dividendo ambo i membri dell’equazione i -sima per a i i (per i = 1,2,...,n) si ha:<br />

x (k+1)<br />

1<br />

= 1 [ (<br />

)]<br />

b 1 − a 12 x (k)<br />

2<br />

+ a 13 x (k)<br />

3<br />

+ ... + a 1n x n<br />

(k)<br />

a 11<br />

x (k+1)<br />

2<br />

= 1<br />

a 22<br />

[<br />

b 2 −<br />

. =<br />

x (k+1)<br />

i<br />

= 1<br />

a i i<br />

[<br />

b i −<br />

. =<br />

x (k+1)<br />

n = 1<br />

a nn<br />

[<br />

b n −<br />

(<br />

a 21 x (k+1)<br />

1<br />

+ a 23 x (k)<br />

3<br />

+ ... + a 2n x n<br />

(k)<br />

.<br />

(<br />

a i 1 x (k+1)<br />

1<br />

+ a i 2 x (k+1)<br />

.<br />

)]<br />

2<br />

+ ... a i i−1 x (k+1)<br />

i−1<br />

)]<br />

+ a i i+1 x (k)<br />

i+1 + ... + a i n x n<br />

(k)<br />

(<br />

a n1 x (k+1)<br />

1<br />

+ a n2 x (k+1)<br />

2<br />

+ a n3 x (k+1)<br />

3<br />

+ ... + a nn−1 x (k+1)<br />

n−1<br />

Usando il residuo, lo schema <strong>di</strong> Gauss-Seidel si scrive come<br />

x (k+1) = x (k) + (D + L) −1 r (k)<br />

)<br />

)]<br />

Il metodo <strong>di</strong> rilassamento<br />

Ciascuno dei meto<strong>di</strong> <strong>di</strong> Jacobi e Gauss-Seidel può essere anche rilassato tramite un fattore ω in modo che<br />

la nuova approssimazione x (k+1) sia ottenuta come una combinazione <strong>di</strong> x (k+1) e x (k) me<strong>di</strong>ante il fattore ω. In<br />

pratica:<br />

x (k+1) ←− (1 − ω)x (k) + ωx (k+1)<br />

Questa operazione viene fatta <strong>di</strong>rettamente nel momento in cui si stabilisce il metodo iterativo con<br />

rilassamento.<br />

Si può osservare che il metodo <strong>di</strong> Jacobi rilassato non produce effettivi miglioramenti rispetto al metodo<br />

non rilassato. Invece, il metodo <strong>di</strong> Gauss-Seidel rilassato può produrre un metodo molto più veloce in termini<br />

124


8.6. Meto<strong>di</strong> classici<br />

<strong>di</strong> convergenza e, quin<strong>di</strong>, preferibile rispetto al metodo senza rilassamento. Come metodo <strong>di</strong> rilassamento,<br />

dunque, consideriamo il metodo <strong>di</strong> rilassamento ottenuto da Gauss-Seidel. Per scelte <strong>di</strong> ω nell’intervallo<br />

]0,1[ si parla <strong>di</strong> metodo Sotto-Rilassato, o Under-Relaxation (e in genere è usato per ottenere convergenza<br />

nella soluzione <strong>di</strong> sistemi che non convergono con il metodo <strong>di</strong> Gauss-Seidel). Per valori <strong>di</strong> ω nell’intervallo<br />

[1,2[ si ha, invece, il metodo noto come metodo <strong>di</strong> sovra-rilassamento o SOR (Successive Over-Relaxation) –<br />

usato per accelerare la convergenza in sistemi che sono convergenti con il metodo <strong>di</strong> Gauss-Seidel.<br />

Lo schema <strong>di</strong> rilassamento, applicato al metodo <strong>di</strong> Gauss-Seidel, è dato da<br />

x (k+1) = (1 − ω)x (k)<br />

i<br />

+ ω i−1 ∑<br />

[b<br />

i i −<br />

a i i<br />

j =1<br />

a i j x (k+1)<br />

j<br />

−<br />

n∑<br />

j =i+1<br />

a i j x (k)<br />

j<br />

]<br />

per i = 1,...,n<br />

La matrice <strong>di</strong> iterazione del metodo <strong>di</strong> rilassamento si ricava scrivendo in forma matriciale l’algoritmo<br />

appena descritto<br />

x (k+1) = (1 − ω)x (k) + ωD −1 ( b − Lx (k+1) −U x (k))<br />

x (k+1) = [ (1 − ω)I − ωD −1 U ] x (k) − ωD −1 Lx (k+1) + ωD −1 b<br />

(I + ωD −1 L)x (k+1) = [ (1 − ω)I − ωD −1 U ] x (k) + ωD −1 b<br />

Moltiplicando ambo i membri per D, si ricava<br />

La matrice <strong>di</strong> iterazione del metodo è dunque<br />

E = (D + ωL) −1 [(1 − ω)D − ωU ]<br />

= (D + ωL) −1 [(1 − ω)D − ω(A − D − L)]<br />

= (D + ωL) −1 [(D + ωL) − ωA]<br />

= [ I − ω(D + ωL) −1 A ]<br />

(D + ωL)x (k+1) = [(1 − ω)D − ωU ] x (k) + ωb<br />

A questo punto, ci si può chiedere quale sia l’ω ottimale nel metodo <strong>di</strong> rilassamento. L’ω ottimale è quello<br />

che fa sì che il metodo <strong>di</strong> rilassamento converga nel minor numero <strong>di</strong> iterazioni (quin<strong>di</strong>, l’ω ottimale rende<br />

minimo il raggio spettrale della matrice <strong>di</strong> iterazione). Vedremo, per particolari matrici A, quando è possibile<br />

stabilire a priori quale sia l’ω ottimale per risolvere il sistema lineare Ax = b.<br />

8.6.4 Convergenza dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamento<br />

Le matrici <strong>di</strong> iterazione dei tre meto<strong>di</strong> appena descritti sono scritte in Tabella 8.6.4 Perchè ci sia<br />

metodo matrice<br />

Jacobi E J = I − D −1 A = −D −1 (L +U )<br />

Gauss-Seidel E S = I − (D + L) −1 A = −(D + L) −1 U<br />

rilassamento E ω = I − ω(D + ωL) −1 A<br />

Tabella 8.1: Matrici <strong>di</strong> iterazione dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamento<br />

convergenza, il raggio spettrale della matrice <strong>di</strong> iterazione deve essere minore <strong>di</strong> uno.<br />

Per i meto<strong>di</strong> <strong>di</strong> Jacobi e <strong>di</strong> Gauss-Seidel si può provare la convergenza del metodo, se la matrice A ha una<br />

delle seguenti caratteristiche:<br />

G A è <strong>di</strong>agonalmente dominante in senso stretto<br />

125


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

G A è a <strong>di</strong>agonalmente dominante (per righe o per colonne) ed è irriducibile 5 .<br />

Si ha inoltre, questo risultato:<br />

G se A è simmetrica non singolare con elementi principali reali e positivi, allora il metodo <strong>di</strong> Gauss-Seidel<br />

è convergente se e solo se A è definita positiva.<br />

Per quanto riguarda il metodo <strong>di</strong> rilassamento, con<strong>di</strong>zione necessaria per la convergenza è |ω − 1| < 1, cioè<br />

ω deve appartenere all’intervallo [0,2] ( per 0 < ω < 1 si ha sotto-rilassamento e per 1 ≤ ω < 2 si ha sovrarilassamento).<br />

Difatti il determinante della matrice <strong>di</strong> iterazione del metodo <strong>di</strong> rilassamento vale 6 detE ω = (1 − ω) n e,<br />

poichè il prodotto <strong>degli</strong> autovalori <strong>di</strong> una matrice è uguale al determinante della matrice stessa, segue 7 la<br />

relazione ρ(E ω ) ≥ |1 − ω|. Quin<strong>di</strong>, se |1 − ω| > 1, sicuramente il metodo <strong>di</strong> rilassamento non convergerà.<br />

Perciò, con<strong>di</strong>zione necessaria per la convergenza è |1 − ω| < 1.<br />

Si ha questo importante teorema.<br />

Teorema 8.6.2 (Ostrowski-Reich) Se A è definita positiva e ω è un numero reale nell’intervallo ]0,2[, allora il<br />

metodo <strong>di</strong> rilassamento è convergente.<br />

G La convergenza del metodo <strong>di</strong> rilassamento si ha, inoltre, per A simmetrica con elementi <strong>di</strong>agonali<br />

positivi ed elementi extra-<strong>di</strong>agonali negativi o nulli, se e solo se A è definita positiva.<br />

Un altro interessante teorema mette in relazione il metodo <strong>di</strong> rilassamento con i meto<strong>di</strong> <strong>di</strong> Jacobi e <strong>di</strong> Gauss-<br />

Seidel, sia per quanto riguarda la convergenza, sia per quanto riguarda il valore ottimale del parametro ω, in<br />

corrispondenza <strong>di</strong> matrici A che godono della cosidetta proprietà A e che siano coerentemente or<strong>di</strong>nate.<br />

Definizione 8.6.1 Una matrice A, <strong>di</strong> <strong>di</strong>mensione n, si <strong>di</strong>ce che ha proprietà A se esiste una matrice <strong>di</strong><br />

permutazione P tale che la matrice PAP T abbia la forma<br />

( )<br />

PAP T D1 A 1<br />

=<br />

A 2 D 2<br />

dove D 1 e D 2 sono matrici <strong>di</strong>agonali.<br />

Una matrice con proprietà A si <strong>di</strong>ce biciclica.<br />

Equivalentemente, una matrice A, <strong>di</strong> <strong>di</strong>mensione n, ha proprietà A se l’insieme dei numeri naturali<br />

{1,2,...,n} può essere scomposto in due sottoinsiemi non vuoti e complementari 8 S e T in modo tale che<br />

i coefficienti non nulli a i j ≠ 0 si hanno per i = j oppure per i ∈ S e j ∈ T oppure per i ∈ T e j ∈ S.<br />

( )<br />

5 P Q<br />

cioè non può essere messa sotto la forma<br />

R<br />

6 Dalla definizione <strong>di</strong> E ω si ha detE ω = det[(D + ωL) −1 ((1 − ω)D − ωU )]. Poichè il determinante del prodotto <strong>di</strong> due matrici è uguale<br />

al prodotto dei determinanti delle matrici stesse, si ha detE ω = det[(D + ωL) −1 ]det[(1 − ω)D − ωU )] = detD −1 (1 − ω) n detD. Si arriva<br />

a questo risultato, tenendo presente il fatto che il determinante <strong>di</strong> una matrice triangolare è uguale al prodotto <strong>degli</strong> elementi della<br />

<strong>di</strong>agonale principale.<br />

7 Infatti, considerando λ i autovalore della matrice E ω , per i = 1,2,...,n e ρ(E ω ) il raggio spettrale, si ha detE ω = ∏ n<br />

i=1 λ i ≤<br />

∏ n<br />

i=1 ρ(E ω) = ρ(E ω ) n da cui segue (1 − ω) n ≤ ρ(E ω ) n , cioè ρ(E ω ) ≥ |1 − ω|.<br />

8 Due insiemi S e T non vuoti si <strong>di</strong>cono complementari <strong>di</strong> V = {1,2,...,n} se S ≠ , T ≠ , S ∪ T = V e, inoltre, se i ∈ S,i ∉ T e,<br />

viceversa, se j ∈ T, j ∉ S<br />

126


8.6. Meto<strong>di</strong> classici<br />

Esempio<br />

Esempio 8.6.1 La matrice tri<strong>di</strong>agonale<br />

⎛<br />

⎞<br />

2 −1 0 0<br />

A = ⎜−1 2 −1 0<br />

⎟<br />

⎝ 0 −1 2 −1⎠<br />

0 0 −1 2<br />

ha proprietà A (o è biciclica): permutando la prima e quarta riga e la prima e quarta colonna, me<strong>di</strong>ante<br />

⎛<br />

⎞<br />

0 0 0 1<br />

la matrice <strong>di</strong> permutazione P = ⎜0 1 0 0<br />

⎟<br />

⎝0 0 1 0⎠ si ha<br />

1 0 0 0<br />

⎛<br />

⎞<br />

2 0 −1 0<br />

( )<br />

PAP T = ⎜ 0 2 −1 −1<br />

⎟<br />

2 0<br />

⎝−1 −1 2 0 ⎠ =⇒ D 1 = D 2 =<br />

0 2<br />

0 −1 0 2<br />

Possiamo scegliere S = {1,3} e T = {2,4}.<br />

Definizione 8.6.2 Una matrice si <strong>di</strong>ce coerentemente or<strong>di</strong>nata in relazione ad un vettore <strong>di</strong> or<strong>di</strong>namento q, <strong>di</strong><br />

lunghezza n, se per ogni coefficiente a i j non nullo, con i ≠ j , si verifica:<br />

G se j > i allora q j − q i = 1<br />

G se j < i allora q j − q i = −1<br />

Un’altra definizione <strong>di</strong> matrice con coerente or<strong>di</strong>namento considera la matrice A data non dalla scomposizione<br />

A = L + D +U che abbiamo visto fino ad ora ma come A = D(L A + I +U A ), (osserviamo che, rispetto<br />

alla prima scomposizione, abbiamo messo in evidenza la matrice <strong>di</strong>agonale D e quin<strong>di</strong> le matrici triangolari<br />

superiore e inferiore sono L A = D −1 L e U A = D −1 U ). Sia D non singolare. Allora la matrice A è detta<br />

coerentemente or<strong>di</strong>nata se gli autovalori della matrice J(α) = αL A + α −1 U A , con α ≠ 0 sono in<strong>di</strong>pendenti dal<br />

parametro α.<br />

( )<br />

D1 A 1<br />

Le matrici con proprietà A (o bicicliche) nella forma A =<br />

(P = I nella definizione <strong>di</strong> proprietà<br />

A 2 D 2<br />

A) sono coerentemente or<strong>di</strong>nate.<br />

Le matrici tri<strong>di</strong>agonali sono un esempio <strong>di</strong> matrici bicicliche e coerentemente or<strong>di</strong>nate.<br />

Per il metodo <strong>di</strong> rilassamento si può provare il seguente risultato.<br />

Teorema 8.6.3 (Young) Se A è una matrice con proprietà A e coerente or<strong>di</strong>namento e 0 < ω < 2, allora:<br />

G se µ è autovalore della matrice <strong>di</strong> iterazione <strong>di</strong> Jacobi E J , ogni λ che verifica la relazione (λ + ω − 1) 2 =<br />

λω 2 µ 2 è autovalore <strong>di</strong> E ω ;<br />

G se λ è autovalore non nullo <strong>di</strong> E ω , allora ogni µ che verifica la relazione precedente è autovalore <strong>di</strong> E J ;<br />

G se gli autovalori <strong>di</strong> E J sono reali e il metodo <strong>di</strong> Jacobi converge (ρ(E J ) < 1), esiste uno ed uno solo ω opt<br />

che rende ottimale il metodo <strong>di</strong> rilassamento, tale cioè che ρ(ω opt ) = min 0


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI<br />

8.7 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 8.7.1<br />

⎛<br />

Sia dato<br />

⎞<br />

il sistema<br />

⎛ ⎞<br />

lineare Ax = b, dove<br />

8 2 6 30<br />

A = ⎝7 5 0⎠ b = ⎝34⎠<br />

1 0 5 7<br />

(a) Provare che gli schemi <strong>di</strong> Jacobi e <strong>di</strong> Seidel convergono e calcolare la velocità asintontica <strong>di</strong><br />

convergenza <strong>di</strong> entrambi gli schemi.<br />

(b) A partire dallo stesso vettore iniziale x (0) = (0 0 0) T , calcolare le approssimazioni x (1) e x (2) che si<br />

ottengono applicando lo schema <strong>di</strong> Jacobi e lo schema <strong>di</strong> Seidel.<br />

Svolgimento<br />

(a) La matrice A non è <strong>di</strong>agonalmente dominante nè per righe nè per colonne (vedasi la seconda riga e<br />

la terza colonna). Non possiamo usare il criterio <strong>di</strong> matrice <strong>di</strong>agonalmente dominante per provare la<br />

convergenza dei due meto<strong>di</strong>. La matrice<br />

( )<br />

A è biciclica e coerentemente or<strong>di</strong>nata (si veda lo schema a<br />

5 0<br />

croce che in<strong>di</strong>vidua D 1 = (8) e D 2 = ):<br />

0 5<br />

8 2 6<br />

7 5 0<br />

1 0 5<br />

Quin<strong>di</strong> se proviamo che lo schema <strong>di</strong> Jacobi converge, cioè che l’autovalore <strong>di</strong> massimo modulo della<br />

matrice <strong>di</strong> Jacobi è reale e in modulo minore <strong>di</strong> 1, allora, poichè per matrici bicicliche e coerentemente<br />

or<strong>di</strong>nate vale ρ(E J ) 2 = ρ(E S ), allora anche il metodo <strong>di</strong> Gauss-Seidel convergerà alla soluzione (da<br />

ρ(E J ) < 1 segue ρ(E S ) < 1). La matrice <strong>di</strong> Jacobi è E J = I − D −1 A cioè<br />

⎛<br />

0 −2/8<br />

⎞<br />

−6/8<br />

⎛<br />

0 −1/4<br />

⎞<br />

−3/4<br />

E J = ⎝−7/5 0 0 ⎠ = ⎝−7/5 0 0 ⎠<br />

−1/5 0 0 −1/5 0 0<br />

Troviamo gli autovalori della matrice E J imponendo det(E J − µI ) = 0.<br />

−µ −1/4 −3/4<br />

−7/5 −µ 0<br />

∣−1/5 0 −µ ∣ = −µ3 + 3 4 · 1<br />

5 µ + 1 4 · 7<br />

5 µ = 0<br />

Si ha: 0 = det(E J − µI ) = −µ 3 + ( 3<br />

20 + 7<br />

20 )µ,<br />

Una ra<strong>di</strong>ce è µ = 0, e le altre due sono µ = ± 1/2 = ± 0.5 = 0.707106781.<br />

Gli autovalori sono tutti reali e quello <strong>di</strong> massimo modulo è µ = 0.707106781 < 1.<br />

C’è, dunque, convergenza per i meto<strong>di</strong> <strong>di</strong> Jacobi e <strong>di</strong> Gauss-Seidel (ρ(E S ) = ρ(E J ) 2 = 0.5). Le velocità<br />

<strong>di</strong> convergenza valgono<br />

R J = −log 10 (ρ(E J )) = 0.1505149<br />

R S = −log 10 (ρ(E S )) = 0.301029995 = −log 10 (ρ(E J ) 2 ) = 2R J<br />

128


8.7. <strong>Esercizi</strong><br />

(b)<br />

Lo schema <strong>di</strong> Jacobi è:<br />

⎧<br />

x (k+1)<br />

1<br />

= 1 (30 − 2x(k)<br />

2<br />

− 6x (k)<br />

3<br />

8 )<br />

⎪⎨<br />

⎪⎩<br />

3<br />

= 1 2 1.0 1.55 0.65<br />

(7 − x(k)<br />

1<br />

5 Partendo dal vettore x (0) con componenti<br />

tutte nulle, abbiamo<br />

k x 1 (k)<br />

x 2 (k)<br />

x 3 (k)<br />

0 0 0 0<br />

1 3.75 6.8 1.4<br />

x (k+1)<br />

2<br />

= 1 (34 − 7x(k)<br />

1<br />

5 )<br />

x (k+1)<br />

Lo schema <strong>di</strong> Seidel è:<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

x (k+1)<br />

1<br />

= 1 (30 − 2x(k)<br />

2<br />

− 6x (k)<br />

3<br />

8 )<br />

x (k+1)<br />

2<br />

= 1 (34 − 7x(k+1)<br />

1<br />

)<br />

5<br />

x (k+1)<br />

3<br />

= 1 5<br />

(7 − x(k+1)<br />

1<br />

)<br />

Partendo dal vettore x (0) con componenti<br />

tutte nulle, abbiamo<br />

k x (k)<br />

1<br />

x (k)<br />

2<br />

x (k)<br />

3<br />

0 0 0 0<br />

1 3.75 1.55 0.65<br />

2 2.875 2.775 0.825<br />

<strong>Esercizi</strong>o 8.7.2 ⎛ Dato⎞il sistema Ax = b con<br />

5 0 10<br />

A = ⎝0 3 15⎠<br />

2 1 α<br />

(a) <strong>di</strong>re per quali valori <strong>di</strong> α il metodo <strong>di</strong> Jacobi converge.<br />

(b) trovare il valore <strong>di</strong> α in corrispondenza del quale il metodo SOR ha un valore <strong>di</strong> omega ottimo ω opt =<br />

3/2. Per tale valore trovare la velocità asintotica <strong>di</strong> convergenza del metodo SOR.<br />

Svolgimento<br />

(a) La matrice <strong>di</strong>pende dal parametro α quin<strong>di</strong> a priori non possiamo <strong>di</strong>re se Jacobi converge o meno.<br />

Scriviamo la matrice <strong>di</strong> iterazione del metodo <strong>di</strong> Jacobi come<br />

⎛<br />

⎞⎛<br />

⎞ ⎛<br />

⎞<br />

1/5 0 0 0 0 10 0 0 −2<br />

E J = −D −1 (L +U ) = −⎝<br />

0 1/3 0 ⎠⎝0 0 15⎠ = ⎝ 0 0 −5⎠<br />

0 0 1/α 2 1 0 −2/α −1/α 0<br />

Gli autovalori si calcolano imponendo det(E J − µI ) = 0, vale a <strong>di</strong>re<br />

−µ 0 −2<br />

0 −µ −5<br />

∣−2/α −1/α −µ ∣ = 0 vale a <strong>di</strong>re − µ3 + 9µ α = 0<br />

Ricaviamo gli autovalori µ = 0 e µ = ± 3 α<br />

.<br />

Perchè ci sia convergenza deve dunque essere 3 α<br />

< 1 ovvero 3 < α. Ricaviamo la relazione α > 9.<br />

(b) Dalla relazione dell’ω opt , ω opt =<br />

or<strong>di</strong>nata, si ha:<br />

2<br />

1 + √ , valida perchè la matrice è biciclica e coerentemente<br />

1 − ρ(E J )<br />

2<br />

2<br />

1 + 1 − 9/α = 3 2 =⇒ 1 3 = 1 − 9/α =⇒ −8<br />

9 = − 9 α =⇒ α = 81 8 = 10.125<br />

Da ω opt = 3 2 = 1.5 segue λ opt = ω opt − 1 = 0.5, da cui R = −log 10 (λ opt ) = 0.3010299957.<br />

129


CAPITOLO 9<br />

Problemi non lineari in più variabili<br />

Ho affermato che le matematiche<br />

sono molto utili per abituare la<br />

mente a un raziocinio esatto e<br />

or<strong>di</strong>nato; con ciò non è che io creda<br />

necessario che tutti gli uomini<br />

<strong>di</strong>ventino dei matematici, ma<br />

quando con questo stu<strong>di</strong>o hanno<br />

acquisito il buon metodo <strong>di</strong><br />

ragionare, essi lo possono usare in<br />

tutte le altri parti delle nostre<br />

conoscenze.<br />

John Locke<br />

9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131<br />

9.2 Metodo <strong>di</strong> Newton per sistemi <strong>di</strong> equazioni in più variabili . . . . . . . . . . . . . . . . . . . . . . . 132<br />

9.3 Minimi quadrati non lineari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135<br />

9.1 Introduzione<br />

Diversi problemi che si incontrano nei più svariati campi dell’ingegneria sono molto più complicati <strong>degli</strong><br />

argomenti trattati fino ad ora. In questo capitolo cercheremo <strong>di</strong> utlizzare le conoscenze già fatte e <strong>di</strong> allargarle<br />

per risolvere questo tipo <strong>di</strong> problemi.<br />

G In ingegneria chimica, l’analisi dei processi chimici <strong>di</strong> separazione, <strong>di</strong> miscelazione e dei reattori chimici<br />

(un esempio: la cattura <strong>di</strong> anidride carbonica con l’utilizzo <strong>di</strong> sorbenti soli<strong>di</strong> in un reattore <strong>di</strong> assorbimento)<br />

si basa sulle equazioni <strong>di</strong> bilancio <strong>di</strong> materia e <strong>di</strong> energia totale, cioè la somma dell’energia<br />

interna e dell’energia meccanica. Da un punto <strong>di</strong> vista matematico, questi bilanci sono rappresentati<br />

da un sistema <strong>di</strong> equazioni alle derivate or<strong>di</strong>narie, in cui la variabile in<strong>di</strong>pendente è data dal tempo. In<br />

con<strong>di</strong>zioni <strong>di</strong> stazionarietà (eliminando quin<strong>di</strong> la <strong>di</strong>pendenza dal tempo), queste equazioni <strong>di</strong>ventano<br />

un sistema algebrico <strong>di</strong> equazioni non lineari in più variabili. Come risolverlo Una strada è utilizzare<br />

il metodo <strong>di</strong> Newton per sistemi <strong>di</strong> più variabili. Ed è quello che faremo noi!<br />

G In ingegneria aerospaziale, un problema molto attuale è legato alla misura della posizione <strong>di</strong> un punto<br />

rispetto a un sistema <strong>di</strong> riferimento implicitamente definito dalle coor<strong>di</strong>nate <strong>di</strong> un certo numero n <strong>di</strong><br />

punti noti (pensiamo al sistema GPS, basato su un certo numero <strong>di</strong> satelliti, per poter determinare la<br />

posizione <strong>di</strong> un punto). Una tecnica utilizzata in questo ambiti è data dall’intersezione inversa e dai<br />

minimi quadrati, che vengono applicati me<strong>di</strong>ante una linearizzazione, come vedremo nel seguito.<br />

Ve<strong>di</strong>amo, dunque, che si tratta <strong>di</strong> allargare il campo delle conoscenze già fatte:<br />

131


9. PROBLEMI NON LINEARI IN PIÙ VARIABILI<br />

G come usare il metodo <strong>di</strong> Newton-Raphson stu<strong>di</strong>ato per trovare gli zeri <strong>di</strong> una funzione se ora abbiamo<br />

più funzioni e queste <strong>di</strong>pendono da più variabili<br />

G come applicare la tecnica <strong>di</strong> approssimazione ai minimi quadrati su un problema più complicato della<br />

retta <strong>di</strong> approssimazione, che abbiamo già visto<br />

In questo capitolo, cercheremo <strong>di</strong> rispondere a queste due domande.<br />

9.2 Metodo <strong>di</strong> Newton per sistemi <strong>di</strong> equazioni in più variabili<br />

Consideriamo, per semplicità, un sistema <strong>di</strong> due equazioni in due incognite<br />

{<br />

f1 (x 1 , x 2 ) = 0<br />

f 2 (x 1 , x 2 ) = 0<br />

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 .<br />

Esempio<br />

Esempio 9.2.1 Consideriamo il sistema <strong>di</strong> equazioni in cui f 1 (x 1 , x 2 ) = 9x1 2 + 4x2 2 − 36 e f 2(x 1 , x 2 ) = x1 2 −<br />

x 2 − 1. L’equazione f 1 (x 1 , x 2 ) = 0 rappresenta l’equazione <strong>di</strong> un’ellisse, mentre l’equazione f 2 (x 1 , x 2 ) =<br />

0 descrive la parabola x 2 = x1 2 − 1 Dalla figura 9.1, si vede come la parabola e l’ellisse si intersecano<br />

in due punti, ξ 1 e ξ 2 <strong>di</strong> coor<strong>di</strong>nate date, in maniera approssimata, dai valori ξ 1 ≈ (1.65,1.71) e ξ 2 ≈<br />

(−1.65,1.71). D’altra parte, abbiamo scelto questo esempio, perchè non è <strong>di</strong>fficile trovare in maniera<br />

analitica le ra<strong>di</strong>ci del sistema<br />

{<br />

9x<br />

2<br />

1<br />

+ 4x2 2 − 36 = 0<br />

x 2 1 − x 2 − 1 = 0<br />

Basta scrivere x 2 in funzione <strong>di</strong> x 1 nella seconda<br />

√<br />

equazione e sostituire nella prima. Si ricava facilmente<br />

−1 + 513<br />

che le soluzioni reali per x 1 sono date da x 1 = ±<br />

= ±1.64504951695277, da cui x 2 = x1 2 8<br />

− 1 =<br />

1.70618791322653. Le ra<strong>di</strong>ci del sistema corrispondono ai punti <strong>di</strong> intersezione delle due curve. Non<br />

sempre, però, si riesce a trovare una soluzione analitica! Ed è per questo che ci serve un metodo per<br />

trovarle numericamente.<br />

Ve<strong>di</strong>amo, quin<strong>di</strong>, come possiamo generalizzare il metodo <strong>di</strong> Newton-Raphson. Nel seguito assumiamo<br />

che la funzione vettoriale f ammetta derivate parziali e che siano limitate almeno fino all’or<strong>di</strong>ne due 1 .<br />

Seguendo una strada del tutto analoga a quella percorsa per il metodo <strong>di</strong> Newton-Raphson per trovare le<br />

ra<strong>di</strong>ci <strong>di</strong> un’equazione (in una sola variabile), e come abbiamo fatto per i meto<strong>di</strong> iterativi per sistemi lineari,<br />

cercheremo <strong>di</strong> costruire un metodo iterativo che, partendo da un vettore iniziale x (0) generi una successione<br />

<strong>di</strong> vettori x (k) che converga alla soluzione x ∗ del nostro problema, che sod<strong>di</strong>sfa, cioè, la relazione f(x ∗ ) =<br />

0. Il caso che stiamo stu<strong>di</strong>ando, per semplicità, ha <strong>di</strong>mensione 2 (la funzione vettoriale e i vettori sono <strong>di</strong><br />

<strong>di</strong>mensione 2), ma il <strong>di</strong>scorso vale anche per problemi non lineari <strong>di</strong> <strong>di</strong>mensione maggiore.<br />

Quando abbiamo ricavato lo schema <strong>di</strong> Newton-Raphson per funzioni scalari, abbiamo utilizzato la formula<br />

<strong>di</strong> Taylor. Ci serve, allora, l’analoga formula per funzioni vettoriali (ci limitiamo a considerare la formula<br />

per il caso particolare che stiamo esaminando).<br />

1 Ricor<strong>di</strong>amo che, data una funzione <strong>di</strong> due variabili f (x 1 , x 2 ) la derivata parziale <strong>di</strong> f rispetto alla variabile x 1 in un punto (x<br />

1 ∗, x∗ 2 ),<br />

che denotiamo come ∂f (x∗ 1 , x∗ 2 )<br />

, altro non è che la derivata della funzione g (x 1 ) = f (x 1 , x<br />

∂x 2 ∗) nel punto x∗ 1<br />

(consideriamo fissata la<br />

1<br />

variabile x 2 = x<br />

2 ∗ e facciamo variare solo la x 1). Allo stesso modo la derivata parziale della f rispetto alla variabile x 2 nel punto (x<br />

1 ∗, x∗ 2 ),<br />

che chiamiamo ∂f (x∗ 1 , x∗ 2 )<br />

, è la derivata della funzione h(x 2 ) = f (x<br />

∂x 1 ∗, x 2) nel punto x<br />

2 ∗ . Nel caso <strong>di</strong> una funzione vettoriale come f =<br />

2<br />

(f 1 , f 2 ) l’ipotesi che chie<strong>di</strong>amo sia sod<strong>di</strong>sfatta è che ciascuna delle funzioni <strong>di</strong> cui è composta, f 1 e f 2 , ammetta derivate parziali prime<br />

e seconde e queste derivate siano continue e limitate.<br />

132


9.2. Metodo <strong>di</strong> Newton per sistemi <strong>di</strong> equazioni in più variabili<br />

Figura 9.1: L’intersezione <strong>di</strong> un’ellisse e <strong>di</strong> una parabola.<br />

Sia data, quin<strong>di</strong>, una funzione vettoriale f = (f 1 , f 2 ) T , dove f 1 e f 2 sono funzioni che <strong>di</strong>pendono dalle variabili<br />

(x 1 , x 2 ), che possiamo scrivere come vettore x = (x 1 , x 2 ). Assumiamo che la funzione f abbia le derivate<br />

continue e limitate almeno fino all’or<strong>di</strong>ne 2. Allora, dati i vettori x (0) = (x (0)<br />

1 , x(0) 2 ) e x = x(0) +p, dove p = (p 1 , p 2 )<br />

è un vettore <strong>di</strong> <strong>di</strong>rezione, la formula <strong>di</strong> Taylor <strong>di</strong> centro x (0) in x si può scrivere come<br />

f(x (0) + p) = f(x (0) ) + J(x (0) )p + termini che <strong>di</strong>pendono da‖p‖ 2 .<br />

dove ‖ · ‖ è una norma su vettori mentre J(x (0) ) è la cosiddetta matrice Jacobiana della funzione f in x (0) , i cui<br />

elementi sono dati dalle derivate parziali prime delle componenti <strong>di</strong> f in x (0) :<br />

⎛<br />

J(x (0) ) = ⎜<br />

⎝<br />

∂f 1 (x (0)<br />

1 , x(0) 2 )<br />

∂f 1 (x (0)<br />

∂x 1 ∂x 2<br />

∂f 2 (x (0)<br />

∂x 1<br />

∂f 2 (x (0)<br />

1 , x(0) 2 )<br />

1 , x(0) 2 )<br />

1 , x(0) 2 )<br />

∂x 2<br />

Componente per componente, la formula <strong>di</strong> Taylor <strong>di</strong>venta<br />

f 1 (x (0)<br />

1 + p 1, x (0)<br />

2 + p 2) = f 1 (x (0)<br />

1 , x(0) 2 ) + ∂f 1(x (0)<br />

1 , x(0) 2 )<br />

p 1 + ∂f 1(x (0)<br />

∂x 1 ∂x 2<br />

f 2 (x (0)<br />

1 + p 1, x (0)<br />

2 + p 2) = f 2 (x (0)<br />

1 , x(0) 2 ) + ∂f 2(x (0)<br />

1 , x(0) 2 )<br />

p 1 + ∂f 2(x (0)<br />

∂x 1 ∂x 2<br />

⎞<br />

⎟<br />

⎠<br />

1 , x(0) 2 )<br />

1 , x(0) 2 )<br />

p 2 + termini <strong>di</strong> or<strong>di</strong>ne superiore<br />

p 2 + termini <strong>di</strong> or<strong>di</strong>ne superiore<br />

Per capire la formula <strong>di</strong> Taylor in due <strong>di</strong>mensioni e, successivamente, il metodo <strong>di</strong> Newton, conviene<br />

pensare al vettore x (0) come ad un punto dello spazio R 2 e a p come ad un vettore <strong>di</strong> <strong>di</strong>rezione. Quando ci<br />

muoviamo dal punto x (0) nella <strong>di</strong>rezione data da p, arriviamo al punto x (0) + p (si veda figura 9.2).<br />

A questo punto, possiamo ricavare il metodo <strong>di</strong> Newton. Come nel caso scalare, partiamo da un punto<br />

iniziale (questo volta in R 2 ) x (0) e generiamo una successione <strong>di</strong> punti x (1) , x (2) , ..., x (k) , ... dove il valore x (k+1)<br />

133


9. PROBLEMI NON LINEARI IN PIÙ VARIABILI<br />

Figura 9.2: Il vettore x (0) , visto come punto, la <strong>di</strong>rezione data da p e il vettore x (0) + p, visto come punto.<br />

si ottiene applicando la formula <strong>di</strong> Taylor <strong>di</strong> centro x (k) e secondo una <strong>di</strong>rezione p scelta in questo modo: se<br />

da x (k) volessimo arrivare in un solo passo alla soluzione esatta x ∗ , (dove vale f(x ∗ ) = 0), basterebbe scegliere<br />

come <strong>di</strong>rezione p la <strong>di</strong>fferenza tra x ∗ e x (k) : p = x ∗ − x (k) . In tal caso 0 = f(x ∗ ) = f(x (k) + p). Applicando la<br />

formula <strong>di</strong> Taylor, avremmo<br />

0 = f(x (k) + p) = f(x (k) ) + J(x (k) )p + termini <strong>di</strong> or<strong>di</strong>ne superiore<br />

Tuttavia, noi non conosciamo la soluzione esatta e quin<strong>di</strong> neanche sappiamo la <strong>di</strong>rezione p da considerare.<br />

Usiamo, però, la relazione precedente per definire una <strong>di</strong>rezione p (k) che ci permetta <strong>di</strong> costruire la nuova<br />

approssimazione x (k+1) . Trascurando i termini <strong>di</strong> or<strong>di</strong>ne superiore e richiedendo<br />

f(x (k) ) + J(x (k) )p (k) = 0<br />

possiamo trovare la <strong>di</strong>rezione p (k) in modo tale che la nuova approssimazione sia il vettore dato da x (k+1) =<br />

x (k) + p (k) .<br />

Il ragionamento che abbiamo fatto è stato molto simile a quello per il metodo <strong>di</strong> Newton-Raphson per<br />

funzioni scalari. Solo che ora stiamo lavorando con vettori e per trovare la nuova <strong>di</strong>rezione p (k) dobbiamo<br />

risolvere un sistema (questa volta lineare perchè i coefficienti della matrice J sono valutati in un vettore<br />

assegnato)<br />

J(x (k) )p (k) = −f(x (k) )<br />

Osserviamo subito che non è assicurato che la matrice Jacobiana sia sempre non singolare, per qualunque<br />

scelta <strong>di</strong> x (k) (e quin<strong>di</strong> non è detto che possiamo sempre risolvere il sistema precedente). Tuttavia, nelle ra<strong>di</strong>ci<br />

della funzione e in un intorno <strong>di</strong> esse, il determinante è <strong>di</strong>verso da zero: ciò assicura che possiamo utilizzare<br />

questo metodo localmente.<br />

L’algoritmo <strong>di</strong> Newton per trovare le ra<strong>di</strong>ci <strong>di</strong> sistemi non lineari <strong>di</strong>venta quin<strong>di</strong><br />

G Partire da un’approssimazione iniziale x (0)<br />

G Per k = 0,1,2,... fino a convergenza<br />

– Risolvere il sistema J(x (k) )p (k) = −f(x (k) )<br />

– Porre la nuova approssimazione x (k+1) = x (k) + p (k)<br />

134


9.3. Minimi quadrati non lineari<br />

La convergenza è basata sul controllo della norma <strong>degli</strong> scarti tra due approssimazioni successive, vale a <strong>di</strong>re<br />

sulla norma della <strong>di</strong>rezione p (k) . Si può anche aggiungere un controllo sulla norma <strong>di</strong> f(x (k) ).<br />

Esempio<br />

Esempio 9.2.2 Ripren<strong>di</strong>amo l’esempio 9.2.1. La matrice jacobiana è data da<br />

( )<br />

18x1 8x 2<br />

J(x) =<br />

2x 1 −1<br />

Se consideriamo x (0) = (0,0) T , la matrice jacobiana ha determinante uguale a zero, quin<strong>di</strong> non possiamo<br />

applicare il metodo partendo da questo punto.<br />

Partiamo invece da x (0) = (1,1) T : il metodo converge alla soluzione ξ 1 . Ecco i valori che troviamo, per<br />

ogni iterazione, della norma euclidea <strong>di</strong> p (k) e <strong>di</strong> f(x (k) ) e delle componenti del vettore x (k) .<br />

k p (k) ‖f(x (k) )‖ 2 x (k)<br />

1<br />

x (k)<br />

2<br />

0 2.000000e-10 2.302173e+01 1.0000000000000000 1.0000000000000000<br />

1 1.228623e+00 1.022848e+01 1.9117647058823530 1.8235294117647058<br />

2 2.729148e-01 6.073071e-01 1.6642652418726938 1.7085228106205075<br />

3 1.924654e-02 3.326709e-03 1.6451607390354450 1.7061888752349927<br />

4 1.112225e-04 1.120144e-07 1.6450495207124343 1.7061879132266946<br />

5 3.759668e-09 7.108896e-15 1.6450495169527666 1.7061879132265310<br />

6 2.633315e-16 0.000000e+00 1.6450495169527668 1.7061879132265312<br />

Partiamo da x (0) = (−0.5,1) T , il metodo converge a ξ 2 , come possiamo vedere dai valori seguenti:<br />

k p (k) ‖f(x (k) )‖ 2 x (k)<br />

1<br />

x (k)<br />

2<br />

0 2.000000e-10 2.980143e+01 -0.5000000000000000 1.0000000000000000<br />

1 2.702083e+00 6.267123e+01 -3.0735294117647061 1.8235294117647058<br />

2 1.102160e+00 1.093291e+01 -1.9773856415813829 1.7085228106205077<br />

3 3.044172e-01 8.391335e-01 -1.6729773676003774 1.7061888752349932<br />

4 2.769474e-02 6.945470e-03 -1.6452826237649281 1.7061879132266946<br />

5 2.330903e-04 4.919889e-07 -1.6450495334662778 1.7061879132265312<br />

6 1.651351e-08 0.000000e+00 -1.6450495169527668 1.7061879132265312<br />

Si può <strong>di</strong>mostrare che, se in un intorno <strong>di</strong> una ra<strong>di</strong>ce semplice x ∗ , la matrice Jacobiana J(x) ha inversa<br />

limitata e le derivate continue, allora il metodo <strong>di</strong> Newton converge quadraticamente, cioè esiste una costante<br />

M ∈ R tale che<br />

‖x ∗ − x (k+1) ‖ ≤ M‖x ∗ − x (k) ‖ 2<br />

in un intorno <strong>di</strong> x ∗ , quin<strong>di</strong> per ‖x ∗ − x (k) ‖ sufficientemente piccoli.<br />

Nell’esempio che abbiamo visto, se, invece <strong>degli</strong> errori, consideriamo il vettore <strong>degli</strong> scarti (che, ricor<strong>di</strong>amo,<br />

si identifica con la <strong>di</strong>rezione p (k) ), ritroviamo la stessa relazione e riconosciamo convergenza<br />

quadratica.<br />

9.3 Minimi quadrati non lineari<br />

Il problema dell’approssimazione ai minimi quadrati, che abbiamo visto brevemente al Capitolo 6, è molto<br />

vasto e richiederebbe un approfon<strong>di</strong>mento che non può essere fatto in un semplice corso <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong>.<br />

Proprio per questo, ora affronteremo solo un aspetto dei minimi quadrati non lineari, applicandolo<br />

<strong>di</strong>rettamente al problema che vogliamo affrontare.<br />

135


9. PROBLEMI NON LINEARI IN PIÙ VARIABILI<br />

Il sistema GPS (Global Positioning System) è un metodo per determinare la posizione <strong>di</strong> <strong>di</strong>stanze misurate<br />

rispetto a punti dalle coor<strong>di</strong>nate note. Questi punti dalle coor<strong>di</strong>nate note sono i satelliti, che trasmettono un<br />

segnale in <strong>di</strong>rezione della terra.<br />

Un ricevitore GPS può misurare il tempo richiesto da un segnale per propagarsi da un satellite GPS fino<br />

al ricevitore stesso. Poichè il segnale viaggia alla velocità della luce, l’intervallo <strong>di</strong> tempo può essere convertito<br />

in <strong>di</strong>stanza moltiplicandolo per la velocità della luce stessa. In assenza <strong>di</strong> errori (quin<strong>di</strong> sincronizzazione<br />

perfetta tra l’orologio presente nel ricevitore e quello nel satellite, mancanza <strong>di</strong> ionosfera e troposfera, che,<br />

invece, rallentano l’arrivo del segnale, ...), una misura <strong>di</strong> questo tipo ci permette <strong>di</strong> avere informazioni sulla<br />

posizione del ricevitore: esso deve trovarsi in qualche punto della sfera centrata nel satellite e con raggio<br />

uguale alla <strong>di</strong>stanza misurata. Chiamiamo questa <strong>di</strong>stanza d 1 . Se, contemporaneamente, un secondo satellite<br />

invia un segnale allo stesso ricevitore, allora il ricevitore deve trovarsi anche da qualche parte sulla sfera che<br />

ha centro nel secondo satellite e raggio dato dalla <strong>di</strong>stanza misurata, d 2 . Le due sfere, quin<strong>di</strong>, si intersecano e<br />

sul cerchio generato dall’intersezione delle due sfere si troverà il nostro ricevitore. Un terza e simultanea misura,<br />

d 3 , data da un terzo satellite, dà una terza sfera che interseca le altre due in soli due punti: uno <strong>di</strong> questi<br />

punti può essere eliminato subito perchè non si trova sulla terra e rimane quin<strong>di</strong> un solo punto, che permette<br />

<strong>di</strong> identificare la posizione del ricevitore. Quanto abbiamo appena detto vale in linea teorica, in con<strong>di</strong>zioni<br />

ideali. Infatti, in genere, l’orologio atomico presente nel ricevitore GPS e gli orologi presenti nei satelliti non<br />

sono sincronizzati. Gli stessi orologi nei satelliti sono sincronizzati l’uno con l’altro con un certo errore che,<br />

per quanto piccolo (un millisecondo) esiste. Gli intervalli <strong>di</strong> misura del ricevitore sono affetti, quin<strong>di</strong>, da errori<br />

e, per questo motivo, sono chiamati pseudoranges. Un errore <strong>di</strong> tempo in termini <strong>di</strong> millisecon<strong>di</strong> può<br />

dare un errore nella posizione <strong>di</strong> circa 300 chilometri e questo, chiaramente, è un errore troppo grande!<br />

Le misure osservate, inoltre, sono affette da errori anche <strong>di</strong> altra natura, come gli effetti della ionosfera e<br />

troposfera, l’errore <strong>di</strong> misura del ricevitore stesso, errori <strong>di</strong> orbita ... Perciò, date delle misure affette da errore,<br />

dobbiamo cercare <strong>di</strong> capire le coor<strong>di</strong>nate del ricevitore. Semplifichiamo il problema applicandolo allo spazio<br />

R 2 .<br />

Sono date delle misure d i tra un punto incognito P 0 <strong>di</strong> coor<strong>di</strong>nate (x 0 , y 0 ) (il ricevitore) ed n punti noti<br />

P i (x i , y i ) (i satelliti GPS). La <strong>di</strong>stanza osservata è affetta da errore <strong>di</strong> misura ɛ i . Quin<strong>di</strong> abbiamo la relazione<br />

tra <strong>di</strong>stanza osservata, <strong>di</strong>stanza esatta ed errore data da<br />

√<br />

d i = (x i − x 0 ) 2 + (y i − y 0 ) 2 + ɛ i , i = 1,2,...,n<br />

Abbiamo n equazioni non lineari in due incognite (x 0 , y 0 ). Per risolvere questo problema si minimizza la<br />

somma dei quadrati delle <strong>di</strong>fferenze tra il valore della <strong>di</strong>stanza misurata e il valore della <strong>di</strong>stanza esatta, vale<br />

a <strong>di</strong>re<br />

n∑ √<br />

n∑<br />

S(x 0 , y 0 ) = (d i − (x i − x 0 ) 2 + (y i − y 0 ) 2 ) 2 (= ɛ 2 i )<br />

i=1<br />

i=1<br />

Questa funzione assomiglia alla funzione S(a 0 , a 1 ) che avevamo costruito per ottenere la retta <strong>di</strong> regressione<br />

lineare ai minimi quadrati. Una <strong>di</strong>fferenza fondamentale, tuttavia, è che S(x 0 , y 0 ) è non lineare.<br />

An<strong>di</strong>amo allora a considerare la funzione δ i (x, y) = √ (x i − x) 2 + (y i − y) 2 , per i = 1,2,...,n. Osserviamo<br />

che δ i (x 0 , y 0 ) = √ (x i − x 0 ) 2 + (y i − y 0 ) 2 : è la <strong>di</strong>stanza esatta tra il punto P 0 e il punto P i , da cui d i = δ i (x 0 , y 0 )+<br />

ɛ i .<br />

Consideriamo un valore provvisorio noto <strong>di</strong> coor<strong>di</strong>nate (x, y) vicino a (x 0 , y 0 ) in modo da poter linearizzare<br />

la funzione δ i (x, y). Applichiamo la formula <strong>di</strong> Taylor <strong>di</strong> centro (x, y), trascurando i termini <strong>di</strong> or<strong>di</strong>ne<br />

superiore (rive<strong>di</strong>amo la formula <strong>di</strong> Taylor per funzioni vettoriali, applicandola però ad un’unica funzione che<br />

<strong>di</strong>pende da due variabili). Si ha<br />

136<br />

δ i (x, y) = δ i (x, y) + ∂δ i (x, y)<br />

∂x<br />

Allora<br />

δ i (x 0 , y 0 ) = δ i (x, y) + ∂δ i (x, y)<br />

∂x<br />

(x − x) + ∂δ i (x, y)<br />

(y − y)<br />

∂y<br />

(x 0 − x) + ∂δ i (x, y)<br />

(y 0 − y)<br />

∂y


9.3. Minimi quadrati non lineari<br />

Per i = 1,...,n, la <strong>di</strong>fferenza b i = d i − δ i (x, y) è data da<br />

b i = d i − δ i (x, y) = δ(x 0 , y 0 ) + ɛ i − δ i (x, y)<br />

∂δ(x, y) ∂δ(x, y)<br />

= δ(x, y) + (x 0 − x) + (y 0 − y) + ɛ i − δ i (x, y)<br />

∂x<br />

∂y<br />

∂δ(x, y) ∂δ(x, y)<br />

= (x 0 − x) + (y 0 − y) + ɛ i (9.1)<br />

∂x<br />

∂y<br />

Le derivate parziali sono, per i = 1,...,n:<br />

∂δ i (x, y)<br />

∂x<br />

∂δ i (x, y)<br />

∂y<br />

= ∂√ (x i − x) 2 + (y i − y) 2<br />

∂x<br />

= ∂√ (x i − x) 2 + (y i − y) 2<br />

∂y<br />

∣<br />

(x i − x)<br />

(x,y)=(x,y) = − √<br />

(xi − x) 2 + (y i − y) = − (x i − x)<br />

2 δ i (x, y)<br />

∣<br />

(y i − y)<br />

(x,y)=(x,y) = − √<br />

(xi − x) 2 + (y i − y) = − (y i − y)<br />

2 δ i (x, y)<br />

Consideriamo, ora, il vettore b = (b 1 ,b 2 ,...,b n ) T , il vettore ɛ = (ɛ 1 ,ɛ 2 ,...,ɛ n ) T e la matrice A <strong>di</strong> n righe e 2<br />

colonne data da<br />

⎛<br />

∂δ 1 (x, y)<br />

∂x<br />

∂δ 2 (x, y)<br />

A =<br />

∂x<br />

⎜ ...<br />

⎝ ∂δ n (x, y)<br />

∂x<br />

⎞<br />

∂δ 1 (x, y)<br />

∂y<br />

∂δ 2 (x, y)<br />

∂y<br />

⎟<br />

∂δ n (x, y) ⎠<br />

∂y<br />

Dalla relazione (9.1), introducendo il vettore ξ = (x 0 − x, y 0 − y) T abbiamo<br />

Aξ + ɛ = b<br />

o, quivalentemente, ɛ = b − Aξ<br />

Se an<strong>di</strong>amo a riprendere la funzione S(x 0 , y 0 ) da minimizzare, abbiamo S(x 0 , y 0 ) = ∑ n<br />

i=1 ɛ2 . In termini<br />

i<br />

vettoriali, S si può anche scrivere come S = ɛ T ɛ, vale a <strong>di</strong>re come funzione del vettore ξ:<br />

S(ξ) = (b − Aξ) T (b − Aξ)<br />

Sviluppando abbiamo<br />

S(ξ) = b T b − b T Aξ − ξ T A T b + ξ T A T Aξ<br />

La quantità b T Aξ è scalare e, quin<strong>di</strong>, coincide con la sua trasposta, da cui b T Aξ = (b T Aξ) T = ξ T A T b. Perciò<br />

S(ξ) = b T b − 2ξ T A T b + ξ T A T Aξ<br />

Per trovare il minimo <strong>di</strong> S dobbiamo imporre uguale a zero la sua derivata rispetto al vettore ξ, vale a <strong>di</strong>re<br />

rispetto a ciascuna componente <strong>di</strong> ξ. Poichè b T b è uno scalare che non <strong>di</strong>pende da ξ, la sua derivata vale zero;<br />

quando deriviamo ξ T A T b, si ha A T b, mentre la derivata <strong>di</strong> ξ T A T Aξ vale 2ξ T A T A = 2(ξ T A T A) T = 2A T Aξ, da<br />

cui 22 Per ricavare queste derivate consideriamo un vettore <strong>di</strong> <strong>di</strong>mensione m, y che è funzione <strong>di</strong> un altro vettore <strong>di</strong> <strong>di</strong>mensione n, x,<br />

me<strong>di</strong>ante la relazione y = ψ(x). Per definizione, la derivata ∂y è data dalla matrice che ha come elemento <strong>di</strong> posto (i , j ) la derivata<br />

∂x<br />

parziale ∂y i<br />

(i = 1,...,m, j = 1,...,n).<br />

∂x j<br />

Data una matrice A, <strong>di</strong> <strong>di</strong>mensione m × n<br />

137


9. PROBLEMI NON LINEARI IN PIÙ VARIABILI<br />

Figura 9.3: Esempio <strong>di</strong> minimi quadrati non lineari: in blu i punti noti, il puntino in rosso è il punto<br />

provvisorio, il puntino in nero è il punto incognito che si ricava me<strong>di</strong>ante il proce<strong>di</strong>mento ai minimi quadrati.<br />

∂S(ξ)<br />

∂ξ<br />

= −2AT b + 2A T Aξ<br />

Poniamo questa derivata uguale a zero<br />

∂S(ξ)<br />

∂ξ<br />

= 0 ⇒ 2AT Aξ = 2A T b ⇒ A T Aξ = A T b<br />

Per ricavare il vettore ξ che minimizza S, dobbiamo dunque risolvere questo sistema dove la matrice A T A è<br />

una matrice 2 × 2. Dal vettore ξ possiamo ricavare i valori x 0 e y 0 (le coor<strong>di</strong>nate del ricevitore GPS). Perchè<br />

G se y = Ax si ha ∂y<br />

∂x = A<br />

Si prova questo risultato considerando che y i = ∑ n<br />

j =1 a i j x j da cui ∂y i<br />

= a i j , per i = 1,...,m e j = 1,...,n da cui otteniamo<br />

∂x j<br />

la matrice A.<br />

G se α = y T Ax si ha ∂α<br />

∂x = yT A<br />

Infatti, se poniamo w T = y T A, w T può essere visto come una matrice <strong>di</strong> <strong>di</strong>mensione 1 × n, da cui α = w T x e, per il caso<br />

precendente, si ha ∂α<br />

∂x = wT = y T A.<br />

G se α = x T Ax, con A matrice n × n, allora ∂α<br />

∂x = xT (A + A T ) Infatti α = ∑ n ∑ n<br />

i=1 j =1 a i j x i x j Quin<strong>di</strong><br />

∂α n∑<br />

n∑<br />

= a<br />

∂x ki x i + a j k x j , per k = 1,2,...,n<br />

k i=1 j =1<br />

In forma compatta, ciò significa<br />

∂α<br />

∂x = xT A T + x T A = x T (A T + A)<br />

G se A è simmetrica, la derivata <strong>di</strong> α = x T Ax <strong>di</strong>venta, <strong>di</strong> conseguenza, ∂α<br />

∂x = 2xT A<br />

138


9.3. Minimi quadrati non lineari<br />

il sistema abbia soluzione, la matrice deve essere non singolare: questa con<strong>di</strong>zione è assicurata se le osservazioni<br />

fatte sono linearmente in<strong>di</strong>pendenti, cioè i punti (x i , y i ), i = 1,...,n non si trovano lungo una stessa<br />

retta passante per il punto (x 0 , y 0 ).<br />

Esempio<br />

Esempio 9.3.1 In figura 9.3 sono evidenziati in blu n = 6 punti noti (che corrispondono alle coor<strong>di</strong>nate<br />

dei satelliti, anche se ora stiamo lavorando in due <strong>di</strong>mensioni). Il puntino rosso rappresenta il punto<br />

provvisorio (x, y), grazie al quale possiamo calcolare le <strong>di</strong>stanze effettive rispetto agli n punti precedenti.<br />

Gli n punti hanno coor<strong>di</strong>nate (esprimiamo tutto in metri) date, rispettivamente, da<br />

(7,9), (2,7), (1,4), (10,15), (−5,8), (−20,−15)<br />

Il punto (x, y) ha coor<strong>di</strong>nate (4.04,4.96). Le <strong>di</strong>stanze osservate dagli n punti rispetto al punto incognito<br />

(x 0 , y 0 ) sono date dai valori<br />

5, 2.83, 3.16, 11.66, 7.5, 9.48, 31.24<br />

Con questi dati a <strong>di</strong>sposizione, siamo in grado <strong>di</strong> calcolare le <strong>di</strong>stanze δ i (x, y) e successivamente la matrice<br />

A. Applicando il metodo ai minimi quadrati linearizzato, si ottiene come matrice A T A la matrice<br />

data da<br />

( )<br />

A T 3.50953 0.89221<br />

A =<br />

0.89221 2.49047<br />

Il vettore A T b ha componenti (−0.111826,0.065088) T , da cui, risolvendo il sistema, si ricava<br />

ξ = (−0.042366,0.041313) T . Le coor<strong>di</strong>nate (x 0 , y 0 ) sono dunque date da (ξ 1 + x,ξ 2 + y) cioè da<br />

(3.997634,5.001312).<br />

139


CAPITOLO 10<br />

Integrazione numerica<br />

Dio non si preoccupa delle nostre<br />

<strong>di</strong>fficoltà matematiche. Lui integra<br />

empiricamente.<br />

Albert Einstein<br />

10.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141<br />

10.2 Formula dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142<br />

10.3 Formule <strong>di</strong> Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143<br />

10.3.1 Formula <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145<br />

10.3.2 Sull’errore della formula <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . 147<br />

10.4 Formule composte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148<br />

10.4.1 Formula composta dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148<br />

10.4.2 Confronti tra la formula dei trapezi e <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . 152<br />

10.5 Estrapolazione <strong>di</strong> Richardson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />

10.6 Approssimazione <strong>di</strong> Romberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />

10.7 Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156<br />

10.7.1 Proprietà delle formule <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159<br />

10.7.2 Formule <strong>di</strong> Gauss-Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159<br />

10.7.3 Altre formule <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160<br />

10.7.4 Applicazione delle formule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161<br />

10.7.5 Sulla funzione peso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161<br />

10.8 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162<br />

10.1 Introduzione<br />

Un’automobile effettua il giro <strong>di</strong> una pista in 84 secon<strong>di</strong>. La velocità dell’auto viene misurata ogni 6 secon<strong>di</strong><br />

usando un’apparecchiatura radar per il controllo della velocità, ricavando i valori che si trovano in<br />

Tabella 10.1.<br />

In base ai dati in possesso, quanto è lunga la pista<br />

Tempo 0 6 12 18 24 30 36 42 48 54 60 66 72 78 84<br />

Velocità 38 41 45 48 45 41 37 33 30 26 24 27 32 35 37<br />

Tabella 10.1: Dati della velocità misurati ogni 6 secon<strong>di</strong>. Il tempo è espresso in secon<strong>di</strong> e la velocità è data in<br />

metri al secondo.<br />

141


10. INTEGRAZIONE NUMERICA<br />

Sapendo che la velocità v è data da v(t) = d s (dove s rappresenta lo spostamento e t il tempo), per calcolare<br />

la lunghezza della pista (data dallo spostamento effettuato dall’auto), dobbiamo integrare la velocità tra<br />

d t<br />

il tempo iniziale e quello finale.<br />

∫ 84<br />

0<br />

∫ s(84)<br />

∫<br />

d s s(84)<br />

v(t)d t =<br />

s(0) d t d t = d s<br />

s(0)<br />

Essendo s(0) = 0 e s(84) = L la lunghezza della pista, si ha<br />

∫ 84<br />

0<br />

v(t)d t =<br />

∫ s(84)<br />

s(0)<br />

d s = L<br />

Quin<strong>di</strong>, se riusciamo a risolvere l’integrale in cui la funzione integranda è la velocità, per le uguaglianze<br />

date, sapremo <strong>di</strong>re quanto vale L, essendo<br />

∫ 84<br />

0<br />

v(t)d t = L<br />

Sfruttando i dati della velocità misurati ogni 6 secon<strong>di</strong>, dobbiamo essere in grado <strong>di</strong> poter risolvere<br />

numericamente questo integrale.<br />

In questo Capitolo stu<strong>di</strong>eremo come fare. Ci occuperemo, infatti, <strong>di</strong> approssimare l’integrale definito<br />

∫ b<br />

I = f (x)d x<br />

a<br />

dove f è una funzione definita nell’intervallo [a,b] (e f può essere nota oppure data su determinati punti<br />

dell’intervallo, come nell’esempio appena visto).<br />

Una formula <strong>di</strong> integrazione numerica (detta anche formula <strong>di</strong> quadratura numerica) approssima<br />

l’integrale esatto I = ∫ b<br />

a f (x)d x me<strong>di</strong>ante ∑ n<br />

j =0 a j f (x j ):<br />

∫ b<br />

I =<br />

a<br />

f (x)d x ≈<br />

n∑<br />

a j f (x j )<br />

j =0<br />

dove x j , j = 0,...,n sono le ascisse o punti <strong>di</strong> appoggio della formula <strong>di</strong> quadratura e a j sono i pesi della<br />

formula.<br />

10.2 Formula dei trapezi<br />

Consideriamo la retta che interpola la f negli estremi dell’intervallo <strong>di</strong> integrazione.<br />

seguiamo l’approccio <strong>di</strong> interpolazione me<strong>di</strong>ante la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise:<br />

Per semplicità,<br />

a<br />

b<br />

f (a)<br />

f (b)<br />

f (b) − f (a)<br />

Il polinomio <strong>di</strong> interpolazione (retta) che interpola la f in a e in b (gli estremi dell’intervallo <strong>di</strong> integrazione)<br />

è dato da<br />

f (b) − f (a)<br />

p(x) = f (a) + (x − a)<br />

b − a<br />

b − a<br />

L’errore <strong>di</strong> interpolazione, utilizzando l’espressione del resto <strong>di</strong> Lagrange è dato da<br />

E(x) = f ′′ (ξ x )<br />

(x − a)(x − b)<br />

2<br />

142


10.3. Formule <strong>di</strong> Newton-Cotes<br />

dove ξ x è un punto dell’intervallo [a,b]. Per quanto abbiamo stu<strong>di</strong>ato sull’interpolazione, sappiamo che la<br />

funzione f (x) si può scrivere come somma del polinomio e dell’errore: f (x) = p(x) + E(x). Nel nostro caso,<br />

abbiamo<br />

f (b) − f (a)<br />

f (x) = f (a) + (x − a) + f ′′ (ξ x )<br />

(x − a)(x − b)<br />

b − a<br />

2<br />

Dovendo integrare la f tra a e b e valendo l’uguaglianza precedente, integrando ambo i membri,<br />

otteniamo:<br />

∫ b<br />

∫ b<br />

(<br />

) ∫<br />

f (b) − f (a)<br />

b<br />

f (x)d x = f (a) + (x − a) d x + (x − a)(x − b) f ′′ (ξ x )<br />

d x<br />

b − a<br />

2<br />

a<br />

ovvero<br />

∫ b<br />

a<br />

a<br />

f (a) + f (b)<br />

f (x)d x = (b − a) + 1 2 2<br />

∫ b<br />

a<br />

a<br />

(x − a)(x − b)f ′′ (ξ x ))d x<br />

Poichè il prodotto (x −a)(x −b) ha segno costante in [a,b], per il teorema del Valor Me<strong>di</strong>o del calcolo integrale<br />

(si veda il Teorema 2.5.6) si ha<br />

1<br />

2<br />

∫ b<br />

a<br />

(x − a)(x − b)f ′′ (ξ x ))d x = 1 2 f ′′ (ξ)<br />

∫ b<br />

a<br />

(x − a)(x − b)d x = − 1 2 f ′′ (b − a)3<br />

(ξ)<br />

3!<br />

dove ξ è un punto interno all’intervallo [a,b].<br />

La quantità E i nt = − 1 2 f ′′ (b − a)3<br />

(ξ) = − 1<br />

3! 12 f ′′ (ξ)(b − a) 3 rappresenta l’errore che si commette approssimando<br />

l’integrale <strong>di</strong> f in [a,b] me<strong>di</strong>ante l’integrale della retta passante per f (a) e f (b), vale a <strong>di</strong>re, me<strong>di</strong>ante<br />

l’area del trapezio sottesa dalla corda passante per f (a) e f (b).<br />

In<strong>di</strong>cando con M = max a≤x≤b |f ′′ (x)| possiamo maggiorare l’errore con la relazione<br />

(b − a)3<br />

|E i nt | ≤ M<br />

12<br />

La formula dei trapezi approssima l’integrale <strong>di</strong> f in [a,b] come I tr ap dato da<br />

I tr ap = b − a [f (a) + f (b)]<br />

2<br />

10.3 Formule <strong>di</strong> Newton-Cotes<br />

Se, al posto <strong>di</strong> una retta, pren<strong>di</strong>amo come funzione interpolante la f un polinomio <strong>di</strong> grado più elevato,<br />

otterremo altre formule <strong>di</strong> quadrature.<br />

Supponiamo <strong>di</strong> poter valutare la f in n + 1 punti x 0 , x 1 ,..., x n e costruiamo il polinomio interpolatore <strong>di</strong><br />

grado n utilizzando la formula <strong>di</strong> Lagrange.<br />

Avremo p n (x) = ∑ n<br />

i=0 f (x i )L i (x), dove i polinomi <strong>di</strong> Lagrange sono dati dalla nota formula<br />

L i (x) =<br />

n∏<br />

j =0<br />

j ≠i<br />

x − x j<br />

x i − x j<br />

Se i no<strong>di</strong> sono equi<strong>di</strong>stanti con passo h, possiamo scrivere x j = x 0 + j h, con j = 0,1,...,n e per un generico<br />

punto x compreso tra x 0 e x n vale x = x 0 + sh con 0 ≤ s ≤ n, s numero reale.<br />

143


10. INTEGRAZIONE NUMERICA<br />

Figura 10.1: Formula dei trapezi: l’integrale della funzione f (zona tratteggiata in blu) viene approssimata<br />

me<strong>di</strong>ante l’area del trapezio sotteso alla retta <strong>di</strong> interpolazione per f (a) e f (b) (zona verde).<br />

Quin<strong>di</strong> 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 <strong>di</strong> Lagrange si può<br />

scrivere come<br />

L i (x) =<br />

n∏ s − j<br />

i − j = L i (s)<br />

j =0<br />

j ≠i<br />

Da f (x) = p n (x) + E(x) dove E(x) è l’errore della formula <strong>di</strong> interpolazione, passando all’integrale,<br />

abbiamo<br />

∫ b<br />

a<br />

f (x)d x =<br />

∫ b<br />

a<br />

p n (x)d x +<br />

∫ b<br />

a<br />

E(x)d x<br />

Il primo integrale a secondo membro rappresenta la formula che approssima l’integrale della f mentre il<br />

secondo integrale rappresenta l’errore della formula <strong>di</strong> quadratura.<br />

La formula <strong>di</strong> quadratura è quin<strong>di</strong> data dal valore dell’integrale <strong>di</strong> p n :<br />

∫ b<br />

∫ b n∑<br />

n∑<br />

I = f (x)d x ≈ f (x i )L i (x)d x = f (x i )<br />

a<br />

a<br />

i=0<br />

i=0<br />

∫ b<br />

a<br />

L i (x)d x<br />

La formula <strong>di</strong> quadratura ha dunque come no<strong>di</strong> i punti x i e come pesi gli integrali ∫ b<br />

a L i (x)d x.<br />

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<br />

∫ b<br />

a<br />

∫ xn<br />

L i (x)d x = L i (x)d x =<br />

x 0<br />

Allora<br />

∫ b<br />

n∑<br />

I = f (x)d x ≈ h f (x i )<br />

a<br />

i=0<br />

∫ n<br />

0<br />

∫ n<br />

0<br />

L i (s)hd s = h<br />

L i (s)d s<br />

∫ n<br />

0<br />

L i (s)d s<br />

144


10.3. Formule <strong>di</strong> Newton-Cotes<br />

Definiamo coefficienti <strong>di</strong> Newton-Cotes 1 le espressioni<br />

C (n) = 1 i<br />

n<br />

∫ n<br />

0<br />

L i (s)d s<br />

i = 0,1,...,n<br />

La formula precedente si scrive, quin<strong>di</strong>, come<br />

∫ b<br />

I =<br />

a<br />

n∑<br />

n∑<br />

f (x)d x ≈ nh f (x i )C (n) = (x<br />

i n − x 0 )<br />

i=0<br />

L’errore della formula <strong>di</strong> quadratura è dato da<br />

E i nt =<br />

∫ b<br />

a<br />

∫ b<br />

E(x)d x =<br />

a<br />

i=0<br />

f (n+1) (ξ x )<br />

(x − x 0 )(x − x 1 )···(x − x n )d x<br />

(n + 1)!<br />

f (x i )C (n)<br />

i<br />

(10.1)<br />

Dato un polinomio <strong>di</strong> interpolazione <strong>di</strong> grado n me<strong>di</strong>ante il proce<strong>di</strong>mento <strong>di</strong> Lagrange è dunque possibile<br />

ricavare una formula <strong>di</strong> quadratura numerica che prende il nome <strong>di</strong> formula <strong>di</strong> Newton-Cotes. Per quanto<br />

riguarda l’errore si può osservare che le formule ottenute con un valore n <strong>di</strong>spari (cui corrisponde un numero<br />

n + 1 pari <strong>di</strong> punti <strong>di</strong> appoggio) è solo leggermente inferiore alle formule <strong>di</strong> or<strong>di</strong>ne pari che le precedono<br />

imme<strong>di</strong>atamente (cui corrisponde un numero <strong>di</strong>spari <strong>di</strong> punti <strong>di</strong> appoggio).<br />

Per questo motivo le formule <strong>di</strong> or<strong>di</strong>ne pari sono le più usate.<br />

Osserviamo che per f (x) ≡ 1, qualunque sia il grado del polinomio utilizzato nelle formule <strong>di</strong> Newton-<br />

Cotes, l’errore <strong>di</strong> integrazione sarà zero. Nell’intervallo [a,b] ≡ [0,1], applicando l’equazione (10.1) si ha<br />

1 =<br />

∫ 1<br />

0<br />

d x =<br />

n∑<br />

i=0<br />

C (n)<br />

i<br />

Troviamo che la somma dei coefficienti <strong>di</strong> Newton-Cotes vale 1.<br />

Per n = 1 (si hanno quin<strong>di</strong> due punti <strong>di</strong> appoggio, x 0 e x 1 ) i coefficienti <strong>di</strong> Cotes sono quelli già ricavati<br />

della formula dei trapezi<br />

Formula dei<br />

trapezi<br />

C (1)<br />

0<br />

= 1 1<br />

C (1)<br />

1<br />

= 1 1<br />

∫ 1<br />

0<br />

∫ 1<br />

0<br />

∫ 1<br />

L 0 (s)d s =<br />

L 1 (s)d s =<br />

0<br />

∫ 1<br />

0<br />

(s − 1)<br />

−1 d s = 1 2<br />

s<br />

1 d s = 1 2<br />

e la formula <strong>di</strong> integrazione <strong>di</strong>venta<br />

∫ b<br />

I =<br />

a<br />

f (x)d x ≈ h<br />

1∑<br />

i=0<br />

10.3.1 Formula <strong>di</strong> Cavalieri-Simpson<br />

f (x i )C (1)<br />

i<br />

= (x 1 − x 0 ) f (x 0) + f (x 1 )<br />

2<br />

Considerando n = 2 (quin<strong>di</strong> 3 punti <strong>di</strong> appoggio nell’intervallo [a,b], x 0 = a, x 1 = a + b e x 2 = b, i due<br />

2<br />

estremi dell’intervallo e il punto centrale) la formula <strong>di</strong> quadratura prende il nome <strong>di</strong> formula <strong>di</strong> Cavalieri-<br />

Simpson 2<br />

1 Roger Cotes (1682-1716) fu un matematico inglese che lavorò molto con Isaac Newton, in particolare per la correzione del suo<br />

famoso libro Principia. Egli inventò le formule <strong>di</strong> quadratura che prendono il suo nome e per primo introdussse quella che oggi<br />

conosciamo come formula <strong>di</strong> Eulero, per cui e x = cos(x) + i sin(x) nel campo complesso.<br />

2 Bonaventura Francesco Cavalieri (1598-1647) fu un matematico italiano. Stu<strong>di</strong>ò teologia e geometria. Lavorò su problemi <strong>di</strong> ottica<br />

e <strong>di</strong> cinematica. È famoso soprattutto per il cosiddetto principio <strong>di</strong> Cavalieri.<br />

Thomas Simpson (1710-1761) fu un matematico britannico, inventore della formula <strong>di</strong> quadratura per il calcolo <strong>di</strong> integrali definiti,<br />

sebbene questa formula fosse stata già scoperta 200 anni prima da Keplero e pare fosse usata anche da Cavalieri nel 1639 e poi riscoperta<br />

da James Gregory. I suoi stu<strong>di</strong> riguardano anche l’astrologia.<br />

145


10. INTEGRAZIONE NUMERICA<br />

Figura 10.2: Formula <strong>di</strong> Cavalieri-Simpson: l’integrale della funzione f (zona tratteggiata in blu) viene<br />

approssimata me<strong>di</strong>ante l’area della regione sottesa alla parabola passante per f (a), f (c) e f (b) (zona verde).<br />

C (2)<br />

0<br />

= 1 2<br />

C (2)<br />

1<br />

= 1 2<br />

C (2)<br />

2<br />

= 1 2<br />

∫ 2<br />

0<br />

∫ 2<br />

0<br />

∫ 2<br />

0<br />

L 0 (s)d s = 1 2<br />

L 1 (s)d s = 1 2<br />

L 2 (s)d s = 1 2<br />

∫ 2<br />

0<br />

∫ 2<br />

0<br />

∫ 2<br />

0<br />

(s − 1)(s − 2)<br />

d s = 1 (−1)(−2) 6<br />

(s)(s − 2)<br />

(1)(−1) d s = 4 6<br />

(s)(s − 1)<br />

d s = 1 (2)(1) 6<br />

La formula <strong>di</strong> Cavalieri-Simpson approssima l’integrale della f considerando come no<strong>di</strong> x 0 =<br />

a, x 1 = c = a + b e x 2 = b e come pesi i coefficienti <strong>di</strong> Cotes C (2)<br />

0<br />

= 1 2<br />

6 , C (2)<br />

1<br />

= 4 6 , C (2)<br />

2<br />

= 1 6 , ottenendo:<br />

∫ b<br />

I =<br />

a<br />

f (x)d x ≈ (x 2 − x 0 )<br />

2∑<br />

i=0<br />

f (x i )C (2)<br />

i<br />

= b − a (f (a) + 4f (c) + f (b))<br />

6<br />

= (b − a)( f (a)<br />

6<br />

4f (c)<br />

+ + f (b)<br />

6 6 )<br />

Con la formula <strong>di</strong> Cavalieri-Simpson, dunque, l’integrale della f viene approssimato con l’integrale della<br />

parabola passante per i due estremi a e b e per il punto centrale dell’intervallo.<br />

Per quanto riguarda l’errore che si commette approssimando l’integrale della f con la formula <strong>di</strong><br />

Cavalieri-Simpson, consideriamo, seguendo l’approccio visto per la formula dei trapezi, l’integrale dell’errore<br />

del polinomio <strong>di</strong> interpolazione <strong>di</strong> Lagrange.<br />

Per il polinomio <strong>di</strong> secondo grado p 2 che interpola la f , l’errore è dato da E(x) = f ′′′ (ξ x )<br />

(x−a)(x−c)(x−b).<br />

3!<br />

146


10.3. Formule <strong>di</strong> Newton-Cotes<br />

Quando facciamo l’integrale, l’errore nell’approssimare l’integrale esatto con la formula <strong>di</strong> Cavalieri-<br />

Simpson è dunque dato da<br />

∫ b<br />

E i nt =<br />

a<br />

f ′′′ (ξ x )<br />

(x − a)(x − c)(x − b)d x<br />

3!<br />

Questa volta, la funzione (x − a)(x − c)(x − b) cambia segno all’interno dell’intervallo [a,b] e non possiamo<br />

più applicare il teorema del Valor Me<strong>di</strong>o come nella formula dei trapezi. In maniera più laboriosa, tuttavia, si<br />

ricava per l’errore la seguente formula:<br />

E i nt = − f IV (u)<br />

90<br />

( ) b − a 5<br />

= − f IV (u)<br />

(b − a)5<br />

2 2880<br />

dove u è un opportuno punto dell’intervallo ]a,b[.<br />

Osservando i valori dei coefficienti <strong>di</strong> Newton-Cotes per n = 1 e per n = 2 si può vedere come i coefficienti<br />

siano simmetrici e la loro somma vale 1. Questo risultato si può generalizzare per ogni n.<br />

10.3.2 Sull’errore della formula <strong>di</strong> Cavalieri-Simpson<br />

Per capire l’errore che si ha nella formula <strong>di</strong> Cavalieri-Simpson, deduciamo la stessa formula seguendo<br />

un’altra strada.<br />

Per semplificare il <strong>di</strong>scorso, scegliamo l’intervallo [a,b] simmetrico rispetto all’origine, quin<strong>di</strong> del tipo<br />

[−t, t] con t ∈ R, sapendo che, se non fosse così, basta applicare una traslazione dell’asse x per ricondursi a<br />

questo caso. Scriviamo il polinomio <strong>di</strong> interpolazione che passa per i punti −t, 0 e t e che interpola anche la<br />

derivata prima della f in 0.<br />

Me<strong>di</strong>ante la tabella delle <strong>di</strong>fferenza <strong>di</strong>vise, il punto 0 va contato due volte e si ha:<br />

−t f (−t)<br />

f (0) − f (−t)<br />

0 f (0)<br />

t<br />

f ′ f (0) − f (−t)<br />

(0) −<br />

0 f (0) f ′ (0)<br />

t<br />

= t f ′ (0) − f (0) + f (−t)<br />

t<br />

t 2<br />

f (t) − f (0)<br />

− f<br />

f (t) − f (0)<br />

′ (0)<br />

t f (t)<br />

t<br />

= f (t) − f (0) − t f ′ (0) f (t) − 2t f ′ (0) − f (−t)<br />

t<br />

t<br />

t 2<br />

2t 3<br />

Il polinomio <strong>di</strong> interpolazione è, dunque<br />

f (0) − f (−t)<br />

p(x) = f (−t) + (x + t) + t f ′ (0) − f (0) + f (−t)<br />

t<br />

t 2 (x + t)x + f (t) − 2t f ′ (0) − f (−t)<br />

2t 3 (x + t)x 2<br />

L’errore <strong>di</strong> interpolazione per questo polinomio <strong>di</strong> grado 3 vale<br />

E(x) = f (IV ) (ξ x )<br />

(x + t)x 2 (x − t)<br />

4!<br />

Quin<strong>di</strong> da f (x) = p(x) + E(x), andando a integrare tra −t e t si ha:<br />

∫ t<br />

−t<br />

−t<br />

∫ t<br />

∫ t<br />

f (x)d x = p(x)d x + E(x)d x<br />

−t<br />

−t<br />

Nell’integrazione del polinomio p(x) è facile vedere che i termini che <strong>di</strong>pendono da f ′ (0) portano un<br />

contributo nullo. Infatti<br />

∫ t<br />

( f ′ (0)<br />

(x + t)x − f ′ ) ∫<br />

(0)<br />

t<br />

t<br />

t 2 (x + t)x 2 f ′ )<br />

(0)<br />

d x =<br />

(x 2 + t x − x3<br />

t<br />

t − x2 d x<br />

−t<br />

= f ′ (0)<br />

t<br />

[t x2<br />

2 − x4<br />

4t<br />

] t<br />

−t<br />

= 0<br />

147


10. INTEGRAZIONE NUMERICA<br />

Gli integrali <strong>degli</strong> altri termini del polinomio p(x) portano alla formula <strong>di</strong> Cavalieri-Simpson.<br />

(omettendo i passaggi matematici) si ha<br />

Infatti<br />

∫ t<br />

−t<br />

(<br />

f (−t) +<br />

f (0) − f (−t) f (−t) − f (0)<br />

(x + t) +<br />

t<br />

t 2 (x + t)x +<br />

= 2t (f (−t) + 4f (0) + f (t))<br />

6<br />

f (t) − f (−t)<br />

2t 3 (x + t)x 2 )<br />

d x =<br />

Allora l’errore della formula <strong>di</strong> Cavalieri-Simpson coincide con l’integrale <strong>di</strong> E(x).<br />

Quin<strong>di</strong> E i nt = ∫ t f (IV ) (ξ x )<br />

−t<br />

(x + t)x 2 (x − t)d x<br />

4!<br />

La funzione (x + t)x 2 (x − t) = (x 2 − t 2 )x 2 non cambia mai segno all’interno dell’intervallo [−t, t], quin<strong>di</strong> si<br />

può applicare il teorema del Valore Me<strong>di</strong>o del calcolo integrale, per cui<br />

E i nt = f (IV ) (ξ)<br />

24<br />

∫ t<br />

−t<br />

(x 2 − t 2 )x 2 d x = f (IV ) [<br />

(ξ) x<br />

5<br />

] t<br />

24 5 − t 2 x3<br />

3 −t<br />

Considerando che l’ampiezza dell’intervallo è h = 2t si ha<br />

E i nt = − f (IV ) (ξ)<br />

( h 90 2 )5 = − f (IV ) (ξ)<br />

2880 h5<br />

Troviamo la formula dell’errore per Cavalieri-Simpson.<br />

= − f (IV ) (ξ)<br />

t 5<br />

90<br />

10.4 Formule composte<br />

Le formule <strong>di</strong> Newton-Cotes non vanno bene su intervalli molto ampi perchè per avere risultati più accurati<br />

dovremmo utilizzare formule <strong>di</strong> grado elevato (in modo da utilizzare un numero elevato <strong>di</strong> punti <strong>di</strong><br />

appoggio). Ci sono vari motivi che sconsigliano questa procedura:<br />

G i valori dei coefficienti in formule <strong>di</strong> grado elevato sono <strong>di</strong>fficili da ottenere;<br />

G le formule <strong>di</strong> Newton-Cotes, essendo basate su polinomi <strong>di</strong> interpolazione con no<strong>di</strong> equi<strong>di</strong>stanti,<br />

danno risultati inaccurati su intervalli ampi a causa della natura oscillatoria dei polinomi <strong>di</strong> grado<br />

elevato.<br />

Conviene dunque utilizzare formule <strong>di</strong> grado basso ma scomponendo l’intervallo <strong>di</strong> integrazione in più<br />

sottointervalli e, in ciascuno <strong>di</strong> essi, applicare la stessa formula.<br />

Sfruttiamo il fatto che se l’intervallo [a,b] viene <strong>di</strong>viso in n sottointervalli in modo che [a,b] = [a, x 1 ] ∪<br />

[x 1 , x 2 ] ∪ [x 2 , x 3 ] ∪ ... ∪ [x n−1 ,b], allora<br />

∫ b<br />

a<br />

∫ x1<br />

∫ x2<br />

∫ x3<br />

∫ b<br />

f (x)d x = f (x)d x + f (x)d x + f (x)d x + ... + f (x)d x<br />

a<br />

x 1 x 2 x n−1<br />

Su ciascuno intervallo [x i−1 , x i ] per i = 1,2,...,n, approssimiamo l’integrale della f me<strong>di</strong>ante una formula<br />

<strong>di</strong> quadratura più semplice, utilizzando pochi punti.<br />

10.4.1 Formula composta dei trapezi<br />

Sud<strong>di</strong>vi<strong>di</strong>amo l’intervallo [a,b] in n sottointervalli definiti dai punti d’appoggio x 0 , x 1 ,..., x n (per semplicità<br />

supponiamo i punti equi<strong>di</strong>stanti con passo h = b − a<br />

n , in modo che x 0 = a e x n = b, x i = x 0 + i h,<br />

i = 0,...,n).<br />

L’integrale su [a,b] si può dunque ottenere come somma <strong>degli</strong> integrali su tali sottointervalli:<br />

148<br />

∫ b<br />

a<br />

f (x)d x =<br />

n∑<br />

i=1<br />

∫ xi<br />

x i−1<br />

f (x)d x


10.4. Formule composte<br />

Figura 10.3: Formula composta dei trapezi, utilizzando 3 sottointervalli (4 punti).<br />

Ciascuno <strong>degli</strong> integrali su [x i−1 , x i ] viene approssimato utilizzando la formula dei trapezi:<br />

n∑<br />

i=1<br />

∫ xi<br />

x i−1<br />

f (x)d x ≈<br />

In forma estesa abbiamo<br />

n∑<br />

i=1<br />

x i − x i−1<br />

2<br />

[f (x i−1 ) + f (x i )] =<br />

n∑<br />

i=1<br />

I ≈ h 2 [f (x 0) + 2f (x 1 ) + 2f (x 2 ) + ... + 2f (x n−1 ) + f (x n )]<br />

f (a) + f (b)<br />

= h[ + f (x 1 ) + f (x 2 ) + ... f (x n−1 )]<br />

2<br />

h<br />

2 [f (x i−1) + f (x i )]<br />

L’errore che si commette è dato dalla somma <strong>degli</strong> errori commessi sui singoli sottointervalli<br />

E i nt =<br />

n∑<br />

i=1<br />

−f ′′ (ξ i ) h3<br />

12<br />

Supponendo che la derivata seconda della f sia continua e limitata in [a,b] e chiamando con m e M<br />

rispettivamente il minimo e il massimo <strong>di</strong> f ′′ in [a,b], si ha:<br />

m ≤ f ′′ (ξ i ) ≤ M<br />

i = 1,...,n<br />

Considerando la somma <strong>di</strong> queste <strong>di</strong>seguaglianze, per i = 1,...,n si ricava<br />

∑<br />

n∑<br />

n<br />

nm ≤ f ′′ i=1<br />

(ξ i ) ≤ nM =⇒ m ≤<br />

f ′′ (ξ i )<br />

≤ M<br />

i=1<br />

n<br />

∑ n<br />

i=1<br />

Per il teorema del Valor Interme<strong>di</strong>o (teorema 2.5.3),<br />

f ′′ (ξ i )<br />

è un valore assunto dalla funzione in<br />

n<br />

qualche punto u <strong>di</strong> [a,b].<br />

Applicando la relazione h = b − a , l’errore <strong>di</strong>venta<br />

n<br />

n∑<br />

E i nt = −f ′′ (ξ i ) h3<br />

i=1<br />

12 = −n f ′′ (ξ) h3<br />

12 = − f ′′ (ξ)<br />

12 (b − a)h2 = − f ′′ (ξ) (b − a) 3<br />

12 n 2 149


10. INTEGRAZIONE NUMERICA<br />

Quin<strong>di</strong> per n → ∞ l’errore tende a zero come h 2 o, equivalentemente, come 1 n 2 .<br />

Formula composta <strong>di</strong> Cavalieri-Simpson<br />

Sud<strong>di</strong>vi<strong>di</strong>amo l’intervallo [a,b] in n sottointervalli <strong>di</strong> ampiezza costante uguale a h e su ciascuno <strong>di</strong> questi<br />

sottointervalli applichiamo la formula <strong>di</strong> Cavalieri-Simpson. Abbiamo, in questo modo, la formula composta<br />

<strong>di</strong> Cavalieri-Simpson.<br />

Su ogni intervallino, quin<strong>di</strong>, dobbiamo considerare gli estremi dell’intervallino e il punto centrale <strong>di</strong> esso.<br />

Siano a i e b i gli estremi <strong>di</strong> ciascuna sud<strong>di</strong>visione e sia c i = a i + b i<br />

il punto me<strong>di</strong>o <strong>di</strong> ciascuna sud<strong>di</strong>visione<br />

2<br />

(quin<strong>di</strong> per i = 1,...,n). L’estremo superiore b i <strong>di</strong> ciascun intervallino, con i = 1,n − 1 coincide con l’estremo<br />

inferiore dell’intervallino successivo: b i = a i+1 . In tal modo, seguendo lo stesso ragionamento fatto per i<br />

trapezi si ha:<br />

∫ b<br />

a<br />

∫ b1<br />

∫ b2<br />

∫ bn<br />

f (x)d x = f (x)d x + f (x)d x + ... + f (x)d x<br />

a 1 a 2 a n<br />

Applicando la formula <strong>di</strong> Cavalieri-Simpson su ciascun intervallino risulta:<br />

∫ bi<br />

a i<br />

In tal modo<br />

∫ b<br />

a<br />

f (x)d x ≈ b i − a i<br />

6<br />

f (x)d x ≈<br />

(<br />

f (ai ) + 4f (c i ) + f (b i ) ) = h 6<br />

n∑ h (<br />

f (ai ) + 4f (c i ) + f (b i ) )<br />

i=1<br />

6<br />

Si ha la formula composta <strong>di</strong> Cavalieri-Simpson.<br />

(<br />

f (ai ) + 4f (c i ) + f (b i ) )<br />

Figura 10.4: Formula composta <strong>di</strong> Cavalieri-Simpson, utilizzando 3 sottointervalli (7 punti).<br />

150


10.4. Formule composte<br />

Possiamo vedere la formula composta <strong>di</strong> Cavalieri-Simpson anche in una forma compatta.<br />

Considerando che, su ogni sottointervallo, dobbiamo prendere il punto me<strong>di</strong>o,<br />

facciamo una numerazione progressiva dei punti <strong>di</strong> integrazione nel modo seguente:<br />

x 0 = a<br />

x 2i = x 0 + i h<br />

i = 0,...n no<strong>di</strong> estremi dei sottointervalli<br />

x 2i+1 = x 0 + (i + 1 2 )h<br />

i = 0,...,n − 1 no<strong>di</strong> centrali dei sottointervalli<br />

∫ b<br />

I = f (x)d x =<br />

a<br />

Quin<strong>di</strong> i no<strong>di</strong> pari corrispondono agli estremi dei sottointervalli, mentre i no<strong>di</strong> <strong>di</strong>spari<br />

sono i punti centrali <strong>di</strong> ogni sottointervallo. Per la formula <strong>di</strong> quadratura otteniamo<br />

n−1 ∑<br />

i=0<br />

i=0<br />

∫ x2i+2<br />

x 2i<br />

f (x)d x<br />

n−1 ∑ h<br />

≈<br />

6 [f (x 2i ) + 4f (x 2i+1 ) + f (x 2i+2 )]<br />

= h 6 [f (x 0) + 4f (x 1 ) + 2f (x 2 ) + 4f (x 3 ) + ... + 2f (x 2n−2 ) + 4f (x 2n−1 ) + f (x 2n )]<br />

= h n−1<br />

6 [f (x ∑<br />

n−1 ∑<br />

0) + 4 f (x 2i+1 ) + 2 f (x 2i ) + f (x 2n )]<br />

i=0<br />

Per quanto riguarda l’errore, facendo la somma <strong>degli</strong> errori <strong>di</strong> integrazione sugli n sottointervalli,<br />

nell’ipotesi che la derivata quarta sia continua e limitata, si ha 3 :<br />

E i nt = − 1 ( ) h 5<br />

(f IV (ξ 1 ) + f IV (ξ 2 ) + ... + f IV (ξ n ))<br />

90 2<br />

= − h5 n−1 ∑<br />

f IV (b − a)5<br />

n−1 ∑<br />

(ξ i ) = −<br />

2880<br />

2880n 5 f IV (ξ i )<br />

i=0<br />

i=0<br />

i=0<br />

Si considera quin<strong>di</strong> il punto ξ tale che 4<br />

f IV (ξ) = 1 n<br />

n∑<br />

f IV (ξ i )<br />

i=1<br />

(b − a)5<br />

E i nt = −<br />

2880n 4 f IV (b − a)h4<br />

(ξ) = − f IV (ξ)<br />

2880<br />

Quin<strong>di</strong> per n → ∞ l’errore tende a zero come<br />

1 n 4 o, equivalentemente, come h4 . Nella formula dei trapezi<br />

l’errore invece decresce come<br />

1 . Ci aspettiamo quin<strong>di</strong> che il maggiore sforzo computazionale <strong>di</strong>a una<br />

n2 maggiore accuratezza nei risultati quando si applica la formula <strong>di</strong> Cavalieri-Simpson rispetto alla formula dei<br />

trapezi.<br />

3 Ricor<strong>di</strong>amo che h = b − a<br />

n .<br />

4 Si ripete lo stesso ragionamento fatto sulla derivata seconda nella formula composta dei trapezi, questa volta però sulla derivata<br />

quarta. Per esercizio, si consiglia <strong>di</strong> ripetere tutti i passaggi per arrivare al risultato.<br />

151


10. INTEGRAZIONE NUMERICA<br />

10.4.2 Confronti tra la formula dei trapezi e <strong>di</strong> Cavalieri-Simpson<br />

Esempio<br />

Esempio 10.4.1 Consideriamo f (x) = e x . Sia a = 0 e b = 1.<br />

Allora, per l’integrale esatto e per le formule dei trapezi e <strong>di</strong> Cavalieri-Simpson, si ha, rispettivamente:<br />

I =<br />

∫ 1<br />

0<br />

e x d x = [ e x] 1<br />

0 = e − 1 = 1.718281828<br />

I tr ap = 1 (1 + e) = 1.859140914<br />

2<br />

I C−S = 1 6 (1 + 4e1/2 + e) = 1 (1 + 6.594885083 + 2.718281828) = 1.718861152<br />

6<br />

La formula <strong>di</strong> Cavalieri-Simpson dà il risultato migliore.<br />

Sia ancora f (x) = e x ma gli estremi <strong>di</strong> integrazione siano a = 0.9 e b = 1. Allora<br />

∫ 1<br />

I = e x d x = e − e 0.9 = 0.2586787173<br />

0.9<br />

I − I tr ap = I − 0.1<br />

2 (e0.9 + e) = −2.2 × 10 −4<br />

I − I C−S = I − 0.1<br />

6 (e0.9 + 4e 0.95 + e) = −9.0 × 10 −9<br />

Ora la formula <strong>di</strong> Cavalieri-Simpson si rivela particolarmente accurata. Ciò non deve sorprendere se si<br />

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<br />

da 1 vale ora 10 −5 .<br />

Considerato che f ′′ = f e f IV = f , queste derivate possono essere maggiorate dal valore assunto nell’estremo<br />

superiore dell’intervallo, cioè e. Quin<strong>di</strong> gli errori delle formule dei trapezi e <strong>di</strong> Cavalieri-Simpson<br />

sono maggiorate da<br />

|E tr ap | ≤ e<br />

12 (b − a)3 = 2.265 × 10 −1 (b − a) 3<br />

|E C−S | ≤ e<br />

2880 (b − a)5 = 9.438 × 10 −4 (b − a) 5<br />

Perciò per a = 0 e b = 1 gli errori sono maggiorati da<br />

|E tr ap | = 2.265 × 10 −1<br />

|E C−S | = 9.438 × 10 −4<br />

Invece per a = 0.9 e b = 1, poichè b − a = 0.1 = 10 −1 , abbiamo<br />

|E tr ap | = 2.265 × 10 −1 · 10 −3 = 2.265 × 10 −4<br />

|E C−S | = 9.438 × 10 −4 · 10 −5 = 9.438 × 10 −9<br />

152


10.4. Formule composte<br />

Esempio<br />

Esempio 10.4.2 Si voglia approssimare l’integrale a<br />

∫ 1<br />

0<br />

e −x2 d x ≈ 0.746824.<br />

Sud<strong>di</strong>vi<strong>di</strong>amo l’intervallo [0,1] in 4 sottointervalli. Sia h = 1/4 = 0.25. Per la formula composta dei<br />

trapezi abbiamo<br />

I tr ap = h 2 [e0 + 2e −h2 + 2e −(2h)2 + 2e −(3h)2 + e −(4h)2 ]<br />

= 0.125[1 + 2e −0.1252 + 2e −0.52 + 2e −0.752 + e −1 ]<br />

= 0.742984<br />

Applichiamo ora la formula <strong>di</strong> Cavalieri-Simpson su soli 2 sottointervalli, in modo da valutare la<br />

funzione negli stessi punti precedenti. L’ampiezza <strong>di</strong> ciascun sottointervallo è dunque h = 0.5.<br />

I C−S = h 6 [e0 + 4e −(h/2)2 + 2e −(h)2 + 4e −( 3 2 h)2 + e −(2h)2 ]<br />

= 0.25<br />

3 [1 + 4e−0.1252 + 2e −0.52 + 4e −0.752 + e −1 ]<br />

= 0.746855<br />

A parità <strong>di</strong> punti (e non <strong>di</strong> sottointervalli) la formula <strong>di</strong> Cavalieri-Simpson è più accurata <strong>di</strong> quella dei<br />

trapezi.<br />

Invece considerando 4 sottointervalli nella formula <strong>di</strong> Cavalieri-Simpson dobbiamo considerare anche<br />

i punti interni <strong>di</strong> ascisse 0.125, 0.375, 0.625, 0.875 e il risultato che otteniamo è 0.746826, evidentemente<br />

maggiormente accurato.<br />

a È un integrale che non può essere risolto analiticamente.<br />

Se si vuole calcolare una sua approssimazione senza<br />

fare uso <strong>di</strong> formule <strong>di</strong> quadrature, possiamo, ad esempio, pensare <strong>di</strong> applicare la definizione <strong>di</strong> integrale ∫ b<br />

a f (x)d x =<br />

∑<br />

lim n n→∞ f (a + i h(n)) · h(n), con h(n) = (b − a)/n, e considerare come approssimazione dell’integrale la somma parziale<br />

∑ i=0<br />

n<br />

i=0 f (a + i h(n)) · h(n) con un valore <strong>di</strong> n molto grande. Per esempio, con n = 107 otteniamo il valore 0.74682420125254.<br />

Esempio<br />

Esempio 10.4.3 Ripren<strong>di</strong>amo l’esempio visto all’inizio del Capitolo, in cui è misurata la velocità <strong>di</strong><br />

un’automobile ogni 6 secon<strong>di</strong> e si vuole calcolare la lunghezza percorsa dalla macchina.<br />

In base ai dati in possesso, possiamo applicare la formula composta dei trapezi su 14 intervalli <strong>di</strong><br />

ampiezza h = 6 secon<strong>di</strong>. Abbiamo (ponendo v 1 = v(0), v 2 = v(6), . . . , v 13 = v(78), v 14 = v(84)):<br />

( v1 + v<br />

) 14<br />

L = 6 + v 2 + v 3 + ... + v 13 = 3009 metri<br />

2<br />

Possiamo anche applicare la formula <strong>di</strong> Cavalieri-Simpson, considerando ora 7 intervalli <strong>di</strong> ampiezza<br />

pari a h = 12 secon<strong>di</strong>. In tal caso, otteniamo:<br />

L = 2(v 1 + 4v 2 + 2v 3 + 4v 4 + 2v 5 + ... + 2v 12 + 4v 13 + v 14 ) = 3010 metri<br />

In questo caso entrambi i risultati sono accettabili.<br />

Se la funzione integranda ha le derivate che sono facili da determinare e da maggiorare, la formula dell’errore<br />

può essere utile per determinare il numero <strong>di</strong> sottointervalli su cui applicare una formula composta<br />

<strong>di</strong> quadratura in modo da ottenere un’approssimazione con un errore minore <strong>di</strong> una tolleranza prefissata.<br />

153


10. INTEGRAZIONE NUMERICA<br />

Esempio<br />

Esempio 10.4.4 Consideriamo ∫ 1<br />

0 e−x2 d x. In quanti sottointervalli bisogna sud<strong>di</strong>videre l’intervallo <strong>di</strong><br />

integrazione per applicare la formula dei trapezi e <strong>di</strong> Cavalieri-Simpson e ottenere un errore che sia<br />

minore <strong>di</strong> una tolleranza ɛ = 10 −5 <br />

Per i trapezi, l’errore è maggiorato da<br />

|E tr ap | ≤ max 0≤x≤1 |f ′′ (x)| (b − a) 3<br />

12<br />

n 2<br />

Per Cavalieri-Simpson si ha<br />

|E C−S | ≤ max 0≤x≤1 |f IV (x)| (b − a) 5<br />

2880 n 4<br />

Da f (x) = e −x2 abbiamo, per le derivate:<br />

f ′ (x) = −2xe −x2<br />

f ′′ (x) = (−2 + 4x 2 )e −x2<br />

f ′′′ (x) = (12x − 8x 3 )e −x2<br />

f IV (x) = (12 − 48x 2 + 16x 4 )e −x2<br />

Si trova che il massimo <strong>di</strong> |f ′′ | e |f IV | in [0,1] è dato dal loro valore in x = 0, quin<strong>di</strong> abbiamo:<br />

|E tr ap | ≤ 2<br />

12n 2 = 1<br />

6n 2 |E C−S | ≤ 12<br />

2880n 4 = 1<br />

240n 4<br />

La richiesta dell’accuratezza per l’errore <strong>di</strong>venta:<br />

|E tr ap | ≤ 10 −5 |E C−S | ≤ 10 −5<br />

vale a <strong>di</strong>re, rispettivamente,<br />

1<br />

6n 2 ≤ 10−5 1<br />

240n 4 ≤ 10−5<br />

Per i trapezi, il primo intero n che verifica la <strong>di</strong>suguaglianza è n = 130, per Cavalieri-Simpson si ha,<br />

invece, n = 5.<br />

Applicando le formule su 130 intervalli per i trapezi e su 5 intervalli per Cavalieri-Simpson, otteniamo i<br />

risultati:<br />

I tr ap = 0.74682050480289 I C−S = 0.7468249482544<br />

154


10.5. Estrapolazione <strong>di</strong> Richardson<br />

10.5 Estrapolazione <strong>di</strong> Richardson<br />

Applichiamo la formula <strong>di</strong> Cavalieri-Simpson sull’intero intervallo [a,b]. L’errore che si commette, come<br />

sappiamo, vale<br />

E 1 = − f IV (ξ 1 )<br />

90<br />

( ) b − a 5<br />

= − f IV (ξ 1 )<br />

(b − a)5<br />

2 2880<br />

Sud<strong>di</strong>vi<strong>di</strong>amo ora l’intervallo [a,b] in due sottointervalli e applichiamo la formula composta <strong>di</strong> Cavalieri-<br />

Simpson. L’errore che otteniamo vale<br />

E 2 = − f IV (ξ 2 ) (b − a) 5<br />

2880 2 4<br />

e, supponendo che le derivate quarte della f non siano molto <strong>di</strong>verse tra loro, si ha E 2 ≈ E 1<br />

16 .<br />

L’errore, quin<strong>di</strong>, <strong>di</strong>venta 16 volte più piccolo passando dalla formula <strong>di</strong> Cavalieri-Simpson in un intervallo<br />

alla formula applicata in due sottointervalli.<br />

Sia I il valore esatto dell’integrale e Q 1 e Q 2 i due valori approssimati ottenuti considerando la formula<br />

<strong>di</strong> Cavalieri-Simpson con n = 1 e n = 2 sottointervalli. Sia ɛ l’errore, cambiato <strong>di</strong> segno, che si ha con n = 2,<br />

ɛ = −E 2 ≈ −E 1 /16. Possiamo scrivere<br />

I + ɛ = Q 2 per n = 2<br />

I + 16ɛ = Q 1 per n = 1<br />

Si può ricavare ɛ dalle due relazioni ottenendo<br />

Quin<strong>di</strong><br />

ɛ = Q 1 −Q 2<br />

15<br />

I ≈ Q 2 + Q 2 −Q 1<br />

15<br />

Utilizzando le due approssimazioni Q 1 e Q 2 possiamo approssimare l’integrale esatto con una maggiore accuratezza<br />

me<strong>di</strong>ante la formula appena scritta. Questo proce<strong>di</strong>mento prende il nome <strong>di</strong> estrapolazione <strong>di</strong><br />

Richardson. Può essere utilizzato per migliorare l’approssimazione <strong>di</strong> un integrale ma è basato sull’ipotesi<br />

che le derivate quarte della funzione integranda siano circa uguali e, quin<strong>di</strong>, va usato con cautela.<br />

10.6 Approssimazione <strong>di</strong> Romberg<br />

Ripetendo lo stesso <strong>di</strong>scorso dell’estrapolazione <strong>di</strong> Richardson a partire dalla formula dei trapezi e in<br />

maniera sistematica, si ha l’approssimazione <strong>di</strong> Romberg.<br />

Supponiamo l’uguaglianza delle derivate seconde della funzione integranda f e sia 2 m il numero <strong>di</strong><br />

sottointervalli in cui sud<strong>di</strong>vi<strong>di</strong>amo il dominio <strong>di</strong> integrazione [a,b].<br />

Applicando la formula dei trapezi su 2 m−1 sottointervalli e, successivamente, su 2 m sottointervalli, l’errore<br />

<strong>di</strong>minuisce come 1/4. Chiamando con A m e A m−1 i risultati della formula dei trapezi rispettivamente su 2 m<br />

e su 2 m−1 sottointervalli e chiamando con ɛ l’errore cambiato <strong>di</strong> segno commesso con 2 m sottointervalli,<br />

abbiamo:<br />

I + ɛ = A m<br />

I + 4ɛ = A m−1<br />

155


10. INTEGRAZIONE NUMERICA<br />

L’integrale può essere dunque migliorato con il valore<br />

B m = A m + A m − A m−1<br />

.<br />

3<br />

Per m = 1 si ha:<br />

A 0 = b − a [f (a) + f (b)] è la formula dei trapezi applicata su un unico intervallo<br />

2<br />

A 1 = b − a<br />

2 [ f (a)<br />

2 + f ( a + b<br />

2 ) + f (b) ] è la formula dei trapezi su 2 sottointervalli<br />

2<br />

B 1 = (b − a)[ f (a) 4f ( a + b<br />

6 + 2 )<br />

6<br />

) + f (b) ] troviamo la formula <strong>di</strong> Cavalieri-Simpson!<br />

6<br />

Si ha dunque che B 1 (e quin<strong>di</strong> ciascun B m ) corrisponde al valore ottenuto con la formula <strong>di</strong> Cavalieri-<br />

Simpson. L’errore ottenuto con B m è dunque proporzionale a 1/n 4 . Nel passo successivo, utilizzando i valori<br />

B m , otteniamo la nuova approssimazione data da<br />

C m = B m + B m − B m−1<br />

15<br />

per m ≥ 2<br />

Si può <strong>di</strong>mostrare che C m coincide con la formula <strong>di</strong> Newton-Cotes con n = 4, dove l’errore è proporzionale<br />

a 1/n 6 e alla derivata sesta <strong>di</strong> f.<br />

La nuova approssimazione è data da:<br />

D m = C m + C m −C m−1<br />

63<br />

per m ≥ 3<br />

L’errore ora <strong>di</strong>venta proporzionale a 1/n 8 ma D m non è più un risultato delle formule <strong>di</strong> Newton-Cotes. Il<br />

proce<strong>di</strong>mento può andare avanti per calcolare E m , F m , etc tenendo presente che al denominatore dobbiamo<br />

mettere il valore 4(d + 1) − 1 dove d è il valore del denominatore della formula precedente.<br />

Il vantaggio dell’approssimazione <strong>di</strong> Romberg si vede solo ai primi livelli dell’applicazione (in particolare<br />

passando da A m a B m ). Inoltre, a causa della precisione finita con cui sono eseguiti i calcoli, le formule <strong>di</strong><br />

Romberg <strong>di</strong> or<strong>di</strong>ne elevato <strong>di</strong>ventano inefficaci se il risultato iniziale A m è già abbastanza accurato rispetto<br />

alla precisione numerica consentita.<br />

10.7 Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss<br />

Consideriamo <strong>di</strong> voler approssimare l’integrale dato da<br />

∫ b<br />

a<br />

f (x)w(x) d x<br />

dove [a,b] può essere finito o infinito (per esempio [−1,1], [0,+∞]). Abbiamo due funzioni, la f (x) e la w(x),<br />

e vogliamo integrare il prodotto <strong>di</strong> queste due funzioni. La funzione w(x), che chiamiamo funzione peso, sia<br />

positiva (w(x) ≥ 0).<br />

Vogliamo trovare dei coefficienti w i , i = 0,...n (detti pesi della formula <strong>di</strong> quadratura) e dei no<strong>di</strong> x i , i =<br />

0,...n (detti no<strong>di</strong> <strong>di</strong> quadratura) nell’intervallo [a,b] in modo da approssimare l’integrale me<strong>di</strong>ante<br />

∫ b<br />

a<br />

f (x)w(x) d x ≈<br />

n∑<br />

w i f (x i )<br />

0=1<br />

Considerando anche l’errore <strong>di</strong> quadratura:<br />

156<br />

∫ b<br />

a<br />

f (x)w(x) d x =<br />

n∑<br />

w i f (x i ) + E i nt (f )<br />

i=0


10.7. Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss<br />

Diremo che la formula <strong>di</strong> quadratura ha un grado <strong>di</strong> precisione (o esattezza) polinomiale d se E i nt (f ) = 0<br />

per tutti i polinomi f fino al grado d (cioè se applichiamo la formula <strong>di</strong> quadratura per approssimare<br />

∫ b<br />

a<br />

f (x)w(x) d x con f polinomio <strong>di</strong> grado d, l’errore è nullo). Osserviamo che ora non stiamo parlando <strong>di</strong><br />

formule <strong>di</strong> quadratura composte quin<strong>di</strong> n non si riferisce a sud<strong>di</strong>visioni dell’intervallo [a,b].<br />

Per le formule <strong>di</strong> Newton-Cotes, si ha w(x) ≡ 1 e si può provare che il grado <strong>di</strong> precisione d è:<br />

d = n per le formule ottenute da polinomi <strong>di</strong> interpolazione <strong>di</strong> grado n <strong>di</strong>spari (come nei Trapezi: n = 1)<br />

G d = n + 1 per le formule ottenute da polinomi <strong>di</strong> interpolazione <strong>di</strong> grado n pari (come in Cavalieri-<br />

Simpson: n = 2)<br />

Diremo che la formula <strong>di</strong> quadratura è interpolatoria se vale d = n . Le formule interpolatorie sono ottenute<br />

per interpolazione, percorrendo la stessa strada che abbiamo visto per le formule <strong>di</strong> Newton-Cotes.<br />

Interpoliamo la funzione f me<strong>di</strong>ante un polinomio <strong>di</strong> grado n, utilizzando i polinomi <strong>di</strong> Lagrange. Nel costruire<br />

i pesi dobbiamo tenere conto anche della funzione w e quin<strong>di</strong> i pesi saranno w i = ∫ b<br />

a L i (x)w(x) d x<br />

dove L i (x) è l’i -simo polinomio <strong>di</strong> Lagrange.<br />

Con questo approccio, e con no<strong>di</strong> equi<strong>di</strong>stanti, la formula <strong>di</strong> quadratura che ricaviamo ha al più grado <strong>di</strong><br />

precisione d = n (o d = n + 1 quando w(x) ≡ 1 e per n pari, come abbiamo visto per le formule <strong>di</strong> Newton-<br />

Cotes).<br />

È possibile ricavare formule <strong>di</strong> quadratura che abbiano un grado <strong>di</strong> precisione d maggiore del grado del<br />

polinomio interpolante E se sì come<br />

A tal fine consideriamo il polinomio dei no<strong>di</strong> F (x) = ∏ n<br />

i=0 (x − x i ), <strong>di</strong> grado n + 1, lo stesso che abbiamo<br />

introdotto nel Capitolo sull’interpolazione.<br />

Vale il seguente teorema.<br />

Teorema 10.7.1 (<strong>di</strong> W. Gautschi) Dato un intero k con 0 < k ≤ n + 1, la formula <strong>di</strong> quadratura<br />

∫ b<br />

a<br />

f (x)w(x) d x =<br />

n∑<br />

w i f (x i ) + E i nt (f )<br />

i=0<br />

ha grado <strong>di</strong> precisione (esattezza) d = n + k se e solo se sono sod<strong>di</strong>sfatte entrambe le con<strong>di</strong>zioni (a) e (b):<br />

(a) la formula è interpolatoria;<br />

(b) il polinomio dei no<strong>di</strong> F (x) sod<strong>di</strong>sfa la relazione ∫ b<br />

a<br />

F (x)p(x)w(x) d x = 0 per ogni polinomio p <strong>di</strong> grado<br />

≤ k − 1.<br />

Osserviamo che la con<strong>di</strong>zione in (b):<br />

G impone k con<strong>di</strong>zioni sui no<strong>di</strong> x 0 , x 1 , x 2 ,... x n . Se fosse k = 0 non ci sarebbero con<strong>di</strong>zioni in più da<br />

considerare e avremmo d = n (cioè esattezza d = n);<br />

G fornisce una relazione <strong>di</strong> ortogonalità: il polinomio F è ortogonale ai polinomi <strong>di</strong> grado ≤ k −1 rispetto<br />

alla funzione peso w. 5<br />

Nel caso specifico, il punto (b) <strong>di</strong>ce che:<br />

∫ b<br />

a<br />

∫ b<br />

a<br />

∫ b<br />

a<br />

∫ b<br />

a<br />

F (x)w(x) d x = 0<br />

xF (x)w(x) d x = 0<br />

x 2 F (x)w(x) d x = 0<br />

.<br />

x k−1 F (x)w(x) d x = 0<br />

5 Per definizione, infatti, due funzioni u e v si <strong>di</strong>cono ortogonali rispetto alla funzione peso w (positiva), se ∫ b<br />

a u(x)v(x)w(x) d x = 0.<br />

157


10. INTEGRAZIONE NUMERICA<br />

G fa sì che k non possa essere maggiore o uguale a n + 2. Se fosse infatti k = n + 2, il punto (b) sarebbe:<br />

(b) il polinomio dei no<strong>di</strong> F (x) sod<strong>di</strong>sfa la relazione ∫ b<br />

a<br />

F (x)p(x)w(x)d x = 0 per ogni polinomio p <strong>di</strong><br />

grado ≤ k − 1 = n + 1.<br />

Allora, si potrebbe prendere come polinomio p(x) esattamente F (x) (che ha grado n + 1) e, per la<br />

(b) sarebbe ∫ b<br />

a (F (x))2 w(x)d x = 0: ma questo è un assurdo perchè l’integrale <strong>di</strong> una funzione positiva<br />

non può essere nullo, e, nel nostro caso, w(x) è positiva e (F (x)) 2 , essendo il quadrato <strong>di</strong> un polinomio,<br />

è pure essa una funzione positiva.<br />

Il caso ottimale (il più alto grado <strong>di</strong> precisione che si può ottenere), si ha per k uguale al valore massimo che<br />

può assumere, vale a <strong>di</strong>re k = n + 1. In tal caso d = n + k = n + n + 1 = 2n + 1. Si hanno le cosiddette formule<br />

<strong>di</strong> Gauss.<br />

A seconda della scelta della funzione peso w e dell’intervallo [a,b] abbiamo <strong>di</strong>verse formule <strong>di</strong> Gauss.<br />

Dimostrazione.<br />

[del teorema <strong>di</strong> W. Gautschi]<br />

Dimostriamo che se d = n + k allora sono vere la (a) e la (b) (necessità). Essendo d =<br />

n + k la formula è esatta anche per polinomi <strong>di</strong> grado n: abbiamo <strong>di</strong>mostrato il punto<br />

(a).<br />

Se p è un polinomio <strong>di</strong> grado al più k − 1, allora F (x)p(x) è un polinomio (perchè<br />

prodotto <strong>di</strong> due polinomi) <strong>di</strong> grado al più n + 1 + k − 1 = n + k. Applichiamo a questo<br />

polinomio prodotto la formula <strong>di</strong> quadratura (che è esatta valendo l’ipotesi che d = n + k, quin<strong>di</strong><br />

E i nt (F (x)p(x)) = 0). Quin<strong>di</strong><br />

∫ b<br />

a<br />

F (x)p(x)w(x) d x =<br />

n∑<br />

F (x i )p(x i )w i .<br />

i=0<br />

Ma F (x i ) = 0 essendo F il polinomio dei no<strong>di</strong>. Perciò ∑ n<br />

i=0 F (x i )p(x i )w i = 0 Di conseguenza<br />

∫ b<br />

a F (x)p(x)w(x) d x = ∑ n<br />

i=0 F (x i )p(x i )w i = 0 e quin<strong>di</strong> il punto (b) è provato.<br />

Supponiamo ora che siano vere le con<strong>di</strong>zioni (a) e (b) e <strong>di</strong>mostriamo che d = n + k (sufficienza). Sia<br />

p un polinomio <strong>di</strong> grado n + k. Dobbiamo provare che E i nt (p) = 0. Divi<strong>di</strong>amo il polinomio p per il<br />

polinomio F : possiamo scrivere p(x) = F (x)q(x) + r (x) dove q(x) (quoziente) è un polinomio <strong>di</strong> grado<br />

k − 1 e r (x) (resto) è un polinomio <strong>di</strong> grado n. Nel fare l’integrale, abbiamo<br />

∫ b<br />

a<br />

p(x)w(x) d x =<br />

∫ b<br />

a<br />

q(x)F (x)w(x) d x +<br />

∫ b<br />

a<br />

r (x)w(x) d x<br />

Il primo integrale a secondo membro vale zero a motivo dell’ipotesi (b) (q(x) è un polinomio <strong>di</strong> grado<br />

k − 1 e quin<strong>di</strong> quell’integrale è zero). Il secondo integrale, invece, per la (a) può essere calcolato esattamente<br />

andando ad applicare la formula <strong>di</strong> quadratura (essendo r <strong>di</strong> grado n ed essendo la formula<br />

interpolatoria si ha E i nt (r ) = 0 ). Si ha<br />

∫ b<br />

a<br />

p(x)w(x) d x =<br />

∫ b<br />

a<br />

r (x)w(x) d x =<br />

n∑<br />

r (x i )w i<br />

Ma r (x i ) = p(x i ) − q(x i )F (x i ) = p(x i ) (essendo F (x i ) = 0). Quin<strong>di</strong><br />

∫ b<br />

a<br />

p(x)w(x) d x =<br />

∫ b<br />

a<br />

r (x)w(x) d x =<br />

i=0<br />

n∑<br />

p(x i )w i<br />

L’errore è dunque zero e la <strong>di</strong>mostrazione è completata. ✔<br />

i=1<br />

Da un punto <strong>di</strong> vista teorico la con<strong>di</strong>zione (a) del teorema permette <strong>di</strong> calcolare i pesi delle formule <strong>di</strong><br />

Gauss: essendo la formula interpolatoria si ha w i = ∫ b<br />

a L i (x)w(x) d x.<br />

La con<strong>di</strong>zione (b) permette <strong>di</strong> calcolare i no<strong>di</strong> x i della formula (imponendo l’ortogonalità tra F (x) e i<br />

polinomi <strong>di</strong> grado k = 0,1,2,...,n si ricava un sistema <strong>di</strong> n + 1 equazioni nelle incognite dei coefficien-<br />

158


10.7. Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss<br />

ti del polinomio F (x). Una volta trovato il polinomio F (x) ricaviamo le ra<strong>di</strong>ci, che sono appunti i no<strong>di</strong> <strong>di</strong><br />

integrazione 6 .<br />

10.7.1 Proprietà delle formule <strong>di</strong> Gauss<br />

Scriviamo le formule <strong>di</strong> Gauss con la notazione<br />

∫ b<br />

a<br />

f (x)w(x) d x =<br />

n∑<br />

w i f (x i ) + E G i nt (f )<br />

i=0<br />

Si ha E G (f ) ≡ 0 per f polinomio <strong>di</strong> grado ≤ 2n + 1<br />

i nt I no<strong>di</strong> x i sono reali, <strong>di</strong>stinti e contenuti nell’intervallo aperto ]a,b[.<br />

G I pesi w i sono tutti positivi.<br />

Infatti, per j = 0,1,...n si ha 0 < ∫ b<br />

a (L j (x)) 2 w(x) d x = ∑ n<br />

i=0 w i (L j (x i )) 2<br />

(l’errore è nullo perchè (L j (x)) 2 è un polinomio <strong>di</strong> grado 2n). Ma L j (x i ) = 0 se i ≠ j e L j (x i ) = 1 se i = j .<br />

Quin<strong>di</strong> ∑ n<br />

i=0 w i (L j (x i )) 2 = w j . Abbiamo provato che i pesi sono positivi.<br />

Le formule <strong>di</strong> Gauss si possono ricavare me<strong>di</strong>ante interpolazione (detta <strong>di</strong> Hermite) sui no<strong>di</strong> x i contati<br />

ciascuno come nodo doppio nel senso che su ciascun nodo imponiamo la con<strong>di</strong>zione <strong>di</strong> interpolazione non<br />

solo sulla f ma anche sulla derivata prima della f . Una volta che abbiamo ricavato il polinomio <strong>di</strong> interpolazione<br />

p(x) (che interpola quin<strong>di</strong> per ogni nodo sia la f sia la f ′ ) e approssimato ∫ b<br />

f (x)w(x) d x me<strong>di</strong>ante<br />

∫ b<br />

a<br />

p(x)w(x) d x, dalla formula che ricaviamo imponiamo che i termini che contengono la derivata prima<br />

siano uguali a zero (questa osservazione è dovuta a Markov, matematico russo, nel 1885).<br />

La formula che otteniamo (considerando che il polinomio interpola la f e la f ′ ) avrà termini del tipo:<br />

∫ b<br />

a f (x)w(x) d x = ∑ n<br />

i=0 w i f (x i ) + ∑ n<br />

i=0 C i f ′ (x i ) + E G i nt (x)<br />

Imponendo C i = 0 i = 0,1,2,...n, otteniamo n + 1 con<strong>di</strong>zioni che ci permettono <strong>di</strong> ricavare i valori <strong>di</strong> x i (i<br />

no<strong>di</strong> <strong>di</strong> integrazione della formula). Possiamo poi ricavare il valore dei pesi w i (che <strong>di</strong>pendono a loro volta dai<br />

no<strong>di</strong>). Nel procedere con l’interpolazione sui valori della f e della f ′ , l’errore del polinomio <strong>di</strong> interpolazione<br />

si può scrivere come E = (F (x)) 2 f (2(n+1)) (ξ x )<br />

(poichè ogni nodo è contato due volte, e supponendo che la f<br />

(2(n + 1))!<br />

sia derivabile 2(n + 1) volte e sia continua).<br />

Di conseguenza, l’errore nella formula <strong>di</strong> integrazione (applicando il teorema del Valor Me<strong>di</strong>o in quanto<br />

(F (x)) 2 w(x) non cambia segno nell’intervallo <strong>di</strong> integrazione) si può scrivere come E G i nt<br />

E G i nt (x) = f (2(n+1)) (ξ)<br />

(2(n + 1))!<br />

∫ b<br />

a<br />

(F (x)) 2 w(x) d x<br />

10.7.2 Formule <strong>di</strong> Gauss-Legendre<br />

A seconda della funzione peso, si ha una particolare formula <strong>di</strong> Gauss.<br />

In genere i no<strong>di</strong> <strong>di</strong> integrazione sono calcolati su intervalli “canonici” (spetta a noi fare il cambio <strong>di</strong><br />

variabili se l’integrale è da farsi su altri intervalli).<br />

Per w(x) ≡ 1 e [a,b] ≡ [−1,1] si ha la formula <strong>di</strong> Gauss-Legendre.<br />

I no<strong>di</strong> della formula <strong>di</strong> quadratura, sono le ra<strong>di</strong>ci dei cosiddetti polinomi <strong>di</strong> Legendre.<br />

6 Ricor<strong>di</strong>amo che un polinomio <strong>di</strong> grado n + 1 lo possiamo scrivere come a n+1 x n+1 + a n x n + ··· + a 0 ma possiamo anche <strong>di</strong>videre<br />

per il coefficiente <strong>di</strong> 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 quin<strong>di</strong> solo n + 1<br />

coefficienti (b 0 , b 1 , . . . , b n ) : le ra<strong>di</strong>ci dei due polinomi non cambiano.<br />

a<br />

159


10. INTEGRAZIONE NUMERICA<br />

Figura 10.5: Funzioni peso per le formule <strong>di</strong> quadratura <strong>di</strong> Gauss-Chebycev <strong>di</strong> prima e seconda specie (a<br />

sinistra e a destra rispettivamente)<br />

Figura 10.6: Funzioni peso per le formule <strong>di</strong> quadratura <strong>di</strong> Gauss-Jacobi (con α = 2 e β = 4) e <strong>di</strong> Gauss-<br />

Laguerre (con α = 2) (a sinistra e a destra rispettivamente)<br />

n + 1 no<strong>di</strong> pesi<br />

2 x 0,1 = ±0.57735026918962576 w 0 = w 1 = 1.0<br />

3 x 0 = −0.77459666924148338 w 0 = 5/9 = 0.5555555556<br />

x 1 = 0 w 1 = 8/9 = 0.8888888889<br />

x 2 = 0.77459666924148338 w 2 = 5/9 = 0.5555555556<br />

4 x 0 = −0.86113631159405257 w 0 = 0.3478548451374538<br />

x 1 = −0.33998104358485626 w 1 = 0.6521451548625461<br />

x 2 = 0.33998104358485626 w 2 = 0.6521451548625461<br />

x 3 = 0.86113631159405257 w 3 = 0.3478548451374538<br />

I polinomi <strong>di</strong> Legendre (e, come essi, anche tutti gli altri polinomi le cui ra<strong>di</strong>ci sono i no<strong>di</strong> delle altre<br />

formule <strong>di</strong> Gauss) hanno la caratteristica <strong>di</strong> essere polinomi mutuamente ortogonali (nel senso che presi<br />

due polinomi <strong>di</strong> Legendre, che chiamiamo ω n (x) e ω m (x), rispettivamente <strong>di</strong> grado n e m, con n ≠ m, si ha<br />

∫ b<br />

a ω n(x)ω m (x)w(x) d x = 0).<br />

I polinomi <strong>di</strong> Legendre (e, come essi, i polinomi delle altre formule <strong>di</strong> Gauss), si ricavano me<strong>di</strong>ante formule<br />

ricorsive, cioè ogni polinomio <strong>di</strong> Legendre <strong>di</strong> grado n è legato (me<strong>di</strong>ante una relazione opportuna) ai<br />

polinomi <strong>di</strong> Legendre <strong>di</strong> grado n − 1 e n − 2.<br />

10.7.3 Altre formule <strong>di</strong> Gauss<br />

1<br />

G Con w(x) = √ e [a,b] = [−1,1] si hanno le formule <strong>di</strong> Gauss-Chebychev (prima specie) in<br />

(1 − x 2 )<br />

quanto i no<strong>di</strong> <strong>di</strong> integrazione sono le ra<strong>di</strong>ci dei cosiddetti polinomi <strong>di</strong> Chebychev <strong>di</strong> prima specie.<br />

G Con w(x) = √ (1 − x 2 ) e [a,b] = [−1,1] si hanno le formule <strong>di</strong> Gauss-Chebychev (seconda specie) in<br />

quanto i no<strong>di</strong> <strong>di</strong> integrazione sono le ra<strong>di</strong>ci dei cosiddetti polinomi <strong>di</strong> Chebychev <strong>di</strong> seconda specie.<br />

G Con w(x) = (1 − x) α (1 + x) β (per α > −1 e β > −1) e [a,b] = [−1,1] si hanno le formule <strong>di</strong> Gauss-Jacobi.<br />

G Con w(x) = x α e −x (per α > −1) e [a,b] = [0,+∞] si hanno le formule <strong>di</strong> Gauss-Laguerre.<br />

G Con w(x) = e −x2 e [a,b] = [−∞,+∞] si hanno le formule <strong>di</strong> Gauss-Hermite.<br />

160


10.7. Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss<br />

Figura 10.7: Funzione peso per le formula <strong>di</strong> quadratura <strong>di</strong> Gauss-Hermite.<br />

10.7.4 Applicazione delle formule<br />

Supponiamo <strong>di</strong> voler approssimare un integrale utilizzando le formule <strong>di</strong> Gauss-Legendre, ma in un<br />

intervallo <strong>di</strong>verso da [−1,1].<br />

Dobbiamo fare un cambio <strong>di</strong> variabili. Da ∫ b<br />

a f (x) d x dobbiamo passare a ∫ 1<br />

−1<br />

f (t) d t.<br />

Poniamo x = b − a<br />

2 t + b + a<br />

2<br />

Per t = −1 si ha x = b − a<br />

2 (−1) + b + a = −b + a + b + a = 2a = a. Quin<strong>di</strong> per t = −1, si ha x = a (il primo<br />

2<br />

2<br />

2<br />

estremo <strong>di</strong> un intervallo viene trasformato nel primo estremo dell’altro intervallo).<br />

Per t = 1 si ha x = b − a<br />

2 (1) + b + a = b − a + b + a = 2b 2<br />

2 2 = b.<br />

Perciò, per t = 1, si ha x = b.<br />

Inoltre d x = b − a d t. Con la trasformazione <strong>di</strong> variabili si ha:<br />

2<br />

∫ b<br />

∫ 1<br />

( b − a<br />

f (x) d x = f<br />

a<br />

−1 2 t + b + a ) b − a<br />

d t<br />

2 2<br />

Applicando la formula <strong>di</strong> Gauss-Legendre<br />

∫ b<br />

a<br />

f (x) d x ≈ b − a<br />

2<br />

n∑<br />

w G i<br />

i=0<br />

f ( b − a<br />

2 x i + b + a<br />

2 )<br />

10.7.5 Sulla funzione peso<br />

Supponiamo <strong>di</strong> voler integrare una funzione g (x) in [a,b] (intervallo finito). Supponiamo che la funzione<br />

integranda g abbia una singolarità algebrica agli estremi (con una certa molteplicità), in modo da poter<br />

scrivere g (x) = f (x)(b − x) α (x − a) β<br />

Adesso, facciamo un cambiamento <strong>di</strong> variabile, da [a,b] a [−1,1], considerando la trasformazione x =<br />

b − a<br />

2 t + b + a<br />

2 .<br />

Si ha (b − x) = b − a<br />

b − a<br />

(1 − t) e (x − a) = (1 + t).<br />

2 2<br />

Allora<br />

∫ b<br />

a g (x) d x = b − a<br />

∫ 1<br />

−1 f ( b − a<br />

) α ( ) b − a β<br />

(1 − t) α (1 + t) β d t<br />

2<br />

2<br />

2 t + b + a ( b − a<br />

2 ) 2<br />

( ) b − a α+β+1<br />

∫ 1<br />

=<br />

−1<br />

2<br />

f ( b − a<br />

2 t + b + a<br />

2 )(1 − t)α (1 + t) β d t<br />

Posso applicare le formule <strong>di</strong> Gauss-Jacobi e “scaricare” sulla funzione peso le singolarità della funzione<br />

<strong>di</strong> partenza.<br />

Sia dato l’integrale ∫ 1<br />

0 f (x)(1 − x)p d x con f regolare e p intero elevato: allora (1 − x) p è una funzione che<br />

ha valori vicini a zero. La funzione da integrare è quasi <strong>di</strong>scontinua e le formule classiche (Trapezi o Cavalieri-<br />

Simpson) non danno buoni risultati. Si può pensare a questo integrale come ad un integrale <strong>di</strong> tipo Jacobi (su<br />

cui applicare la formula <strong>di</strong> Gauss-Jacobi) con α = p e β = 0. Si fa l’opportuno passaggio <strong>di</strong> variabili in modo<br />

161


10. INTEGRAZIONE NUMERICA<br />

da integrare sull’intervallo [−1,1]. La formula <strong>di</strong> Gauss incorpora nella funzione peso la parte che riguarda<br />

(1 − x) p .<br />

10.8 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 10.8.1 Sia dato l’integrale I =<br />

∫ 0<br />

−2<br />

e −x (x + 1) dx.<br />

(a) Approssimare il valore dell’integrale applicando la formula dei trapezi con n = 5 sud<strong>di</strong>visioni in parti<br />

uguali dell’intervallo <strong>di</strong> integrazione.<br />

(b) Trovare una maggiorazione dell’errore commesso e, dopo aver calcolato analiticamente l’integrale<br />

esatto, confrontare tale stima con l’errore esatto.<br />

Svolgimento<br />

(a) Applichiamo la formula dei trapezi con n = 5 sud<strong>di</strong>visioni dell’intervallo dato. Vale, dunque, h = 0.4. I<br />

punti da considerare e il valore della f (x) = e −x (x + 1), sono:<br />

i x i f (x i )<br />

0 -2 -7.3890561<br />

1 -1.6 -2.97181945<br />

2 -1.2 -0.664023385<br />

3 -0.8 0.445108186<br />

4 -0.4 0.895094819<br />

5 0 1<br />

La formula dei trapezi è<br />

I tr ap = h( f (x 0) + f (x 5 )<br />

+ f (x 1 ) + f (x 2 ) + f (x 3 ) + f (x 4 )) = −2.19606715<br />

2<br />

(b) Per calcolare una maggiorazione dell’errore commesso, dobbiamo calcolare la derivata seconda della<br />

f .<br />

Da f (x) = e −x (x + 1) segue f ′ (x) = −e −x (x + 1) + e −x = −e −x x e f ′′ (x) = e −x x − e −x = e −x (x − 1).<br />

Poichè f ′′ (x) è sempre negativa nell’intervallo <strong>di</strong> integrazione e a noi interessa la funzione valore<br />

assoluto della f ′′ (x), stu<strong>di</strong>amo la funzione g (x) = |f ′′ (x)| = e −x (1 − x). Si ha che g ′ (x) = e −x (x − 2) < 0<br />

in [−2,0], quin<strong>di</strong> g è decrescente e ha valore massimo per x = −2. Si ha dunque che M = max|f ′′ (x)| =<br />

|f ′′ (−2)| = 22.1671682968<br />

Quin<strong>di</strong> |E tr ap | ≤ M |(b − a)3 |<br />

12 · 5 2 = 0.591124488<br />

Analiticamente, è facile calcolare l’integrale esatto (per parti):<br />

∫ 0<br />

∫ 0<br />

I = f (x) dx = −e −x (x + 1)| 0 −2 + e −x dx = −e −x (x + 2)| 0 −2 = −2<br />

−2<br />

−2<br />

Quin<strong>di</strong> l’errore esatto, in valore assoluto, è:<br />

maggiorazione trovata prima.<br />

|I − I tr ap | = 0.196067154, un valore minore della<br />

162


10.8. <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 10.8.2 Sia dato l’integrale<br />

∫ 2<br />

2<br />

0 x − 4 d x<br />

(a) Dare una sua approssimazione con la formula dei trapezi e n = 4 sud<strong>di</strong>visioni in parti uguali<br />

dell’intervallo <strong>di</strong> integrazione.<br />

(b) Trovare una maggiorazione dell’errore commesso.<br />

(c) Confrontare l’errore esatto con la stima precedentemente trovata.<br />

(d) Dire in quanti sottointervalli occorre sud<strong>di</strong>videre l’intervallo <strong>di</strong> integrazione per ottenere una<br />

maggiorazione dell’errore minore della tolleranza ɛ = 10 −5 .<br />

Svolgimento<br />

(a) Sud<strong>di</strong>videndo l’intervallo <strong>di</strong> integrazione [0,2] in n = 4 parti si trova un passo h = 2/4 = 1/2 = 0.5.<br />

La formula dei trapezi è:<br />

I T = b − a f (a) + f (b)<br />

( + f (x 1 ) + f (x 2 ) + f (x 3 ))<br />

n 2<br />

f (0) + f (2)<br />

= 0.5( + f (0.5) + f (1) + f (1.5))<br />

2<br />

= 0.5( −0.5 − 1 − 0.571428571 − 0.666666667 − 0.8)<br />

2<br />

= −1.39404762<br />

(b) Consideriamo la formula dell’errore: E = − f ′′ (ξ) (b − a) 3<br />

12 n 2<br />

Da f (x) = 2<br />

x − 4 segue f ′ (x) =<br />

−2<br />

(x − 4) 2 e f ′′ 4<br />

(x) =<br />

(x − 4) 3 .<br />

Per maggiorare l’errore dobbiamo considerare che vale<br />

|E| ≤ max 0≤x≤2 |f ′′ (x)| (b − a) 3<br />

12<br />

n 2 , da cui dobbiamo calcolare M = max 0≤x≤2 |f ′′ (x)|.<br />

La funzione (x −4) 3 4<br />

è continua, crescente e sempre negativa nell’intervallo [0,2]. Quin<strong>di</strong> |<br />

(x − 4) 3 | =<br />

4<br />

(4 − x) 3 : osserviamo il cambiamento al denominatore. Poniamo g (x) = 4<br />

(4 − x) 3 . Risulta g ′ (x) =<br />

12<br />

(4 − x) 4 > in [0,2], quin<strong>di</strong> la g è crescente e ha valore massimo per x = 2. Perciò M = max 0≤x≤2 |f ′′ (x)| =<br />

|f ′′ (2)| = 4 2 3 = 1/2 = 0.5. Si ha allora la maggiorazione dell’errore |E| ≤ M 12<br />

(c) L’integrale esatto si calcola facilmente:<br />

2 3<br />

4 2 = 1<br />

48 = 0.0208333333<br />

∫ 2<br />

I =<br />

0<br />

2<br />

x − 4 d x = 2ln(|x − 4|)|2 0 = 2ln(| − 2|) − 2ln(| − 4|) = 2ln(1/2) = ln(1/4) − 1.386294361<br />

L’errore esatto commesso con la formula dei trapezi, in valore assoluto, è |I − I T | = 0.00775325793<br />

(d) Perchè la maggiorazione dell’errore sia minore della tolleranza ɛ = 10 −5 deve essere |E| ≤ M 12 n 2 ≤ 10−5<br />

cioè n 2 ≥ M 12 23 10 5 = 105<br />

3 = 33333.333333. Quin<strong>di</strong> n > 182.574186, vale a <strong>di</strong>re n = 183. 163<br />

2 3


10. INTEGRAZIONE NUMERICA<br />

<strong>Esercizi</strong>o 10.8.3 Dato l’integrale<br />

∫ 0.5<br />

1<br />

I = d x<br />

1 − x<br />

2<br />

0<br />

(a) si approssimi I con i valori Q 1 e Q 2 ottenuti applicando il metodo <strong>di</strong> Cavalieri-Simpson prima a tutto<br />

l’intervallo e poi sud<strong>di</strong>videndo l’intervallo in due parti uguali;<br />

(b) si approssimi I usando la formula <strong>di</strong> estrapolazione <strong>di</strong> Richardson;<br />

(c) dopo aver calcolato analiticamente il valore esatto <strong>di</strong> I , determinare l’errore esatto commesso con<br />

l’estrapolazione <strong>di</strong> Richardson.<br />

Svolgimento<br />

(a) Applichiamo la formula <strong>di</strong> Cavalieri-Simpson su tutto l’intervallo, considerando che l’ampiezza<br />

dell’intervallo è b − a = 0.5<br />

Q 1 = 0.5 (f (0) + 4f (0.25) + f (0.5)) = 0.523823565<br />

6<br />

Si ha, infatti, f (0) = 1, f (0.25) = 1.03279556 e f (0.5) = 1.15470054.<br />

Sud<strong>di</strong>videndo l’intervallo in due parti uguali, abbiamo h = 0.25, da cui i punti: x 0 = a = 0, x 1 = 0.125,<br />

x 2 = 0.25, x 3 = 0.375, e x 4 = b = 0.5.<br />

Q 2 = h 6 (f (x 0) + 4(f (x 1 ) + 4f (x 3 )) + 2f (x 2 ) + f (x 4 )) = 0.523616326<br />

dove f (0.125) = 1.00790526, f (0.375) = 1.07871978 (essendo già in possesso <strong>degli</strong> altri valori, calcolati<br />

per Q 1 )<br />

(b) La formula <strong>di</strong> estrapolazione <strong>di</strong> Richardson è: I R = Q 2 + Q 2 −Q 1<br />

da cui ricaviamo I R = 0.5236025101<br />

15<br />

(c) Analiticamente l’integrale esatto è:<br />

I =<br />

∫ 0.5<br />

0<br />

1<br />

<br />

1 − x<br />

2 d x = arcsin(x)|0.5 0 = π/6 − 0 = 0.523598775<br />

L’errore esatto commesso con l’estrapolazione <strong>di</strong> Richardson, in valore assoluto, è: |I −I R | = 3.7351·<br />

10 −6 .<br />

<strong>Esercizi</strong>o 10.8.4 Si calcoli I = ∫ 5<br />

2 sin( x) d x utilizzando il metodo <strong>di</strong> Gauss-Legendre con 3 punti <strong>di</strong><br />

appoggio (x 1 = − (3/5), x 2 = 0, x 3 = (3/5); w 1 = w 3 = 5/9, w 1 = 8/9).<br />

Svolgimento<br />

Applichiamo la formula, ricordandoci che dobbiamo utilizzarla non in [2,5] ma in [−1,1]. Considerando<br />

che la trasformazione dall’intervallo [2,5] all’intervallo [−1,1] porta al cambiamento <strong>di</strong> variabili x = b − a<br />

2 t +<br />

b + a<br />

= 5 − 2<br />

2 2 t + 5 + 2 = 3 2 2 t + 7 2 si ha d x = 3 d t. La formula <strong>di</strong> Gauss-Legendre deve essere applicata sui no<strong>di</strong><br />

2<br />

trasformati dati da 3 2 x i + 7 . Perciò abbiamo<br />

2<br />

I G = 3 (w 1 f ( 3 2 2 x 1 + 7 2 ) + w 2 f ( 3 2 x 2 + 7 2 ) + w 3 f ( 3 2 x 3 + 7 )<br />

2 )<br />

= 1.5 ( (5/9)f (−1.161895004 + 3.5) + (8/9)f (3.5) + (5/9)f (1.161895004 + 3.5) )<br />

= 1.5(0.5550723689 + 0.8491794877 + 0.4621443545) = 2.799594317<br />

164


CAPITOLO 11<br />

Differenziazione numerica ed equazioni alle<br />

derivate or<strong>di</strong>narie<br />

L’universo è un’equazione<br />

<strong>di</strong>fferenziale.<br />

Jules Henri Poincarè<br />

11.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165<br />

11.2 Differenziazione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166<br />

11.3 Sulle equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168<br />

11.4 Metodo <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170<br />

11.5 Metodo <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172<br />

11.6 Metodo <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175<br />

11.7 Stu<strong>di</strong>o dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176<br />

11.8 Errori <strong>di</strong> troncamento locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177<br />

11.9 Convergenza e stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177<br />

11.9.1 Convergenza <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178<br />

11.9.2 Stabilità <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178<br />

11.9.3 Convergenza <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179<br />

11.9.4 Stabilità <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179<br />

11.9.5 Convergenza <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179<br />

11.9.6 Stabilità <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180<br />

11.9.7 Sulla stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180<br />

11.10 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181<br />

11.1 Introduzione<br />

All’inizio del ’900, van der Pol 1 stu<strong>di</strong>ò fenomeni non lineari e propose l’equazione <strong>di</strong>fferenziale<br />

y ′′ (t) + ɛ(y 2 (t) − 1)y ′ (t) + y(t) = 0<br />

1 Balthasar van der Pol (1889-1959) fu un fisico e matematico olandese. Nel 1916 lavorò per un anno con l’ingegnere John Ambrose<br />

Fleming a Londra (Fleming aveva già inventato il <strong>di</strong>odo nel 1904). Si trasferì successivamente a Cambridge e iniziò una collaborazione<br />

con John Joseph Thomson al Caven<strong>di</strong>sh Laboratory (Thomson aveva scoperto l’elettrone nel 1897). Qui <strong>di</strong>venne amico <strong>di</strong> Edward Appleton<br />

che, nel 1947, ricevette il premio Nobel per la fisica per i suoi contributi alla conoscenza della ionosfera – stu<strong>di</strong> fatti insieme a<br />

van der Pol. La loro collaborazione riguardò anche lo stu<strong>di</strong>o <strong>di</strong> fenomeni non lineari usando circuiti trio<strong>di</strong> per verificare le loro teorie.<br />

Quando van del Pol rientrò in Olanda, continuò a occuparsi <strong>di</strong> ottica, elettromagnetismo, onde ra<strong>di</strong>o e fisica atomica. Il nome <strong>di</strong> van<br />

der Pol è associato con l’equazione <strong>di</strong>fferenziale che porta il suo nome. Questa equazione apparve per la prima volta sul suo articolo On<br />

relaxation oscillation pubblicato sulla rivista Philosophical Magazine nel 1926.<br />

165


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Questa equazione governa l’intensità <strong>di</strong> corrente in un circuito oscillante a triodo e viene utilizzata nello<br />

stu<strong>di</strong>o <strong>di</strong> circuiti che contengono valvole termoioniche, i cosiddetti tubi a vuoto, come il tubo cato<strong>di</strong>co del<br />

televisore o il magnetron nei forni a microonde. La quantità ɛ in<strong>di</strong>ca l’intensità dello smorzamento non<br />

lineare: quanto più ɛ è elevato tanto più il sistema perde energia rapidamente.<br />

L’equazione <strong>di</strong>fferenziale del secondo or<strong>di</strong>ne si può ricondurre ad un sistema <strong>di</strong> equazioni <strong>di</strong>fferenziali<br />

del primo or<strong>di</strong>ne. Ponendo u = (u 1 ,u 2 ) = (y, y ′ ) si ha<br />

( u<br />

′<br />

1<br />

u ′ 2<br />

) (<br />

)<br />

u 2<br />

=<br />

−ɛ((u 1 ) 2 − 1)u 2 − u 1<br />

Come si risolve numericamente un sistema <strong>di</strong> equazioni <strong>di</strong>fferenziali come quello appena scritto In questo<br />

Capitolo, daremo una piccola introduzione ad alcune tecniche <strong>di</strong> <strong>di</strong>fferenziazione numerica e ad alcuni<br />

meto<strong>di</strong> numerici che permettono <strong>di</strong> risolvere equazioni <strong>di</strong>fferenziali del primo or<strong>di</strong>ne.<br />

11.2 Differenziazione numerica<br />

Dall’analisi matematica, sappiamo come si calcolano le derivate <strong>di</strong> una funzione. Tuttavia è utile conoscere<br />

anche delle tecniche numeriche <strong>di</strong> <strong>di</strong>fferenziazione, sia perchè, molte volte, la funzione non è nota in<br />

maniera esplicita ma solo per punti, sia perchè, a volte, la funzione è troppo complicata!<br />

Dall’analisi, sappiamo che, assegnata una funzione y = f (x) e dato un punto x 0 nel suo insieme <strong>di</strong><br />

definizione, la derivata f ′ (x 0 è data da<br />

f ′ (x 0 ) = lim<br />

h→0<br />

f (x 0 + h) − f (x 0 )<br />

h<br />

Per ottenere una formula che approssima la derivata prima <strong>di</strong> f ′ (x 0 ), useremo no<strong>di</strong> equi<strong>di</strong>stanti in un<br />

intorno <strong>di</strong> x O : x 0 − h, x 0 , x 0 + h,... con h una quantità positiva sufficientemente piccola.<br />

Consideriamo la f sufficientemente regolare per applicare la formula <strong>di</strong> Taylor (f continua e limitata<br />

insieme alle sue derivate, fino ad un or<strong>di</strong>ne sufficientemente elevato). La formula <strong>di</strong> Taylor della funzione f<br />

<strong>di</strong> centro x 0 , se ci fermiamo alla derivata seconda, è data da<br />

f (x) = f (x 0 ) + f ′ (x 0 )(x − x 0 ) + (x − x 0) 2<br />

f ′′ (ξ)<br />

2<br />

dove ξ è un punto, che non conosciamo, nell’intervallo <strong>di</strong> estremi x e x 0 ..<br />

Pren<strong>di</strong>amo come x il valore x = x 0 − h: la formula <strong>di</strong> Taylor si legge come<br />

f (x 0 − h) = f (x 0 ) − h f ′ (x 0 ) + h2<br />

2 f ′′ (ξ)<br />

Portiamo a primo membro f ′ (x 0 , ottenendo<br />

f ′ (x 0 ) = f (x 0) − f (x 0 − h)<br />

+ h h<br />

2 f ′′ (ξ)<br />

Se trascuriamo il termine h2<br />

2 f ′′ (ξ) abbiamo una formula che approssima f ′ (x 0 ) e che si chiama backward<br />

<strong>di</strong>fference formula, formula delle <strong>di</strong>fferenze all’in<strong>di</strong>etro (stiamo usando infatti il punto x o − h).<br />

La backward <strong>di</strong>fference formula è data da f ′ (x 0 ) = f (x 0) − f (x 0 − h)<br />

h<br />

Questa formula richiede la conoscenza del valore della f in due punti x 0 e x 0 − h ed è del primo or<strong>di</strong>ne<br />

(trascuriamo, infatti, un termine che <strong>di</strong>pende da h: h 2 f ′′ (ξ)).<br />

166


11.2. Differenziazione numerica<br />

Se, invece, applichiamo la formula <strong>di</strong> Taylor a x = x 0 + h abbiamo la forward <strong>di</strong>fference formula, formula<br />

delle <strong>di</strong>fferenze in avanti:<br />

da cui<br />

f (x 0 + h) = f (x 0 ) + h f ′ (x 0 ) + h2<br />

2 f ′′ (ξ)<br />

f ′ (x 0 ) = f (x 0 + h) − f (x 0 )<br />

− h h<br />

2 f ′′ (ξ)<br />

La forward formula è f ′ (x 0 ) = f (x 0 + h) − f (x 0 )<br />

h<br />

L’errore è sempre del primo or<strong>di</strong>ne.<br />

Una formula <strong>di</strong> grado più elevato si ottiene considerando tre punti x 0 −h, x 0 , x 0 +h. Pren<strong>di</strong>amo le formule<br />

<strong>di</strong> Taylor <strong>di</strong> centro x 0 − h e x 0 + h scritte fino alla derivata terza <strong>di</strong> f ,<br />

f (x 0 + h) = f (x 0 ) + h f ′ (x 0 ) + h2<br />

2 f ′′ (x 0 ) + h3<br />

6 f ′′′ (ξ 1 )<br />

f (x 0 − h) = f (x 0 ) − h f ′ (x 0 ) + h2<br />

2 f ′′ (x 0 ) − h3<br />

6 f ′′′ (ξ 2 )<br />

Sottraendo membro a membro abbiamo<br />

f (x 0 + h) − f (x 0 − h) = 2h f ′ (x 0 ) + h3<br />

6 (f ′′′ (ξ 1 ) + f ′′′ (ξ 2 ))<br />

Ora le due derivate terze nei due punti ξ 1 e ξ 2 (che non conosciamo) sono comprese tra un valore minimo e<br />

un valore massimo, da cui anche il loro valore me<strong>di</strong>o f ′′′ (ξ 1 ) + f ′′′ (ξ 2 )<br />

è compreso tra il minimo e il massimo<br />

2<br />

della funzione f ′′′ stessa (si veda il Teorema del Valore Interme<strong>di</strong>o), cioè esiste ξ (compreso tra ξ 1 e ξ 2 e,<br />

quin<strong>di</strong>, tra x 0 − h e x 0 + h) per cui f ′′′ (ξ) = f ′′′ (ξ 1 ) + f ′′′ (ξ 2 )<br />

. Sostituendo abbiamo<br />

2<br />

f (x 0 + h) − f (x 0 − h) = 2h f ′ (x 0 ) + h3<br />

6 2f ′′′ (ξ )<br />

Risolviamo ora per f ′ (x 0 ), ottenendo<br />

f ′ (x 0 ) = f (x 0 + h) − f (x 0 − h)<br />

− h2<br />

2h<br />

6 f ′′′ (ξ)<br />

Se trascuriamo il termine che <strong>di</strong>pende da h 2 otteniamo un’approssimazione <strong>di</strong> f ′ (x 0 ).<br />

La formula centrata è data da f ′ (x 0 ) = f (x 0 + h) − f (x 0 − h)<br />

2h<br />

Il termine che trascuriamo per ottenere le formule <strong>di</strong> <strong>di</strong>fferenziazione numerica, cioè l’errore <strong>di</strong><br />

<strong>di</strong>scretizzazione, prende il nome <strong>di</strong> errore <strong>di</strong> troncamento.<br />

La formula centrata valuta il valore della f in soli due punti, come è stato fatto per le formule backward e<br />

forward ma ha un or<strong>di</strong>ne <strong>di</strong> accuratezza più elevato.<br />

Formule più accurate si possono ottenere usando più punti nell’intorno <strong>di</strong> x 0 e considerando espansioni<br />

<strong>di</strong> Taylor che coinvolgono derivate <strong>di</strong> or<strong>di</strong>ne più elevato. Ad esempio, prendendo i punti x 0 −2h, x 0 −h, x 0 +h<br />

e x 0 + 2h si può ricavare<br />

f ′ (x 0 ) = 1 (<br />

f (x0 − 2h) − 8f (x 0 − h) + 8f (x 0 + h) − f (x 0 + 2h) ) + h4<br />

12h<br />

30 f (v) (ξ)<br />

167


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Ricaviamo la formula, detta a 5 punti perchè, oltre al punto in cui vogliamo approssimare la derivata, ne<br />

consideriamo altri quattro.<br />

La formula a 5 punti è data da<br />

f ′ (x 0 ) ≈ 1 (<br />

f (x0 − 2h) − 8f (x 0 − h) + 8f (x 0 + h) − f (x 0 + 2h) )<br />

12h<br />

L’errore <strong>di</strong> troncamento <strong>di</strong>pende da h 4 .<br />

Altre tecniche <strong>di</strong> <strong>di</strong>fferenziazione numerica sono basate sull’interpolazione polinomiale <strong>di</strong> Lagrange (se<br />

p(x) approssima f (x) allora p ′ (x) approssima f ′ (x)) o su un proce<strong>di</strong>mento <strong>di</strong> estrapolazione <strong>di</strong> Richardson<br />

(simile a quello che abbiamo visto per le formule <strong>di</strong> integrazione numerica). Il <strong>di</strong>scorso si estende, inoltre,<br />

per approssimare derivate <strong>di</strong> or<strong>di</strong>ne superiore.<br />

Nell’applicare queste formule, dobbiamo ricordarci che, oltre all’errore <strong>di</strong> troncamento dovuto al tipo <strong>di</strong><br />

approssimazione fatto, c’è anche l’errore <strong>di</strong> arrotondamento. Nell’esempio 3.6.4, avevamo visto come, per<br />

piccoli valori <strong>di</strong> h, il fenomeno <strong>di</strong> cancellazione numerica portava a crescite <strong>degli</strong> errori.<br />

La scelta <strong>di</strong> h dovrebbe, perciò, <strong>di</strong>pendere, dall’or<strong>di</strong>ne dell’errore <strong>di</strong> troncamento (che conosciamo) e<br />

da una maggiorazione sul termine d’errore d’arrotondamento (valore che in genere non conosciamo). Per<br />

evitare che domini l’errore <strong>di</strong> arrotondamento (che può portare al fenomeno <strong>di</strong> cancellazione numerica) è<br />

importante non prendere h troppo vicino alla precisione <strong>di</strong> macchina.<br />

Esempio<br />

Esempio 11.2.1 Ripren<strong>di</strong>amo l’esempio 3.6.4 per confrontare le <strong>di</strong>verse formule che abbiamo introdotto.<br />

Dobbiamo derivare f (x) = sin(x) in x 0 = 1.2. Per confrontare le <strong>di</strong>verse formule, partiamo da h = 1 e<br />

lo riduciamo fino ad arrivare a h = 10 −12 . In Figura 11.1, in un grafico semilogaritmico, confrontiamo<br />

gli errori assoluti ottenuti dalle varie formule. Possiamo osservare che le formule forward e backward<br />

danno risultati confrontabili tra loro. La formula centrata porta a errori notevolmente inferiori rispetto<br />

alle prime due formule e la formula a 5 punti riduce ancora l’errore. Per la scelta <strong>di</strong> h che abbiamo fatto,<br />

l’errore si riduce senza mostrare il fenomeno <strong>di</strong> cancellazione numerica.<br />

11.3 Sulle equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie<br />

Passiamo ora a stu<strong>di</strong>are le equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie.<br />

Vogliamo trovare una funzione y(t) che sod<strong>di</strong>sfi la seguente equazione <strong>di</strong>fferenziale or<strong>di</strong>naria ( ODE:<br />

Or<strong>di</strong>nary Differential Equation) del primo or<strong>di</strong>ne:<br />

dy<br />

= f (t, y),<br />

dt a<br />

≤ t ≤ b<br />

La funzione f (t, y) è assegnata. Ci riferiamo a t come alla variabile in<strong>di</strong>pendente. Dobbiamo trovare quella<br />

funzione y = y(t) tale che la sua derivata prima y ′ = y ′ (t) = dy(t) coincida con f (t, y(t)).<br />

dt<br />

168


11.3. Sulle equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie<br />

Figura 11.1: Grafico semilogaritmico che mette a confronto l’errore esatto al variare <strong>di</strong> h ∈ [10 −12 ,1] delle<br />

formule forward, backward, centrata e a 5 punti.<br />

Esempio<br />

Esempio 11.3.1 Sia f (t, y) = −y + t definita per t ≥ 0 e per qualunque y reale. Si ha<br />

y ′ = −y + t, t ≥ 0<br />

Si verifica che, per qualunque scalare α la funzione y(t) = t − 1 + αe −t sod<strong>di</strong>sfa la ODE.<br />

Se, inoltre, è assegnato un valore iniziale, per esempio y(0) = 1, allora, dovendo essere −1 + α = y(0) =<br />

1, risulta α = 2. Assegnare una soluzione iniziale determina un’unica soluzione all’ODE. Si parla <strong>di</strong><br />

problema a valori iniziali (IVP).<br />

Nel caso in cui y(0) = 1 si ricava l’unica soluzione y(t) = t − 1 + 2e −t .<br />

Problemi in cui abbiamo equazioni alle derivate or<strong>di</strong>narie <strong>di</strong> or<strong>di</strong>ne più elevato possono essere<br />

trasformati in sistemi equivalenti <strong>di</strong> equazioni del primo or<strong>di</strong>ne.<br />

169


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Sistemi <strong>di</strong><br />

ODE<br />

Esempio<br />

Esempio 11.3.2 La seconda legge del moto <strong>di</strong> Newton <strong>di</strong>ce che la forza F è uguale al prodotto della<br />

massa m per l’accelerazione a: F = ma. Questa equazione è una ODE del secondo or<strong>di</strong>ne in quanto<br />

l’accelerazione a è data da a = y ′′ , dove y è la coor<strong>di</strong>nata della posizione. L’ODE può essere riscritta<br />

come: y ′′ = F m . Definendo u 1 = y e u 2 = y ′ si ha il sistema (equivalente all’equazione <strong>di</strong> prima) <strong>di</strong> due<br />

equazioni del primo or<strong>di</strong>ne <strong>di</strong> ODE:<br />

( u<br />

′<br />

1<br />

u ′ 2<br />

) ( )<br />

u2<br />

=<br />

F /m<br />

Per risolvere il sistema, possiamo usare meto<strong>di</strong> che vanno bene per risolvere equazioni <strong>di</strong>fferenziali del<br />

primo or<strong>di</strong>ne. La prima componente della soluzione u 1 corrisponde alla posizione y dell’equazione da<br />

cui siamo partiti. La seconda componente u 2 fornisce la velocità y ′ .<br />

Sistemi del primo or<strong>di</strong>ne <strong>di</strong> ODE hanno la forma<br />

y ′ (t) = f(t,y)<br />

dove y : R −→ R n con y = (y 1 y 2 ... y n ), f : R n+1 −→ R n e y ′ (t) = dy<br />

d t<br />

denota la derivata rispetto a t (per cui la<br />

i -sima componente del vettore derivata è data da y ′ i (t) = d y i (t)<br />

). La funzione f è assegnata e noi vogliamo<br />

d t<br />

determinare il vettore <strong>di</strong> funzioni y che sod<strong>di</strong>sfa l’ODE.<br />

Per semplicità noi stu<strong>di</strong>eremo il caso <strong>di</strong> una singola equazione scalare, n = 1. Ma l’approccio è del tutto<br />

simile nel caso <strong>di</strong> sistemi <strong>di</strong> equazioni del primo or<strong>di</strong>ne.<br />

Sia data l’ODE<br />

y ′ = f (t, y(t))<br />

a ≤ t ≤ b<br />

con valore iniziale<br />

y(a) = y a .<br />

Per risolvere questa ODE <strong>di</strong>scretizziamo l’intervallo [a,b] in n + 1 punti, equi<strong>di</strong>stanti per semplicità: t i =<br />

a + i h, h = 0,1,...,n, con h = (b − a)/n.<br />

Il passo <strong>di</strong> <strong>di</strong>scretizzazione (temporale se t assume il significato della variabile temporale) è dunque h.<br />

Nelle applicazioni pratiche, il passo h è variabile (cioè i punti non sono equi<strong>di</strong>stanti), tuttavia, per capire<br />

meglio come funzionano i meto<strong>di</strong>, noi useremo sempre un passo h costante.<br />

Sia y(t) la soluzione esatta del nostro problema a valori iniziali. Allora y(t i ) è il valore esatto della<br />

soluzione calcolata nel punto t i .<br />

In<strong>di</strong>chiamo invece con y i il valore approssimato al tempo t i che ricaviamo applicando un metodo<br />

numerico che risolve il problema proposto.<br />

11.4 Metodo <strong>di</strong> Eulero esplicito<br />

Con il metodo <strong>di</strong> Eulero 2 esplicito applichiamo la formula <strong>di</strong> Taylor (del secondo or<strong>di</strong>ne) alla funzione<br />

y(t), <strong>di</strong> centro t i , in modo da poter successivamente approssimare la derivata prima y ′ (t i ):<br />

y(t) = y(t i ) + (t − t i )y ′ (t i ) + (t − t i ) 2<br />

y ′′ (ξ i )<br />

2<br />

2 Leonhard Euler (1707-1783) fu un matematico svizzero. Fu studente <strong>di</strong> Johann Bernoulli che comprese le sue gran<strong>di</strong> potenzialità<br />

e favorì i suoi stu<strong>di</strong>. Eulero è noto soprattutto per i suoi contributi nel campo della geometria, della teoria dei numeri, delle equazioni<br />

<strong>di</strong>fferenziali, del calcolo delle variazioni. È lui che introdusse il simbolo f (x) per in<strong>di</strong>care le funzioni, e per la base naturale, i per la<br />

ra<strong>di</strong>ce quadrata <strong>di</strong> −1, <strong>di</strong> π, il simbolo <strong>di</strong> sommatoria ∑ e altri ancora.<br />

170


11.4. Metodo <strong>di</strong> Eulero esplicito<br />

La quantità (t − t i ) 2<br />

y ′′ (ξ i ) è il resto della formula <strong>di</strong> Taylor con ξ i un punto opportuno nel segmento <strong>di</strong><br />

2<br />

estremi t e t i .<br />

Pren<strong>di</strong>amo come t il valore t i + h vale a <strong>di</strong>re t i+1 , da cui si ha t − t i = t i+1 − t i = h. Sostituendo si ottiene:<br />

y(t i+1 ) = y(t i ) + hy ′ (t i ) + h2<br />

2 y′′ (ξ i )<br />

Esplicitando y ′ (t i ) rispetto agli altri termini si ha:<br />

y ′ (t i ) = y(t i+1) − y(t i )<br />

− h h 2 y′′ (ξ i )<br />

Ora si sostituisce il valore trovato per y ′ (t i ) nella ODE y ′ = f (t, y(t)) per t = t i :<br />

y(t i+1 ) − y(t i )<br />

− h h 2 y′′ (ξ i ) = f (t i , y(t i ))<br />

Trascurando il termine h 2 y′′ (ξ i ) non abbiamo più i valori della soluzione esatta, ma otterremo i valori della<br />

soluzione approssimata. Scriviamo dunque:<br />

y i+1 − y i<br />

= f (t i , y i )<br />

h<br />

La formula <strong>di</strong> Eulero esplicito è: y i+1 = y i + h f (t i , y i ).<br />

La formula è <strong>di</strong> tipo esplicito perchè per passare dal livello i al livello i + 1 sfruttiamo i dati che già<br />

conosciamo del livello i .<br />

Si parte infatti da y 0 = y(t 0 ) = y(a) = y a e si ricava:<br />

y 1 = y 0 + f (t 0 , y 0 )<br />

y 2 = y 1 + f (t 1 , y 1 )<br />

. = . . .<br />

Si arriva alla stessa formula integrando l’ODE e approssimando l’integrale della f me<strong>di</strong>ante il valore in<br />

f (t 0 , y(t 0 )): da y ′ = f (t, y(t)) integrando ambo i membri da t 0 a t, otteniamo<br />

∫ t<br />

t 0<br />

∫<br />

d y<br />

t<br />

d t d t =<br />

t 0<br />

f (t, y(t)) d t =⇒<br />

∫ y(t)<br />

y 0<br />

d y =<br />

∫ t<br />

t 0<br />

f (t, y(t)) d t<br />

Al secondo membro, approssiamo ∫ t<br />

t 0<br />

f (t, y(t)) d t me<strong>di</strong>ante il valore (t − t 0 )f (t 0 , y(t 0 )) (approssimiamo la f<br />

me<strong>di</strong>ante la retta f (t 0 , y(t 0 ))).<br />

Abbiamo:<br />

y(t) = y 0 + (t − t 0 )f (t 0 , y 0 )) + errore della formula <strong>di</strong> quadratura.<br />

Per t = t 1 , numericamente: y 1 = y 0 + h f (t 0 , y 0 )).<br />

Ai passi successivi: y i+1 = y i + h f (t i , y i ))<br />

Un altro<br />

approccio<br />

Esempio<br />

Esempio 11.4.1 Supponiamo <strong>di</strong> applicare il metodo <strong>di</strong> Eulero esplicito alla ODE y ′ = −y con passo h a<br />

partire dal punto iniziale t 0 = 0 e avanziamo al tempo t 1 = t 0 + h<br />

y 1 = y 0 + h f (t 0 , y 0 ) = y 0 − hy 0 = (1 − h)y 0<br />

Il valore y 1 che otteniamo è affetto da errore: y 1 ≠ y(t 1 ) Per esempio, se per t 0 si ha y 0 = 1, la soluzione<br />

esatta è y(t) = e −t . Per h = 0.5, si ha y 1 = 0.5 mentre y(0.5) = e −0.5 ≈ 0.60653<br />

171<br />

Interpretazione<br />

geometrica


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Da un punto <strong>di</strong> vista geometrico (si veda la Figura 11.2), il valore in t i+1 è approssimato utilizzando il valore<br />

della retta la cui pendenza è data da f (t i , y i ): è come se ad ogni passo cercassimo <strong>di</strong> risolvere il problema<br />

a valori iniziali:<br />

y ′ (t) = f (t, y(t))<br />

y(t i ) = y i<br />

per cui il valore che otteniamo per il tempo t i+1 è tangente alla traiettoria della soluzione <strong>di</strong> questo IVP.<br />

Figura 11.2: Interpretazione geometrica del metodo <strong>di</strong> Eulero esplicito. Si è considerato il problema y ′ = −y<br />

con y(0) = 1 la cui soluzione esatta è y(t) = e −t . I valori numerici ottenuti dal metodo <strong>di</strong> Eulero esplicito sono<br />

cerchiati e si trovano sulla linea spezzata che li interpola. La linea spezzata è tangente, all’inizio <strong>di</strong> ogni passo,<br />

alla traiettoria che passa per il corrispondente punto, soluzione del problema y ′ = −y con y(t i ) = y i .<br />

11.5 Metodo <strong>di</strong> Eulero implicito<br />

Se applichiamo la formula <strong>di</strong> Taylor <strong>di</strong> punto iniziale t i+1 , abbiamo<br />

y(t) = y(t i+1 ) + (t − t i+1 )y ′ (t i+1 ) + (t − t i+1) 2<br />

y ′′ (ξ i )<br />

2<br />

Per t = t i , si ha t − t i+1 = t i − t i+1 = t i − (t i + h) = −h. Sostituendo, abbiamo:<br />

y(t i ) = y(t i+1 ) − hy ′ (t i+1 ) + h2<br />

2 y′′ (ξ i )<br />

Otteniamo quin<strong>di</strong><br />

y ′ (t i+1 ) = y(t i+1) − y(t i )<br />

+ h h 2 y′′ (ξ i )<br />

172


11.5. Metodo <strong>di</strong> Eulero implicito<br />

Andando a sostituire nella ODE al tempo t i+1 , si ha :<br />

y(t i+1 ) − y(t i )<br />

+ h h 2 y′′ (ξ i ) = f (t i+1 , y(t i+1 ))<br />

Trascurando il termine del resto <strong>di</strong> Taylor h 2 y′′ (ξ i ) abbiamo:<br />

y i+1 − y i<br />

h<br />

= f (t i+1 , y i+1 ))<br />

La formula <strong>di</strong> Eulero implicito vale y i+1 = y i + h f (t i+1 , y i+1 )).<br />

La <strong>di</strong>fferenza rispetto alla formula esplicita è che la f è valutata non più al tempo t i ma al tempo t i+1 Quin<strong>di</strong><br />

il calcolo <strong>di</strong> y i+1 <strong>di</strong>pende implicitamente da y i+1 stesso! La valutazione <strong>di</strong> y i+1 <strong>di</strong>venta quin<strong>di</strong> più laboriosa<br />

e complicata (se si ha un’equazione non lineare in y i+1 , la si risolve tramite un metodo <strong>di</strong> punto fisso o <strong>di</strong><br />

Newton-Raphson). In termini <strong>di</strong> accuratezza si hanno risultati migliori.<br />

Esempio<br />

Esempio 11.5.1 Consideriamo sempre y ′ = −y con y(0) = 1 (soluzione esatta y(t) = e −t ).<br />

Il metodo <strong>di</strong> Eulero implicito <strong>di</strong>venta: y i+1 = y i − hy i+1 ovvero (1 + h)y i+1 = y i<br />

La soluzione numerica è y i+1 =<br />

y i<br />

(1 + h) .<br />

Per h = 0.5 ricaviamo y 1 = 0.66667 contro un valore esatto y(1) ≈ 0.60653.<br />

Esempio<br />

Esempio 11.5.2 Si abbia l’equazione y ′ = −y 3 con con<strong>di</strong>zione iniziale y(0) = 1. Usando il metodo <strong>di</strong><br />

Eulero implicito con passo h = 0.5, per ricavare y 1 otteniamo l’equazione implicita<br />

y 1 = y 0 + h f (t 1 , y 1 ) = 1 − 0.5y 3 1<br />

Questa equazione non lineare in y 1 può essere risolta me<strong>di</strong>ante metodo <strong>di</strong> punto fisso (x = g (x) =<br />

1−0.5x 3 ) oppure utilizzando il metodo <strong>di</strong> Newton-Raphson per F (x) = 0 con F (x) = x −1+0.5x 3 ) . L’approssimazione<br />

iniziale per ottenere y 1 può essere o la soluzione al passo precedente, y 0 , oppure usare il<br />

metodo <strong>di</strong> Eulero esplicito, che dà y 1 = y 0 − 0.5y 3 0 = 0.5. Otteniamo, come y 1 il valore finale y 1 ≈ 0.7709.<br />

Esempio<br />

Esempio 11.5.3 Vogliamo <strong>di</strong>scretizzare il problema <strong>di</strong> Cauchy<br />

y ′ = −y 2<br />

y(0) = 1<br />

con passo h = 0.1 applicando il metodo <strong>di</strong> Eulero esplicito per ricavare y 1 e y 2 .<br />

Il metodo <strong>di</strong> Eulero esplicito è:<br />

y i+1 = y i + h f (t i , y i ) = y i + h(−y 2 i ) = y i − hy 2 i<br />

Partendo da y 0 = 1 si ricava:<br />

y 1 = 1 − 0.1(1 2 ) = 0.9<br />

y 2 = 0.9 − 0.1(0.9 2 ) = 0.819<br />

173


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Per confronto, calcoliamo la soluzione esatta y(t) = 1<br />

t + 1 , ottenendo:<br />

y(t 1 ) = y(0.1) = 1/(0.1 + 1) = 0.9090909090<br />

y(t 2 ) = y(0.2) = 1/(0.2 + 1) = 0.8333333333<br />

Applichiamo ora il metodo <strong>di</strong> Eulero implicito con lo stesso passo h = 0.1.<br />

y i+1 = y i + h f (t i+1 , y i+1 ) = y i − hy 2 i+1<br />

Per ricavare y 1 la formula <strong>di</strong>venta:<br />

y 1 = y 0 + h f (t 1 , y 1 ) = 1 − 0.1(y 2 1 )<br />

Abbiamo un’equazione non lineare in y 1 . Per trovare y 1 , possiamo pensare <strong>di</strong> applicare lo schema <strong>di</strong><br />

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<br />

per la funzione g . Applichiamo tre passi dello schema <strong>di</strong> punto fisso:<br />

y (1) = g (y (0) ) = 1 − 0.1(1 2 ) = 0.9<br />

y (2) = g (y (1) ) = 1 − 0.1(0.9 2 ) = 0.919<br />

y (3) = g (y (2) ) = 1 − 0.1(0.919 2 ) = 0.9155439<br />

Se pren<strong>di</strong>amo y (3) come approssimazione <strong>di</strong> y 1 ricaviamo y 1 = 0.9155439 (per confronto, il valore<br />

esatto è 0.90909090).<br />

Calcoliamo ora y 2 :<br />

y 2 = y 1 + h f (t 2 , y 2 ) = 0.9155439 − 0.1(y 2 2 )<br />

Ora la funzione <strong>di</strong> punto fisso <strong>di</strong>venta g (y) = 0.9155439−0.1(y 2 ). Applichiamo lo schema <strong>di</strong> punto fisso<br />

partendo da y (0) = y 1 = 0.9155439.<br />

y (1) = g (y (0) ) = 0.9155439 − 0.1(0.9155439 2 ) = 0.8317218367<br />

y (2) = g (y (1) ) = 0.9155439 − 0.1(0.8317218367 2 ) = 0.8463677786<br />

y (3) = g (y (2) ) = 0.9155439 − 0.1(0.8463677786 2 ) = 0.8439100583<br />

Troviamo quin<strong>di</strong> y 2 = 0.8439100583 (valore esatto 0.8333333333).<br />

Ve<strong>di</strong>amo cosa accade in Eulero implicito se il punto iniziale del metodo <strong>di</strong> punto fisso è dato da un<br />

passo del metodo <strong>di</strong> Eulero esplicito.<br />

Per ricavare y 1 , considero come y (0) = y 0 + h f (t 0 , y 0 ) = 1 − 0.1 = 0.9<br />

In tal caso, l’approssimazione iniziale è quella che, nel caso <strong>di</strong> prima, era il valore y (1) .<br />

Applichiamo tre volte lo schema <strong>di</strong> punto fisso:<br />

y (1) = g (y (0) ) = 1 − 0.1(0.9 2 ) = 0.919<br />

y (2) = g (y (1) ) = 1 − 0.1(0.919 2 ) = 0.9155439<br />

y (3) = g (y (2) ) = 1 − 0.1(0.9155439 2 ) = 0.9161779367<br />

174


11.6. Metodo <strong>di</strong> Crank-Nicolson<br />

Quin<strong>di</strong> y 1 = 0.9161779367.<br />

Al secondo passo, lo schema <strong>di</strong> punto fisso è dato dalla funzione g (y) = y 1 − h(y 2 ) = 0.9161779367 −<br />

0.1y 2 .<br />

Come approssimazione iniziale pren<strong>di</strong>amo y (0) = y 1 + h f (t 1 , y 1 ) = g (y 1 ) = 0.8322397355. Si ha:<br />

y (1) = g (y (0) ) = 0.9161779367 − 0.1(0.8322397355 2 ) = 0.8469156390<br />

y (2) = g (y (1) ) = 0.9161779367 − 0.1(0.8469156390 2 ) = 0.8444513267<br />

y (3) = g (y (2) ) = 0.9161779367 − 0.1(0.84445132672) = 0.8448681324<br />

Ricaviamo y 2 = 0.8448681324.<br />

11.6 Metodo <strong>di</strong> Crank-Nicolson<br />

Partiamo dall’ODE 3 y ′ = f (t, y(t)). Integriamo ambo i membri dell’equazione sull’intervallo [t i , t i+1 ]:<br />

∫ y(ti+1 )<br />

y(t i )<br />

∫ ti+1<br />

∫ ti+1<br />

dy = f (t, y(t)) dt =⇒ y(t i+1 ) − y(t i ) = f (t, y(t)) dt<br />

t i t i<br />

A secondo membro, applichiamo la formula dei trapezi trascurando l’errore <strong>di</strong> integrazione:<br />

y i+1 − y i = h 2 [f (t i , y i ) + f (t i+1 , y i+1 )]<br />

Si ha la formula <strong>di</strong> Crank-Nicolson: y i+1 = y i + h 2 [f (t i , y i ) + f (t i+1 , y i+1 )]<br />

La stessa formula la si può ricavare prendendo la me<strong>di</strong>a aritmetica delle formule <strong>di</strong> Eulero esplicito e<br />

implicito:<br />

Altro<br />

approccio<br />

y i+1 − y i = h f (t i , y i )<br />

y i+1 − y i = h f (t i+1 , y i+1 )<br />

sommando e <strong>di</strong>videndo per 2:<br />

y i+1 − y i = h 2 [f (t i , y i ) + f (t i+1 , y i+1 )] =⇒ y i+1 = y i + h 2 [f (t i , y i ) + f (t i+1 , y i+1 )]<br />

3 John Crank (1916-2006) è stato un matematico inglese che si è de<strong>di</strong>cato soprattutto allo stu<strong>di</strong>o <strong>di</strong> soluzioni numeriche <strong>di</strong> equazioni<br />

alle derivate parziali, in particolare <strong>di</strong> problemi <strong>di</strong> conduzione del calore. È noto soprattutto per il lavoro svolto con Phyllis Nicolson.<br />

Phyllis Nicolson (1917-1968) è stata una matematica inglese. Negli anni della seconda guerra mon<strong>di</strong>ale lavorò sulla teoria del<br />

magnetron. È nota, appunto, per il metodo <strong>di</strong> Crank-Nicolson.<br />

175


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Esempio<br />

Esempio 11.6.1 Lo stesso esempio <strong>di</strong> prima (y ′ = −y con y(0) = 1) risolto con Crank-Nicolson dà: y i+1 =<br />

y i + h 2 [−y i − y i+1 )] cioè<br />

(1 + h 2 )y i+1 = (1 − h ( ) 2 − h<br />

2 )y i =⇒ (2 + h)y i+1 = (2 − h)y i =⇒ y i+1 = y i<br />

2 + h<br />

Per h = 0.5, confrontiamo i valori ottenuti dai meto<strong>di</strong> <strong>di</strong> Eulero esplicito, implicito e Crank-Nicolson,<br />

con la soluzione esatta:<br />

t i y(t i ) y i Eul. Espl. y i Eul. Impl. y i C-N<br />

0.0 1.000000 1.0000000 1.000000 1.000000<br />

0.5 0.606531 0.5000000 0.666667 0.600000<br />

1.0 0.367879 0.2500000 0.444444 0.360000<br />

1.5 0.223130 0.1250000 0.296296 0.216000<br />

2.0 0.135335 0.0625000 0.197531 0.129600<br />

2.5 0.082085 0.0312500 0.131687 0.077760<br />

3.0 0.049787 0.0156250 0.087791 0.046656<br />

3.5 0.030197 0.0078125 0.058528 0.027994<br />

4.0 0.018316 0.0039062 0.039018 0.016796<br />

11.7 Stu<strong>di</strong>o dell’errore<br />

Nel costruire i meto<strong>di</strong> (<strong>di</strong> Eulero esplicito, implicito, Crank-Nicolson) abbiamo trascurato un termine (il<br />

resto della formula <strong>di</strong> Taylor o l’errore della formula dei trapezi): questo termine che abbiamo trascurato<br />

rappresenta l’errore <strong>di</strong> troncamento locale. Nel caso <strong>di</strong> Eulero esplicito avevamo (usando la formula <strong>di</strong><br />

Taylor):<br />

y ′ (t i+1 ) = y(t i+1) − y(t i )<br />

− h h 2 y′′ (ξ i ) = f (t i , y(t i ))<br />

Per costruire il metodo, abbiamo trascurato il termine del resto, vale a <strong>di</strong>re la quantità<br />

d i = y(t i+1) − y(t i )<br />

− f (t i , y(t i )) = h h<br />

2 y′′ (ξ i ) = O (h)<br />

Questa quantità ci <strong>di</strong>ce <strong>di</strong> quanto la soluzione esatta “fallisce” nel sod<strong>di</strong>sfare la relazione della formula <strong>di</strong><br />

Eulero esplicito e rappresenta l’errore <strong>di</strong> troncamento locale.<br />

Definizione 11.7.1 Si definisce errore totale <strong>di</strong> troncamento ε i la quantità:<br />

ε i = y(t i ) − y i .<br />

Ci aspettiamo che sia dello stesso or<strong>di</strong>ne <strong>di</strong> grandezza dell’errore <strong>di</strong> troncamento locale.<br />

Definizione 11.7.2 Per effetto dell’arrotondamento, al tempo t i al posto <strong>di</strong> y i otteniamo il valore arrotondato<br />

y i . Si definisce errore totale <strong>di</strong> arrotondamento la quantità:<br />

ε i = y i − y i<br />

Definizione 11.7.3 L’errore globale dello schema numerico è dato dal contributo dell’errore totale <strong>di</strong><br />

troncamento e dell’errore totale <strong>di</strong> arrotondamento<br />

ɛ i = y(t i ) − y i = ε i + ε i<br />

176


11.8. Errori <strong>di</strong> troncamento locale<br />

Gli errori <strong>di</strong> arrotondamento nell’approssimare la derivata prima <strong>di</strong> una funzione si comportano come<br />

O ( 1 ) (si veda l’esempio fatto sulla propagazione <strong>degli</strong> errori a pag. 30). Tuttavia questo aspetto <strong>di</strong>venta secondario<br />

nella risoluzione delle ODE sia perchè il passo h nelle applicazioni non è mai troppo (esagerata-<br />

h<br />

mente) piccolo per ragioni <strong>di</strong> efficienza sia perchè è la y e non la y ′ la funzione che dobbiamo approssimare.<br />

Inoltre, nell’eseguire i calcoli in doppia precisione (come si fa nei moderni linguaggi <strong>di</strong> programmazione),<br />

l’aspetto dovuto all’arrotondamento si vede poco rispetto ad altri fenomeni che influenzano la propagazione<br />

<strong>degli</strong> errori.<br />

11.8 Errori <strong>di</strong> troncamento locale<br />

G Nel metodo <strong>di</strong> Eulero esplicito:<br />

G Nel metodo <strong>di</strong> Eulero implicito:<br />

d i = y(t i+1) − y(t i )<br />

− f (t i , y(t i )) = h h<br />

2 y′′ (ξ i ) = O (h)<br />

d i = y(t i+1) − y(t i )<br />

− f (t i , y(t i+1 )) = − h h<br />

2 y′′ (ξ i ) = O (h)<br />

G Nel metodo <strong>di</strong> Crank-Nicolson (derivando la formula dai trapezi e includendo il termine dell’errore):<br />

y(t i+1 ) − y(t i ) = h 2 [f (t i , y(t i )) + f (t i+1 , y(t i+1 ))] − f ′′ (ξ i ,τ i )<br />

h 3<br />

12<br />

dove ξ i e τ i sono opportuni punti. Ma f = y ′ da cui f ′ = y ′′ e f ′′ = y ′′′ .<br />

Perciò<br />

y(t i+1 ) − y(t i ) = h 2 [f (t i , y(t i )) + f (t i+1 , y(t i+1 ))] − y′′′ (ξ i )<br />

h 3<br />

12<br />

d i = y(t i+1) − y(t i )<br />

h<br />

11.9 Convergenza e stabilità<br />

Definizione 11.9.1 Un metodo si <strong>di</strong>ce convergente se lim h→0<br />

− 1 2 [f (t i , y(t i )) + f (t i+1 , y(t i+1 ))] = − y′′′ (ξ i )<br />

h 2 = O (h 2 )<br />

12<br />

i→+∞<br />

ɛ i = 0 cioè se l’errore va a zero al tendere del<br />

passo h a zero e <strong>di</strong> i all’infinito in modo che il prodotto i h si mantenga costante (così t 0 +i h tende ad un valore<br />

<strong>di</strong> t fissato: stu<strong>di</strong>amo l’errore fissato t).<br />

Esempio<br />

Esempio 11.9.1 Ve<strong>di</strong>amo come, fissato un certo istante t, possiamo fare tendere h a zero e far crescere i<br />

all’infinito in modo che t 0 + i h sia sempre uguale a t. Sia t 0 = 0 e t = 0.5:<br />

h i i h<br />

0.5 1 0.5<br />

0.25 2 0.5<br />

0.125 4 0.5<br />

0.0625 8 0.5<br />

.<br />

.<br />

.<br />

2.4414e-4 2048 0.5<br />

Definizione 11.9.2 Un metodo si <strong>di</strong>ce stabile se l’errore iniziale si mantiene limitato al crescere <strong>di</strong> i (per i → ∞):<br />

con M costante positiva.<br />

|ɛ i | ≤ M|ɛ 0 |<br />

177


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Stu<strong>di</strong>eremo la convergenza e la stabilità dei meto<strong>di</strong> <strong>di</strong> Eulero esplicito, implicito e Crank-Nicolson<br />

applicati all’equazione test y ′ = −λy (λ > 0 in modo che −λ < 0) con con<strong>di</strong>zione iniziale y(0) = y 0 .<br />

La soluzione esatta <strong>di</strong> questo IVP è y(t) = y 0 e −λt : tende a zero per valori <strong>di</strong> t crescenti. Ci aspettiamo che<br />

anche la soluzione numerica si comporti in maniera simile.<br />

11.9.1 Convergenza <strong>di</strong> Eulero esplicito<br />

Per semplicità, applichiamo la formula del metodo <strong>di</strong> Eulero esplicito all’equazione test con λ = 1.<br />

y 1 = y 0 + h f (t 0 , y 0 ) = y 0 − hy 0 = (1 − h)y 0<br />

y 2 = y 1 + h f (t 1 , y 1 ) = y 1 − hy 1 = (1 − h)y 1<br />

.<br />

y i = y i−1 + h f (t i−1 , y i−1 ) = y i−1 − hy i−1 = (1 − h)y i−1<br />

Andando a ritroso troviamo una formula che lega y i <strong>di</strong>rettamente a y 0 .<br />

y 1 = (1 − h)y 0<br />

y 2 = (1 − h)y 1 = (1 − h) 2 y 0<br />

.<br />

y i = (1 − h)y i−1 = (1 − h) i y 0<br />

La soluzione numerica al tempo t i è data da y i = (1 − h) i y 0 . Fissato un tempo t = i h, ve<strong>di</strong>amo se<br />

cioè se<br />

lim<br />

h→0<br />

i→+∞<br />

y i = y(t).<br />

i h<br />

⎡<br />

1<br />

⎤<br />

Osserviamo che: (1 − h) i = (1 − h) h = ⎣(1 − h) h ⎦<br />

t<br />

lim<br />

h→0<br />

i→+∞<br />

Ricor<strong>di</strong>amo la proprietà per la quale x α = e ln(xα) = e αln(x) . Perciò: (1 − h) h = e ln(1−h)(1/h) = e h<br />

Quando facciamo il limite per h → 0 e per i → +∞ consideriamo che, per il teorema dell’ Hôpital, vale<br />

Di conseguenza lim h→0 e<br />

Allora<br />

lim<br />

h→0<br />

i→+∞<br />

ln(1 − h)<br />

h<br />

y i = lim<br />

h→0<br />

i→+∞<br />

ln(1 − h) −1<br />

lim = lim<br />

h→0 h h→0 1 − h = −1<br />

= e −1<br />

⎡<br />

y 0 (1 − h) i = lim y 0 h→0<br />

i→+∞<br />

1<br />

⎤t<br />

⎣(1 − h) h ⎦ = y 0 e −t = y(t)<br />

1<br />

ln(1 − h)<br />

ɛ i = 0<br />

In questo modo abbiamo provato che il metodo converge. Il <strong>di</strong>scorso si ripete in maniera del tutto simile,<br />

per λ ≠ 1.<br />

11.9.2 Stabilità <strong>di</strong> Eulero esplicito<br />

Per quanto riguarda la stabilità, dobbiamo provare che l’errore si mantiene limitato. Sia λ > 0. Abbiamo<br />

y i+1 = y i − hλy i = (1 − hλ)y i , vale a <strong>di</strong>re y i+1 = y 0 (1 − hλ) i+1 . La soluzione esatta <strong>di</strong> questo problema è<br />

178


11.9. Convergenza e stabilità<br />

y(t) = y 0 e −λt e tende a zero per valori <strong>di</strong> t crescenti. Vogliamo che tenda a zero anche la soluzione numerica<br />

(in modo da mantenere limitato l’errore). La soluzione numerica (fissato h e per i grande, cioè per valori <strong>di</strong> t<br />

crescente) tende a zero se |1 − hλ| < 1 cioè per −1 < 1 − hλ < 1 ⇐⇒ 0 < hλ < 2 ⇐⇒ h < 2 λ .<br />

Il metodo <strong>di</strong> Eulero esplicito è stabile sotto con<strong>di</strong>zione.<br />

11.9.3 Convergenza <strong>di</strong> Eulero implicito<br />

Il metodo <strong>di</strong> Eulero implicito applicato all’equazione test <strong>di</strong>venta:<br />

Quin<strong>di</strong><br />

y 0<br />

y 1 =<br />

(1 + hλ)<br />

y 1<br />

y 2 =<br />

(1 + hλ) = y 0<br />

(1 + hλ) 2<br />

y 2<br />

y 3 =<br />

(1 + hλ) = y 0<br />

(1 + hλ) 3<br />

.<br />

y i =<br />

y i−1<br />

(1 + hλ) = y 0<br />

(1 + hλ) i<br />

y i+1 =<br />

y i<br />

(1 + hλ)<br />

In tal caso<br />

lim<br />

h→0<br />

i→+∞<br />

y i = lim<br />

h→0<br />

i→+∞<br />

y 0<br />

(1 + hλ) i = lim<br />

h→0<br />

i→+∞<br />

⎡<br />

1<br />

⎤<br />

y 0 (1 + hλ) −i = y 0<br />

⎣(1 + hλ) h ⎦<br />

(i passaggi sono del tutto simili a quelli visti per Eulero esplicito).<br />

Abbiamo provato la convergenza.<br />

−i h<br />

= y 0 e −tλ = y(t)<br />

11.9.4 Stabilità <strong>di</strong> Eulero implicito<br />

y 0<br />

Per la stabilità, dalla soluzionei numerica y i = , si osserva che, per i → +∞, qualunque sia il valore<br />

<strong>di</strong> h, la soluzione tende a zero in quanto lim i→+∞ = 0 Si parla <strong>di</strong> metodo incon<strong>di</strong>zionatamente<br />

(1 + λh)<br />

i<br />

1<br />

(1 + λh)<br />

i<br />

stabile.<br />

11.9.5 Convergenza <strong>di</strong> Crank-Nicolson<br />

Il metodo <strong>di</strong> Crank-Nicolson applicato all’equazione test <strong>di</strong>venta: y i+1 = y i + hλ<br />

2 [−y i − y i+1 ] da cui<br />

( ) 2 − hλ<br />

y i+1 = y i<br />

2 + hλ<br />

Andando a ritroso si ricava<br />

( ) 2 − hλ i+1<br />

y i+1 = y 0<br />

2 + hλ<br />

179


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

Per verificare che il metodo converge stu<strong>di</strong>amo il limite<br />

lim<br />

h→0<br />

i→+∞<br />

⎡<br />

( ) 2 − hλ i ( ) 1 ⎤<br />

⎢ 2 − hλ<br />

= ⎣<br />

h ⎥<br />

⎦<br />

2 + hλ 2 + hλ<br />

i h<br />

y i . Partiamo dalla relazione<br />

⎡<br />

( ) 1 ⎤t<br />

⎢ 2 − hλ<br />

= ⎣<br />

h ⎥<br />

⎦<br />

2 + hλ<br />

Ma<br />

( 2 − hλ<br />

2 + hλ<br />

) 1 1 2 − hλ<br />

ln(<br />

h = e h 2 + hλ )<br />

Nel fare il limite per h → 0 e i → +∞ della quantità che si trova all’esponente, applichiamo l’Hôpital e<br />

ricor<strong>di</strong>amo che la derivata <strong>di</strong> 2 − hλ −λ(2 + hλ) − (2 − hλ)λ<br />

vale<br />

2 + hλ (2 + hλ) 2 = −4λ<br />

(2 + hλ) 2 :<br />

Quin<strong>di</strong><br />

lim<br />

h→0<br />

i→+∞<br />

lim<br />

h→0<br />

i→+∞<br />

ln( 2 − hλ<br />

2 + hλ )<br />

h<br />

y i = lim<br />

La convergenza è provata.<br />

h→0<br />

i→+∞<br />

= lim<br />

h→0<br />

i→+∞<br />

( 2 − hλ<br />

y 0<br />

2 + hλ<br />

2 + hλ −4λ<br />

2 − hλ (2 + hλ) 2 = lim −4λ<br />

h→0 (2 + hλ)(2 − hλ) = −λ<br />

) i<br />

= lim<br />

h→0<br />

i→+∞<br />

i→+∞<br />

⎡<br />

( ) 1 ⎤<br />

⎢ 2 − hλ<br />

y 0 ⎣<br />

h ⎥<br />

⎦<br />

2 + hλ<br />

i h<br />

= y 0 e −tλ = y(t)<br />

11.9.6 Stabilità <strong>di</strong> Crank-Nicolson<br />

( ) 2 − λh i<br />

Per la stabilità, si vede che la soluzione numerica è y i = y 0 . Per i → +∞, qualunque sia il valore<br />

2 + λh<br />

( ) 2 − λh i<br />

<strong>di</strong> h, la soluzione tende a zero in quanto lim i→+∞ = 0. Il metodo è incon<strong>di</strong>zionatamente stabile.<br />

2 + λh<br />

11.9.7 Sulla stabilità<br />

La stabilità <strong>di</strong> questi meto<strong>di</strong> la si può verificare anche considerando <strong>di</strong>rettamente l’errore ɛ i , <strong>di</strong>mostrando<br />

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’errore<br />

rimane limitato sotto con<strong>di</strong>zione per Eulero esplicito mentre è incon<strong>di</strong>zionatamente stabile per gli altri<br />

meto<strong>di</strong>. In Figura 11.3 si vede come il metodo <strong>di</strong> Eulero esplicito sia stabile sotto con<strong>di</strong>zione mentre i meto<strong>di</strong><br />

<strong>di</strong> Eulero implicito e Crank-Nicolson sono stabili qualunque passo <strong>di</strong> <strong>di</strong>scretizzazione venga utilizzato.<br />

180


11.10. <strong>Esercizi</strong><br />

Figura 11.3: Confronto dei meto<strong>di</strong> <strong>di</strong> Eulero esplicito, implicito e Crank-Nicolson sull’equazione test y ′ = −y,<br />

prendendo come h il valore h = 2 (a sinistra) e h = 0.5 (a destra).<br />

Esempio<br />

Esempio 11.9.2 Consideriamo il metodo <strong>di</strong> Eulero esplicito e applichiamolo all’equazione test.<br />

Sappiamo che y i+1 = y i + hλy i .<br />

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 <strong>di</strong> troncamento<br />

locale).<br />

Sottraendo la prima equazione dalla seconda abbiamo<br />

ɛ i+1 = ɛ i + hλɛ i + hd i<br />

Considerato che d i = h 2 y′′ (ξ i ) e che, per stu<strong>di</strong>are la stabilità, h è fissato mentre i tende a +∞, il termine<br />

hd i non influisce sull’andamento dell’errore e possiamo trascurarlo. Si ha allora la relazione:<br />

ɛ i+1 = ɛ i + hλɛ i<br />

Ricaviamo ɛ i = ɛ 0 (1 + hλ) i .<br />

Il ragionamento da fare è lo stesso che abbiamo fatto in precedenza e troviamo gli stessi risultati.<br />

Dobbiamo infatti verificare quando ɛ i tende a zero per i che tende a +∞. . .<br />

11.10 <strong>Esercizi</strong><br />

<strong>Esercizi</strong>o 11.10.1 Stu<strong>di</strong>are la stabilità del metodo <strong>di</strong> Eulero esplicito applicato all’equazione <strong>di</strong>fferenziale<br />

y ′ = −2y + 1, con y(0) = 1 (soluzione esatta y(t) = e−2t + 1<br />

)<br />

2<br />

Svolgimento<br />

Per provare la stabilità del metodo dobbiamo verificare che l’errore iniziale si mantiene limitato per valori<br />

crescenti del tempo.<br />

Il metodo <strong>di</strong> Eulero esplicito applicato all’ODE del problema <strong>di</strong>venta<br />

y i+1 = y i + h(−2y i + 1) = (1 − 2h)y i + h<br />

181


11. DIFFERENZIAZIONE NUMERICA ED EQUAZIONI ALLE DERIVATE ORDINARIE<br />

La soluzione esatta sod<strong>di</strong>sfa un’equazione del tipo<br />

y(t i+1 ) = y(t i ) + h(−2y(t i ) + 1) + hd i = (1 − 2h)y(t i ) + h + hd i<br />

Nel calcolare l’errore ɛ i+1 = y(t i+1 ) − y i+1 abbiamo<br />

ɛ i+1 = (1 − 2h)ɛ i + hd i<br />

Il termine hd i (d i errore locale <strong>di</strong> troncamento) si può trascurare. Abbiamo allora ɛ i+1 = (1 − 2h)ɛ i .<br />

Possiamo trovare con facilità che ɛ i+1 = (1 − 2h) i+1 ɛ 0 o, ancora, ɛ i = (1 − 2h) i ɛ 0 .<br />

Se vogliamo che l’errore rimanga limitato per i → ∞ la quantità (1 − 2h) i non deve crescere.<br />

Quin<strong>di</strong> deve essere |1 − 2h| < 1, vale a <strong>di</strong>re −1 < 1 − 2h < 1 cioè 2h < 2, quin<strong>di</strong> h < 1: stabilità sotto<br />

con<strong>di</strong>zione.<br />

182


CAPITOLO 12<br />

Primi passi in MATLAB®<br />

L’universo non potrà essere letto<br />

finché non avremo imparato il<br />

linguaggio ed avremo familiarizzato<br />

con i caratteri con cui è scritto. È<br />

scritto in linguaggio matematico, e<br />

le lettere sono triangoli, cerchi ed<br />

altre figure geometriche, senza le<br />

quali è umanamente impossibile<br />

comprendere una singola parola.<br />

Galileo Galilei<br />

12.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183<br />

12.2 Avvio <strong>di</strong> MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184<br />

12.2.1 Matrici e vettori in MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185<br />

12.3 Coman<strong>di</strong> utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187<br />

12.4 MATLAB® per scrivere ed eseguire programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188<br />

12.4.1 Strutture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188<br />

12.5 Dati <strong>di</strong> input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190<br />

12.5.1 Programma sul metodo delle bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191<br />

12.6 Dati <strong>di</strong> output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192<br />

12.7 Grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193<br />

12.8 Sulle potenzialità <strong>di</strong> MATLAB® . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194<br />

12.9 Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194<br />

12.9.1 Sull’instabilità numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194<br />

12.9.2 Sull’interpolazione e approssimazione <strong>di</strong> dati . . . . . . . . . . . . . . . . . . . . . . . . . . 195<br />

12.9.3 Confronto tra schemi per equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie . . . . . . . . . . . . . . . . . . 202<br />

12.1 Introduzione<br />

Questo capitolo è provvisorio. Infatti, in origine, era stato pensato come una semplice introduzione a<br />

MATLAB® , per chi aveva già imparato a usare il FORTRAN. Molte cose non sono quin<strong>di</strong> approfon<strong>di</strong>te<br />

come dovrebbero! Approfon<strong>di</strong>menti e integrazioni al presente capitolo saranno <strong>di</strong>sponibili durante il<br />

corso: tenere d’occhio, quin<strong>di</strong>, il sito delle <strong>di</strong>spense!!!<br />

MATLAB® può essere considerato un linguaggio <strong>di</strong> programmazione ad alto livello e, allo stesso tempo,<br />

un ambiente interattivo per lo sviluppo <strong>di</strong> algoritmi, per la visualizzazione e l’analisi <strong>di</strong> dati, e per il calcolo<br />

numerico.<br />

183


12. PRIMI PASSI IN MATLAB®<br />

Figura 12.1: L’ambiente MATLAB consiste <strong>di</strong> una serie <strong>di</strong> finestre, alcune delle quali vengono aperte <strong>di</strong> default:<br />

la Command Window (la finestra dei coman<strong>di</strong>), la Current Folder (la <strong>di</strong>rectory corrente in cui si<br />

sta lavorando), la Workspace (lo spazio <strong>di</strong> lavoro) e la Command History (la finestra con la storia dei<br />

coman<strong>di</strong> dati).<br />

Per chi ha già imparato a programmare in altri linguaggi <strong>di</strong> programmazione, come, ad esempio, il linguaggio<br />

FORTRAN, il passaggio a MATLAB® è semplice (basta capire come cambiano le strutture <strong>di</strong> programmazione<br />

e il modo <strong>di</strong> programmare). In più, MATLAB® ha le sue functions, permette calcoli molto più<br />

sofisticati <strong>di</strong> quelli <strong>di</strong> una calcolatrice, ed è capace <strong>di</strong> fare grafici e visualizzare i risultati in maniera <strong>di</strong>retta.<br />

Molto spesso la conoscenza <strong>di</strong> MATLAB® è un requisito richiesto per molte posizioni lavorative in ambito<br />

ingegneristico: a tal fine, è utile imparare qualcosa <strong>di</strong> MATLAB® . E importante prendere atto, comunque,<br />

del fatto che non esiste un linguaggio <strong>di</strong> programmazione che vada bene per risolvere tutti i problemi (quin<strong>di</strong><br />

non basta conoscere e saper usare un solo linguaggio <strong>di</strong> programmazione). MATLAB® è esso stesso un programma<br />

complesso (originariamente scritto in FORTRAN e successivamente riscritto in linguaggio C) che va<br />

bene per risolvere programmi d’elaborazione numerica, per lavorare con matrici (MATLAB® infatti sta per<br />

MATrix LABoratory “laboratorio matriciale”) e per la grafica.<br />

MATLAB® è un prodotto della The MathWorks : vedremo in particolare la versione<br />

MATLAB® 7.10.0.499 (R2010a).<br />

Un prodotto simile a MATLAB® ma open source è GNU Octave (si vada sul sito http://www.octave.<br />

org).<br />

Nel seguito vedremo come si lavora in MATLAB® tenendo presente che quasi tutti i coman<strong>di</strong> che daremo<br />

valgono alla stessa maniera anche per Octave (eccezion fatta per l’interfaccia grafico).<br />

12.2 Avvio <strong>di</strong> MATLAB®<br />

Tralasciamo la parte relativa alla procedura <strong>di</strong> installazione <strong>di</strong> MATLAB® (che <strong>di</strong>pende dal computer e dal<br />

sistema operativo in uso) e <strong>di</strong>amo per scontato che il programma sia presente sul proprio computer.<br />

In ambiente Linux, per avviare MATLAB® basta <strong>di</strong>gitare il comando matlab da una finestra <strong>di</strong> terminale.<br />

Una volta avviato MATLAB® comparirà il prompt dei coman<strong>di</strong> in una finestra come quella mostrata in<br />

Figura 12.1. Per uscire dall’ambiente si <strong>di</strong>gita exit dalla finestra dei coman<strong>di</strong> oppure dal menu File o ancora<br />

dall’icona <strong>di</strong> chiusura (x in alto a destra della finestra).<br />

184


12.2. Avvio <strong>di</strong> MATLAB®<br />

Figura 12.2: Primi calcoli in MATLAB® : osservare cosa succede nella Command Window nella Workspace<br />

e nella Command History.<br />

Per imparare a usare MATLAB® , inizialmente si prende familiarità con la finestra dei coman<strong>di</strong> eseguendo<br />

calcoli come se fosse una calcolatrice. Ve<strong>di</strong>amo che il risultato viene assegnato ad una variabile detta ans e<br />

che nella Workspace si trovano informazioni su <strong>di</strong> essa (si veda Figura 12.2).<br />

12.2.1 Matrici e vettori in MATLAB®<br />

I vettori si possono scrivere come vettori riga o vettori colonna.<br />

Per esempio:<br />

>>x=[1 2]<br />

>> x=[1 2]<br />

x =<br />

1 2<br />

>> y=[10 20]’<br />

y =<br />

10<br />

20<br />

Un vettore riga x viene scritto usando le parentesi quadre e scrivendo le componenti del vettore una dopo<br />

l’altra. Un vettore colonna può essere creato facendo la trasposta <strong>di</strong> un vettore riga (me<strong>di</strong>ante il simbolo ’ ),<br />

oppure mettendo un punto e virgola dopo ciascuna componente:<br />

>> y=[10;20]<br />

y =<br />

10<br />

20<br />

185


12. PRIMI PASSI IN MATLAB®<br />

In MATLAB® i vettori altro non sono che un caso particolare <strong>di</strong> matrice a n righe e 1 colonna (vettore<br />

colonna) o a 1 riga e n colonne (vettore riga). Quin<strong>di</strong> per scrivere una matrice si scrivono i valori della matrice<br />

riga per riga andando a capo con il punto e virgola:<br />

>> A=[1 2 3 4;<br />

5 6 7 8;<br />

9 10 11 12;<br />

13 14 15 16]<br />

A =<br />

1 2 3 4<br />

5 6 7 8<br />

9 10 11 12<br />

13 14 15 16<br />

Per matrici (e quin<strong>di</strong> per i vettori) si possono fare le operazioni <strong>di</strong> somma e prodotto in maniera molto<br />

semplice. Date due matrici A e B si ha<br />

G C=A+B: matrice somma<br />

G C=A-B: matrice <strong>di</strong>fferenza<br />

G C=A*B: matrice prodotto (deve essere la matrice A <strong>di</strong> <strong>di</strong>mensione n × m e la matrice B <strong>di</strong> <strong>di</strong>mensione<br />

m × r altrimenti si ha un messaggio <strong>di</strong> errore).<br />

G C=A’: matrice trasposta<br />

G C=A.*B : matrice i cui elementi sono C (i , j ) = A(i , j ) ∗ B(i , j )<br />

Osserviamo che, per in<strong>di</strong>care un valore della matrice A basta specificare l’in<strong>di</strong>ce <strong>di</strong> riga e <strong>di</strong> colonna: per<br />

esempio<br />

>> A(2,2)<br />

ans =<br />

6<br />

Per in<strong>di</strong>care gli elementi <strong>di</strong> tutta la colonna i si usa A(:,i), mentre A(i,:) in<strong>di</strong>ca gli elementi della riga<br />

i.<br />

>> A(:,2)<br />

ans =<br />

2<br />

6<br />

10<br />

14<br />

>> A(2,:)<br />

ans =<br />

5 6 7 8<br />

L’operatore due punti può dunque essere usato per estrarre un’intera riga o colonna da una matrice o<br />

un’intera sottomatrice. Se vogliamo estrarre le ultime due righe e colonne della matrice A, si <strong>di</strong>gita il comando<br />

>> M=A(3:4,3:4)<br />

M =<br />

186<br />

11 12<br />

15 16


12.3. Coman<strong>di</strong> utili<br />

In questo modo abbiamo creato la matrice M che ha come elementi quelli della sottomatrice <strong>di</strong> A con le ultime<br />

due righe e colonne.<br />

Per scrivere una matrice vuota A, invece, si usa l’istruzione A=[ ].<br />

Se si vuole risolvere un sistema lineare Ax = b in MATLAB® si può semplicemente usare una function<br />

propria <strong>di</strong> MATLAB® “nascosta” nell’operatore \ (backslash): basta <strong>di</strong>gitare il comando x= A \b, con b<br />

vettore colonna, per avere in x il vettore incognito. Ad esempio (si confronti con l’esercizio 7.6.2):<br />

>> A=[0.2 1 0.2; 1 6.5 1.75; 0 2 2.25]<br />

A =<br />

0.2000 1.0000 0.2000<br />

1.0000 6.5000 1.7500<br />

0 2.0000 2.2500<br />

>> b=[2.8 ; 19.25; 10.75]<br />

b =<br />

2.8000<br />

19.2500<br />

10.7500<br />

>> x=A\b<br />

x =<br />

1<br />

2<br />

3<br />

12.3 Coman<strong>di</strong> utili<br />

Per lavorare meglio sia nella finestra dei coman<strong>di</strong> sia, successivamente, per scrivere ed eseguire dei veri e<br />

propri programmi, risultano utili le seguenti funzioni:<br />

G who – fornisce l’elenco <strong>di</strong> tutte le variabili presenti nella finestra dei coman<strong>di</strong> (lo si può vedere anche<br />

nella Workspace;<br />

G whos – fornisce l’elenco <strong>di</strong> tutte le variabili insieme allo spazio in memoria da esse occupato;<br />

G help – può essere usato da solo o insieme al nome <strong>di</strong> una function <strong>di</strong> MATLAB® o creata dall’utente, e<br />

mostra tutte le informazioni utili per capire come usare MATLAB® o quella function;<br />

G clear – se è usata da sola cancella tutte le variabili presenti nella finestra dei coman<strong>di</strong>, se invece è<br />

seguita da un elenco <strong>di</strong> variabili (messe una <strong>di</strong> seguito all’altra senza virgole) cancella tutte le variabili<br />

dell’elenco;<br />

G il punto e virgola “;” messo dopo un’istruzione non fa vedere il risultato dell’istruzione nella finestra<br />

dei coman<strong>di</strong>;<br />

G il simbolo % è il simbolo per scrivere commenti: ciò che viene scritto dopo % rappresenta un<br />

commento;<br />

G <strong>di</strong>ary – permette <strong>di</strong> salvare, su un file che viene chiamato <strong>di</strong>ary, il contenuto <strong>di</strong> ciò che viene scritto<br />

nella finestra dei coman<strong>di</strong>. Il file <strong>di</strong>ary si trova nella <strong>di</strong>rectory corrente in cui si sta lavorando;<br />

G <strong>di</strong>ary off – chiude il file aperto me<strong>di</strong>ante l’istruzione <strong>di</strong>ary;<br />

G <strong>di</strong>ary file<strong>di</strong>ary – comando analogo a <strong>di</strong>ary, ma il file non si chiamerà <strong>di</strong>ary bensì<br />

file<strong>di</strong>ary, dove file<strong>di</strong>ary rappresenta il nome del file definito dall’utente;<br />

G save filesave – salva tutte le variabili presenti nel Workspace, nel file filesave.mat con<br />

filesave nome scelto dall’utente;<br />

G load ’filesave’ – ripristina lo stato del Workspace, per esempio dopo aver chiuso la sessione<br />

<strong>di</strong> MATLAB® , caricando tutte le variabili che erano state salvate in filesave.mat.<br />

187


12. PRIMI PASSI IN MATLAB®<br />

C‘e una notevole <strong>di</strong>fferenza <strong>di</strong> significato tra i files generati dall’istruzione <strong>di</strong>ary e quelli generati me<strong>di</strong>ante<br />

save. Ciò che salviamo con il comando <strong>di</strong>ary è paragonabile a ciò che può essere scritto alla lavagna<br />

e <strong>di</strong> cui pren<strong>di</strong>amo appunti: scriviamo un file <strong>di</strong> testo che possiamo elaborare o da cui possiamo trarre dei<br />

risultati per i nostri problemi. Al contrario, quello che viene salvato me<strong>di</strong>ante il comando save è costituito<br />

da una o più variabili, che possono essere riutilizzate nuovamente in MATLAB® nella finestra dei coman<strong>di</strong>, in<br />

sessioni successive a quella in cui sono state create, senza dover rieseguire tutti i coman<strong>di</strong> che hanno portato<br />

alla creazione delle variabili stesse.<br />

Il comando save è utile anche per salvare singole matrici o una lista <strong>di</strong> matrici nella <strong>di</strong>rectory corrente. Ci<br />

soffermiamo sulla possibilità <strong>di</strong> salvare i dati in formato ASCII, in modo da poter utilizzare i dati che salviamo<br />

non solo in MATLAB® ma anche in programmi scritti con altri linguaggi <strong>di</strong> programmazione. Supponiamo<br />

<strong>di</strong> avere una matrice A e <strong>di</strong> volerla salvare nel file matriceA.dat. Scriveremo il comando<br />

save matriceA.dat A -ascii<br />

Quando vogliamo caricare in MATLAB® la matrice dal file useremo il comando<br />

load(’matriceA.dat’)<br />

e in questo modo avremo la matrice nella variabile matriceA (il nome del file senza l’estensione dopo il<br />

punto).<br />

12.4 MATLAB® per scrivere ed eseguire programmi<br />

Per eseguire determinati algoritmi o risolvere determinati problemi me<strong>di</strong>ante determinate istruzion, MA-<br />

TLAB® utilizza le cosiddette functions che possono avere uno o più variabili <strong>di</strong> ingresso (dati <strong>di</strong> input) e una<br />

o più variabili in uscita (dati <strong>di</strong> output).<br />

I files in cui vengono scritti i programmi si chiamano M-files dal fatto che hanno l’estensione .m:<br />

prova.m, fun.m, . . . I files vanno scritti con l’e<strong>di</strong>tor <strong>di</strong> testo <strong>di</strong> MATLAB® o con un altro e<strong>di</strong>tor <strong>di</strong> testo in<br />

formato ASCII.<br />

In MATLAB® abbiamo due tipi <strong>di</strong> files eseguibili: lo script, che presenta una lista <strong>di</strong> coman<strong>di</strong> da eseguire<br />

in ambiente MATLAB® , tra cui la chiamata alle functions proprie <strong>di</strong> MATLAB® o definite dall’utente<br />

(sempre tramite M-files) e le functions (<strong>di</strong> MATLAB® o definite dall’utente) che possono essere chiamate<br />

<strong>di</strong>rettamente nell’ambiente <strong>di</strong> lavoro <strong>di</strong> MATLAB® o all’interno <strong>di</strong> uno script.<br />

Per eseguire uno script salvato in nomefile.m non c’è bisogno <strong>di</strong> dover compilare il programma<br />

(come invece si fa con altri linguaggi <strong>di</strong> programmazione): basta lanciare il programma nella finestra dei<br />

coman<strong>di</strong> me<strong>di</strong>ante il nome del file (senza l’estensione .m) o me<strong>di</strong>ante il comando run(’nomefile.m’)<br />

o run(’nomefile’). Una function invece può essere eseguita tramite uno script oppure <strong>di</strong>rettamente<br />

nella finestra dei coman<strong>di</strong>, specificando le variabili <strong>di</strong> ingresso e <strong>di</strong> uscita, come vedremo con qualche<br />

esempio tra breve.<br />

Per quanto riguarda il nome da dare alle variabili, MATLAB® è sensibile alle lettere minuscole e<br />

maiuscole: una variabile chiamata A è <strong>di</strong>versa da a, una variabile XOLD è <strong>di</strong>versa da xold.<br />

È importante osservare, inoltre, che nello scrivere M-files le variabili utilizzate non vanno <strong>di</strong>chiarate, ma<br />

è bene sapere <strong>di</strong> che tipo sono (intere, reali in singola precisione, reali in doppia precisione,...)<br />

12.4.1 Strutture<br />

Elenchiamo in breve gli operatori logici.<br />

Ve<strong>di</strong>amo i vari cicli in MATLAB® (spiegazione dettagliata in aula e ampliata con materiale on-line<br />

<strong>di</strong>stributo durante il corso):<br />

188


12.4. MATLAB® per scrivere ed eseguire programmi<br />

Operatore MATLAB® Significato<br />

< minore<br />

> maggiore<br />

= maggiore o uguale<br />

== uguale<br />

∼= non uguale<br />

&&<br />

congiunzione<br />

|| <strong>di</strong>sgiunzione<br />

∼<br />

negazione<br />

Tabella 12.1: Operatori relazionali e logici<br />

Ciclo if con più con<strong>di</strong>zioni<br />

Ciclo if con una con<strong>di</strong>zione<br />

i f ( espr . logica )<br />

{ istruzione 1a }<br />

{ istruzione 2a }<br />

{ . . . . }<br />

else<br />

{ istruzione 1b }<br />

{ istruzione 2b }<br />

{ . . . . }<br />

end<br />

i f ( espr . logica1 )<br />

{ istruzione 1a }<br />

{ istruzione 2a }<br />

{ . . . . }<br />

e l s e i f ( espr . logica2 )<br />

{ istruzione 1b }<br />

{ istruzione 2b }<br />

{ . . . . }<br />

. . . .<br />

else<br />

{ istruzione 1z }<br />

{ istruzione 2z }<br />

{ . . . . }<br />

end<br />

Osserviamo che in MATLAB® elseif va scritto tutto attaccato.<br />

Ciclo while<br />

while ( espressione logica )<br />

{ istruzione 1 }<br />

{ istruzione 2 }<br />

{ . . . }<br />

{ istruzione n }<br />

end<br />

Ciclo for<br />

for ind= v a l i n i z : incr : v a l f i n<br />

{ i s t r u z i o n i }<br />

end<br />

189


12. PRIMI PASSI IN MATLAB®<br />

Ciclo switch<br />

switch ( espressione ) % ( s c a l a r e o stringa )<br />

case { valore1 } % eseguita se l ’ espressione e ’ valutata al valore1 )<br />

{ i s t r u z i o n i }<br />

{ . . . }<br />

case { valore2 } % ( eseguita se l ’ espressione e ’ valutata al valore2 )<br />

{ i s t r u z i o n i }<br />

{ . . . }<br />

otherwise<br />

{ i s t r u z i o n i }<br />

{ . . . }<br />

end<br />

Il ciclo con switch confronta i valori dati nell’espressione <strong>di</strong> input (subito dopo switch) con ciascun<br />

valore assegnato a case ed esegue le istruzioni relative al case in cui valore ed espressione coincidono.<br />

Nell’esempio che riportiamo, a seconda del valore assegnato alla variabile scelta cambiano i valori da<br />

assegnare alle variabili a e b:<br />

s c e l t a =’test1’ ;<br />

switch s c e l t a<br />

case {’test1’}<br />

x0= 0 . 1 ;<br />

x1= 0 . 2 ;<br />

case {’test2’}<br />

x0= 0 . 0 ;<br />

x1= 1 . 0 ;<br />

otherwise<br />

<strong>di</strong>sp (’nessun caso test scelto’)<br />

end<br />

Osserviamo che scelta è una variabile <strong>di</strong> stringa <strong>di</strong> caratteri, il nome del caso test scritto tra apici; per<br />

visualizzare un messaggio sulla Command Window, abbiamo usato la function <strong>di</strong> MATLAB® chiamata <strong>di</strong>sp.<br />

12.5 Dati <strong>di</strong> input<br />

Quando si lavora nella finestra dei coman<strong>di</strong>, per assegnare il valore alle variabili basta scrivere il nome<br />

della variabile seguito dal simbolo <strong>di</strong> uguale e dal valore (o dai valori) da assegnare (a seconda che si tratti <strong>di</strong><br />

una variabile scalare, matrice, vettore...):<br />

>> a=10.5;<br />

>> A=[1 2 3; 4 5 6; 7 8 9];<br />

Nell’eseguire uno script, alla stessa maniera, si può assegnare il valore alle variabili <strong>di</strong>rettamente all’interno<br />

dello script. Tuttavia, se si vuole dare maggiore generalità al programma e si vogliono dare in input i valori<br />

delle variabili, conviene usare la function input. Ve<strong>di</strong>amo con un esempio:<br />

a=input(’ scrivi il valore della variabile a ’)<br />

Il messaggio contenuto tra apici viene visualizzato sulla finestra dei coman<strong>di</strong> e il prompt aspetterà che<br />

l’utente scriva il valore da assegnare ad a.<br />

Questa procedura può essere utilizzata sia per assegnare il valore a variabili scalari, sia per matrici e vettori.<br />

Tuttavia, se i dati <strong>di</strong> input sono molto “pesanti” (ad esempio matrici <strong>di</strong> <strong>di</strong>mensioni molto elevate), conviene<br />

usare in maniera opportuna la funzione <strong>di</strong> input unitamente al comando load - scrivendo una volta per tutte<br />

la matrice <strong>di</strong> input in un file da caricare ogni volta che si vuole eseguire il programma con quella matrice.<br />

Per esempio, abbiamo scritto nel file A.dat i valori della matrice e vogliamo dare in input questa matrice al<br />

nostro programma. Invece <strong>di</strong> scrivere<br />

190


12.5. Dati <strong>di</strong> input<br />

A= input(’ matrice A ’);<br />

nello script scriveremo<br />

A= input(’ file <strong>di</strong> input con la matrice A ’, ’s’);<br />

A= load(A);<br />

Osserviamo che abbiamo usato input inserendo, oltre alla stringa tra apici ’file <strong>di</strong> input con<br />

la matrice A’, anche ’s’: questa opzione serve perchè noi scriveremo il nome del file su cui si trova<br />

memorizzata la matrice e questo file viene letto come una stringa <strong>di</strong> caratteri per cui inizialmente alla variabile<br />

A viene associato il file con la matrice (in questo caso A.dat). Con il comando successivo, viene caricato<br />

il file e memorizzato <strong>di</strong> nuovo sulla variabile A, che quin<strong>di</strong> <strong>di</strong>venta la nostra matrice.<br />

Si osservi la <strong>di</strong>fferenza che c’è nel lasciare o meno spazi bianchi prima dell’apice che chiude la frase che<br />

viene visualizzata sulla Command Window tramite input.<br />

È utile sapere anche che, se un’istruzione è troppo lunga e si vuole andare a capo, si utilizzano tre puntini<br />

... sulla riga che si vuole interrompere e si prosegue a scrivere sulla riga successiva.<br />

12.5.1 Programma sul metodo delle bisezioni<br />

Consideriamo l’algoritmo del metodo delle bisezioni, per calcolare gli zeri <strong>di</strong> un’opportuna funzione f .<br />

Ad esempio vogliamo risolvere il problema f (x) = 0 con f (x) = ( x 2 )2 − sin(x) nell’intervallo [1,3].<br />

Dobbiamo scrivere il programma principale, in un file che chiamiamo bisez.m, e la function legata alla<br />

funzione f (x), in un file che chiamiamo fun.m.<br />

Scriviamo il programma principale:<br />

% programma per i l calcolo d e g l i z e r i <strong>di</strong> una funzione me<strong>di</strong>ante<br />

% i l metodo <strong>di</strong> bisezione<br />

a=input (’primo estremo dell’’intervallo a ’ ) ;<br />

b=input (’secondo estremo dell’’intervallo b ’ ) ;<br />

aux=fun ( a ) * fun (b ) ;<br />

i f aux>=0<br />

<strong>di</strong>sp (’estremi dello stesso segno’)<br />

break<br />

end<br />

itmax =100;<br />

t o l l =1.e−10;<br />

i t e r =0;<br />

c =(a+b ) * 0 . 5 ;<br />

scarto=abs (b−a ) * 0 . 5 ;<br />

while i t e r t o l l<br />

i t e r = i t e r +1;<br />

aux=fun ( a ) * fun ( c ) ;<br />

i f aux>0<br />

a=c ;<br />

else<br />

b=c ;<br />

end<br />

c =(a+b ) * 0 . 5 ;<br />

scarto=abs (b−a ) * 0 . 5 ;<br />

end<br />

i f fun ( c)==0 | | scarto < t o l l<br />

s p r i n t f (’%s %15.8e’ , ’soluzione approssimata c= ’ , c )<br />

else<br />

s p r i n t f (’%s’ , ’raggiunto numero max <strong>di</strong> iterazioni ’)<br />

end<br />

Per poter essere eseguito, dobbiamo scrivere in un file chiamato fun.m la function fun. Si ha:<br />

function y=fun ( x )<br />

% funzione per lo schema d e l l e b i s e z i o n i<br />

191


12. PRIMI PASSI IN MATLAB®<br />

% input x<br />

% output y =(x /2)^2 −sin ( x )<br />

y=( x/2).^2 − sin ( x ) ;<br />

Nel programma principale abbiamo semplicemente tradotto l’algoritmo del metodo delle bisezioni. Abbiamo<br />

considerato dei coman<strong>di</strong> che non abbiamo ancora visto in MATLAB® , per la stampa dei risultati (me<strong>di</strong>ante<br />

sprintf) e abbiamo usato il comando break per interrompere l’esecuzione del programma se una<br />

con<strong>di</strong>zione non è verificata.<br />

Le righe <strong>di</strong> commento scritte dopo l’istruzione function y=fun(x) vengono visualizzate sulla<br />

Command Window se, una volta salvata la function, <strong>di</strong>gitiamo l’istruzione help fun<br />

12.6 Dati <strong>di</strong> output<br />

L’ambiente MATLAB® permette <strong>di</strong> visualizzare tutte le variabili presenti al termine dell’esecuzione <strong>di</strong> un<br />

programma o <strong>di</strong> una funzione. Tuttavia, alcune volte vogliamo visualizzare subito dei risultati sulla Command<br />

Window o su un file separato rispetto all’ambiente <strong>di</strong> lavoro. Abbiamo già visto, nell’esempio precedente<br />

il comando sprintf: esso serve per stampare un messaggio sulla Command Window utilizzando un<br />

certo tipo <strong>di</strong> formato.<br />

Nell’esempio avevamo usato<br />

sprintf(’%s %15.8e’, ’soluzione approssimata c= ’, c)<br />

All’interno delle parentesi tonde si possono riconoscere due parti: nella prima parte si scrive, tra apici e uno <strong>di</strong><br />

seguito all’altro, il formato da utilizzare per la stampa delle variabili che sono scritte subito dopo. Nel nostro<br />

caso, le variabili da stampare sono la stringa <strong>di</strong> caratteri soluzione approssimata c= e il valore della<br />

variabile c. Per la stringa <strong>di</strong> caratteri si usa il formato delle stringhe che è dato da %s mentre per la variabile c,<br />

volendo scriverla me<strong>di</strong>ante un formato esponenziale con 8 cifre nella mantissa, usiamo il formato %15.8e.<br />

Il formato per una variabile è preceduto dal simbolo % . Per la variabili intere o reali possiamo decidere<br />

quante cifre utilizzare per rappresentare la variabile (%15.8e nell’esempio). Riassumiamo nella tabella<br />

seguente i principali tipi <strong>di</strong> formato e i simboli che servono per andare a capo o creare nuove linee: Se si<br />

formato<br />

Significato<br />

%s stringhe <strong>di</strong> caratteri<br />

%d formato intero<br />

%f formato fisso<br />

%e formato esponenziale (del tipo 3.5e + 00)<br />

%E formato esponenziale (del tipo 3.5E + 00)<br />

\ n nuova linea<br />

\ r per andare a capo<br />

Tabella 12.2: Il formato<br />

vogliono scrivere i risultati su un file, occorre aprire il file e associarlo ad una variabile me<strong>di</strong>ante la function<br />

fopen. Ad esempio<br />

fid= fopen(’risultati.txt’,’w’)<br />

Con questa istruzione aprimamo il file <strong>di</strong> risultati dal nome risultati.txt (’w’ in<strong>di</strong>ca che il file è <strong>di</strong><br />

scrittura) associandolo alla variabile fid. Per scrivere sul file, al posto della function sprintf si userà la<br />

function fprintf che <strong>di</strong>fferisce dalla prima per il fatto che bisogna in<strong>di</strong>care la variabile associata al file <strong>di</strong><br />

scrittura dati. Il comando sprintf <strong>di</strong> prima <strong>di</strong>venta ora:<br />

fprintf(fid , ’%s %15.8e’, ’soluzione approssimata c= ’, c)<br />

Per chiudere il file si usa l’istruzione fclose(fid).<br />

192


12.7. Grafici<br />

Figura 12.3: Finestra con il grafico<br />

12.7 Grafici<br />

Supponiamo <strong>di</strong> voler fare il grafico <strong>di</strong> una serie <strong>di</strong> dati (x i , y i ), i = 1,...,n. Sulla Command Window (o<br />

all’interno <strong>di</strong> uno script) basta <strong>di</strong>gitare il comando<br />

plot(x,y)<br />

Si aprirà una nuova finestra con il grafico (ve<strong>di</strong> Figura 12.3).<br />

Potremo poi mo<strong>di</strong>ficare il colore, il tipo <strong>di</strong> linea, inserire titolo, legenda,...operando <strong>di</strong>rettamente sul menu<br />

della finestra del grafico, o inserendo i coman<strong>di</strong> opportuni tramite la Command Window 1 .<br />

Si possono sovrascrivere grafici l’uno sull’altro utilizzando il comando hold on. Oppure si possono<br />

affiancare grafici me<strong>di</strong>ante il comando subplot. Lasciamo gli approfon<strong>di</strong>menti all’help on line.<br />

Per fare il grafico <strong>di</strong> una funzione, si possono seguire <strong>di</strong>verse strade.<br />

Se si ha a <strong>di</strong>sposizione la function (propria <strong>di</strong> MATLAB® o scritta su un file .m), si può costruire il vettore<br />

con il valore della funzione in un numero determinato <strong>di</strong> punti equi<strong>di</strong>stanti sull’intervallo in cui si desidera<br />

visualizzarla. A tal proposito è utile la function linspace che permette <strong>di</strong> <strong>di</strong>scretizzare un intervallo chiuso<br />

[a,b] in un prefissato numero <strong>di</strong> punti. Useremo allora le seguenti istruzioni:<br />

x=linspace ( 0 , 2 ) ;% <strong>di</strong>scretizziamo l ’ i n t e r v a l l o [ 0 , 2 ] in 100 parti<br />

% uguali<br />

% x=linspace (50 , 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<br />

%50 parti uguali<br />

y=myfun( x ) ; % valuto la function myfun nel v e t t o r e x<br />

plot ( x , y )<br />

Questo approccio è comodo quando la funzione da visualizzare ha una espressione complicata o quando<br />

stiamo lavorando all’interno <strong>di</strong> uno script. La function myfun deve essere scritta in modo che sia possibile<br />

valutarla <strong>di</strong>rettamente su un vettore (che è quello che facciamo tramite l’istruzione y=myfun(x)). Le<br />

operazioni <strong>di</strong> moltiplicazione, <strong>di</strong>visione ed elevamento a potenza devono essere vettorizzate, facendo precendere<br />

il simbolo <strong>di</strong> moltiplicazione, <strong>di</strong>visione e elevamento a potenza dal simbolo del punto ( .*, ./,<br />

.ˆ ) permettendo, in tal modo, che le operazioni vengano fatte componente per componente del vettore. Le<br />

operazioni <strong>di</strong> somma e <strong>di</strong>fferenza sono vettorizzate per definizione.<br />

Ad esempio: la function myfun definita tramite le istruzioni<br />

1 Ci sarebbe tanto da <strong>di</strong>re a riguardo ma lasciamo che il lettore curioso approfon<strong>di</strong>sca l’argomento utilizzando l’help on line <strong>di</strong><br />

MATLAB® . In Octave, invece, le mo<strong>di</strong>fiche ai grafici non possono essere fatte usando la finestra del grafico.<br />

193


12. PRIMI PASSI IN MATLAB®<br />

function [ y ]= f ( x )<br />

y=log ( x ) * x<br />

non è vettorizzata. Se invece scriviamo<br />

function [ y ]= f ( x )<br />

y=log ( x ) . * x<br />

allora la function è vettorizzata.<br />

Un’altra via è <strong>di</strong> scrivere la function come una funzione inline nella Command Window e <strong>di</strong> utilizzare la<br />

function ezplot per farne il grafico.<br />

Supponiamo <strong>di</strong> voler fare il grafico della funzione f (x) = e x −10sin(x)−1. Per avere questa funzione nella<br />

Command Window durante la sessione <strong>di</strong> lavoro (quin<strong>di</strong> non come una function scritta su file), scriviamo il<br />

comando<br />

fun = inline(’exp(x)-10*sin(x)-1’)<br />

Sulla Command Window compaiono le seguenti righe:<br />

>> fun=inline(’exp(x)-10*sin(x)-1’)<br />

fun =<br />

Inline function:<br />

fun(x) = exp(x)-10*sin(x)-1<br />

Se vogliamo farne il grafico nell’intervallo [0,2] scriveremo<br />

ezplot(fun, 0, 2)<br />

e viene <strong>di</strong>rettamente creato il grafico della funzione fun. La function ezplot può essere utilizzata anche<br />

con funzioni intrinseche <strong>di</strong> MATLAB® o definite dall’utente in forma vettorizzata (per esempio<br />

ezplot(’sin’,0,2)<br />

crea il grafico della funzione sin(x) nell’intervallo [0,2]).<br />

12.8 Sulle potenzialità <strong>di</strong> MATLAB®<br />

MATLAB® ha un grande numero <strong>di</strong> functions predefinite che permettono <strong>di</strong> eseguire applicazioni in <strong>di</strong>versi<br />

settori propriamente matematici, per approssimare zeri <strong>di</strong> funzioni, per lavorare su matrici sparse, risolvere<br />

equazioni <strong>di</strong>fferenziali, lavorare su dati statistici, fare grafici in due e tre <strong>di</strong>mensioni... Basta vedere il<br />

Demo <strong>di</strong> MATLAB® per trovare la function <strong>di</strong> cui si ha bisogno.<br />

È possibile inoltre installare pacchetti specifichi per specifiche aree <strong>di</strong> applicazioni, quali sistemi <strong>di</strong><br />

controllo, biologia computazionale, finanza computazionale, meccatronica...<br />

In questa breve presentazione <strong>di</strong> MATLAB® , tuttavia, cercheremo <strong>di</strong> vedere come utilizzarlo per capire<br />

meglio alcuni dei problemi trattati in <strong>Calcolo</strong> <strong>Numerico</strong>, rielaborando o ripresentando alcuni esempi già visti.<br />

12.9 Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong><br />

12.9.1 Sull’instabilità numerica<br />

Ripren<strong>di</strong>amo l’esempio sull’instabilità numerica visto nel Capitolo sulla rappresentazione dei numeri al<br />

calcolatore, per cui vogliamo approssimare il valore <strong>degli</strong> integrali espressi me<strong>di</strong>ante la formula<br />

y n =<br />

∫ 1<br />

0<br />

x n<br />

x + 10 dx<br />

per valori <strong>di</strong> n = 1,2,...,30.<br />

Avevamo visto due formule ricorsive che ci permettevano <strong>di</strong> approssimare y n , una era instabile e l’altra<br />

era stabile.<br />

Proviamo a rivedere gli algoritmi e scriviamo un programma MATLAB® da eseguire per verificare quanto<br />

avevamo detto.<br />

194


12.9. Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong><br />

% E s e r c i z i o sull ’ i n s t a b i l i t a ’ numerica<br />

% calcolo dell ’ i n t e g r a l e y_n= int_0^1 x^n / ( x+10) dx<br />

%<br />

% y i n s t : v e t t o r e con i v a l o r i dell ’ algoritmo i n s t a b i l e<br />

% y s t : v e t t o r e con i v a l o r i dell ’ algoritmo s t a b i l e<br />

%<br />

% algoritmo i n s t a b i l e<br />

%<br />

y inst (1)= log (11) −log ( 1 0 ) ; %corrisponde al valore i n i z i a l e<br />

for i =1:30<br />

y inst ( i +1)= 1/ i −10* y inst ( i ) ;<br />

end<br />

%<br />

% algoritmo s t a b i l e<br />

% s i r i c hiede che i l valore dell ’ i n t e g r a l e y_n1 s i a approssimato<br />

% con una accuratezza data dal valore <strong>di</strong> input t o l<br />

n1= input (’ in<strong>di</strong>ce n1’ ) ;<br />

t o l =input (’ tolleranza tol’ ) ;<br />

k= −log10 ( t o l ) + n1 ;<br />

k= f i x ( k + 1 ) ; % f i x e ’ una function che e f f e t t u a l ’ arrotondamento<br />

% del numero in modo da avere un valore intero<br />

yst ( k ) = 0 ;<br />

for j =k−1:−1:1<br />

yst ( j ) =1/10*(1/ j − yst ( j + 1 ) ) ;<br />

end<br />

Uno volta eseuito lo script, nella Command Window si hanno i due vettori che possono essere confrontati<br />

tra loro. Il valore iniziale y 0 si avrà nella prima componente dei vettori che vengono creati. Perciò si faccia<br />

attenzione agli in<strong>di</strong>ci utilizzati (per yst si usa j e j+1: perchè).<br />

Volendo, si può mo<strong>di</strong>ficare lo script facendo uso della function <strong>di</strong> MATLAB® single che converte il<br />

risultato in singola precisione in modo da confrontare i due algoritmi con i calcoli in singola precisione.<br />

% y i n s t s i n g : v e t t o r e dell ’ algoritmo i n s t a b i l e lavorando<br />

% in singola precisione<br />

% y s t s i n g : v e t t o r e dell ’ algoritmo s t a b i l e lavorando<br />

% in singola precisione<br />

yinstsing (1)= single ( log ( 1 1 ) ) −single ( log ( 1 0 ) ) ;<br />

for i =1:30<br />

yinstsing ( i +1)= single (1/ i ) −single (10* yinstsing ( i ) ) ;<br />

end<br />

n1= input (’ in<strong>di</strong>ce n1’ ) ;<br />

t o l =input (’ tolleranza tol’ ) ;<br />

k= −log10 ( t o l ) + n1 ;<br />

k= f i x ( k + 1 ) ;<br />

ystsing ( k ) = 0 ;<br />

for j =k−1:−1:1<br />

ystsing ( j ) = single (1/10)* single (1/ j − ystsing ( j + 1 ) ) ;<br />

end<br />

Come si può osservare dalle Figure 12.4 e 12.5, i risultati ottenuti dall’algoritmo instabile cambiano a seconda<br />

che si usi o meno la function single mentre abbiamo gli stessi risultati (consideriamo le cifre corrette in<br />

singola precisione, usando il formato format short e) per l’algoritmo stabile.<br />

12.9.2 Sull’interpolazione e approssimazione <strong>di</strong> dati<br />

In MATLAB® esistono già delle function che permettono <strong>di</strong> interpolare e approssimare delle serie <strong>di</strong> dati.<br />

C’è la function polyfit che, dati i vettori contenenti le ascisse e le or<strong>di</strong>nate da interpolare o approssimare,<br />

<strong>di</strong> <strong>di</strong>mensione n, e il grado m del polinomio che si vuole creare, fornisce in output il vettore contenente i<br />

195


12. PRIMI PASSI IN MATLAB®<br />

Figura 12.4: Algoritmo instabile: schermata del confronto tra l’uso o meno della function single<br />

coefficienti del polinomio interpolante (o approssimante) in or<strong>di</strong>ne decrescente [a m a m−1 ... a 0 ] da cui il polinomio<br />

è p(x) = a m x m + a m−1 x m−1 +... a 0 : per m = n −1 si ha il polinomio <strong>di</strong> interpolazione, per m < n −1 si<br />

ha il polinomio <strong>di</strong> approssimazione. L’algoritmo si basa sul processo <strong>di</strong> minimizzazione nel senso dei minimi<br />

quadrati.<br />

Esempio:<br />

>> x=[7 8 9 10];<br />

>> y=[3 1 1 9];<br />

>> p=polyfit(x,y,3)<br />

p =<br />

1.0000 -23.0000 174.0000 -431.0000<br />

Significa che il polinomio <strong>di</strong> interpolazione è:<br />

p(x) = x 3 − 23x 2 + 174x − 431<br />

Una volta ricavati i coefficienti, si può fare un grafico del polinomio utilizzando la function polyval.<br />

>> xx=linspace(x(1), x(4));<br />

>> yy=polyval(p,xx);<br />

>> plot(x,y,’o’, xx,yy)<br />

196


12.9. Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong><br />

Figura 12.5: Algoritmo stabile: schermata del confronto tra l’uso o meno della function single<br />

Con polyval si valuta il polinomio, i cui coefficienti sono dati dal vettore p, nei punti <strong>di</strong> xx. Abbiamo usato<br />

la function plot per rappresentare sullo stesso grafico due curve, quella dei dati x,y (grafico che facciamo<br />

per punti utilizzando dei “cerchietti”) e quella del polinomio.<br />

Scriviamo ora delle function che ci permettano <strong>di</strong> ottenere il polinomio <strong>di</strong> interpolazione sia usando<br />

l’approccio delle funzioni base monomiali che porta alla costruzione della matrice <strong>di</strong> Vandermonde, sia<br />

costruendo i polinomi <strong>di</strong> Lagrange o utilizzando le <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton.<br />

Usando le funzioni base monomiali, scriviamo la seguente function, interpmonom:<br />

function p=interpmonom( x , y )<br />

% function p=interpmonom ( x , y )<br />

% interpolazione monomiale<br />

% dati i v a l o r i x e y da interpolare s i c o s t r u i s c e i l v e t t o r e p<br />

% dei c o e f f i c i e n t i del polinomio <strong>di</strong> interpolazione<br />

% applicando i l metodo dei c o e f f i c i e n t i indeterminati<br />

%<br />

% se x e y non sono gia ’ v e t t o r i colonna l i ren<strong>di</strong>amo t a l i<br />

% me<strong>di</strong>ante l e due i s t r u z i o n i s u c c e s s i v e<br />

x=x ( : ) ;<br />

y=y ( : ) ;<br />

i f length ( x)~= length ( y )<br />

% length e ’ una function che misura la lunghezza del v e t t o r e<br />

% ( s i confronti la d i f f e r e n z a tra length e s i z e )<br />

error (’MATLAB:interpmonom’ , . . .<br />

’i vettori x e y non hanno la stessa lunghezza’)<br />

197


12. PRIMI PASSI IN MATLAB®<br />

else<br />

n=length ( x ) −1;<br />

% V matrice <strong>di</strong> Vandermonde c o s t r u i t a in maniera r i c o r s i v a<br />

V( : , 1 ) = ones (n+1 , 1 ) ;<br />

for i =2:n+1<br />

V ( : , i )= x . * V ( : , i −1);<br />

end<br />

p=V\y ;<br />

% 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<br />

% in or<strong>di</strong>ne c r e s c e n t e − p0 p1 p2 . . .<br />

% se vogliamo usare la function del MATLAB polyval per valutare<br />

% t a l e polinomio in piu ’ punti , dobbiamo s c r i v e r l i in or<strong>di</strong>ne decrescente<br />

p=p(n+1: −1:1);<br />

end<br />

Osserviamo che abbiamo usato l’istruzione error per mostrare un messaggio <strong>di</strong> errore e far interrompere<br />

l’esecuzione della function, nel caso in cui i dati <strong>di</strong> input x e y non abbiano la stessa lunghezza. La stringa<br />

’MATLAB:interpmonom’ è una stringa <strong>di</strong> identificazione dell’errore (puù essere anche omessa), mentre la<br />

stringa ’i vettori x e y non hanno la stessa lunghezza’ è quella che viene visualizzata durante l’esecuzione del<br />

co<strong>di</strong>ce.<br />

La matrice V è stata costruita in maniera ricorsiva. Una volta calcolato il vettore p possiamo valutare il<br />

polinomio <strong>di</strong> interpolazione me<strong>di</strong>ante la polyval.<br />

Riprendendo l’esempio <strong>di</strong> prima, con x,y,xx,yy già dati:<br />

>> p=interpmonom(x,y);<br />

>> plot(x,y,’o’, xx,yy)<br />

Per quanto riguarda l’interpolazione <strong>di</strong> Lagrange, si considerino le due functions che chiamamo<br />

lagrange e interplagrange rispettivamente. La prima valuta l’i -simo polinomio <strong>di</strong> Lagrange e l’altra<br />

valuta il polinomio <strong>di</strong> interpolazione <strong>di</strong> Lagrange in un assegnato punto (o nelle componenti <strong>di</strong> un vettore).<br />

function yval=lagrange ( xval , x , i )<br />

% function yval=lagrange ( xval , x , i )<br />

% function che calcola i l polinomio i−simo <strong>di</strong> Lagrange<br />

% valutandolo in xval<br />

% xval puo ’ e s s e r e uno s c a l are o un v e t t o r e<br />

% x − v e t t o r e d e l l e a s c i s s e da interpolare<br />

% yval e ’ un v e t t o r e colonna<br />

xval=xval ( : ) ;<br />

n=length ( x ) ;<br />

yval =ones ( length ( xval ) , 1 ) ; % s i crea un v e t t o r e <strong>di</strong> t u t t i 1<br />

for j =1:n<br />

i f j ~= i<br />

yval=yval . * ( xval−x ( j ) ) / ( x ( i ) −x ( j ) ) ;<br />

end<br />

end<br />

Scriviamo ora la seguente function in due mo<strong>di</strong>: la prima non è ottimale per MATLAB® , la seconda sì. Si<br />

osservino le <strong>di</strong>fferenze: nella prima usiamo un ciclo for, nella seconda no.<br />

function yval=interplagrange ( xval , x , y )<br />

% function yval=interplagrange ( xval , x , y )<br />

% dati i v e t t o r i x e y da interpolare<br />

% la function implementa l ’ interpolazione <strong>di</strong> Lagrange valutandola<br />

% in xval<br />

% xval puo ’ e s s e r e uno s c a l are o un v e t t o r e<br />

% questa function chiama la function lagrange ( xval , x , i )<br />

i f length ( x)~= length ( y )<br />

error (’MATLAB:interplagrange’ , . . .<br />

198


12.9. Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong><br />

’i vettori x e y non hanno la stessa lunghezza’)<br />

else<br />

xval=xval ( : ) ;<br />

yval=zeros ( length ( xval ) , 1 ) ; % s i crea un v e t t o r e <strong>di</strong> t u t t i zero<br />

n=length ( x ) −1; % n grado del polinomio<br />

for i =1:n+1<br />

yval = yval + lagrange ( xval , x , i ) * y ( i ) ;<br />

end<br />

end<br />

function yval=interplagrange ( xval , x , y )<br />

% dati i v e t t o r i x e y da interpolare<br />

% la function fa l ’ interpolazione <strong>di</strong> Lagrange valutandola<br />

% in xval<br />

i f length ( x)~= length ( y )<br />

error (’MATLAB:lagrange’ ,’x e y non hanno la stessa lunghezza’)<br />

else<br />

y=y ( : )<br />

n=length ( x ) −1;% n grado del polinomio<br />

A = [ ] ;<br />

for i =1:n+1<br />

A=[A , lagrange ( xval , x , i ) ] %ogni colonna della matrice A ha i l<br />

% valore dell ’ i−simo polinomio <strong>di</strong><br />

% Lagrange c a l c o l a t o nei v a l o r i xval<br />

end<br />

yval=A* y ;<br />

end<br />

Eseguiamo l’esempio <strong>di</strong> prima per vedere cosa si ottiene:<br />

>> yy=interplagrange(xx,x,y);<br />

>> plot(x,y,’o’, xx,yy)<br />

Ora la function interplagrange sostituisce l’uso delle due function polyfit, polyval o<br />

interpmonom, polyval.<br />

Calcoliamo ora il polinomio <strong>di</strong> interpolazione me<strong>di</strong>ate le <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton. Scriviamo due<br />

functions, la prima che scrive la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise, la seconda che valuta il polinomio <strong>di</strong> interpolazione<br />

implementando l’algoritmo <strong>di</strong> Horner 2 in modo da minimizzare il numero delle operazioni da<br />

eseguire.<br />

function table= d i v d i f ( x , y )<br />

% function table=<strong>di</strong>v<strong>di</strong>f ( x , y )<br />

% x − a s c i s s e dei dati da interpolare<br />

% y − or<strong>di</strong>nate dei dati da interpolare<br />

% table − t a b e l l a d e l l e d i f f e r e n z e d i v i s e<br />

x=x ( : ) ;<br />

y=y ( : ) ;<br />

n=length ( x ) ;<br />

m=length ( x ) ;<br />

i f n~=m<br />

error (’MATLAB:<strong>di</strong>fferenze_<strong>di</strong>vise’ ,’errore sui dati’)<br />

else<br />

table=zeros (n , n ) ; % iniziamo la t a b e l l a come una matrice <strong>di</strong> z e r i<br />

table ( : , 1 ) = y ;<br />

for j =2:n<br />

2 William Horner (1786-1837) fu un matematico inglese, ricordato essenzialmente per il suo metodo sulle equazioni algebriche.<br />

Spieghiamo l’algoritmo solo per rendere comprensibile la function che scriviamo.<br />

199


12. PRIMI PASSI IN MATLAB®<br />

for<br />

end<br />

end<br />

end<br />

k =2: j<br />

table ( j , k)= ( table ( j , k−1) − table ( j −1,k−1) ) / . . .<br />

( x ( j ) − x ( j−k+1) ) ;<br />

La <strong>di</strong>agonale principale della matrice table ha i coefficienti a 0 , a 1 , ... a n del polinomio <strong>di</strong> interpolazione.<br />

Il polinomio è dunque:<br />

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 )<br />

Per valutarlo in un punto x eseguiamo i seguenti passaggi, applicando, in tal modo, l’algoritmo <strong>di</strong> Horner:<br />

p = a n<br />

p = p(x − x n−1 ) + a n−1<br />

= a n (x − x n−1 ) + a n−1<br />

p = p(x − x n−2 ) + a n−2<br />

.<br />

= a n (x − x n−1 )(x − x n−2 ) + a n−1 (x − x n−2 ) + a n−2<br />

p = p(x − x 0 ) + a 0<br />

= 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<br />

= 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 )<br />

La function da scrivere è dunque:<br />

function yval= i n t e r p d i v d i f ( xval , x , table )<br />

% function yval= i n t e r p d i v d i f ( xval , x , table )<br />

% x − a s c i s s e dei dati da interpolare<br />

% table − t a b e l l a d e l l e d i f f e r e n z e <strong>di</strong>vise ,<br />

% ottenuta dalla function d i v d i f ;<br />

% servono i v a l o r i della <strong>di</strong>agonale principale<br />

% 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<br />

% i n t e r p o l a t o r e<br />

% yval − valore ( o v a l o r i ) del polinomio i n t e r p o l a t o r e<br />

% valutato in xval<br />

% nel calcolo del polinomio i n t e r p o l a t o r e s i applica<br />

% l ’ algoritmo <strong>di</strong> Horner<br />

xval=xval ( : ) ;<br />

x=x ( : ) ;<br />

n=length ( x ) −1;<br />

yval=table (n+1 ,n+1)* ones ( length ( xval ) , 1 ) ;<br />

for j =n: −1:1<br />

yval=yval . * ( xval−x ( j ) ) + table ( j , j ) ;<br />

end<br />

Le functions appena descritte possono essere usate in maniera del tutto equivalenti per risolvere il problema<br />

dell’interpolazione. Ci sono però dei casi in cui i risultati ottenuti dalla polyfit e dalla interpmonom<br />

non sono corretti in quanto la matrice <strong>di</strong> Vandermonde ad esse legate è malcon<strong>di</strong>zionata.<br />

Abbiamo già descritto gli effetti del malcon<strong>di</strong>zionamento nell’interpolazione. Quando applichiamo la<br />

function polyfit ai dati <strong>di</strong> quel problema, si ha il seguente messaggio <strong>di</strong> avvertimento (un warning):<br />

>> poli=polyfit(x,y,5)<br />

Warning: Polynomial is badly con<strong>di</strong>tioned. Add points with <strong>di</strong>stinct X<br />

values, reduce the degree of the polynomial, or try<br />

200


12.9. Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong><br />

centering<br />

and scaling as described in HELP POLYFIT.<br />

Questo ci <strong>di</strong>ce che i risultati che avremo non saranno buoni e, effettivamente, se facciamo il grafico dei dati<br />

del problema e del polinomio <strong>di</strong> interpolazione ottenuto con la polyfit, si nota subito che il polinomio è<br />

completamente errato (ve<strong>di</strong> Figura 12.8) Anche nell’applicare la function interpmonom si ha il messaggio<br />

Figura 12.6: Uso della function polyfit per l’esempio malcon<strong>di</strong>zionato.<br />

<strong>di</strong> avvertimento<br />

>> pmon=interpmonom(x,y)<br />

Warning: Matrix is close to singular or badly scaled.<br />

Results may be inaccurate. RCOND = 5.537667e-31.<br />

Se aggiungiamo al grafico precendente la curva corrispondente al polinomio ottenuto con la interpmonom<br />

osserviamo come le due curve siano tra loro <strong>di</strong>stinte e non interpolano i dati.<br />

Figura 12.7: Uso della function interpmonom per l’esempio malcon<strong>di</strong>zionato.<br />

Proviamo invece ad applicare l’algoritmo <strong>di</strong> Lagrange o delle <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton e aggiungiamo<br />

le nuove curve sul precedente grafico:<br />

>> ylagr=interplagrange(xx,x,y);<br />

>> table=<strong>di</strong>v<strong>di</strong>f(x,y);<br />

>> ynewt=interp<strong>di</strong>v<strong>di</strong>f(xx,x,table);<br />

>> plot(xx,ylagr,xx,ynewt)<br />

Si nota subito che le due curve sono tra loro coincidenti e interpolatorie!<br />

201


12. PRIMI PASSI IN MATLAB®<br />

Figura 12.8: Uso delle functions corrispondenti agli algoritmi <strong>di</strong> Lagrange e delle <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton<br />

nell’esempio malcon<strong>di</strong>zionato. Osserviamo che la Figura 5.6 relativa allo stesso problema è stata ottenuta<br />

eseguendo le stesse functions (per semplicità abbiamo omesso i risultati ottenuti dalla interpmonom) in<br />

ambiente Octave.<br />

12.9.3 Confronto tra schemi per equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie<br />

Quando abbiamo introdotto alcuni meto<strong>di</strong> per la risoluzione <strong>di</strong> equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie, in<br />

particolare i meto<strong>di</strong> <strong>di</strong> Eulero esplicito, <strong>di</strong> Eulero implicito e <strong>di</strong> Crank-Nicolson.<br />

Li abbiamo anche confrontati per capire meglio il concetto <strong>di</strong> stabilità, considerando l’equazione test<br />

y ′ = −y con y(0) = 1 (si veda a proposito la Figura 11.3).<br />

Scriviamo ora un programma MATLAB® che, per questa equazione test,<br />

G ci permetta <strong>di</strong> poter confrontare i tre meto<strong>di</strong> tra loro e con la soluzione esatta<br />

G crei dei grafici simili a quelli <strong>di</strong> Figura 11.3<br />

G salvi i valori numerici dei <strong>di</strong>versi meto<strong>di</strong> e della soluzione esatta in un file.<br />

clear<br />

% h = passo <strong>di</strong> d i s c r e t i z z a z i o n e temporale<br />

% Tfin = tempo f i n a l e <strong>di</strong> osservazione<br />

% n = numero <strong>di</strong> v o l t e in cui verra ’ applicato ciascuno dei meto<strong>di</strong><br />

% proposti<br />

% f i d = v a r i a b i l e associata al f i l e <strong>di</strong> r i s u l t a t i<br />

% t = v e t t o r e dei tempi<br />

% 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 <strong>di</strong> Eulero e s p l i c i t o<br />

% ( <strong>di</strong> lunghezza n+1 perche ’ la prima componente corrisponde<br />

% al valore della soluzione al tempo zero )<br />

% 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 <strong>di</strong> Eulero implicito<br />

% 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 <strong>di</strong> Crank−Nicolson<br />

% yex = v e t t o r e dei v a l o r i a s s o c i a t i alla soluzione e s a t t a<br />

h=input (’passo h ’ ) ;<br />

Tfin=input (’tempo finale <strong>di</strong> osservazione ’ ) ;<br />

n=Tfin /h ;<br />

f i d =fopen (’ode_a_confronto.txt’ ,’w’ ) ;<br />

t ( 1 ) = 0 ;<br />

y ( 1 ) = 1 ;<br />

ye (1)= y ( 1 ) ;<br />

y i (1)= y ( 1 ) ;<br />

ycn (1)= y ( 1 ) ;<br />

yex (1)= y ( 1 ) ;<br />

for i =1:n<br />

ye ( i +1)= ye ( i ) − h* ye ( i ) ;<br />

y i ( i +1)= y i ( i )/(1+h) ;<br />

202


12.9. Applicazioni <strong>di</strong> MATLAB® nel <strong>Calcolo</strong> <strong>Numerico</strong><br />

ycn ( i +1)= (2−h)/(2+h) * ycn ( i ) ;<br />

t ( i +1)= t ( i )+h ;<br />

yex ( i +1)=exp(− t ( i + 1 ) ) ;<br />

end<br />

plot ( t , yex , ’k’ , ’linewidth’ ,2 )<br />

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<br />

plot ( t , ye ,’b’ , ’linewidth’ , 2 )<br />

plot ( t , yi ,’r’ ,’linewidth’ , 2 )<br />

plot ( t , ycn , ’g’ ,’linewidth’ , 2 )<br />

legend (’soluzione esatta’ , ’Eulero esplicito’ , ’Eulero implicito’ , ’Crank-Nicolson’ , )<br />

% la legenda , lo spessore d e l l e linee , o i l colore possono e s s e r e<br />

% messi s i a <strong>di</strong>rettamente dalla f i n e s t r a della figura<br />

% s i a dal programma s t e s s o , come in questo caso ( solo in Octave s i<br />

% deve operare <strong>di</strong>rettamente dal programma per poter cambiare<br />

% l e proprieta ’ della figura ) .<br />

hold o f f<br />

for i =1:n+1<br />

f p r i n t f ( fid , ’\n%5.2f %12.6e %12.6e %12.6e %12.6e’ , t ( i ) , yex ( i ) , . . .<br />

ye ( i ) , y i ( i ) , ycn ( i ) ) ;<br />

end<br />

f c l o s e ( f i d ) ;<br />

Questo programma è specifico per l’equazione test assegnata. La sua esecuzioneci permette ci comprendere<br />

meglio il concetto <strong>di</strong> stabilità dei meto<strong>di</strong> stu<strong>di</strong>ati per la soluzione <strong>di</strong> equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie.<br />

203


Bibliografia<br />

[1] ASCHER, U. M. e GREIF, C. (2011), A First Course on Numerical Methods, SIAM, Philadelphia.<br />

[2] BJÖRK, A. e DAHLQUIST, G. (2008), Numerical Methods in Scientific Computing, Volume II, Siam.<br />

[3] BURDEN, R. L. e FAIRES, J. D. (2004), Numerical Analysis, Brooks-Cole Publishing.<br />

[4] DAHLQUIST, G. e BJÖRK, A. (2006), Numerical Methods in Scientific Computing, Volume I, Siam.<br />

[5] GAMBOLATI, G. (1994), Lezioni <strong>di</strong> Meto<strong>di</strong> Numerici, Cortina, Padova.<br />

[6] GAUTSCHI, W. (1997), Numerical Analysis: An Introduction, Birkäuser, Boston.<br />

[7] GIANGRANDI, P. (2010), <strong>Dispense</strong> del corso <strong>di</strong> Storia dell’Informatica, Università <strong>degli</strong> Stu<strong>di</strong> <strong>di</strong> U<strong>di</strong>ne,<br />

Italia.<br />

[8] GIANGRANDI, P. (ultima visita: febbraio 2012), Museo on line - Breve storia <strong>degli</strong> Strumenti <strong>di</strong> <strong>Calcolo</strong>,<br />

Tecnoteca, http://www.tecnoteca.it/museo/.<br />

[9] KEISLER, H. J. (2009), Elementary Calculus, An Infinitesimal Approach, Creative Commons Attribution<br />

Non-Commercial-ShareAlike License, http://www.math.wisc.edu/~Keisler/calc.html.<br />

[10] LANGLEY, R. B. (1991), «The Mathematics of GPS», GPS World, vol. 2 (8), p. 55–59.<br />

[11] MOORE, H. (2008), MATLAB® per l’ingegneria, Pearson Prentice Hall, Italy.<br />

[12] O’CONNOR, J. e ROBERTSON, E. F. (ultima visita: febbraio 2012), The MacTutor History of Mathematics<br />

archive, University of St Andrews Scotland, http://www-gap-dcs.st-and.ac.uk/~history/.<br />

[13] SARTORETTO, F. e PUTTI, M. (2008), Introduzione alla Programmazione per Elaborazioni Numeriche.,<br />

E<strong>di</strong>zioni Libreria Progetto, Padova.<br />

[14] STRANG, G. (1991), Calculus, Wellesley-Cambridge Press.<br />

[15] SWADE, D. (ultima visita: febbraio 2012), The Babbage Engine, Computer History Museum, Mountain<br />

View, CA, http://www.computerhistory.org/babbage.<br />

205

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!