Il 0% ha trovato utile questo documento (0 voti)
30 visualizzazioni263 pagine

Appunti Di Calcolo Numerico Con Codici Matlab e Octave

appunti di calcolo con codici Matlab e Octave

Caricato da

sglinopk
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
30 visualizzazioni263 pagine

Appunti Di Calcolo Numerico Con Codici Matlab e Octave

appunti di calcolo con codici Matlab e Octave

Caricato da

sglinopk
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 263

a mia moglie Cristina, a mia figlia Silvia

e all’indimenticabile papà Bruno


Introduz ione
Queste pagine nascono come appunti del corso di Calcolo Numerico che il
sottoscritto ha tenuto dall’A.A. 2006-07, dapprima per il corso di laurea triennale
in Matematica Applicata e Informatica Multimediale della Facoltà di Scienze
dell’Università degli Studi di Verona, poi presso le Facoltà di Scienze Statistiche
e di Scienze MM. FF. e NN. dell’Università degli Studi di Padova.
Al lettore è richiesta la familiarità con Matlab, MATrix LABoratory, o la sua
versione freeware GNU Octave (nel seguito citato semplicemente come Octave) di
cui si fa uso nel testo per scrivere pezzi di codici che implementano alcuni degli
algoritmi numerici, degli esempi ed esercizi proposti. Per chi desidera conoscere
Matlab, la sua sintassi e il suo utilizzo, rimandiamo ad esempio al libro [25]
oppure ai tanti manuali disponibili in rete, quali ad esempio
http://www.math.unipd.it/∼demarchi/CorsoMatlab/dispense.pdf
www.ciaburro.it/matlab/matlab.pdf.
Per quanto riguarda GNU Octave, il manuale è disponibile on-line ed incluso
nel file di download disponibile al link
http://www.gnu.org/software/octave/.
Gli appunti sono organizzati in 6 capitoli, corrispondenti agli argomenti fon-
damentali trattati nel corso di Calcolo Numerico.

• Cap. 1: Aritmetica di macchina e analisi degli errori.


• Cap. 2: Ricerca di zeri di funzione.
• Cap. 3: Soluzione di sistemi lineari.
• Cap. 4: Autovalori di matrici.
• Cap. 5: Interpolazione e approssimazione.
• Cap. 6: Integrazione e derivazione.

In tutti i capitoli c’è una sezione di Esercizi proposti: si tratta di esercizi proposti
dall’autore nei vari appelli, compiti, compitini e laboratori. Per molti essi si pos-
sono trovare anche le soluzioni e, dove richiesto il codice Matlab, navigando alla
pagina web
http://www.math.unipd.it/∼demarchi/didattica.html.
Vi sono poi alcune Appendici, il cui scopo è di integrare la trattazione dei vari
capitoli con la teoria mancante, delle applicazioni e delle indicazioni implementa-
tive, con l’obiettivo di completare la sensibilità numerica richiesta a chi si occupa
o è interessato al calcolo numerico.
• Appendice A: Metodi iterativi ed equazione logistica
• Appendice B: Interpolazione: aspetti implementativi e applicazioni.
• Appendice C: Codici Matlab/Octave.
6 Appunti di Calcolo Numerico con codici in Matlab/Octave

Il testo non ha assolutamente la pretesa di essere sostitutivo di libri molto


più completi e dettagliati disponibili in letteratura, come ad esempio i libri [1,
6, 7, 19, 24, 25, 26, 30], ma come traccia di riferimento per un corso di Cal-
colo Numerico di base, tipico dei corsi di laurea triennale. Pertanto l’invito è
di consultare anche i testi citati in bibliografia, sia per cultura personale, ma
soprattutto per un completamento della preparazione.
Ringrazio ancora una volta il prof. Marco Caliari dell’Università di Verona,
per il prezioso contributo alla stesura dell’ Appendice B.
Come fatto nella prima edizione ringrazio sin d’ora coloro che mi segnaler-
anno sviste ed errori. Tutto ciò per migliorare la trattazione e renderla più
adeguata anche ai cambiamenti nell’insegnamento del Calcolo Numerico.

Stefano De Marchi
Dipartimento di Matematica
Università di Padova.

Padova, gennaio 2016.


Indice dei Capitoli
1 Aritmetica di macchina e analisi degli errori 17
1.1 Rappresentazione dei numeri in un calcolatore . . . . . . . . . . . . 17
1.2 Analisi degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3 Operazioni con numeri macchina . . . . . . . . . . . . . . . . . . . . 24
1.4 Stabilità e condizionamento . . . . . . . . . . . . . . . . . . . . . . . 26
1.5 Il calcolo di π . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.6 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2 Ricerca di zeri di funzione 35
2.1 Ricerca di zeri di funzione . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2 Metodo di bisezione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3 Iterazione di punto fisso . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.4 Il metodo di Newton o delle tangenti . . . . . . . . . . . . . . . . . . 42
2.4.1 Varianti del metodo di Newton . . . . . . . . . . . . . . . . . 48
2.5 Accelerazione di Aitken . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.6 Calcolo delle radici di polinomi algebrici . . . . . . . . . . . . . . . . 52
2.6.1 Schema di Hörner . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.7 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3 Soluzione di sistemi lineari 59
3.1 Cose basilari sulle matrici . . . . . . . . . . . . . . . . . . . . . . . . 59
3.1.1 Operazioni aritmetiche con le matrici . . . . . . . . . . . . . 59
3.1.2 Determinante e autovalori . . . . . . . . . . . . . . . . . . . . 64
3.2 Norme di vettore e di matrice . . . . . . . . . . . . . . . . . . . . . . 66
3.3 Soluzione di sistemi lineari: generalità . . . . . . . . . . . . . . . . . 69
3.3.1 Condizionamento del problema . . . . . . . . . . . . . . . . . 69
3.4 Metodi diretti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.4.1 Il Metodo di Eliminazione di Gauss (MEG) . . . . . . . . . . 72
3.4.2 Metodo di Gauss e fattorizzazione LU di matrici . . . . . . . 77
3.4.3 Matrici elementari di Gauss . . . . . . . . . . . . . . . . . . . 79
3.4.4 Il metodo di Cholesky . . . . . . . . . . . . . . . . . . . . . . . 81
3.4.5 Algoritmo di Thomas per matrici tridiagonali . . . . . . . . . 82
3.4.6 Raffinamento iterativo . . . . . . . . . . . . . . . . . . . . . . 83
3.5 Calcolo dell’inversa di una matrice: cenni . . . . . . . . . . . . . . . 84
3.6 Metodi iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.6.1 I metodi di Jacobi e Gauss-Seidel . . . . . . . . . . . . . . . . 89
3.6.2 Il metodo SOR o di rilassamento . . . . . . . . . . . . . . . . 93
3.7 Metodi del gradiente: cenni . . . . . . . . . . . . . . . . . . . . . . . 96
3.7.1 Il metodo del gradiente coniugato . . . . . . . . . . . . . . . . 97
3.8 Sistemi sovra e sottodeterminati . . . . . . . . . . . . . . . . . . . . 99
8 Appunti di Calcolo Numerico con codici in Matlab/Octave

3.8.1 Fattorizzazione QR di matrici . . . . . . . . . . . . . . . . . . 101


3.9 Soluzione di sistemi non lineari con il metodo di Newton . . . . . . 103
3.10 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4 Autovalori di matrici 111
4.1 Autovalori di matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
4.2 Il metodo delle potenze . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.2.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
4.3 Il metodo delle potenze inverse . . . . . . . . . . . . . . . . . . . . . 119
4.3.1 Il metodo delle potenze inverse con shift . . . . . . . . . . . . 119
4.3.2 Metodo delle potenze e metodo di Bernoulli . . . . . . . . . . 119
4.4 Il metodo QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
4.4.1 Il metodo QR con shift . . . . . . . . . . . . . . . . . . . . . . 122
4.5 Autovalori di matrici simmetriche . . . . . . . . . . . . . . . . . . . 124
4.5.1 Il metodo delle successioni di Sturm . . . . . . . . . . . . . . 124
4.5.2 Il metodo di Jacobi . . . . . . . . . . . . . . . . . . . . . . . . 126
4.6 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
5 Interpolazione e approssimazione 131
5.1 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . 132
5.2 Forma di Lagrange dell’interpolante . . . . . . . . . . . . . . . . . . 134
5.2.1 Analisi dell’errore d’interpolazione . . . . . . . . . . . . . . . 137
5.3 Errore d’interpolazione e fenomeno di Runge . . . . . . . . . . . . . 138
5.3.1 La costante di Lebesgue . . . . . . . . . . . . . . . . . . . . . 142
5.3.2 Stabilità dell’interpolazione polinomiale . . . . . . . . . . . . 143
5.4 Polinomio interpolante in forma di Newton . . . . . . . . . . . . . . 144
5.4.1 Differenze divise e loro proprietà . . . . . . . . . . . . . . . . 145
5.4.2 Algoritmo delle differenze divise . . . . . . . . . . . . . . . . 146
5.4.3 Formula di Hermite-Genocchi per le differenze divise . . . . 147
5.5 Interpolazione di Hermite . . . . . . . . . . . . . . . . . . . . . . . . 149
5.6 Algoritmo di Neville . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.7 Interpolazione polinomiale a tratti: cenni . . . . . . . . . . . . . . . 152
5.8 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
5.9 Funzioni Spline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
5.9.1 B-splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
5.9.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
5.9.3 Interpolazione con splines cubiche . . . . . . . . . . . . . . . 160
5.9.4 Teorema del campionamento di Shannon e smoothing spline 164
5.10 Polinomio d’approssimazione di Bernstein . . . . . . . . . . . . . . . 165
5.10.1 Curve B-splines e di Bézier . . . . . . . . . . . . . . . . . . . 166
5.10.2 Algoritmo di De Casteljau . . . . . . . . . . . . . . . . . . . . 167
5.11 Minimi quadrati discreti e decomposizione SVD . . . . . . . . . . . 170
5.11.1 Equivalenza tra sistema dei minimi quadrati e decompozione
SVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
5.11.2 SVD in Matlab/Octave . . . . . . . . . . . . . . . . . . . . . . 174
5.11.3 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Indice dei Capitoli 9

5.12 Interpolazione trigonometrica e FFT . . . . . . . . . . . . . . . . . . 180


5.12.1 Algoritmo FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
6 Integrazione 185
6.0.2 Formule di tipo interpolatorio . . . . . . . . . . . . . . . . . . 185
6.0.3 Formule di Newton-Côtes . . . . . . . . . . . . . . . . . . . . 187
6.0.4 Stima dell’errore di quadratura . . . . . . . . . . . . . . . . . 189
6.0.5 Formule composite o generalizzate . . . . . . . . . . . . . . . 192
6.0.6 Routine adattativa per la quadratura: applicazione al metodo
di Simpson e dei trapezi . . . . . . . . . . . . . . . . . . . . . 194
6.1 Polinomi ortogonali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
6.2 Formule di quadratura gaussiane . . . . . . . . . . . . . . . . . . . . 199
6.3 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
6.4 Derivazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.4.1 Un esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.4.2 Metodi di Eulero . . . . . . . . . . . . . . . . . . . . . . . . . . 211
6.5 Estrapolazione di Richardson . . . . . . . . . . . . . . . . . . . . . . 213
6.5.1 Applicazione alla quadratura numerica . . . . . . . . . . . . 216
6.5.2 Una implementazione del metodo di Romberg . . . . . . . . 219
6.5.3 I polinomi di Bernoulli . . . . . . . . . . . . . . . . . . . . . . 220
6.5.4 Algoritmo di Neville . . . . . . . . . . . . . . . . . . . . . . . 221
A Metodi iterativi ed equazione logistica 223
A.1 Modello lineare di Malthus . . . . . . . . . . . . . . . . . . . . . . . . 223
A.2 Il modello non lineare di Verhulst . . . . . . . . . . . . . . . . . . . . 224
A.2.1 Isometrie, dilatazioni e contrazioni . . . . . . . . . . . . . . . 226
A.2.2 Semplici esempi di processi iterativi . . . . . . . . . . . . . . 228
A.3 Modello lineare di Volterra . . . . . . . . . . . . . . . . . . . . . . . . 231
A.3.1 Interazione tra 2 popolazioni: modello lineare di Volterra . . 231
A.4 Modello non lineare di Lotka-Volterra . . . . . . . . . . . . . . . . . 233
B Interpolazione: aspetti implementativi e applicazioni 239
B.1 Richiami sull’interpolazione polinomiale . . . . . . . . . . . . . . . . 239
B.1.1 Interpolazione di Lagrange . . . . . . . . . . . . . . . . . . . 239
B.1.2 Sistema di Vandermonde . . . . . . . . . . . . . . . . . . . . . 240
B.1.3 Interpolazione di Newton . . . . . . . . . . . . . . . . . . . . 240
B.1.4 Interpolazione polinomiale a tratti . . . . . . . . . . . . . . . 241
B.1.5 Strutture in Matlab/Octave . . . . . . . . . . . . . . . . . . . 242
B.1.6 Splines cubiche . . . . . . . . . . . . . . . . . . . . . . . . . . 242
B.1.7 Compressione di dati . . . . . . . . . . . . . . . . . . . . . . . 246
B.1.8 Esercizi proposti . . . . . . . . . . . . . . . . . . . . . . . . . . 246
C Codici Matlab/Octave 249
Indice analitico 2 51
Bibliografia 257
Elenco delle Figure
1.1 Calcolo di π con l’algorimo di Archimede . . . . . . . . . . . . . . . . 29
1.2 Calcolo di π con l’algorimo di Viéte . . . . . . . . . . . . . . . . . . . 30
1.3 Calcolo di π con la formula di Wallis . . . . . . . . . . . . . . . . . . 30
1.4 Calcolo di π con la formula dell’arcotangente . . . . . . . . . . . . . 31
1.5 Calcolo di π con la formula dell’arcoseno . . . . . . . . . . . . . . . . 32

2.1 Interpretazione geometrica della condizione 4 del Teorema 4 nell’ipotesi


di funzione è concava in [a, b] . . . . . . . . . . . . . . . . . . . . . . . 44
2.2 La funzione dell’Esempio 13 in [0.9, 1] con α = 2. . . . . . . . . . . . 47

3.1 Raggio spettrale di H(ω) con n = 10, ottenuto con la funzione


SOROmegaZero.m. Il valore ottimale calcolato è ω0 = 1.5727. . . . . . 95
3.2 Convergenza a zig-zag del metodo del gradiente . . . . . . . . . . . 98
3.3 Riflessione di vettore x rispetto all’iperpiano π . . . . . . . . . . . . 101

4.1 Cerchi di Gerschgorin della matrice A dell’ Esempio 28: sopra i


cerchi riga e sotto quelli colonna. . . . . . . . . . . . . . . . . . . . . 114
4.2 Cerchi riga di Gerschgorin della matrice A dell’ Esempio 29. . . . . 115

5.1 Funzione e polinomio d’interpolazione dell’Esempio 35 . . . . . . . 134


5.2 Grafico di alcuni polinomi elementari di Lagrange. . . . . . . . . . . 135
5.3 La parabola dell’Esempio 38. . . . . . . . . . . . . . . . . . . . . . . 139
5.4 Funzione di Runge e polinomio d’interpolazione su nodi equispaziati
e di Chebyshev. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
5.5 10 punti di Chebyshev. . . . . . . . . . . . . . . . . . . . . . . . . . . 141
5.6 10 punti di Chebyshev (o) e Chebyshev estesi (*) in [−1, 1]. . . . . . 144
5.7 Funzione dell’Esempio 40 . . . . . . . . . . . . . . . . . . . . . . . . 145
5.8 Funzione seno (linea punteggiata) e la sua interpolante lineare a
tratti (linea continua) . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
5.9 Bsplines di ordine 3 (quadratiche). . . . . . . . . . . . . . . . . . . . 158
5.10 Bsplines quadratiche costruite con la funzione bspline.m sulla se-
quenza equispaziata x=linspace(1,10,10) . . . . . . . . . . . . . . 158
5.11 BSpline quadratiche costruite sulla sequenza xi = linspace(-5,5,11)
con aggiunta di nodi multipli, con molteplicità pari all’ordine, agli
estremi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
5.12 Spline cubica interpolante su nodi ”ad hoc” a (sx) e nodi equis-
paziati (dx) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
5.13 Polinomi elementari di Bernstein di grado 3 . . . . . . . . . . . . . . 166
5.14 f (x) = x(x − 1), x ∈ [0, 1] approssimata con un polinomio di Bern-
stein di grado 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
12 Appunti di Calcolo Numerico con codici in Matlab/Octave

5.15 Costruzione di una curva di Bézier di grado 3 con l’algoritmo di De


Casteljau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
5.16 Dati da approssimare con il metodo dei minimi quadrati . . . . . . 174
5.17 Approssimazione ai minimi quadrati . . . . . . . . . . . . . . . . . . 176
 2
6.1 Regola dei trapezi per il calcolo di sin (x) dx. . . . . . . . . . . . 188
1/2
6.2 Grafico della funzione errore, erf . . . . . . . . . . . . . . . . . . . . 191
6.3 Confronto tra la formula dei trapezi e dei trapezi composita per il
2
calcolo di 0.5 sin (x) dx. . . . . . . . . . . . . . . . . . . . . . . . . . . 193
6.4 Integrazione con Simpson composito . . . . . . . . . . . . . . . . . . 195
6.5 Integrazione con Simpson adattativo . . . . . . . . . . . . . . . . . . 196
6.6 Integrazione con il metodo dei trapezi adattativo. I punti utilizzati
sono oltre 2000, molti di più di quelli richiesti dalla stima a pri-
ori (6.21), ma distribuiti non uniformemente ma dove la funzione
oscilla di maggiormente. . . . . . . . . . . . . . . . . . . . . . . . . . 197
6.7 Grafico che illustra l’errore relativo compiuto dal metodo 1 (dif-
ferenze in avanti), in rosso, col + e dal metodo 2 (differenze finite
centrali) in nero con o, nell’approssimare exp(1). . . . . . . . . . . . 210
6.8 Tableau dello schema di Richardson per m = 3, con Ti,0 = T (hi ). . . 216
6.9 Alcuni polinomi di Bernoulli. . . . . . . . . . . . . . . . . . . . . . . 221

A.1 Thomas Malthus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224


A.2 La progressione di Malthus a partire da una popolazione iniziale
di 100 individui per diversi valori di g. . . . . . . . . . . . . . . . . . 225
A.3 Pierre Verhlust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
A.4 La trasformazione lineare della parabola T (x) ≥ 0 in [0, 1] . . . . . . 226
A.5 Iterazione del processo di Verhulst che origina il ben noto dia-
gramma di biforcazione . . . . . . . . . . . . . . . . . . . . . . . . . 227
A.6 Renato Caccioppoli . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
A.7 Rappresentazione di un processo iterativo. . . . . . . . . . . . . . . 229
A.8 Processi iterativi per diversi valori di m. . . . . . . . . . . . . . . . 230
A.9 Processo convergente . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
A.10 Processo divergente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
A.11 Processo di Verhulst convergente con x0 = 0.1, κ = 3. . . . . . . . . 232
A.12 Processo di Verhulst convergente con x0 = 0.1, κ = 3.9 . . . . . . . . 233
A.13 Processo di Verhulst divergente con x0 = 0.1, κ = 4.1 . . . . . . . . . 234
A.14 Qui x0 = 10, y0 = 20 e a = b = 0.1, c = 0.01, d = 0 . . . . . . . . . . . 234
A.15 Valori scelti: x0 = 10, y0 = 20 e a = −0.01, b = 0.2 c = 0.1, d =
−0.0001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
A.16 Valori scelti: x0 = 10, y0 = 20 e a = −0.1, b = 1.0 c = −0.1, d = 0.1 . 235
A.17 Valori scelti: x0 = 10, y0 = 20 e a = 0.01, b = 0.02 c = −0.01, d =
−0.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
A.18 Alfred J. Lotka (1880-1949)(sx) e Vito Volterra (1860-1940)(dx) . . . 236
A.19 Valori scelti: x0 = 2000, y0 = 600, a = 0.1, b = 0.00008333333, c =
0.00004, d = 0.04. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Elenco delle Figure 13

1 Newton, Eulero e Lagrange . . . . . . . . . . . . . . . . . . . . . . . 259


2 Gauss, Hörner e Cauchy . . . . . . . . . . . . . . . . . . . . . . . . . 259
3 Chebyshev, Runge e Kutta . . . . . . . . . . . . . . . . . . . . . . . . 260
4 Neville, Aitken e Golub . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Elenco delle Tabelle
1.1 Rappresentazione dei numeri in un calcolatore . . . . . . . . . . . . 18
1.2 Rappresentazione in singola precisone: i numeretti indicano i bits
d’inizio e fine delle parti corrispondenti al segno, esponente e man-
tissa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3 Rappresentazione in doppia precisone: i numeretti, come in Tabella
1.2 indicano i bits d’inizio e fine delle parti. . . . . . . . . . . . . . . 18
1.4 Occupazione dei registri di memoria nelle due fondamentali rapp-
resentazioni floating-points . . . . . . . . . . . . . . . . . . . . . . . 19
1.5 Il più piccolo numero floating point rappresentabile in singola pre-
cisione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.6 Il più grande numero floating point rappresentabile in singola pre-
cisione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.7 Calcolo della precisione macchina in base 2 . . . . . . . . . . . . . . 22

2.1 Algoritmo di bisezione . . . . . . . . . . . . . . . . . . . . . . . . . . 36


2.2 Confonto di una successione di punto fisso e di Δ2 di Aitken . . . . 52
2.3 Algoritmo di Hörner per la valutazione di un polinomio pn (x) nel
punti ζ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

3.1 Numero di condizionamento in norma 2 della matrice di Hilbert . . 70

5.1 Confronti dei valori della costante di Lebesgue per punti di Cheb-
syshev e della funzione σ(n) . . . . . . . . . . . . . . . . . . . . . . . 143
5.2 Differenze divise della funzione x2 + 1 . . . . . . . . . . . . . . . . . 145
5.3 Tabella delle differenze divise per un punto ripetuto k + 1 volte . . 149
5.4 Tabella delle differenze divise per l’interpolazione di Hermite . . . 150
5.5 Schema di Neville, per n = 3. . . . . . . . . . . . . . . . . . . . . . . 152

6.1 Formule di N-C per n = 1, . . . , 6. Per n = 1 si ha la formula del


trapezi, per n = 2 la formula di (Cavalieri-)Simpson e per n = 3 si
parla di formula dei 3/8. . . . . . . . . . . . . . . . . . . . . . . . . 190
6.2 Pesi di formule chiuse di N-C con n = 8 . . . . . . . . . . . . . . . . 192
6.3 Nodi e pesi per le formule di Gauss-Legendre con n = 1, 2, 3, 4 . . . 201
6.4 Nodi e pesi per le formule di Gauss-Legendre-Lobatto con n =
1, 2, 3, 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
6.5 Tabella del metodo di Romberg . . . . . . . . . . . . . . . . . . . . . 220

A.1 Tabella di confronto tra le iterazioni di Malthus e Verhlust . . . . . 227

B.1 Matrice di Vandermonde. . . . . . . . . . . . . . . . . . . . . . . . . . 240


B.2 Spline cubica naturale. . . . . . . . . . . . . . . . . . . . . . . . . . . 244
1
Aritmetica di macchina e
analisi degli errori
In questo capitolo iniziale, metteremo per cosı̀ dire le basi per comprendere la
filosofia sottostante al calcolo numerico. L’analisi degli errori è fondamentale
per comprendere come evitarli, ma se non fosse possibile evitarli, come ridurli
almeno al minimo possibile.
Ma per comprendere quali sono i tipi d’errore di cui dobbiamo tenere conto,
prima di tutto dobbiamo capire come si rappresentano i numeri in un calcolatore.
Vedremo che la rappresentazione dei numeri è una delle fonti principali d’errore
detti appunti errori di rappresentazione.

1.1 Rappresentazione dei numeri in un calcolatore


La notazione che maggiormente si usa nei calcolatori è la notazione a virgola
mobile o in inglese floating-point . Se a è un numero, intero o reale, usando la
notazione a virgola mobile, lo possiamo scrivere come

a = pN q , (1.1)

dove p si chiama mantissa che è un numero reale, N è la base di numerazione


(solitamente N = 2, base binaria) e q è un intero che si chiama esponente .
Osserviamo anzitutto che la notazione non è unica. Infatti

a = pN q = p1 N q−1 = p2 N q+1

con p1 = N p e p2 = p/N .
Se la mantissa p è tale che
1
< |p| < 1
N
allora la rappresentazione (1.1) si dice normalizzata . Facciamo due esempi
• a = 115.78, la sua forma normalizzata è a = 0.11578 · 103 .
• a = 0.0026, la sua forma normalizzata è a = 0.26 · 10−2 .
Pertanto, fissata la base di numerazione N , per la rappresentazione di un nu-
mero a dovremo conoscere la coppia (p, q) (mantissa ed esponente). Nel caso
18 Appunti di Calcolo Numerico con codici in Matlab/Octave

s q |p|

Tabella 1.1: Rappresentazione dei numeri in un calcolatore

a = 0, (p, q) = (0, 0). In generale si usa la seguente rappresentazione dove s in-


dica il bit riservato al segno del numero e che assume valori s = 0 se il segno è
+ e s = 1 quando il segno è −; q lo spazio per l’esponente e |p| lo spazio per la
mantissa normalizzata.
Definizione 1. Si chiama numero macchina un numero tale che p e q sono rapp-
resentabili esattamente negli spazi riservati.
Se ad esempio, lo spazio per |p| è formato da t cifre, i numeri macchina sono
tutti quelli che hanno la mantissa normalizzata con non più di t cifre. Per
l’esponente valgono le disuguaglianze
m≤q≤M
dove il minimo m < 0 e il massimo M > 0 dipendono da calcolatore a calcolatore.
Posto q ∗ = q − m ≥ 0 allora
0 ≤ q∗ ≤ M − m .
Parleremo poi di singola precisione se la rappresentazione di Tabella 1.1 è su
32bits (essendo 1byte=8bits essa equivale a 4 bytes) (cfr. Tabella 1.2), di doppia
precisione quando la rappresentazione di Tabella 1.1 è su 64bits (8 bytes) (cfr.
Tabella 1.3).

1 s 1 2 q 9 10 |p| 32

Tabella 1.2: Rappresentazione in singola precisone: i numeretti indicano i bits


d’inizio e fine delle parti corrispondenti al segno, esponente e mantissa.

1 s 1 2 q 12 13 |p| 64

Tabella 1.3: Rappresentazione in doppia precisone: i numeretti, come in Tabella


1.2 indicano i bits d’inizio e fine delle parti.

Nel caso di singola precisione, essendoci 8 bits riservati all’esponente, allora


28 − 1 = 255 sarà il massimo numero rappresentabile. Da cui, essendo 0 ≤ q ∗ ≤
255 dalla relazione q ∗ = q − m avremo che −127 ≤ q ≤ 
128 .
  
m M
Lo standard ANSI/IEEE 754-1985 (modificato nel 1989 e ufficialmente detto
IEC 60559:1989, binary floating-point arithmetic for microprocessor systems) usa
la rappresentazione
a = (−1)s (1.a2 a3 . . . at at+1 . . .) 2q .
1 - Aritmetica di macchina e analisi degli errori 19

In questo caso la mantissa ha t cifre con la prima cifra sempre uguale ad 1 (che
non viene rappresentata). Ció spiega perchè abbiamo scritto a2 a3 . . . at at+1 . . ..
Il campo dell’esponente serve a rappresentare sia esponenti positivi che neg-
ativi. Si usa inoltre in bias (scostamento) appunto per avere esponenti q ∗ sempre
positivi. Ad esempio q ∗ = 200 indica l’esponente 200 − 127 = 73.
Riassumiamo in tabella le cose salienti di questa rappresentazione sia nel
caso di singola che doppia precisione.

singola doppia
# bit 32 (4 bytes) 64 (8 bytes)
segno s 1 bit 1 bit
spazio mantissa 23 53
spazio esponente 8 11
bias 127 (011....1) 1023 (011....1)
max q 127 1023
min q -126 -1022

Tabella 1.4: Occupazione dei registri di memoria nelle due fondamentali rappre-
sentazioni floating-points

Nel caso di singola precisione avremo allora


−126
   ·2
• il più piccolo numero floating point rappresentabile è 1.00....0 ≈ 10−38
mantissa
Nota: l’esponente con tutte le cifre 0 (zero) si usa solo per indicare lo 0

0 0
 . . .
. . . 01 0...0
−126+127=1

Tabella 1.5: Il più piccolo numero floating point rappresentabile in singola preci-
sione

oppure l’underflow.
127
  ·2
• il più grande numero floating point rappresentabile è 1.11...1 = (1 +
mantissa
1 − 2−23 ) · 2127 ≈ 1038 Nota: l’esponente 255 si usa solo per l’overflow.

0 1
 . . .
. . . 10 1...1
127+127=254

Tabella 1.6: Il più grande numero floating point rappresentabile in singola pre-
cisione

Similmente nel caso di doppia precisione


20 Appunti di Calcolo Numerico con codici in Matlab/Octave

• il più piccolo numero floating point rappresentabile è 1.00


 .. . . . . 0 ·2−1022 =
1+23 cif re
2−1022 ≈ 10−308

• il più grande numero floating point rappresentabile è 1.11


 .. . . . . 1 ·21023 =
1+52 cif re
(1 + 1 − 2−52 ) · 21023 ≈ 10308

E SEMPIO 1. Supponiamo di volere rappresentare in singola precisione il numero


decimale a = 43.6875 nello standard ANSI/IEEE 754-1985.

(i) Dapprima dovremo trasformare il numero, senza segno, in forma binaria. La


parte intera, 43, diventa, 4310 = 1010112 . La parte frazionaria 0.687510 =
10112 . Complessivamente 43.687510 = 101011.10112 .

(ii) Successivamente spostiamo la virgola verso sinistra, lasciando solo un 1 alla


sinistra: 1.010111011 · 25 .
La mantissa viene quindi riempita con zeri a destra, fino a completare i 23 bit.
Il numero che si ottiene è 1.01011101100000000000000.

(iii) L’esponente è 5, ma dobbiamo convertirlo in forma binaria e adattarlo allo


standard. Per la singola precisione, dobbiamo aggiungere 127 (detto anche
bias) , ovvero 5 + 127 = 13210 = 100001002 .

E SEMPIO 2. Nella rappresentazione floating point secondo lo standard IEEE 754-


1985 su 32 bits, abbiamo s = 1, q = 10000111 e |p| = 1101100
 · · · 0. Si richiede di
23 cif re
calcolare il corrispondente valore decimale.
Soluzione. Osserviamo che q = (10000111)2 = 13510 . Quindi

a = (−1)s 2q−127 1.|p| = −1 · 2135−127 1.110110...0


= −28 1.1101100...0 = (−111011000)2 =
= −(28 + 27 + 26 + 24 + 23 )10 = −472 .

E SEMPIO 3. Desideriamo trasformare il numero in base 10, −3.6, in base 2. Soluzione.


Sostanzialmente dobbiamo trasformare in binario la parte intera 3 e la parte decimale
0.6.

1. (−3)10 = (−11)2 . che si ottiene con divisioni consecutive per 2 e prendendone


i resti.

2. Per la parte decimale si moltiplica per 2 finché la parte decimale della molti-
plicazione risula essere uguale a 0. Nel nostro caso 0.6 ∗ 2 = 1.2 che ha cifra
binaria 1 e decimale 0.2 che riporto nella prossima moltiplicazione. 0.2 ∗ 2 = 0.4
cha ha parte binaria 0 e decimale 0.4 che uso per prossima moltiplicazione.
0.4 ∗ 2 = 0.8 (0 cifra binaria e 0.8 decimale), 0.8 ∗ 2 = 1.6 (1 binaria, 0.6 deci-
male). La prossima moltiplicazione ci fa ripartire dall’inizio. Pertanto il numero
(0.6)10 é il numero periodico (1001)2 .
1 - Aritmetica di macchina e analisi degli errori 21

Riassumendo (−3.6)10 = −11.1001.... 20 = −1.11001....21 .


Analogamente risolvere queste trasformazioni da base decimale a base binaria
a) (−23.375)10 = ( ? )2
b) (−131.50)10 = ( ? )2
c) (0.6875)10 = ( ? )2 .

Al link http://babbage.cs.qc.edu/IEEE-754/Decimal.html, il lettore inter-


essato, troverà un’interessante interfaccia che consente di trasformare numeri
decimali in numeri binari (ed esadecimali) proprio nello standard IEEE 784.
Come ultima nota, lo standard è attualmente sotto revisione (IEEE 754r) e i
lavori di revisione, il cui termine era previsto per l’anno 2005, non sono ancora
stati conclusi. Per maggiori informazioni, si rimanda al link
http://it.wikipedia.org/wiki/IEEE 754.

1.2 Analisi degli errori


Nel caso di un sistema floating-point in base N con mantissa a cui sono riservate
t posizioni o cifre, tutti i numeri che nella rappresentazione normalizzata hanno
più di t cifre (con esponente m ≤ q ≤ M ) dovranno venire approssimati. Come?
Ci sono sostanzialmente due tipi di approssimazione a cui corrispondono anche
analoghi errori di rappresentazione.
(a) troncamento: della mantissa p del numero, si prendono solo t cifre, le altre
dalla t + 1-esima in poi non si considerano. Ad esempio se p = 0.7243591,
N = 10 e t = 5, allora p̃ = 0.72435.
(b) arrotondamento: alla cifra t-esima della mantissa p viene aggiunta la quan-
tità 0.5 e poi si opera come in (a). Nell’ esempio di prima, alla quinta cifra
di p = 0.7243591, che è 5, si somma 0.5 che diventa 6, cosicché p̃ = 0.72436.
Tra le due tecniche, troncamento e arrotondamento, qual è quella che consente
di commettere un errore inferiore?
Dato un numero a = pN q indichiamo con ã = p̃N q una sua approssimazione.
Osserviamo che le mantisse p̃ dei numeri macchina 1/N ≤ p̃ < 1 non hanno più
di t cifre e la distanza tra due mantisse consecutive p1 , p2 è proprio N −t , da cui
|p − p1 | < N −t (analogamente per p2 ). Vediamo cosa accade degli errori nei casi
di troncamento(a) e di arrotondamento (b).
(a)
|a − ã| = |(p − p̃)|N q < N q−t
essendo p e p̃ consecutive.
(b)
1 q−t
|a − ã| = |(p − p̃)|N q ≤
N
2
essendo p e p̃ consecutive ma nel caso di arrotondamento |p − p̃| ≤ 12 N −t .
22 Appunti di Calcolo Numerico con codici in Matlab/Octave

Segue che l’approssimazione per arrotondamento è da preferirsi! Infine, per


quanto rigurdano i corrispondenti errori relativi si ha:

(a)
|a − ã|
< N 1−t ,
|a|
poiché, essendo N q−1 < |a| < N q e dal fatto che |a − ã|/|a| < N q−t /N q−1 , si
ottiene la maggiorazione di cui sopra.

(b)
|a − ã| 1
≤ N 1−t .
|a| 2

A questo punto vale la seguente definizione

Definizione 2. Il numero
1 1−t
eps = N , (1.2)
2
si chiama precisione macchina.

In pratica, la precisione macchina, rappresenta quella costante caratteristica


di ogni aritmetica (arrotondata) floating-point ed è la massima precisione con
cui vengono effettuati i calcoli su quella particolare macchina. Detto altrimenti,
eps è il più piccolo numero che sommato a 1 (o ad un generico numero a) dà un
numero maggiore di 1 (o del numero a). Pertanto un algoritmo, scritto in codice
Matlab/Octave, per il calcolo di eps con N = 2 in doppia precisione è il seguente:

e=1; k=0;
while (e+1 > 1)
e=e/2; k=k+1;
end
e=2*e {è necessario perché si era diviso per 2}
k-1 {da l’esponente}

Tabella 1.7: Calcolo della precisione macchina in base 2

dove il contatore k serve a ricordare il numero di divisioni e indica pure


l’esponente della rappresentazione del numero eps. La moltiplicazione finale è
necessaria perché dopo che il test è stato verificato, e avrebbe un valore metà del
valore vero. Se ora facciamo eseguire il codice, otterremo il seguente risultato

e = 2.2204e-016
k = 52

infatti e = 2−52 . Vale la pena ricordare che in Matlab/Octave esiste la costante


predefinita eps il cui valore è appunto 2.2204e-016.
1 - Aritmetica di macchina e analisi degli errori 23

Sia ora x un numero che rappresenta un valore esatto. Indichiamo con x̃ una
sua rappresentazione sul calcolatore. Allora

Ea := |x − x̃| ,
 
 x − x̃ 
 
Erx :=  x  , x = 0
 
 x̃ − x 
Erx̃ :=   x̃ = 0 ,
 x̃  ,

definiscono il modulo dell’errore assoluto, dell’errore relativo su x e dell’errore


relativo su x̃, rispettivamente.
In particolare avremo che Erx ≤ . Infatti

1 q−t N 1
|x − x̃| ≤ N = N −t · N q−1 ≤ N 1−t |x| (1.3)
2 2 2
  


poiché |x| < N q | essendo |p| < 1. La relazione ci dice come un’approssimazione
si ottenga dal valore esatto a meno di un errore di rappresentazione. Questo
errore, si dice errore inerente o ineliminabile poiché esso dipende dalla rapp-
resentazione (finita) dei numeri su un calcolatore.
Quanto detto vale ovviamente se la esponente di x, q, risulta m ≤ q ≤ M . In
particolare:

• Il più grande numero reale rappresentabile come numero macchina, è quello


in cui tutte le t cifre usate per la rappresentazione risultano essere uguali
a N − 1 e con esponente pari ad M , ovvero il numero

aM = (1 − N −t ) · N M .
Ricordando, che in un calcolatore con aritmetica in doppia precisione M =
1024, per cui (1 − N −t ) · N M = (1 + 1 − 2−52 ) · 21023 = (1 − 2−53 ) · 21024 ≈
1.7977 · 10308 . In Matlab/Octave questo valore è restituito dalla variabile
realmax.

• Il più piccolo numero reale rappresentabile come numero macchina, è quello


in cui tutte le t cifre risultano essere uguali a 0 eccetto la prima che vale 1
e con esponente pari ad m, ovvero il numero

am = N m−1 = 2−1022 .
Ricordando, che in un calcolatore con aritmetica in doppia precisione m =
−1021, per cui N m−1 ≈ 2.2251 · 10−308 . In Matlab/Octave questo valore è
restituito dalla variabile realmin. Ad essere precisi, in Octave 3.2.3 si può
arrivare a calcolare 2−1074 mentre 2−1075 risulta 0 (zero).
24 Appunti di Calcolo Numerico con codici in Matlab/Octave

1.3 Operazioni con numeri macchina


Se indichiamo con con f l(a) = ã l’operazione di arrotondamento e con ⊕, , e
le corrispondenti operazioni aritmetiche fatta sui numeri macchina, valgono per
esse le seguenti regole
ã ⊕ b̃ = f l(ã + b̃) = (ã + b̃)(1 + 1 )
ã b̃ = f l(ã − b̃) = (ã − b̃)(1 + 2 )
ã b̃ = f l(ã · b̃) = (ã · b̃)(1 + 3 )
ã b̃ = f l(ã/b̃) = (ã/b̃)(1 + 4 )

con |i | < eps.


La domanda da porsi è se per queste operazioni macchina valgono le stesse
regole che per le corrispondenti operazioni aritmetiche. La risposta è in generale
negativa.
E SEMPIO 4. Consideriamo la somma di due numeri floating-point. Infatti ã ⊕ b̃ = ã
se 0 < |b̃| |ã|
Facciamo vedere un esempio che anche per numeri macchina si possono pre-
sentare dei problemi.
E SEMPIO 5. Siano a = p1 N q1 e b = p2 N q2 . Consideriamo a b. Il risultato sarà
overflow (esponente maggiore di M ) se q1 > 0, q2 < 0 e q1 − q2 > M oppure
underflow (esponente minore di m) se q1 < 0, q2 > 0 e q1 − q2 < m.
A conferma ulteriore dei problemi che si possono verificare lavorando con nu-
meri macchina, diamo alcuni semplici esercizi.
E SERCIZIO 1. Calcolare l’espressioni a + (b + c) e (a + b) + c dove a = 1.0e + 308,
b = 1.1e + 308 e c = −1.001e + 308.
(1 + x) − 1
E SERCIZIO 2. Sia x = 1.0e − 15. Calcolare . Perchè l’espressione è
x
inaccurata?
E SERCIZIO 3. Si consideri il polinomio
f (x) = x7 − 7x6 + 21x5 − 35x4 + 35x3 − 21x2 + 7x − 1 .
Lo si valuti su 401 punti equispaziati per x ∈ [1 − 2 · 10−8 , 1 + 2 · 10−8 ]. Si plotti
quindi il grafico (x, f (x)) e il grafico di (x, p(x)) con p(x) = (x − 1)7 , sugli stessi
punti. Se ne discutano i risultati.
Uno dei problemi che maggiormente si presentano negli algoritmi numerici è
la cancellazione numerica che in sostanza è la perdita di cifre significative.
Anzitutto comprendiamo che cosa sono le cifre significative di un numero. Ad
esempio 13020.0 ha cifre significative 1302 mentre 0.0534 ha cifre significative 534.
Se due numeri sono quasi uguali, dove uguali s’intende a meno della pre-
cisione macchina, allora è possibile il verificarsi della cancellazione numerica.
Vediamo alcuni esempi.
1 - Aritmetica di macchina e analisi degli errori 25

E SEMPIO 6. Consideriamo i numeri a = p1 N q con p1 = 0.147554326 e b = p2 N q


con p2 = 0.147251742 e N = 10. In aritmetica a t = 6 cifre significative, avremo
p˜1 = 0.147554 e p˜2 = 0.147252. Ora a − b = (p1 − p2 )N q = (p1 − p2 )103 = 0.302584.
Ma (p˜1 p˜2 )103 = 0.302000 con la perdita delle cifre significative 584.
ex − 1
E SEMPIO 7. Consideriamo il calcolo della funzione f (x) = in un punto x0 .
x
∞ i−1
x
La funzione data si può anche vedere come la serie . Pertanto si possono
i=1
i!
usare due algoritmi per il calcolo di f (x0 )
ALGORITMO 1 ALGORITMO 2

if x0==0 y=exp(x0);
f=1; if y==1,
else f=1;
f=(exp(x0)-1)/x0; else
end f=(y-1)/log(y);
end
Nel caso in cui |x| 1 (cioè molto vicino a 0, usando i due algoritmi otterremo i
seguenti risulati
x0 ALG.1 ALG. 2
1.e − 5 1.000005 1.000005
1.e − 6 1.0036499 1.0000005
.. .. ..
. . .
1.e − 15 1.1102... 1.000....000 (15 zeri)

1.e − 16 0 1
Pertanto l’ALGORITMO 2 è più stabile (chiariremo meglio più avanti il concetto
di stabilità di un algoritmo numerico). Infatti, nell’ipotesi di singola precisione, la
risposta esatta sarebbe 1.00000005. Se infatti consideriamo f l((ex −1)/x) ≈ 1.3245....
mentre f l((ex − 1)/(log(ex )) ≈ 1.00000006 che è la risposta corretta.

Cosa fare per evitare la cancellazione numerica? Una prima risposta è


di trovare un’espressione più stabile, ovvero tale da non far aumentare gli errori
introdotti dalla formulazione del problema.
√ √
Ad esempio, si voglia valutare x + δ − x per δ → 0. Razionalizzando si
δ
ottiene √ √ dove si evitano i problemi di cancellazione che si avrebbero
x+δ+ x
con l’espressione originale.
Un altro esempio è il calcolo di cos(x + δ) − cos(x) sempre per δ → 0. Qui
possiamo evitare i problemi di cancellazione usando la formula di prostaferesi
della differenza di coseni: cos(x + δ) − cos(x) = −2 sin(δ/2) sin(x + √δ/2).
Come ultimo esempio, consideriamo √ di valutare f (x) = x(x − x2 − 1) quando
x → +∞. Infatti per un tale valore x2 − 1 ≈ x. Pertanto, sempre razionaliz-
x
zando possiamo scrivere f (x) = √ evitando i soliti problemi di insta-
2
x −1+x
bilità dovuti alla cancellazione.
26 Appunti di Calcolo Numerico con codici in Matlab/Octave

1.4 Stabilità e condizionamento


Iniziamo subito con la definizione di stabilità di un metodo numerico.

Definizione 3. Un metodo numerico (formula, algoritmo) si dice stabile se non


propaga gli errori. Altrimenti si dice instabile.

La stabilità è quindi un concetto legato al metodo risolutivo ovvero al cor-


rispondente algoritmo. Lo scopo dell’analisi di stabilità è di capire come avviene
la propagazione degli errori. Se questa è controllata, cioè non li fa crescere, allora
il metodo sarà stabile. Uno dei problemi connessi all’instabilità è la cancellazione
numerica, proprio come evidenziato nei due esempi successivi.

E SEMPIO 8. Desideriamo
√ risolvere l’equazione ax2 + bx + c = 0. Se a = 0, le radici
2
−b ± b − 4ac
sono x1,2 = . Dove si manifesta la cancellazione numerica?
2a

• In x1 quando b2 − 4ac ≈ b

• in x2 quando − b2 − 4ac ≈ b.

Come ovviare a questi problemi? Nel primo caso, prima si calcola x2 dove il prob-
lema della cancellazione non sussiste quindi, usando le relazioni tra le radici x1 e
x2 di un’equazione di secondo grado, otteniamo x1 = c/(ax2 ). In maniera analoga
opereremo nel secondo caso: prima calcolo x1 quindi x2 = c/(ax1 ).

E SEMPIO 9. Data f (x) = x2 si voglia calcolare f  (x) per x = x0 . Ora, ricorrendo


alla definizione di derivata come
f (x + h) − f (x)
lim per x = x0 ,
h→0 h
ma per h → 0 potrebbero insorgere problemi di cancellazione. Cosa che si ovvia
ricorrendo alla relazione f  (x) = 2x che verrà quindi valutata per x = x0 .

Riassumendo, la stabilità è legata al metodo risolutivo e l’instabilità è dovuta


essenzialemente agli errori algoritmici legati alle operazioni da effettuarsi du-
rante l’esecuzione dell’algoritmo. Ma non dimentichiamo gli errori di rappresen-
tazione (che sono errori inevitabili).
L’altro aspetto da tenere presente nell’analisi è quello che definiremo come
condizionamento del problema numerico. Questo aspetto è legato alla definizione
del problema, matematicamente una funzione dei dati del problema.

Definizione 4. Un problema si dice ben condizionato se a piccole perturbazioni


(relative) sui dati in ingresso corrispondono perturbazioni (relative) dello stesso
ordine in uscita. In caso contrario il problema si dice mal condizionato.

Per misurare il condizionamento si introduce il cosidetto numero di condizion-


amento
r
C= , (1.4)
d
1 - Aritmetica di macchina e analisi degli errori 27

dove r indica la percentuale d’errore sul risultato rispetto alla percentuale d’errore
sul dato d. Pertanto, usando questo indice, un problema sarà ben condizionato
quando C è piccolo (vedremo più oltre in che senso) altrimenti sarà mal con-
dizionato. Vediamo un esempio.
E SEMPIO 10. Il sistema
x+y =2
1001x + 1000y = 2001

ha soluzione (x, y) = (1, 1). Siano

1 1 2
A= , b= .
1001 1000 2001

Ora, perturbiamo l’elemento a1,1 della matrice A di 0.01, ovvero consideriamo la


matrice
0.01 0
A1 = A + .
0 0
Se risolviamo il sistema A1 x = b otteniamo la soluzione (x, y) = (−1/9, 1901/900).
Pertanto, per calcolare il numero di condizionamento (1.4), dobbiamo vedere chi sono
i rapporti, r/d, su ogni componente del vettore soluzione:
r 1 − (−1/9) r 1 − (1901/900)
= = 1.1̄, = = −1.112̄
d x 1 d y 1
da cui, complessivamente in percentuale, C = 111%. Quindi, un errore di 10−2 sul
dato A (misurato in qualunque norma matriciale) si è riversato con un errore di circa
102 sul risultato. Il problema è quindi mal condizionato.
Consideriamo la valutazione di una funzione f : R → R in un punto x0 . Pren-
diamo ora una perturbazione x0 + h. Le quantità r e d richieste in (1.4), in questo
caso sono
x 0 + h − x0 h f (x0 + h) − f (x0 )
d= = ; r= ,
x0 x0 f (x0 )
da cui
f (x0 + h) − f (x0 ) x0
C(f, h) := .
h f (x0 )
Al tendere di h → 0,
 
 x0 
lim |C(f, h)| = |C(f, x0 )| = f  (x0 ) · .
h→0 f (x0 ) 
Questo esempio ci dice che il numero di condizionamento tende ad un limite che
in modulo vale  
  x0 

|C(f, x0 )| = f (x0 ) · ,
f (x0 ) 
che viene detto fattore d’amplificazione d’errore. Se C(f, x0 ) < 1 diremo che
il problema è ben condizionato altrimenti verrà detto malcondizionato.
28 Appunti di Calcolo Numerico con codici in Matlab/Octave

Come applicazione di quest’analisi, consideriamo f (x) = 1 − x. Ora f  (x) =
1
− 2√1−x e quindi
 
 x 
C(f (x)) =  
2(1 − x) 
che ha problemi quando x ≈ 1. Ad esempio se x = 0.999 e h = 10−5 allora
 √
−5 1 − (x + h) − 1 − x
d = h/x = 1.001 · 10 , r = √ ≈ −0.00503
1−x
 
da cui  dr  ≈ 501.67. Anche passando al limite per h → 0 le cose non migliorano. Il
problema è malcondizionato e ciò è dovuto al fatto che il fattore d’amplificazione
richiede il calcolo della derivata. Questo ci dice anche che il calcolo della derivata
è un problema, in genere, malcondizionato.

1.5 Il calcolo di π
Per il calcolo di π esistono alcuni importanti algoritmi non tutti convergenti per
motivi di instabilità. Di seguito diamo cenno di 5 algoritmi tra i più importanti.
Di essi diamo anche un pseudo-algoritmo che è un’utile base di partenza per una
successiva implementazione in un linguaggio di programmazione.

1. Algoritmo di Archimede. Mediante questo algoritmo, π è approssimato con


l’area del poligono regolare di 2n lati inscritto nella circonferenza di raggio
1 (che ha area uguale a π).
Indicando con bi il numero di lati dell’i-esimo poligono regolare iscritto, con
π
si = sin i e con Ai la corrispondente area, l’algoritmo si può cosı̀ descri-
2
vere:

Algoritmo
b1 = 2; s1 = 1
for i=2:n  √
1− 1−s2i−1
Ai = bi−1 si−1 , si = 2
bi = 2bi−1
end for

La formula risulta instabile come si vede dall’andamento dell’errore visual-


izzato in Figura 1.1.
2. Algoritmo di Viète. Mediante questo algoritmo, π è approssimato con il
semi-perimetro del poligono regolare di 2n lati inscritto nella circonferenza
di raggio 1.

π
Indicando con
ci = cos
2i
e pi il corrispondente semiperimetro, l’algoritmo si descrivere come segue:
1 - Aritmetica di macchina e analisi degli errori 29

Figura 1.1: Calcolo di π con l’algorimo di Archimede

Algoritmo
c1 = 0; p1 = 2
for i=2:n
ci = 1+c2i−1
pi = pi−1
ci
end for

L’idea di Viéte risulta migliore per il calcolo di π. Infatti, come visualizzato


in Figura 1.2, l’errore assoluto tende alla precisione macchina già con 20−30
iterazioni.

3. Algoritmo di Wallis. Qui π è approssimato con la formula:


π 22 44 2n 2n
= ··· ··· n≥1.
2 13 35 2n − 1 2n + 1

Indicando con pi la produttoria al passo i, l’algoritmo si descrivere come


segue:

Algoritmo
p0 = 2;
for i=1:n,
2
pi = pi−1 4i4i
2 −1 ;

end for
30 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 1.2: Calcolo di π con l’algorimo di Viéte

La formula converge molto lentamente, come visualizzato dall’andamento


dell’errore in Figura 1.3.

Figura 1.3: Calcolo di π con la formula di Wallis


1 - Aritmetica di macchina e analisi degli errori 31

4. π = 4 arctan(1). Usando l’espansione di Taylor di arctan(1), π è approssi-


mato con la formula:
1 1 1
arctan(1) = 4 1 − + − · · · .
3 5 7
Indicando con qi la somma al passo i, l’algoritmo si può descrivere come
segue:

Algoritmo
q1 = 1;
for i=2:n
(−1)i−1
qi = qi−1 + 2i−1
end for
π = 4qn

L’algoritmo converge lentamente come visualizzato dall’andamento dell’errore


in Figura 1.4

Figura 1.4: Calcolo di π con la formula dell’arcotangente

5. π = 6 arcsin( 12 ). Come nel caso dell’ arctan, π è approssimato con la seguente


formula che si ottiene ancora una volta espandendo in serie di Taylor l’
arcsin( 12 ):
1 1 11 1 131 1
arcsin =6 + + + ··· .
2 2 2 3 23 2 4 5 25
Indicando con qi la somma al passo i e ti il “punto” corrente, l’algoritmo si
descrivere come segue:
32 Appunti di Calcolo Numerico con codici in Matlab/Octave

Algoritmo
q1 = 0; t1 = 12
for i=1:n-1
ti ti (2i−1)
qi+1 = qi + 2i−1 ; ti+1 = 8i
end for
π = 6qn

L’approssimasione con l’arcsin risulta essere davvero buona, come si osserva


dall’andamento dell’errore assoluto visualizzato in Figura 1.5 per n = 30.

Figura 1.5: Calcolo di π con la formula dell’arcoseno

1.6 Esercizi proposti

E SERCIZIO 4. Calcolare a2 − b2 con a = 1.4 · 10154 e b = 1.3 · 10154 . Cosa si


nota? Come risolvere il problema in modo stabile?

E SERCIZIO 5. Sia x = 8.88178419700125 · 10−16 . Si calcoli l’espressione

(1 + x) − 1
.
x
Perchè il risultato è meno accurato che prendendo x = 8.0 · 10−16 ?
1 - Aritmetica di macchina e analisi degli errori 33

E SERCIZIO 6. Sia
Sn (x) = 1 + x + x2 /2 + x3 /3! + · · · + xn /n!
la troncata n-esima di exp(x). Si prenda x = −10 e si calcoli per n =
1, 2, . . . , 80 l’errore relativo
|Sn (x) − exp(x)|
exp(x)
Cosa si osserva? Perchè ciò accade?
E SERCIZIO 7. Si prenda x = 1.005, il calcolo di q7 (x) = (x − 1)7 produce il
risultato 7.8125 · 10−17 mentre quello di p7 (x) = x7 − 7x6 + 21x5 − 35x4 + 35x3 −
21x2 + 7x − 1 da come risultato −8.88178419700125 · 10−16 . Perchè?
E SERCIZIO 8. Implementare queste operazioni:
a=4/3; b=a-1; c=b+b+b; e=1-c.
Qual è il risultato dell’operazione? Altri valori di a darebbero lo stesso risul-
tato?
E SERCIZIO 9. Siano x = 5 e y = 5 − η con x − y = η. L’errore relativo della
differenza è
f l(x − y) − (x − y)
x−y = ,
x−y
dove f l(x − y) è la differenza dei 2 numeri x e y, in aritmetica floating point.
Ovvero
f l(x − y) = (x − y)(1 + eps),
con eps la funzione Matlab/Octave che restituisce la precisione macchina.
Calcolare x−y al diminuire di η e riportare su una tabella i valori η, x−y e
la percentuale x−y ∗ 100.
E SERCIZIO 10. Si consideri la ricorrenza
z2 = 2,
√ zn
zn+1 = 2  ;n ≥ 2
1+ 1 − 41−n zn2

che converge a π quando n → ∞. Scrivere un M-file che implementa la ri-


correnza precedente e inoltre visualizza in scala logaritmica al variare di n
l’errore relativo |π−z
π
n|
.
La formula ricorrente è stabile?
E SERCIZIO 11. Si consideri la ricorrenza

1 1 1 0 x
I0 = (e − 1) = x e dx ,
e e 0

1 1 n+1 x
In+1 = 1 − (n + 1)In = x e dx ; n ≥ 0
e 0
34 Appunti di Calcolo Numerico con codici in Matlab/Octave

sapendo che In → 0 per n → ∞, si scriva un M-file che calcola I40 . La ri-


correnza è stabile? Come è possibile stabilizzarla? Sugg. Si può procedere
mediante stabilizzazione all’indietro. Ovvero posto n=40, si calcola

1 1 n x
vn = x e dx ,
e 0
vi−1 = (1 − vi )/i, i = n, n − 1, . . . , 2

Per il calcolo di vn usare la funzione Matlab/Octave quadl, usando la chia-


mata quadl(’f’,0,1,[],n).
E SERCIZIO 12. Si consideri la ricorrenza
6
I0 = log , (1.5)
5
1
Ik = − 5 Ik−1 k = 1, 2, . . . n , (1.6)
k
che in teoria dovrebbe convergere a
 1
xn
In = dx ,
0 x+5

mentre che cosa possiamo dire circa la convergenza della ricorrenza (1.6)?

E SERCIZIO 13. Si consideri l’equazione ax2 + bx + c = 0 con a = 1.e − 8,


b = 2 e c = 1.e − 6 le cui radici, in modulo, sono |x1 | = 2.0e + 8, |x2 | = 5.0e − 7.
Quale delle due radici pone problemi di calcolo con la formula risolutiva delle
equazioni di secondo grado?

E SERCIZIO 14. Si consideri la serie del coseno

cos x = 1 − x2 /2! + x4 /4! − x6 /6! + x8 /8! − · · · .

Valutare cos( 1) il cui valore, arrotondato a 2 decimali, è 0.540. Quanti termini


della serie sono necessari per approssimare cos(1) con errore assoluto ≈ 1.7 ·
10−3 ?

E SERCIZIO 15. Sia R=realmax. Calcolare in maniera stabile l’espressione


(R2 − 1)/R. Quale tra le seguenti espressioni è calcolabile senza overflow o
underflow?
1. (R − 1)(R + 1)/R 2. R − 1/R 3. (R−1) R (R + 1).
2
Ricerca di zeri di funzione
Sin dalla scuola media superiore sappiamo che, dato un polinomo di grado n,
pn (x) = a0 + a1 x + · · · + an xn , esistono delle formule esplicite di calcolo delle sue
radici, solo per n ≤ 4, mentre per n ≥ 5 non esistono formule generali che ci
consentono di determinarne gli zeri in un numero finito di operazioni. A maggior
ragione questo vale nel caso in cui si vogliano determinare le soluzioni di f (x) =
0, per una generica funzione f .
Queste considerazioni introduttive ci inducono a dire che la ricerca di soluzioni
di f (x) = 0 si potrà fare solo con tecniche di tipo iterativo ovvero con la ricerca
basata su delle iterazioni di un certo algoritmo.

2.1 Ricerca di zeri di funzione


La ricerca di zeri di funzione è un problema frequente nel calcolo scientifico. Fac-
ciamo un paio di esempi
1. Dinamica della popolazioni. Consideriamo il seguente modello preda preda-
tore (si veda anche l’Appendice A), che modellizza l’evoluzione di una de-
terminata popolazione di cellule, di batteri, di animali ecc... mediante
l’equazione
rx2
x+ =  2 , r > 0, c > 0 (2.1)
1 + xc
L’equazione (2.1) dice che la popolazione ”successiva” x+ cresce secondo
una legge non lineare dipendente dai parametri r, c che indicano le risorse
disponibili (e sono costanti fisse del problema). Scrivendola nella forma
x+ = g(x) (con ovvio significato), ci si potrebbe chiedere se esiste un val-
ore x∗ tale che x∗ = g(x∗ ). Questa è la tipica formulazione del problema
di punto fisso dell’equazione (2.1) corrispondente allo zero della funzione
f (x) = x − g(x).
2. Capitalizzazione composta a tasso fisso. Sia C il capitale che si investe
all’inizio di ogni anno su un fondo d’investimento o pensionistico. Il mon-
tante dopo il primo anno è M1 = C +Cx = C(1+x). Dopo n anni il montante
Mn dato dalla somma dei montanti Mi , i = 1, . . . , n, ottenuti in regime di
capitalizzazione composta, è
n
2
Mn = C (1 + x) + C (1 + x) + · · · + C (1 + x) = C
n
(1 + x)i . (2.2)
i=1
36 Appunti di Calcolo Numerico con codici in Matlab/Octave

con x che indica il tasso fisso d’investimento (x ∈ (0, 1)). Se desiderassimo



calcolare il tasso medio
n x di rendita del piano d’ investimento, chiamando
con f (x) = Mn − C i=1 (1 + x)i , il problema consisterà nella ricerca dello
zero della funzione f .

Passiamo ora a descrivere i più comuni metodi iterativi per la ricerca di zeri di
funzione.

2.2 Metodo di bisezione


Sia f ∈ C[a, b] t.c. f (a)f (b) < 0. Sappiamo allora che esiste almeno uno zero
di f in (a, b). In particolare se f fosse strettamente crescente (o decrescente) in
(a, b) allora lo zero sarebbe unico. Ad esempio f (x) = x2 − x − 1 è strettamente
crescente per x ∈√[3/2, 2] e strettamente decrescente in [−1, −1/2]: infatti ha due
1± 5
radici x1,2 = .
2
Per semplicità ci limiteremo al caso in cui (a, b) contiene un solo zero di f ,
che chiameremo α. Altrimenti contrarremo l’intervallo d’interesse fino a con-
tenere un solo zero..
L’algoritmo di calcolo si può descrivere come in Tabella 2.1.

Passo iniziale k = 0; a0 = a; b0 = b; I0 = [a0 , b0 ] .


1
Iterazione {Si determina Ik = Ik−1 , k ≥ 1. }
2
ak−1 + bk−1
1. xk−1 = .
2
2. Se |f (xk−1 )| < tol (∗ ) allora α = xk−1 ; tt {radice! stop!}
altrimenti se
f (ak−1 )f (xk−1 ) < 0 allora ak = ak−1 , bk = xk−1 ,
altrimenti, ak = xk−1 , bk = bk−1 .
ak + b k
3. xk = , k = k + 1.
2
Ritorna al passo 2.

(*) tol serve a verificare quando f (xk−1 ) ≈ 0.

Tabella 2.1: Algoritmo di bisezione

Facciamo vedere che il metodo di bisezione, nelle ipotesi che l’intervallo con-
tenga una sola radice, converge all’unica radice α di f nell’intervallo [a, b].
Dim. Assumiamo f (a) < 0 < f (b). Vogliamo far vedere che il metodo genera
una successione {xk } che converge verso α. Infatti, le successioni {ak } e {bk } sono
tali che
a0 ≤ a1 ≤ · · · ≤ an ≤ · · · ≤ bn ≤ · · · ≤ b0
2 - Ricerca di zeri di funzione 37

ovvero {ak } monotona crescente e {bk } monotona decrescente. Sappiamo quindi


che lim ak = α− e lim bk = α+ con α− ≤ α+ ∈ (a, b). Ora,
k→∞ k→∞

(b − a)
α+ − α− = lim (bk − ak ) = lim = 0.
k→∞ k→∞ 2k
Pertanto α+ = α− = α.
Ma f , per ipotesi, è continua e quindi lim f (ak ) = lim f (bk ) = f (α). Inoltre,
k→∞ k→∞
dal teorema del confronto limk→∞ f (ak ) ≤ 0 e limk→∞ f (bk ) ≥ 0 da cui segue
0 ≤ f (α) ≤ 0. Ció consente di concludere che f (α) = 0. 
Poiché |Ik | = |bk − ak | = 21k |I0 | con I0 = b − a, allora l’errore assoluto ek al
passo k soddisfa alla disuguaglianza
1 1
|ek | = |xk − α| < |Ik | = k+1 |b − a| .
2 2
Chiedendo che |ek | < , possiamo determinare a priori il numero minimo di
iterazioni per ridurre l’errore a meno di 
|b − a|
kmin > log2 −1. (2.3)


La funzion Matlab/Octave, bisezione in Appendice C, implementa il metodo di


bisezione (richiede la definizione della funzione fun di cui si cerca lo zero).
Osservazioni.
• Il metodo non garantisce una riduzione progressiva dell’errore ma solo un
dimezzamento dell’ampiezza dell’intervallo dove sta α.
• Il metodo non tiene conto del reale andamento della funzione f su I0 =
[a0 , b0 ] = [a, b]. Se, I0 è simmetrico rispetto α, basterebbe un solo passo per
determinare la radice. Invece, l’algoritmo nella sua formulazione originale,
non è in grado di verificarlo essendoci gli inevitabili errori di rappresen-
tazione e algoritmici.
• Infine, se f è una retta il metodo richiederà più di un passo per trovare la
radice. Vedremo che, ad esempio con il metodo di Newton (cfr. Sezione 2.4),
nel caso in cui la funzione sia una retta lo zero si determinerà, come giusto
che sia, con una sola iterazione.

2.3 Iterazione di punto fisso


L’idea del metodo è di trasformare il problema originale, che consiste nel cercare
gli zeri di f risolvendo f (x) = 0, in un problema di punto fisso x = g(x) la cui
soluzione è la stessa del problema originale.
1. Il primo passo è la trasformazione di f (x) = 0 in un problema di punto fisso
x = g(x), con g derivabile in Iα e t.c. α = g(α) se e solo se f (α) = 0.
38 Appunti di Calcolo Numerico con codici in Matlab/Octave

2. Dato un valore iniziale x0 costruiamo il metodo iterativo xk+1 = g(xk ), k =


0, 1, . . . che genererà la successione {xk } che convergerà verso un punto ξ =
α.

Per inciso, la funzione g(x) viene detta funzione d’iterazione del metodo itera-
tivo.
La trasformazione di f (x) = 0 in x = g(x) non è unica. Infatti, se consideriamo
4
x4 − 3 = 0, la possiamo trasformare in x = x4 + x − 3, oppure in x = 3+5x−x o an-
 5
cora in x = 3 x3 . In generale esistono infiniti modi di ottenere una formulazione
di punto fisso.
L’altro problema, una volta ottenuta la forma x = g(x), è di chiederci se tutte
le funzioni d’iterazione g(x) vanno ugualmente bene. La risposta è negativa in
generale. Vale il seguente Teorema

Teorema 1. Supponiamo che g([a, b]) ⊂ [a, b] e che esista un L < 1 t.c.

|g(x1 ) − g(x2 )| ≤ L |x1 − x2 |, ∀ x1 , x2 ∈ [a, b] . (2.4)

Allora esiste un unico punto fisso α della funzione d’iterazione g. Inoltre la suc-
cessione {xk }k≥0 , x0 fissato, converge ad α.

Dim. Consideriamo la funzione φ(x) = g(x)−x. Dalle ipotesi φ(a) = g(a)−a ≥


0 e φ(b) = g(b) − b ≤ 0. Pertanto esiste almeno uno zero all’interno di [a, b] Se
esistessero due zeri, siano α1 e α2 , allora per (2.4)

|α1 − α2 | = |g(α1 ) − g(α2 )| ≤ L|α1 − α2 | < |α1 − α2 |

ovvero assurdo.
Per concludere facciamo vedere che la successione {xk } converge ad α. Infatti,

0 ≤ |xk+1 − α| = |g(xk ) − g(α)| ≤ L|xk − α| ≤ · · · ≤ Lk+1 |x0 − α| .

Ovvero per ogni k ≥ 0


|xk − α|
≤ Lk ,
|x0 − α|
Passando al limite si conclude. 
Osservazione. Il Teorema appena enunciato dice che se la g è una contrazione
allora essa ammette un solo punto fisso. Questo è sostanzialmente il Teorema
delle contrazioni di Banach-Caccioppoli (vedasi Teorema 32 in Appendice A).
Nel caso in cui g sia derivabile vale il seguente Teorema che ci assicura una
condizione necessaria e sufficiente per la convergenza.

Teorema 2. (Ostrowski) Se g(x) è derivabile in Iα ed esiste un numero μ < 1


t.c.
|g  (x)| ≤ μ, ∀ x ∈ Iα ; (2.5)
2 - Ricerca di zeri di funzione 39

allora g(x) ha un unico punto fisso α. Inoltre la successione generata dal metodo
xk+1 = g(xk ) converge ad α per ogni scelta di x0 ∈ Iα . Infine si ha

|xk+1 − α|
lim = |g  (α)| . (2.6)
k→∞ |xk − α|

Dim. La dimostrazione segue dal fatto che g è una contrazione e quindi si


ragiona come nel teorema delle contrazioni. 
Da (2.6) deduciamo che le iterazioni di punto fisso convergono almeno linear-
mente. Infatti per k > k̄, k̄ sufficientemente grande, l’errore ek+1 = xk+1 − α ha lo
stesso comportamento di quello al passo k a meno di una costante |g  (α)| ≤ μ < 1.

Definizione 5. Sia {xk } una successione convergente a α. Consideriamo l’errore


assoluto in modulo al passo k, |ek | = |xk − α|. Se esiste un reale p ≥ 1 e una
costante reale positiva γ < +∞ t.c.

|ek+1 | |xk+1 − α|
lim = lim =γ, (2.7)
k→∞ |ek |p k→∞ |xk − α|p

allora la successione {xk } ha ordine di convergenza p.

• Se p = 1 e 0 < γ < 1 parleremo di convergenza lineare.

• Se p = 1 e γ = 1 parleremo di convergenza sublineare.

• Nel caso in cui 1 < p < 2 si dice che la convergenza è superlineare.

• Se p = 2 parleremo di convergenza quadratica; se p = 3 di convergenza


cubica e cosı̀ via.

Come conseguenza della precedente definizione, il metodo di iterazione fun-


zionale xk+1 = g(xk ) ha ordine di convergenza p se vale la (2.7).
Un modo pratico, di determinare un valore approssimato dell’ordine di con-
vergenza p, che deriva dalla definizione (2.7), è il seguente. Osservando che

|xk+1 − α|
lim = γ = 0
k→∞ |xk − α|p

si ricava
log |xk+1 − α| − log γ log |xk+1 − α|
p = lim ≈ lim . (2.8)
k→∞ log |xk − α| k→∞ log |xk − α|

Naturalmente se, come spesso accade, non si conosce la radice α, si puoò con-
siderare, in (2.8) invece di α, una sua approssimazione xm con m più grande di
k + 1.

E SEMPIO 11. Consideriamo la funzione d’iterazione g(x) = x(2 − qx), q > 0.

(a) Quali sono i punti fissi di g(x).


40 Appunti di Calcolo Numerico con codici in Matlab/Octave

(b) Per il metodo xk+1 = g(xk ), k ≥ 0, determinare l’intervallo Iα di convergenza


della radice positiva α.
(c) Calcolare l’ordine di convergenza del metodo iterativo di cui al punto precedente.
Soluzione.
(a) Risolvendo x = x(2 − qx) si ottengono le soluzioni x1 = 0 e x2 = 1/q > 0.
(b) L’intervallo di convergenza Iα con α = 1/q si ottiene chiedendo che |g  (1/q)| < 1.
Ora risolvendo |g  (x)| < 1, ovvero |2(1 − qx)| < 1, si ha
1 3
<x< .
2q 2q
Questo intervallo contiene la radice α = 1/q e inoltre g  (1/q) = 0 < 1 e quindi,
come richiesto
 dalla Proposizione 2, il metodo converge alla radice positiva per
1 3
x ∈ 2q , 2q .

(c) Calcoliamo l’ordine di convergenza verificando per quali p il limite

|xk (2 − q xk ) − α|
lim
k→∞ |xk − α|p
risulta finito. Per p = 1 non è finito perchè il numeratore si comporta come
x2 e il denomiatore come x. Invece per p = 2, numeratore e denominatore si
comportano come x2 e quindi il limite sarà finito. Pertanto il metodo converge
con ordine 2.


L’esempio appena svolto ci consente di specializzare il concetto di ordine di
convergenza di un metodo iterativo.
Teorema 3. Se la funzione d’iterazione è derivabile almeno p volte con continuità
in Iα , con α un punto fisso semplice di g(x) per cui

g  (α) = g  (α) = · · · = g (p−1) (α) = 0, g (p) (α) = 0 ,

allora il metodo d’iterazione ha ordine di convergenza p.


Dim.. Infatti, usando l’espansione di Taylor di g in un intorno α con resto in
forma di Lagrange

(x − α)2 (x − α)p−1 (p) (x − α)p


g(x) = g(α)+g  (α)(x−α)+g  (α) +· · ·+g (p−1) (α) +g (ξ) .
2! (p − 1)! p!

Per ipotesi g (k) (α) = 0, k = 0, . . . , p − 1, quindi

|xn+1 − α| |g (p) (ξ)|


= = 0 .
|(xn − α) |
p p!
2 - Ricerca di zeri di funzione 41

Questo conclude la dimostrazione. .

Tornando all’esempio precedente punto (c), notiamo che g  (1/q) = 0 mentre


g  (1/q) = −2q = 0 che come dimostrato ha ordine di convergenza quadratico.

Naturalmente, questo ha senso se conosciamo la radice α.


Test d’arresto

1. Test sulla differenza tra due iterate successive. Il metodo iterativo contin-
uerà la ricerca della soluzione finchè |xk+1 − xk | < . Infatti

xk+1 − α = g(xk ) − g(α) = g  (ξk )(xk − α), ξk ∈ [α, xk ] . (2.9)

Essendo xk+1 − α = xk+1 − xk + xk − α otteniamo

1
xk − α = (xk − xk+1 ) .
1 − g  (ξk )

Pertanto, se g  (x) ≈ 0, x ∈ Iα , in particolare per x = ξk , allora l’errore viene


stimato abbastanza accuratamente dalla differenze delle iterate successive.
Invece, se g  (x) ≈ 1 il fattore 1/(1 − g  (ξk )) → ∞, pertanto la stima non sarà
una buona stima.

2. Test sulla differenza ”relativa” tra due iterate successive. Il test che faremo
ora è
|xk+1 − xk | < |xk+1 | .

3. Test sul valore della funzione. Il test consiste nel verificare se |f (xk )| <
. Purtroppo questo test non funziona quando la funzione è piatta su Iα ,
facendo fermare le iterazioni troppo lontano dal valore della soluzione. Un
esempio: la funzione f (x) = (x10 − 10)/x nell’intorno sinistro della radice
positiva α ≈ 1.26 è molto piatta e usando il test in esame partendo da x0 ∈
Iα = [1, 2] usando anche una tolleranza alta come  = 1.e − 2, ci arresteremo
dopo migliaia di iterazioni.

L’esempio proposto al punto 3, ci suggerisce le seguenti considerazioni.

• Nei test di arresto è necessario inserire anche un controllo sul numero mas-
simo di iterazioni, k ≤ kmax.

• Il test che ci darà “maggiore sicurezza” è quindi la combinazione del test


sull’errore relativo e il controllo sul numero di passi. Pertanto il metodo
iterativo continuerà a cercare la radice finchè

(|xk+1 − xk | ≥ |xk+1 |) & (k ≤ kmax) . (2.10)

altrimenti se una delle due condizioni non sarà verificata ci si arresterà.


42 Appunti di Calcolo Numerico con codici in Matlab/Octave

La funzione Matlab/Octave MetIterazioneFunz.m, in Appendice C, implementa


un metodo di iterazione funzionale la cui funzione d’iterazione descritta in un
altro M-file g, richiede in input il valore iniziale x0, la tolleranza tol e il numero
massimo d’iterazioni kmax, e restituisce la soluzione in x0, niter, numero di iter-
azioni fatte e un flag per la convergenza. Se c’è convergenza flag=1 altrimenti
flag=0.
Esercizio. Trovare un metodo di iterazione funzionale convergente alla radice di
x10 = 10.

2.4 Il metodo di Newton o delle tangenti


Supponiamo che f sia derivabile su [a, b]. Pertanto possiamo considerare l’equazione
della tangente di f in xk

y(x) = f (xk ) + (x − xk )f  (xk ) . (2.11)

Come punto xk+1 prendiamo il punto in cui la retta tangente interseca l’asse delle
ascisse. In pratica dobbiamo risolvere y(x) = 0.
Imponendo questa condizione in (2.11), otteniamo la formula del metodo di
Newton
f (xk )
xk+1 = xk −  , (2.12)
f (xk )
purchè f  (xk ) = 0, k ≥ 0.
Facciamo ora un paio di osservazioni.
1. Il metodo di Newton consiste nel sostituire localmente f (x) con la retta
tangente. Infatti

f (xk+1 ) = f (xk ) + (xk+1 − xk )f  (xk ) + O((xk+1 − xk )2 ) ,

da cui, imponendo che f (xk+1 ) = 0 e trascurando i termini di ordine superi-


ore al primo, otteniamo la (2.12). Questo ci dice che la (2.12) è un modo per
approssimare f in xk+1 .
2. Se f (x) = a0 + a1 x (f è una retta), allora il metodo di Newton converge in
una sola iterazione. Infatti
a0 + a1 x a0
x 1 = x0 − =− .
a1 a1


Facciamo ora vedere che se x0 è preso “ sufficientemente” vicino alla radice
α, con f  (α) = 0 (ovvero α radice semplice), allora il metodo converge almeno
quadraticamente e si ha

xk+1 − α f  (α)
lim 2
=  , (2.13)
k→∞ (xk − α) 2f (α)
2 - Ricerca di zeri di funzione 43

da cui, se f  (α) = 0, allora il metodo converge quadraticamente altrimenti con


ordine maggiore di due.
Dimostriamo la (2.13).

(α − xk )2 
0 = f (α) = f (xk ) + f  (xk )(α − xk ) + f (ξ), ξ ∈ (xk , α)
2
f (xk ) (α − xk )2 
= 
+ α − xk + f (ξ)
f (xk ) 2f  (xk )
(α − xk )2 
= xk − xk+1 + α − xk + f (ξ)
2f  (xk )
f  (ξ)
= α − xk+1 + (α − xk )2 
2f (xk )

si conclude dividendo per (xk − α)2 , portando a primo membro e passando al


limite. 
Il seguente teorema ci da delle condizioni per la convergenza globale del metodo
di Newton.
Teorema 4. Sia f ∈ C 2 [a, b] con [a,b] chiuso e limitato, inoltre
1. f (a)f (b) < 0
2. f  (x) = 0, x ∈ [a, b]
3. f  (x) ≥ 0 oppure f  (x) ≤ 0, ∀x ∈ [a, b]
   
   f (b) 
4.  ff(a)
(a)  < b − a e  f  (b)  < b − a.

Allora il metodo di Newton converge all’ unica soluzione α ∈ [a, b] per ogni x0 ∈
[a, b].
Osservazione. L’ultima ipotesi del Teorema ci assicura che la tangente agli
estremi a e b interseca l’asse x all’interno di [a, b].
Dim. Supponiamo, come visualizzato in figura 2.1, che f  > 0, f  ≤ 0 e
f (a) < 0, f (b) > 0 (ovvero nell’ipotesi di esistenza di un unico zero α in [a, b]).
Sia a ≤ x0 < α e, ovviamente, f (x0 ) ≤ 0 = f (α). Allora x1 = x0 −f (x0 )/f  (x0 ) ≥
x0 . Proviamo per induzione che xk ≤ α e xk+1 ≥ xk .
Per k = 0 è vera. Sia vera per k e proviamola per k + 1.

−f (xk ) = f (α) − f (xk ) = (α − xk )f  (ξk ), xk ≤ ξk ≤ α .


Ma, f  (x) ≤ 0, che implica che f  è decrescente. Quindi f  (ξk ) ≤ f  (xk ). Allora,

−f (xk ) ≤ (α − xk )f  (xk )
f (xk )
xk+1 = xk −  ≤ xk + (α − xk ) = α .
f (xk )

Segue che f (xk+1 ) ≤ f (α) = 0 e anche che xk+2 ≥ xk+1 come richiesto.
44 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 2.1: Interpretazione geometrica della condizione 4 del Teorema 4


nell’ipotesi di funzione è concava in [a, b]

In conclusione, la successione {xk } è monotona e limitata superiormente e


quindi convergente: limk→∞ xk = α . 
Se α è zero multiplo, con molteplicità m > 1 il metodo di Newton converge
linearmente. Vediamolo su un semplice esempio.
E SEMPIO 12. f (x) = x2 . Il metodo di Newton costruisce la successione
x2k xk
xk+1 = xk − = .
2xk 2
ek
L’errore corrispondente soddisfa la successione ek+1 = 2 che ci dice appunto che il
metodo converge linearmente.
Se si considerasse la successione
x2k
xk+1 = xk − 2 =0
2xk
il metodo converge immediatamente alla radice doppia α = 0.


L’esempio ci suggerisce come modificare il metodo di Newton affinchè sia man-
tenuta la convergenza quadratica anche in presenza di zeri con molteplicità m >
1.

f (xk )
xk+1 = xk − m , f  (xk ) = 0, k ≥ 0 . (2.14)
f  (xk )
La successione generata con l’iterazione (2.14) converge quadraticamente alla
radice multipla α alla luce della seguente osservazione: il metodo di Newton è un
metodo di iterazione funzionale con funzione d’iterazione g(x) = x − ff(x)
(x) .
2 - Ricerca di zeri di funzione 45

Facciamo vedere che, nel caso in cui la radice α ha molteplicità m, per man-
tenere l’ordine di convergenza quadratico, dobbiamo considerare la funzione d’ite-
razione
f (x)
g(x) = x − m . (2.15)
f  (x)

Infatti, poichè possiamo scrivere f (x) = (x − α)m h(x) con h(p) (α) = 0, p =
0, . . . , m e
(x − α) h(x)
g(x) = x −
mh(x) + (x − α)h (x)
h(x) d
g  (x) = 1 − 
− (x − α) ψ(x)
mh(x) + (x − α)h (x) dx
h(x) 
dove ψ(x) = mh(x)+(x−α)h  (x) . Pertanto g (α) = 1 − 1/m = 0 se m > 1. È facile

a questo punto verificare che se prendiamo g(x) = x − m f (x)/f  (x), come in


(2.15), allora g  (α) = 0 che ci garantisce ancora convergenza almeno quadratica
del metodo di Newton anche per zeri con multeplicità m > 1.
Se non conosciamo la molteplicità della radice, considereremo invece di f (x)
la funzione φ(x) = f (x)/f  (x) e applicheremo il metodo di Newton a questa fun-
zione costruendo la successione
φ(xk )
xk+1 = xk − .
φ (xk )

L’unico inconveniente di questa tecnica è che si deve calcolare la derivata seconda


della funzione f . Alternativamente, si può stimare il valore della molteplicità con
una successione
xk−1 − xk−2
mk = (2.16)
2xk−1 − xk − xk−2
come descritto in [26, §6.2.2]. Infatti, visto che la successione {xk } converge
(linearmente) alla radice α allora

xk − xk−1 g(xk−1 ) − g(xk−2 ) 1


lim = lim = g  (α) = 1 − ,
k→∞ xk−1 − xk−2 k→∞ xk−1 − xk−2 m
da cui
1
lim xk −xk−1 = m.
k→∞ 1− xk−1 −xk−2

Vediamo ora un paio di esempi (didattici ma importanti).



1. f (x) = x2 − q, x > 0, q ∈ R+ . Il problema ha soluzione x = q. La
successione del metodo di Newton è
1 q
xk+1 = (xk + ),
2 xk
46 Appunti di Calcolo Numerico con codici in Matlab/Octave

che altro non è che il metodo babilonese o di Erone che calcola q usando
le operazioni elementari. Poiché f  > 0, f  > 0 per x > 0, allora per il
√ √
Teorema 4, per ogni 0 < a < q < b la successione converge a q.
Nel caso f (x) = xn − q, q > 0, n > 0,
1 q
xk+1 = xk (1 − ) + x1−n
n n k
consente di calcolare la radice n-esima del numero reale positivo q.
2. f (x) = x1 − c. Il problema equivale quindi a calcolare l’inverso di c. Sup-
poniamo, per semplicità che c > 0. La successione del metodo di Newton

xk+1 = xk (2 − cxk )
che consente di calcolare il reciproco senza divisioni! Ora, per applicare il
Teorema 4, osservo che essendo f  < 0 e f  > 0 (ricorda che x > 0) dovrò
trovare c, il con a < 1/c < b, tale che
√ √
f (b) 1 − 1 − ac 1 + 1 − ac
= b(bc − 1) < b − a ⇐⇒ <b<
f  (b) c c
1
Pertanto, se a > 0 il metodo di Newton converge pur di prendere < x0 <
2c
3
.
2c
Concludiamo con un uleriore esempio.
E SEMPIO 13. Data la funzione
sin(αx)
fα (x) = log(αx), α = 0 ,
αx + 2
(a) dire quali sono gli zeri di fα (x) risolvendo analiticamente fα (x) = 0;
(b) per α = 2, si calcoli lo zero x∗ = 1/α mediante il metodo di Newton a meno di
tol = 1.e − 6.
Anzitutto la funzione è definita per x = −2/α. Ma la condizione sull’esistenza del
logaritmo, richiede che αx > 0 che implica che α e x siano concordi in segno. Pertanto,
il suo campo di esistenza è R \ {−2/α}. Gli zeri si ottengono dalle equazioni e
disequazioni
sin(αx) = 0,
log(αx) = 0,
αx > 0.
che hanno soluzioni x = kπ α , k ∈ Z, x = 1/α e α x > 0 . In x = 0 la funzione è
definita per continuità e vale 0.
Ad esempio, per α = 2, lo zero richiesto è x∗ = 1/2. Usando il metodo di
sin(αx) cos(αx)(αx + 2) − sin(αx)
Newton, sapendo che fα (x) = +α , con il
x(αx + 2) (αx + 2)2
codice seguente Matlab/Octave:
2 - Ricerca di zeri di funzione 47

Figura 2.2: La funzione dell’Esempio 13 in [0.9, 1] con α = 2.

kmax=100; tol=1.e-6;
x0=3/(2*a);
iter(1)=x0;
[y,yd]=fun1(x0,a);
x1=x0-y/yd;
k=1;
iter(k+1)=x1;
while abs(x1-x0)> tol*abs(x1) & k <=kmax
x0=x1;
[y,yd]=fun1(x0,a);
x1=x0-y/yd;
iter(k+1)=x1;
k=k+1;
end
disp(’La soluzione cercata e’’ ’); x1
%---file che valuta la funzione e la sua derivata ----
function [y,yd]=fun1(x,a)
Ax=a*x+2; Sx=sin(a*x);
y=Sx./Ax.*log(a*x);
yd=Sx./(Ax.*x)+a*(cos(a*x).*Ax-Sx)./(Ax.^2);
return

in 12 iterazioni si calcola la soluzione richiesta.


48 Appunti di Calcolo Numerico con codici in Matlab/Octave

2.4.1 Varianti del metodo di Newton


Descriviamo brevemente alcune varianti del metodo di Newton note in letter-
atura con altri nomi.

Metodo delle corde


Consiste nel considerare costante, uguale ad un certo valore c, la derivata prima
della funzione f . Si ottiene pertanto il metodo delle corde

f (xk )
xk+1 = xk − , c ∈ R\{0}. (2.17)
c
Per la ricerca del valore ottimale per c, si deve tener conto del fatto che il metodo
è un metodo d’iterazione funzionale con funzione d’iterazione g(x) = x − f (x)/c.
Pertanto c si sceglie cosicché
 
 f  (x) 
|g  (x)| = 1 − < 1,
c 

in un intorno Iα = [α − δ, α + δ] della soluzione α. Pertanto, per la convergenza


del metodo delle corde dovremo verificare le seguenti condizioni:

f  (x) = 0, x ∈ Iα ,
0 < f  (x)/c < 2 .

Dalla seconda condizione, indicando con M = maxx∈Iα |f  (x)| si deduce che per la
convergenza dobbiamo richiedere che |c| > M/2 e anche che c f  (x) > 0.
Se c = f  (α) allora il metodo ha convergenza lineare, quando c = f  (α) il
metodo è almeno del primo ordine.

Metodo delle secanti


L’idea è quello di approssimare f  (xk ), che appare nel metodo di Newton, con il
f (xk ) − f (xk−1 )
rapporto incrementale . Si ottiene
xk − xk−1
xk − xk−1
xk+1 = xk − f (xk ) , k = 1, 2, ... (2.18)
f (xk ) − f (xk−1 )

con f (xk−1 ) = f (xk ). Pertanto il metodo richiede la conoscenza di due valori


iniziali, x0 , x1 . Al passo k, il nuovo valore xk+1 è l’intersezione della secante,
ovvero la retta per i punti (xk−1 , f (xk−1 )) e (xk , f (xk )), con l’asse delle ascisse.
Il metodo delle secanti converge, sotto le stesse ipotesi del metodo di Newton,
con ordine di convergenza

1+ 5
p= ≈ 1.618 ,
2
2 - Ricerca di zeri di funzione 49

che equivale ad una convergenza superlineare. Ma, l’importanza del metodo


delle secanti stà principalmente nel costo computazionale: il metodo richiede
solo il calcolo di f (xk ) mentre il metodo di Newton richiede i valori di f (xk )
e di f  (xk ). Nel caso di funzioni la cui espressione è ”complicata”, il calcolo
della derivata può essere costoso dal punto di vista della complessità. Pertanto
il metodo delle secanti, pur avendo una convergenza superlineare, rappresenta
sempre una valida alternativa al metodo di Newton.
Nel valutare, se usare il metodo delle secanti o di Newton, si dovrebbe consid-
erare la loro efficienza computazionale che indica se è più costoso calcolare la
derivata o il rapporto incrementale senza tralasciare il fatto che il calcolo della
derivata di una funzione è comunque un problema mal-condizionato.
Osserviamo che in [2] viene chiamato metodo delle secanti il metodo iterativo
xk − c
xk+1 = xk − f (xk ) , k = 1, 2, ... (2.19)
f (xk ) − f (c)
con c ∈ [a, b], che corrisponde ad usare una secante sempre con la stessa pen-
denza. In questo caso, la convergenza è di tipo lineare. Se c è scelto cosicché
f (c)/(c − α) ha lo stesso segno di f  (α) ed inoltre
 
 f (c)  1 
 
 c − α  > 2 |f (α)|

allora la corrispondente funzione d’iterazione è tale che |g  (x)| < 1 e quindi il


metodo converge.

Il metodo di Steffensen
Il metodo costruisce la sequenza
f (xk )
xk+1 = xk − , (2.20)
g(xk )
f (xk + f (xk )) − f (xk )
g(xk ) = . (2.21)
f (xk )
Posto βk = f (xk ), si ha
f (xk + βk ) − f (xk ) 1
g(xk ) = = f  (xk ) 1 − hk f  (xk ) + O(βk2 )
f (xk ) 2
con hk = −f (xk )/f  (xk ) che è la correzione di Newton.
Osservando che per la funzione s(x) = 1/(1 − x) si può scrivere come s(x) =
1 + x + O(x2 ), pertanto la (2.20) diventa
hk 
xk+1 = xk + hk (1 + f (xk ) + O(βk2 )) . (2.22)
2
Da cui, per l’errore ek = xk − α, osservando che
1 f  (ξ)
hk = −ek + e2k 
2 f (xk )
50 Appunti di Calcolo Numerico con codici in Matlab/Octave

(xk − α)2 f  (ξk )


(si ottiene dal fatto che hk = (xk − α) + )
2 f  (xk )
otteniamo
ek+1 f  (α)
lim = (1 + f  (α)) .
k→∞ e2
k 2f  (α)

In conclusione il metodo di Steffensen è un metodo di ordine 2.

2.5 Accelerazione di Aitken


Il metodo consente di accelerare una sequenza ottenuta a partire da successioni
di punto fisso xk+1 = g(xk ), k ≥ 0.
Se {xk } converge linearmente allo zero α, allora possiamo dire che esiste un
η (da determinarsi) tale che

g(xk ) − α = η(xk − α) . (2.23)

Il metodo si propone di definire una “nuova” successione che migliori la succes-


sione ottenuta con il metodo di partenza. Dalla (2.23) otteniamo
g(xk ) − ηxk g(xk ) − ηxk + xk − xk
α= =
1−η 1−η
ovvero

g(xk ) − xk
α = xk + . (2.24)
1−η
Come possiamo determinare η? Lo approssimiamo con la successione
g(g(xk )) − g(xk )
ηk = . (2.25)
g(xk ) − xk
Lemma 1. Se la successione xk+1 = g(xk ) converge ad α allora

lim ηk = g  (α) .
k→+∞

Dim. Osserviamo che xk+1 = g(xk ) e xk+2 = g(g(xk )). Da (2.25)


xk+2 − xk+1 xk+2 − α − (xk+1 − α)
ηk = = =
xk+1 − xk xk+1 − α − (xk − α)
xk+2 −α
xk+1 −α − 1
= k −α
.
1 − xxk+1 −α

Passando al limite, ricordando che per ipotesi la successione converge ovvero che
xk+1 − α
lim = g  (α), otteniamo l’asserto
k→+∞ xk − α

g  (α) − 1
lim ηk = 1 = g  (α) .
k→+∞ 1 − g (α)
2 - Ricerca di zeri di funzione 51

In definitiva {ηk } approssima η. 


Usando (2.24) e (2.25) otteniamo la “nuova successione”

(g(xk ) − xk )2
x̂k+1 = xk − , k≥0 (2.26)
g(g(xk )) − 2g(xk ) + xk

detta formula di estrapolazione di Aitken o anche metodo di Steffensen. La


(2.26) si può considerare una iterazione di punto fisso con funzione d’iterazione

x g(g(x)) − (g(x))2
gΔ (x) = .
g(g(x)) − 2g(x) + x

Osservazione. Il Δ a pedice nella gΔ è dovuto alla seguente osservazione. Os-
serviamo che la successione di Aitken si può riscrivere come

(xk+1 − xk )2
x̂k+1 = xk − , (2.27)
xk+2 − 2xk+1 + xk

dove appare evidente la presenza dell’operatore differenze in avanti, Δ. Δ è


un operatore lineare che si definisce come

Δ x = (x + h) − x, h > 0

Pertanto Δ xk = xk+1 − xk , Δ2 xk = Δ(Δ xk ) = Δxk+1 − Δ xk = xk+2 − 2xk+1 + xk .


In definitiva la successione di Aitken (2.27), usando l’operatore Δ, diventa

(Δ xk )2
x̂k+1 = xk − . (2.28)
Δ2 x k

Talvolta, per indicare il metodo di accelerazione di Aitken, si usa la notazione Δ2


di Aitken.

Tornando alla gΔ (x), notiamo che è indeterminata per x = α. Infatti, ricordando
α2 −α2
che g(α) = α e g(g(α)) = α otteniamo gΔ (α) = α−2α+α = 00 . Se g è derivabile e

g (α) = 1 allora applicando de l’ Hôpital limx→α gΔ (x) = α. Pertanto, in x = α,
gΔ (x) è estendibile per continuità e gΔ (α) = α.
Se g(x) = x − f (x) allora g  (α) = 1 se e solo se α ha molteplicità 2. Anche per
questa particolare g, si verifica che gΔ (α) = α ovvero ha gli stessi punti fissi di
g. Possiamo quindi considerare l’iterazione di punto fisso xk+1 = g(xk ), g(x) =
x − f (x). Vale il seguente risultato.

Proposizione 1. Sia g(x) = x − f (x) e α radice di f . Se f è sufficientemente


regolare la successione xk+1 = g(xk ) ha le seguenti proprietà.

(i) se le iterazioni di punto fisso convergono linearmente ad una radice semplice


di f allora Δ2 di Aitken converge quadraticamente alla stessa radice.
52 Appunti di Calcolo Numerico con codici in Matlab/Octave

(ii) se le iterazioni di punto fisso convergono con ordine p ≥ 2 ad una radice


semplice di f allora Δ2 di Aitken converge alla stessa radice con ordine
2p − 1.

(iii) se le iterazioni di punto fisso convergono linearmente ad una radice multipla


di molteplicità m ≥ 2 di f allora Δ2 di Aitken converge linearmente alla
stessa radice con fattore asintotico 1 − 1/m.

Inoltre, nel caso p = 1 con α radice semplice di f , il metodo di Aitken converge


anche se le corrispondenti iterazioni di punto fisso non convergono.
3 1
E SEMPIO 14. La funzione tan(x) = 2x −
ha la radice α = 0.205921695. Se
10
0.1 + tan(xk )
la determiniamo con il metodo iterativo xk+1 = 2 partendo da x0 = 0
3 
otteniamo una successione linearmente convergente ad α (infatti g (α) ≈ 0.45636 < 1).
In Tabella 2.2 facciamo vedere la differente velocità di convergenza usando anche la
successione del metodo di accelerazione Δ2 di Aitken.

k xk x̂k (Aitken)
0 0 0
.. .. ..
. . .
2 0.111 0.2024
.. .. ..
. . .
5 0.1751 0.2053

Tabella 2.2: Confonto di una successione di punto fisso e di Δ2 di Aitken

Una possibile implemetazione del metodo di accelerazione di Aitken, in Mat-



lab/Octave, è descritta nella funzione Aitken.m nell’Appendice C.

2.6 Calcolo delle radici di polinomi algebrici


Indicheremo con
n
pn (x) = ak xk , a k ∈ R
k=0

un poliomio algebrico di grado n. Per la ricerca delle radici reali e/o complesse
di pn (x) ricordiamo anzitutto due risultati utili a comprendere la difficoltà del
problema.

• Regola dei segni di Cartesio. Dato pn (x), indichiamo con s il numero di


cambiamenti di segno nell’insieme dei coefficienti {ak } e con p il numero
delle radici reali positive ognuna contata con la propria molteplicità. Allora
p ≤ s e s − p è un numero pari.
2 - Ricerca di zeri di funzione 53

• Regola di Cauchy. Tutti gli zeri di pn (x) sono inclusi nel cerchio Ω ⊂ C
 
 ak 
Ω = {z ∈ C : |z| ≤ 1 + γ}, γ = max  
0≤k≤n−1 an

Vediamo ora un paio di esempi esplicativi che ci dicono come la regola di


Cauchy ci dia una localizzazione troppo approssimativa.

1. Sia p3 (x) = x3 − 3x + 2 (che si può fattorizzare (x − 1)2 (x + 2)). Questo


polinomio ha s = 2, p = 2 quindi la regola di Cartesio vale in quanto 2 ≤ 2 e
2 − 2 = 0 è pari. Pe Cauchy abbiamo che il cerchio di raggio 1 + γ = 1 + 3 = 4
contiene le radici.

2. Sia p6 (x) = x6 − 2x5 + 5x4 − 6x3 + 2x2 + 8x − 8 le cui radici sono ±1, ±2i, 1 ± i.
Abbiamo una sola radice positiva: p = 1. Il numero dei cambi di segno è
s = 5. Anche qui le due regole di Cartesio e Cauchy sono ancora vere. In
particolare per Cauchy avremo che γ = 8!

2.6.1 Schema di Hörner


Lo schema consente di valutare efficientemente un polinomio in un punto. Parti-
amo con un esempio esplicativo. Per valutare il polinomio p2 (x) = a0 + a1 x + a2 x2
in un punto ζ richiederebbe 2 addizioni e 2 moltiplicazioni. Se lo riscrivessimo
nella forma equivalente p2 (x) = a0 + x(a1 + a2 x), per valutarlo in ζ occorerebbero
2 addizioni e 2 moltiplicazioni.
Nel caso generale, la valutazione in ζ di pn (x) = a0 +a1 x+· · ·+an xn richiederebbe
n somme e 2n − 1 moltiplicazioni. Usando la riscrittura

pn (x) = a0 + x(a1 + x(a2 + · · · + x(an−1 + an x)))

serviranno solo n somme e n moltiplicazioni.


L’algoritmo di Hörner per valutare pn (x) nel punto ζ si può cosı̀ descrivere.

b n = an ;
for k=n-1:-1:0,
bk = ak + bk+1 ζ
end for
Alla fine b0 = pn (ζ).

Tabella 2.3: Algoritmo di Hörner per la valutazione di un polinomio pn (x) nel


punti ζ.

L’algoritmo di Hörner è anche detto di divisione sintetica. Infatti, consid-


eriamo il polinomio

qn−1 (x; ζ) = b1 + b2 x + · · · + bn xn−1


54 Appunti di Calcolo Numerico con codici in Matlab/Octave

i cui coefficienti sono i coefficienti bk calcolati con l’algoritmo di Hörner e che


dipendono da ζ, allora possiamo scrivere

pn (x) = (x − ζ)qn−1 (x; ζ) + b0

con b0 che è il resto della divisione di pn (x) per x − ζ. Per Ruffini sappiamo che
b0 = pn (ζ) e quindi b0 = 0 quando ζ è una radice di pn (x). Pertanto, quando
pn (ζ) = 0 possiamo scrivere

pn (x) = (x − ζ)qn−1 (x; ζ) .

Per determinare le rimanenti radici di pn (x) dobbiamo risolvere l’equazione


qn−1 (x; ζ) = 0. Per fare questo opereremo per deflazione come descriveremo nel
prossimo algoritmo che dovremo eseguire per ogni valore di k da n fino a 1
(ovvero k=n:-1:1).

Algoritmo 1.

(i) trova una radice ζk di pk con un metodo di ricerca radici (es. Newton);

(ii) calcola il polinomio quoziente qk−1 (x; ζk ) usando lo schema di Hörner;

(iii) poni pk−1 = qk−1 e vai a (i).

Metodo di Newton-Hörner

È il metodo di Newton associato allo schema di deflazione: calcola la radice ζk di


pk (x). Osservo anzitutto che se pn (x) = (x − ζ)qn−1 (x) allora

pn (x) = qn−1 (x; ζ) + (x − ζ)qn−1



(x; ζ)

Da cui
pn (ζ) = qn−1 (ζ; ζ) .

Pertanto il metodo di Newton-Hörner per approssimare la j-esima radice ζj , j =


(0)
1, . . . , n di pn , consiste, a partire da una approssimazione iniziale ζj , nel costru-
ire la successione
(k)
(k+1) (k) pn (ζj )
ζj = ζj − (k) (k)
.
qn−1 (ζj ; ζj )

Poi, ricordando che pn (x) = (x − ζj )qn−1 (x) si sfrutta la deflazione per approssi-
mare uno zero di qn−1 finchè determineremo tutte le radici.
2 - Ricerca di zeri di funzione 55

2.7 Esercizi proposti

E SERCIZIO 16. Data la funzione f (x) = cosh x + sin x − γ, per γ = 1, 2, 3 si


individui graficamente un intervallo contenente uno zero ξ ≥ 0 e lo si calcoli
con il metodo di bisezione con tol = 1.e − 10. Calcolare anche il numero
di iterazioni necessarie sia a priori che a posteriori. Fare anche il grafico
dell’errore relativo da cui si evince che la convergenza è lineare.
E SERCIZIO 17. Un oggetto si trova fermo su un piano la cui inclinazione
varia con velocità costante ω. Dopo t secondi la posizione del questo oggetto è
g
s(t, ω) = (sinh(ωt) − sin(ωt))
2ω 2
dove g = 9.81m/sec2 è l’accelerazione di gravità. Supponiamo che il corpo si
sia mosso di 1 metro in 1 secondo. Si ricavi il valore corrispondente di ω con
accuratezza 1.e − 5, mediante un metodo di iterazione funzionale convergente!
(Sugg: si deve trovare una funzione di iterazione la cui derivata prima risulta
in modulo minore di 1 nell’intorno dello zero...).
E SERCIZIO 18. Si consideri la funzione f (x) = x2 − sin(πx) e−x .
1. Individuare un metodo di iterazione funzionale convergente linearmente
alla radice positiva, α, di f (x).
2. Individuare un metodo di iterazione funzionale convergente quadrati-
camente alla radice β = 0, di f (x).
In tutti i casi usare tol = 1.e − 6 e calcolare l’errore assoluto.
E SERCIZIO 19. 1. Si consideri la funzione f (x) = x2 − log(x2 + 2) di cui si
vogliamo trovare gli zeri.
• Individuare le due radici reali di f (x) = 0 e i corrispondenti inter-
valli separatori (che denoteremo con Iα1 e Iα2 ).
• Si costruiscano due metodi convergenti di iterazione funzionale, le
cui funzioni di iterazione sono gi (x), i = 1, 2. Determinare per cias-
cuno di essi il numero di iterazioni necessarie, l’ordine di conver-
genza e il fattore asintotico d’errore. Usare 50 come numero mas-
simo di iterazioni e un opportuno test d’arresto con tol = 1.e − 5
2. Data la funzione f (x) = x2 − 2x − log(x), si studi la convergenza del
metodo delle secanti applicato all’equazione f (x) = 0.

Ricordo che la formula del metodo delle secanti è

x(k) − x(k−1)
x(k+1) = x(k) − f (x(k) ) , k≥1.
f (x(k) ) − f (x(k−1) )
Si fornisca anche il plot della sequenza {xi } alle due radici reali di f .
Si scelga tol = 1.e − 5. Rifare quindi l’esercizio con il metodo di Newton
(o delle tangenti).
56 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 20. Si consideri il metodo d’iterazione funzionale

xi+1 = xi + e1−xi − 1 .

Provare, dapprima teoricamente e quindi numericamente usando tol =


1.e − 9, che questo procedimento converge all’unico punto fisso della funzione
d’iterazione. Calcolarne anche l’ordine di convergenza.
E SERCIZIO 21. Si consideri la funzione f (x) = (x2 − 1)p log(x), p ≥ 1, x > 0
che ha in α = 1 una radice multipla di molteplicità m = p + 1. Nei casi
p = 2, 4, 6, si determini α con i due seguenti metodi a meno di tol = 1.e − 8
partendo da x0 = 0.8.
1.
f (xk ) xk−1 − xk−2
xk+1 = xk − mk 
, k ≥ 2 con mk = . (2.29)
f (xk ) 2xk−1 − xk − xk−2

2.
f (xk )
xk+1 = xk − m .
f  (xk )
Per ciascun metodo si determini il numero di iterazioni necessarie. Nel caso
del primo metodo si faccia vedere che la formula per mk in (2.29) fornisce
anche una stima della molteplicità di α.
E SERCIZIO 22. Si consideri l’equazione x = e−x .
• Individuato un intervallo che contiene la radice, usando l’iterazione
e−xn + xn
xn+1 = , n≥0 (2.30)
2
si determini la radice α dell’equazione data con tol = 1.e − 6.
• Si prenda ora l’iterazione
ωe−xn + xn
xn+1 = , n ≥ 0, ω = 0, ω = −1 , (2.31)
1+ω
Determinata α, graficamente si dica per quali valori di ω l’iterazione
(2.31) converge più rapidamente di (2.30) (Sugg. si calcoli in α la
derivata della funzione d’iterazione (2.31) )
• Qual è il valore ottimale di ω?
E SERCIZIO 23. Si considerino le funzioni f1 (x) = log(2/(3 − x)) e f2 (x) =
x3 − 3 .
• Mediante il metodo di Newton determinare l’unica intersezione x di
f1 (x) = f2 (x) calcolando anche il numero di iterazioni.
2 - Ricerca di zeri di funzione 57

• Visualizzare in scala semilogaritmica l’andamento dell’errore relativo


usando la soglia tol = 1.e − 9.
E SERCIZIO 24. Si considerino le funzioni f1 (x) = log(2|x|) e f2 (x) = 1 − k x,
k reale.
1. Aiutandosi con la grafica, dire quante soluzioni reali hanno le due fun-
zioni per i seguenti valori k1 = 2e−2 − 0.1, k2 = k1 + 0.3 e k3 = 0.
2. Si consideri quindi k = 1. Studiare la convergenza dei seguenti metodi
di iterazione funzionale all’unica radice α
(i)
xi+1 = 1 − log(2|xi |) ,
(ii)
1
xi+1 = exp (1 − xi ) .
2
E SERCIZIO 25. Si consideri la funzione f (x) = x3 − 3 ex + 3 di cui si vogliamo
trovare gli zeri.
• Individuare le due radici reali di f (x) = 0 e i corrispondenti intervalli
separatori (che denoteremo con Iα1 e Iα2 ) e verificare che α1 < α2 = 0.
• Si determini α1 con il metodo delle secanti. Usare un opportuno test
d’arresto con tol = 1.e − 8.
• facoltativo: individuare un metodo di iterazione funzionale conver-
gente ad α1 .
E SERCIZIO 26. Si consideri la funzione
√ 4 1
f (x) = 1.74 log(10 x) − −√ .
10 x
• Trovare l’intervallo [a, b] che contiene l’unica radice α di f (x).
• Costruire un metodo d’iterazione funzionale convergente in [a, b] alla
radice α. Usare tol = 1.e − 6.
E SERCIZIO 27. Dato il polinomio p3 (x) = x3 − 2x2 + 1. Si dica quale tra le
seguenti 3 funzioni d’iterazione, per calcolare la radice ξ = 1, converge con
ordine almeno quadratico: g1 (x) = x − p3 (x), g2 (x) = p3 (x) − x e g3 (x) =
p3 (x) + x.
E SERCIZIO 28. Si consideri lo schema iterativo

xk+1 = xk + e1−xk − 1 , k ≥ 0 .

Qual è l’unico punto fisso α della funzione d’iterazione data e qual è il cor-
rispondente ordine p di convergenza?
58 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 29. Data la funzione f (x) = ex − x3 + 2 che in [2, 5/2] ha una


radice α ≈ 2.27. Si dica quale tra le seguenti 3 funzioni d’iterazione converge
con ordine almeno quadratico partendo da x0 = 2: g1 (x) = log(x3 − 2), g2 (x) =
f (x) + x e g3 (x) = −(f (x)/f  (x) − x).

E SERCIZIO 30. La funzione f (x) = x3 − 2− x+1 ha un’unico zero reale. Cal-
colare tale zero con un errore minore di 0.25. Trovare quindi un metodo di
punto fisso convergente allo zero.
3
Soluzione di sistemi lineari
Prima di addentrarci nello studio dei metodi numerici, è doveroso introdurre le
matrici e alcune strutture particolari di matrici nonchè alcuni concetti fonda-
mentali quali la norma vettoriale e matriciale e il numero di condizionamento di
una matrice.

3.1 Cose basilari sulle matrici


Le definizioni che qui forniamo sono relative a matrici a valori reali ma valgono
similmente nel caso complesso con alcune piccole variazioni.
Una matrice (di numeri reali) è una tabella di m × n numeri disposti su m
righe e n colonne. I numeri che compaiono nella tabella si chiamano elementi
(della matrice). La loro individuazione avviene attraverso la loro posizione di
riga e colonna. Ad esempio
⎡ ⎤
1 2 4 8 6
A = ⎣ 0 −5 16 −9 0.3 ⎦
3 25 6 3 0.5

è una mtrice 3 × 5. L’elemento 16 essendo posizionato sulla seconda riga e terza


colonna, verrà indicato con a23 .
In generale una matrice A avente m righe ed n si indicherà con
⎡ ⎤
a11 a12 · · · a1j · · · a1n
⎢ a21 a22 · · · a2j · · · a2n ⎥
⎢ ⎥
⎢ ··· ··· ··· ··· ··· ··· ⎥
A=⎢ ⎢ ai1 ai2 · · · aij
⎥.
⎢ · · · ain ⎥

⎣ ··· ··· ··· ··· ··· ··· ⎦
am1 am2 · · · amj · · · amn

Il numero di righe o di colonne viene detto ordine o dimensione della matrice. Nel
caso in cui m = n si dice che la matrice è quadrata di ordine n altrimenti sarà
detta rettangolare.

3.1.1 Operazioni aritmetiche con le matrici


• Somma di matrici. Siano A e B due matrici quadrate di ordine n o in
generale dello stesso tipo m × n. Indicando con C la matrice risultato
60 Appunti di Calcolo Numerico con codici in Matlab/Octave

dell’operazione, si ha:

Cij = (A + B)ij = Aij + Bij .

Esempio. ⎡ ⎤ ⎡ ⎤ ⎡ ⎤
1 3 2 0 0 5 1 3 7
⎣ 1 0 0 ⎦+⎣ 7 5 0 ⎦ = ⎣ 8 5 0 ⎦ .
1 2 2 2 1 1 3 3 3

• Prodotto per uno scalare. Sia A una matrice quadrata di ordine n o ret-
tangolare m × n. Preso un α ∈ R si ha

(α A)ij = α Aij .

Esempio. ⎡ ⎤ ⎡ ⎤
1 3 4 2 6 8
⎢ 0 1 5 ⎥ ⎢ 0 2 10 ⎥
2⎢
⎣ −1
⎥ = ⎢ ⎥ .
7 −8 ⎦ ⎣ −2 14 −16 ⎦
1 0 0 2 0 0

• Prodotto di matrici. La regola fondamentale è che il prodotto di matrici


si fa righe per colonne. Pertanto perchè abbia senso richiederemo che il
numero di colonne della prima matrice sia uguale al numero di righe della
seconda matrice.
Se A e B sono matrici quadrate di ordine n il prodotto è sempre possibile.
Invece se A e B sono rettangolari il numero delle colonne di A deve coin-
cidere con quello delle righe di B. As esempio, se A è n × p e B è p × m allora
C = A × B avrà dimensione n × m. Pertanto,
p
Cij = (Aik Bkj ) .
k=1

In Matlab/Octave basta scrivere A*B.


Esempio. ⎡ ⎤ ⎡ ⎤ ⎡ ⎤
1 3 2 2 1 14 6
⎣ 0 0 1 ⎦·⎣ 4 1 ⎦ = ⎣ 0 1 ⎦ .
1 2 2 0 1 9 5

Elenchiamo le principali proprietà dell’ operazione di somma e prodotto con


matrici.

1. A+0 = 0+A = A ovvero la matrice formata da tutti zeri è l’elemento neutro


della somma.

2. A + (−A) = 0, ovvero esiste l’opposto di A che è la matrice −A.

3. (A + B) + C = A + (B + C), ovvero la somma è associativa.


3 - Soluzione di sistemi lineari 61

4. A + B = B + A: la somma è commutativa. Purtroppo questa proprietà non


vale per il prodotto: il prodotto di matrici non è commutativo.
     
1 2 5 0 5 2
· = ,
4 −1 0 1 20 −1
mentre      
5 0 1 2 5 10
· = .
0 1 4 −1 4 −1

5. (AB)C = A(BC): associatività del prodotto di matrici.


6. C(A + B) = CA + CB: distributività del prodotto rispetto alla somma di
matrici.
Ci sono poi, alcune operazioni sulle matrici, tipiche dell’algebra delle matrici.
• Somma diretta di matrici. Siano A e B due matrici non necessariamente
quadrate, la loro somma diretta, che si indica con A ⊕ B è
 
A 0
A⊕B = .
0 B

Esempio.
⎡ ⎤
⎡ ⎤ 1 3 2 0 0
  2 1 ⎢ 2 3 1 0 0 ⎥
1 3 2 ⎢ ⎥
⊕⎣ 4 1 ⎦ = ⎢
⎢ 0 0 0 2 1 ⎥ .

2 3 1 ⎣ ⎦
0 1 0 0 0 4 1
0 0 0 0 1

In generale


k
Ai = A1 ⊕ A2 ⊕ · · · ⊕ Ak = diag(A1 , . . . , Ak ) .
i=1

In Matlab/Octave esiste la funzione blkdiag che permette di calcolare la


somma diretta di matrici.
• Prodotto diretto di matrici. Siano A, m × n e B, p × q (in generale
due matrici non necessariamente quadrate), il loro prodotto diretto, che si
indica con A ⊗ B è
⎡ ⎤
a11 B ··· a1n B
⎢ a21 B ··· a2n B ⎥
⎢ ⎥
A⊗B =⎢ .. .. ⎥.
⎣ . . ⎦
am1 B ··· amn B
La matrice C = A ⊗ B ha quindi dimensione mp × nq.
62 Appunti di Calcolo Numerico con codici in Matlab/Octave

Esempio.
⎡ ⎤
0 3 0 6
⎡ ⎤ ⎢ 2 1 4 2 ⎥
  0 3 ⎢ ⎥
1 2 ⎢ 0 1 0 2 ⎥
⊗⎣ 2 1 ⎦ = ⎢

⎥ .

3 0 ⎢ 0 9 0 0 ⎥
0 1 ⎣ ⎦
6 3 0 0
0 3 0 0

• Esponenziale di matrici quadrate. Sia A, n × n, l’esponenziale di A si


definisce come la serie di Taylor infinita

Ak
eA = . (3.1)
k!
k=0

Nel caso banale in cui A sia 1 × 1 la serie coincide con l’usuale funzione
esponenziale scalare. L’ esponenziale di matrice viene usata soprattutto
nel contesto della soluzione di sistemi di equazioni differenziali ordinarie.
In Matlab/Octave la funzione expm consente di calcolare l’esponenziale di
matrice mediante un’approssimazione di Padè. Quest’ultima consiste in
un’approssimazione polinomiale razionale di matrici dell’espansione di Tay-
lor (3.1) (cfr. [18, 23]).

Alcune strutture speciali sono le seguenti

• A è detta diagonale se
⎛ ⎞
a1,1 0
⎜ 0 a2,2 ⎟
⎜ ⎟
⎜ .. .. ⎟ , ai,j = 0, i = j .
⎝ . . ⎠
0 an,n

In Matlab/Octave esiste la funzione diag, se applicata ad una matrice resti-


tuisce il vettore della diagonale altrimenti se applicata ad un vettore resti-
tuisce una matrice diagonale.

• A è detta triangolare superiore se


⎛ ⎞
x ··· ··· x
⎜ x ··· x ⎟
⎜ ⎟
⎜ .. .. ⎟ , ai,j = 0, i > j .
⎝ 0 . . ⎠
x

In Matlab/Octave per estrarre la parte triangolare superiore di una matrice


si usa triu.
3 - Soluzione di sistemi lineari 63

• A è detta triangolare inferiore se


⎛ ⎞
x
⎜ ⎟
⎜ x ... 0 ⎟
⎜ ⎟ , ai,j = 0, i < j .
⎜ . ⎟
⎝ .. · · · . . . ⎠
x ··· ··· x

In Matlab/Octave per estrarre la parte triangolare inferiore di una matrice


si usa tril.

• A è detta tridiagonale se
⎛ ⎞
x x 0
⎜ x x x ⎟
⎜ ⎟
⎜ . . .. .. ⎟
⎜ . . . ⎟ , ai,j = 0, |i − j| > 1 .
⎜ ⎟
⎜ . .. ⎟
⎝ .. . x ⎠
0 x x

Si dirà che una matrice è a banda con banda di ampiezza 2s + 1 se gli ele-
menti nulli sono quelli i cui indici soddisfano la disuguaglianza |i − j| > s.
Ad esempio, in Matlab/Octave per costruire una matrice tridiagonale A con
diagonale principale il vettore a (di dimensione n) e sottodiagonale e sovra-
diaganole i vettori b, c (di dimensione n − 1) rispettivamente, si usa il co-
mando A=diag(a)+diag(b,-1)+diag(c,1).

• A è detta avere la forma di matrice di Hessenberg superiore se


⎛ ⎞
x x x ··· x
⎜ x x x ··· x ⎟
⎜ ⎟
⎜ . .. . . . . . . ... ⎟
⎜ 0 ⎟ , ai,j = 0, i > j + 1 .
⎜ ⎟
⎜ . . ⎟
⎝ .. . . . . . . . . ... ⎠
0 ··· 0 x x

Si dirà poi che A ha la forma di Hessenberg inferiore se ai,j = 0, j > i + 1 .


In Matlab/Octave H=hess(A), consente di estrarre la sottomatrice di Hes-
senberg superiore di figura.

• A si dice a blocchi se i suoi elementi sono a loro volta delle matrici. Ad


esempio una matrice a blocchi 2 × 2 si indica come segue

A11 A12
A= .
A21 A22

• Trasposta di una matrice


64 Appunti di Calcolo Numerico con codici in Matlab/Octave

La matrice trasposta di A, denotata con AT è tale che (A)Tij = Aji . La


trasposizione gode delle seguenti proprietà.

(AT )T = A, (cA)T = cAT , (A + B)T = B T + AT , (AB)T = B T AT .

Se A e B sono due matrici a blocchi, i cui blocchi hanno la stessa dimen-


sione, la somma A + B equivale alla matrice i cui elementi sono la somma
dei rispettivi blocchi. Sempre nel caso di matrici a blocchi 2 × 2 avremo

A11 + B11 A12 + B12


A+B = .
A21 + B21 A22 + B22

L’operazione di trasposizione si applica anche a matrici a blocchi. Ad esem-


pio ⎛ T ⎞
A11 AT21
AT = ⎝ ⎠.
T T
A12 A22
Se AT = A allora A è detta simmetrica. Quando AT = −A, A è detta
antisimmetrica.
Osserviamo che la matrice trasposta esiste sia nel caso di matrici quadrate
che rettangolari. In Matlab/Octave la trasposta di A si ottiene col comando
A’.

• Inversa di una matrice


La matrice inversa di una matrice quadrata A di ordine n, che si indica con
A−1 , è tale che A A−1 = A−1 A = I. Valgono operazioni simili alla trasposta.
Se A e B sono quadrate di ordine n allora (AB)−1 = B −1 A−1 .
Nel caso di matrici rettangolari, non si può definire l’inversa nel modo in cui
siamo abituati, ma come vedremo più oltre nel contesto della soluzione di
sistemi lineari sovra o sotto-determinati, si parlerà di inversa generalizzata
o pseudo inversa di Moore-Penrose (vedi sezione 3.8).

Definizione 6. Data A, diremo che B è simile ad A se esiste una matrice invert-


ibile P tale che
P −1 AP = B .

3.1.2 Determinante e autovalori


Ad ogni matrice quadrata A di ordine n, possiamo associare un numero detto de-
terminante che denoteremo con det(A) oppure |A|. Se indichiamo con M l’algebra
delle matrici quadrate di ordine n, allora il determinante det è una funzione da
M a valori nei reali:

det : M→R
A → det(A)
3 - Soluzione di sistemi lineari 65

Per il calcolo del determinante ci si può avvalere della regola di Laplace



⎨ a11 n=1
det(A) = (3.2)
⎩ n
j=1 Ã i,j a i,j , i = 1, ..., n n > 1

con Ãi,j = (−1)i+j det(Ai,j ) dove Ai,j è la matrice ottenuta sopprimendo la i-esima
riga e la j-esima colonna.
Definizione 7. Un autovalore di una matrice A, è un numero λ ∈ C per cui
esiste un vettore x non nullo per cui vale l’uguaglianza

λx = Ax . (3.3)

Il vettore x = 0 viene detto autovalore di A associato all’autovalore λ.


Il numero λ è soluzione dell’equazione caratteristica

pA (λ) = det(A − λI) = 0 ,

con pA (λ) che si chiama polinomio caratteristico della matrice A. Valgono


inoltre le relazioni
&
n
det(A) = λi ,
i=1
n n
tr(A) = λi = ai,i ,
i=1 i=1

dove tr indica la traccia di A. Queste due uguaglianze si dimostrano facilmente


osservando che il polinomio caratteristico pA (λ) è un polinomio monico di grado
n della forma
' n (
pA (λ) = (−1)n λn + (−1)n−1 aii λn−1 + · · · + det(A) .
i=1

Ricordando le relazioni tra le radici di un polinomio e i suoi coefficienti, si con-


clude.
In Matlab/Octave esistono le funzioni det e trace con ovvio significato.
Definizione 8. Una matrice simmetrica si dice definita positiva se per ogni
vettore x = 0 la forma quadratica xT A x risulta essere maggiore di zero in senso
stretto. Se xT A x ≥ 0 la matrice si dice semidefinita positiva.
Proposizione 2. Se A è simmetrica definita positiva allora
(i) |Ak | > 0, ∀ k = 1, ..., n, cioè i minori principali di testa (incluso il determi-
nante) sono positivi.
(ii) ai,i > 0.
66 Appunti di Calcolo Numerico con codici in Matlab/Octave

(iii) |a2i,j | < ai,i aj,j , i = j , ovvero l’elemento più grande sta sulla diagonale
principale.
(iv) Gli autovalori di A sono tutti positivi. Infatti se λ è un autovalore, dalla
definizione di una matrice simmetrica e definita positiva otteniamo la dis-
uguaglianza
0 < xT A x = λ xT x
n
da cui si conclude essendo xT x = i=1 x2i > 0 per ogni vettore x non nullo.
Nota: non vale il viceversa della proprietà (iv).

3.2 Norme di vettore e di matrice


Per ogni vettore x ∈ Rn , possiamo definire la norma come una funzione
 ·  : Rn → R+ ,
avente le seguenti proprietà:
1. x > 0, ∀ x = 0, x = 0 ⇔ x = 0
2. c x = |c|x, ∀ c ∈ R
3. x + y ≤ x + y, ∀ x, y ∈ Rn (disuguaglianza triangolare).
Una proprietà importante è che in uno spazio vettoriale di dimensione finita
tutte le norme vettoriali sono equivalenti. Ovvero per ogni coppia di norme  · (1)
e  · (2) esistono due costanti positive m e M t.c.
mx(2) ≤ x(1) ≤ M x(2) , ∀ x ∈ Rn . (3.4)
Gli esempi di norme vettoriali più usate sono:
(a) x∞ = max |xi | (norma infinito)
1≤i≤n

(b) x1 = |xi | (norma 1)


1≤i≤n
⎛ ⎞1/2

(c) x2 = ⎝ |xi |2 ⎠ = xT x (norma 2 o norma euclidea)
1≤i≤n

⎛ ⎞1/p

(d) xp = ⎝ |xi |p ⎠ , p ≥ 1 (norma p)


1≤i≤n

In Matlab/Octave, queste norme si determinano usando la funzione norm(x,*),


dove * potrà assumere i valori 1,2,inf,p. Per default norm(x) è la norma 2.
Se A ∈ Rn×n , la sua norma è ancora una funzione  ·  : Rn×n → R+ , che
soddisfa le seguenti proprietà
3 - Soluzione di sistemi lineari 67

1. A > 0, ∀ A = 0 ; A = 0 ⇐⇒ A = 0

2. c A = |c|A, ∀ c ∈ R

3. A + B ≤ A + B, ∀ A, B ∈ Rn×n (disuguaglianza triangolare).

4. A B ≤ A B, ∀ A, B ∈ Rn×n

L’ultima proprietà è caratteristica della norma di matrice. Anche per le norme di


matrici vale un’equivalenza simile alla (3.4). Gli esempi di norme matriciali più
usate sono:
n
(a) A∞ = max |ai,j | (norma infinito o norma per righe)
1≤i≤n
j=1

n
(b) A1 = max |ai,j | (norma 1 o norma per colonne)
1≤j≤n
i=1
⎛ ⎞1/2

(c) AF = ⎝ |ai,j |2 ⎠ = tr(A AT ) , (norma di Frobenius)
1≤i≤n 1≤j≤n

(d) A2 = ρ(AT A) (norma 2 o norma euclidea o norma spettrale)

Osserviamo che la norma euclidea si chiama anche norma spettrale poiché ρ(A) =
max1≤i≤n |λi |, con λi i-esimo autovalore di A, si chiama raggio spettrale della
matrice A. Inoltre, se A è simmetrica A2 = ρ(A) altrimenti A2 = σ1 (A), con
σ1 (A) il più grande valore singolare della matrice A (per la definizione di valori
singolari di una matrice rimandiamo al capitolo successivo). Infatti, nel caso in
cui A = AT per il generico autovalore avremo: λ(A AT ) = λ(A2 ) = λ2 (A) e dunque
ρ(A) = A2 . Pertanto nel caso di matrici simmetrice il raggio spettrale è una
norma.

Definizione 9. Data una norma di matrice e una vettoriale, diremo che esse
sono compatibili o consistenti se

Ax ≤ Ax, ∀ A ∈ Rn×n , x ∈ Rn .

Ad ogni norma di vettore possiamo associare una norma di matrice nel seguente
modo
Ax
A := sup = sup Ax (3.5)
x=0 x x =1

Questa viene detta norma naturale o norma indotta. Ne consegue che Ax ≤
Ax, ovvero che una norma indotta è anche compatibile. Come esempio, è
facile verificare ricorrendo alla definizione che per la matrice identica

I = max Ix = 1


x =1
68 Appunti di Calcolo Numerico con codici in Matlab/Octave

e che le norme 1, 2, ∞ sono norme naturali indotte dalle corrispondenti norme


vettoriali. L’unica
√ norma matriciale che non è naturale è quella di Frobenius.
Infatti IF = n.
Infine è interessante ricordare la seguente proprietà:

Proposizione 3. Per ogni norma compatibile con la corrispondente norma vet-


toriale, si ha
ρ(A) ≤ A .

Dim. Sia λ autovalore di A associato all’autovettore v = 0. Avremo

|λ|v = λv = Av ≤ A v

da cui ρ(A) := max1≤i≤n |λi | ≤ A. 


3 - Soluzione di sistemi lineari 69

3.3 Soluzione di sistemi lineari: generalità


Data A ∈ Rn×n e il vettore b ∈ Rn il problema consiste nel determinare il vettore
x ∈ Rn soluzione del sistema lineare

Ax = b . (3.6)

Anzitutto la soluzione di (3.6) esiste se e solo se la matrice A è invertibile, che


significa che det(A) = 0. Se A è invertibile sappiamo che grazie alla regola di
Cramer le componenti del vettore soluzione x sono

det(Ai )
xi = ,
det(A)

con Ai che è la matrice ottenuta da A sostituendo la colonna i-esima con il ter-


mine noto b.
In pratica con la regola di Cramer si calcolano n+1 determinanti. Considerato
che il calcolo di un determinante (con la regola di Laplace) costa O(n3 ) operazioni,
allora determinare la soluzione del sistema con Cramer costa O(n4 ) operazioni.
Pensando di doverla applicare a sistemi di grandi dimensioni, ad esempio n >
100, il metodo diventa via via inapplicabile dal punto di vista del tempo di calcolo.

3.3.1 Condizionamento del problema


Analizziamo due situazioni: perturbazione del termine noto e perturbazione si-
multanea della matrice e del termine noto.

1. Sia δb la quantità di cui perturbiamo il termine noto b. Questa pertur-


bazione si ripercuoterà sulla soluzione cosicchè invece di x otterremo la
soluzione x + δx. Vogliamo vedere come δx può essere legato a δb. Pertanto,
da
A(x + δx) = b + δb
ricordando che Ax = b, otteniamo il sistema Aδx = δb. Ora,

δx = A−1 δb ≤ A−1  δb ,

ma b = Ax ≤ A x, pertanto

δx δb
≤ A−1  .
Ax b

Per l’errore relativo abbiamo infine la maggiorazione

δx δb
≤ AA−1  . (3.7)
x b

Definendo poi κ(A) = AA−1  come il numero di condizionamento della


matrice A, possiamo dedurre da (3.7) che il rapporto tra l’errore relativo
70 Appunti di Calcolo Numerico con codici in Matlab/Octave

sulla soluzione e quello sul termine noto è maggiorato dal numero di con-
dizionamento della matrice. Più la matrice sarà malcondizionata e peggiore
sarà la maggiorazione e quindi la perturbazione indotta sulla soluzione.
κ(A) è quindi un fattore di amplificazione dell’errore.
In Matlab la funzione cond(A,p) consente di calcolare il numero di con-
dizionamento di A in norma p = 1, 2, ∞. In Octave esiste il comando cond(A)
che calcola il numero di condizionamento della matrice A in norma 2.
Facciamo notare che in alcuni testi, invece di κ(A), si trovano le notazioni
μ(A) o ν(A).

2. Se perturbiamo anche la matrice A di una quantità δA, si può dimostrare


che per l’errore relativo vale la maggiorazione

δx κ(A) δA δb


≤ + . (3.8)
x 1 − κ(A) δA A b
A

1
Nel caso in cui δA ≤ , in (3.8) si ha
2A−1 

κ(A)
δA
≤ 2κ(A) .
1 − κ(A) A

Come dicevamo il numero di condizionamento di A dà indicazioni sull’amplificazione


dell’errore relativo sulla soluzione. Osservando che κ(A) ≥ 1 (assume il valore 1
quando A è la matrice identica), allora più piccolo sarà κ(A) e meglio condizion-
ato risulterà il problema della soluzione di un sistema lineare.
Diamo solo un paio di esempi che quantificano il concetto di matrice malcon-
dizionata.

1. Matrice di Hilbert, H.
È una matrice simmetrica di ordine n i cui elementi sono Hi,j = 1/(i + j −
1), 1 ≤ i, j ≤ n.
Si dimostra che κ2 (H) ≈ e3.5n . Alcuni valori di κ2 (H), sono riportati in
Tabella 3.1.

n 2 6 10
κ2 (H) 19.3 1.5 107 1.6 1013

Tabella 3.1: Numero di condizionamento in norma 2 della matrice di Hilbert

In Matlab/Octave esiste la funzione hilb(n) che consente di definire la ma-


trice di Hilbert di ordine n.

2. Matrice di Vandermonde, V.
3 - Soluzione di sistemi lineari 71

È la matrice associata al problema d’interpolazione polinomiale su n punti


(distinti) x1 , · · · , xn . La matrice di Vandermonde di ordine n è
⎛ ⎞
1 1 ... 1
⎜ 1 x1 . . . xn−1 ⎟
⎜ 1 ⎟
V =⎜ . .. ⎟ .
⎝ .. . ⎠
1 xn ... xn−1
n
)
Si dimostra che per punti distinti xi = xj , det(V ) = i=j (xi − xj ) = 0 .
Circa il numero di condizionamento κ∞ (V ) vale la pena ricordare il risul-
tato di Gautschi e Inglese [14]. Sia X = {xi } di cardinalità n, l’insieme dei
nodi d’interpolazione. Se xi > 0 allora κ∞ (X) ≥ (n − 1)2(n−1) . Invece, se i
nodi sono simmetrici rispetto l’origine si hanno i seguenti limiti inferiori:
(n−2)
κ∞ (X) ≥ (n − 2)2 2 se n pari
(n−3)
κ∞ (X) ≥ (n − 3)2 2 se n dispari .

Anche per la matrice di Vandermonde esiste una funzione Matlab/Octave


che si invoca come V=vander(x) dove x è un vettore e la matrice V è tale che
Vi,j = xn−j
i .

A completamento ricordiamo che Matlab contiene una galleria di matrici test nel
cosidetto Matrix Computational Toolbox (MCT) di Nick Higham
www.maths.manchester.ac.uk/∼higham/mctoolbox/.
Per ottenere la lista di tutte le matrici test disponibili basta usare il comando

[out1,out2,...]=gallery(matname,opt1,opt2,...)
72 Appunti di Calcolo Numerico con codici in Matlab/Octave

3.4 Metodi diretti


Si tratta di metodi numerici che consentono di determinare la soluzione del sis-
tema lineare, teoricamente in un numero finito di passi. Putroppo a causa degli
inevitabili errori di rappresentazione e algoritmici, i metodi necessitano di al-
cune strategie implementative. I metodi diretti che studieremo in questo testo
sono: il metodo di eliminazione di Gauss che dimostreremo essere equivalente
alla fattorizzazione LU di A, il metodo di Cholesky che si applica quando A è
simmetrica e l’algoritmo di Thomas per matrici tridiagonali.

3.4.1 Il Metodo di Eliminazione di Gauss (MEG)


Dato il sistema Ax = b il metodo di Gauss consiste di due passi principali:

(i) eliminazione;

(ii) sostituzione all’indietro.

L’obiettivo del passo di eliminazione è di trasformare la matrice A in forma di


matrice triangolare superiore allo scopo di ricavere la soluzione del sistema me-
diante appunto la sostituzione all’indietro (ovvero determinando dapprima xn e
via via tutte le altre componenti del vettore x).
Dato il sistema


⎪ a11 x1 + a12 x2 + · · · +a1n xn = b1

⎨ a21 x1 + a22 x2 + · · · +a2n xn = b2
.. .. . (3.9)


⎪ . . = ..

an1 x1 + an2 x2 + · · · +ann xn = bn

che indicheremo più compattamente con A(1) x = b(1) , dove l’apice ci ricorda il
(1)
passo di eliminazione, avendo posto A(1) = A. Ora se a11 = 0 la prima equazione
può essere usata per ricavare x1 e sostituirlo nelle rimanenti equazioni ottenendo
un nuovo sistema A(2) x = b(2) che avrà un solo elemento non nullo nella prima
colonna ⎧ (2)
⎪ a1,1 x1 +a(2)
⎪ 1,2 x2 + · · ·
(2)
+a1,n xn = b1
(2)


⎨ 0 (2) (2)
+a2,2 x2 + · · · +a2,n xn = b2
(2)

.. .. .. .. (3.10)

⎪ . . . .


=
⎩ (2) (2) (2)
0 +an,2 x2 + · · · +an,n xn = bn

In pratica per passare da A(1) ad A(2) si individua dapprima il moltiplicatore


(1)
ai,1
mi,1 = (1)
, i = 2, . . . , n
a1,1

di modo che gli elementi di A(2) e b(2) saranno


3 - Soluzione di sistemi lineari 73


⎪ (1)
⎨ ai,j i=1
(2)
ai,j =

⎩ a(1) − m a(1)
i,j i,1 1,j i>1

⎪ (1)
⎨ bi i=1
(2)
bi =

⎩ b(1) − m b(1)
i i,1 1 i>1
(2)
Se a2,2 = 0 si può continuare con la seconda colonna e cosı̀ via.
(k)
Pertanto per 1 ≤ k ≤ n − 1, se ak,k = 0 avremo

(k)
ai,k
mi,k = (k)
, i = k + 1, . . . , n
ak,k

e ⎧
⎪ (k)
⎨ ai,j i≤k
(k+1)
ai,j =

⎩ a(k) − m a(k)
i,j i,k k,j i = k + 1, . . . , n j = i, ..., n

⎪ (k)
⎨ bi i≤k
(k+1)
bi =

⎩ b(k) − m b(k)
i i,k k i = k + 1, . . . n

Alla fine il sistema A(n) x = b(n) avrà la matrice A(n) che sarà triangolare
superiore
⎧ (n) (n) (n) (n)

⎪ a1,1 x1 +a1,2 x2 + · · · +a1,n xn = b1


⎨ (n) (n)
+a2,2 x2 + · · · +a2,n xn = b2
(n)

.. .. (3.11)

⎪ . .


⎩ (n) (n)
an,n xn = bn

A questo punto si può applicare la sostituzione all’indietro e determinare il


vettore soluzione. Infatti se
(n)
ai,i = 0, i = 1, . . . , n , (3.12)

allora

xn = b(n) (n)
n /an,n (3.13)
⎧ ⎫
1 ⎨ (n) ⎬
n
(n)
xi = bi − ai,j xj , i = n − 1, . . . , 1 . (3.14)
a ⎩ ⎭
(n)
i,i j=i+1
74 Appunti di Calcolo Numerico con codici in Matlab/Octave

Algoritmo di eliminazione e di sostituzione all’indietro

I due passi del metodo di eliminazione di Gauss si possono discrivere da un punto


di vista algoritmico, usando sempre la sintassi Matlab/Octave, come segue.

Algoritmo 2. Eliminazione

for i=1:n-1,
for j=i+1:n,
m=a(j,i)/a(i,i);
a(j,:)=a(j,:)-m*a(i,:);
b(j)=b(j)-m*b(i);
end
end

Dal punto di vista della complessità, al passo i-esimo di eliminazione il costo,


in termini di moltiplicazioni e divisioni, è

(n − i) (n − i + 1) + (n − i) = (n − i)(n − i + 2) ,
        
ciclo su j ciclo su k ciclo su j per i bj

Pertanto, per i tre cicli for, la complessità totale sarà

n−1 n−1
(n − i)(n − i + 2) = (n2 + 2n − 2(n + 1)i + i2 ) . (3.15)
i=1 i=1

Ricordando le identità
n n
n(n + 1) n(n + 1)(2n + 1)
i= , i2 = (3.16)
i=1
2 i=1
6

sostituendo in (3.15) (con n − 1 al posto di n) otteniamo

n−1
2n3 − 3n2 + n n3 n2 5n n3
(n2 + 2n − 2(n + 1)i + i2 ) = n2 − n + = + − ≈O .
i=1
6 3 2 6 3
(3.17)
Pertanto la complessità dell’algoritmo di eliminazione, in termini di operazioni
di moltiplicazione, è n3 /3 .
Per la sostituzione all’indietro possiamo usare questo codice.

Algoritmo 3. Sostituzione all’indietro

for i=n:-1:1,
sum=a(i,:)*x
x(i)=(b(i)-sum)/a(i,i);
end
3 - Soluzione di sistemi lineari 75

Anche per la sostituzione all’indietro facciamo il calcolo della complessità.


Come è facile vedere, per costruire sum si fanno n − i moltiplicazioni. Pertanto la
complessità totale è
n
n(n − 1)
(n − i) = .
i=1
2

La complessità totale del metodo di Gauss si ottiene sommando la complessità


dell’algoritmo di elminazione e quella dell’algoritmo di sostituzione
n3 n2 5n n(n − 1) n3 4n
+ − + = + n2 − .
3 2 6 2 3 3
In conclusione, l’algoritmo di Gauss richiede O(n3 /3) operazioni.
E SEMPIO 15.
⎛ ⎞ ⎛ ⎞
11 4 −6 9
A := A(1) = ⎝ −7 17 9 ⎠, b = b(1) = ⎝ 19 ⎠ ,
−1 −4 6 1
• Primo passo. I moltiplicatori sono m2,1 = −7/11, m3,1 = −1/11.
⎛ ⎞ ⎛ ⎞
11 4 −6 9
⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ⎟
A(2) = ⎜
⎜ 0
215
11
57
11
⎟ , b(2) = ⎜ 272 ⎟ ,
⎟ ⎜ 11 ⎟
⎝ ⎠ ⎝ ⎠
0 − 40 11
60
11
20
11

• Secondo passo. Il moltiplicatore è m3,2 = −8/43.


⎛ ⎞ ⎛ ⎞
11 4 −6 9
⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ⎟
A(3) = ⎜
⎜ 0
215
11
57
11
⎟,
⎟ b(3)
=⎜

272
11
⎟ ,

⎝ ⎠ ⎝ ⎠
276 276
0 0 43 43

Con la sostituzione all’indietro troveremo che la soluzione è x = (1, 1, 1)T .

Strategia del pivot


L’ipotesi su cui si basa il MEG è che al passo k gli elementi diagonali siano in
(k) (k)
modulo diversi da zero, ovvero |ak,k | = 0. Ma se accade che ak,k ≈ 0, si può
applicare la stategia del pivot parziale per righe consistente nel ricercare nelle
righe k + 1, . . . , n (quelle sotto la diagonale) l’elemento in modulo più grande. Sia
r l’indice di riga corrispondente, quindi si scambierà la riga r con la riga k (sia
nella matrice che nel termine noto).
In Matlab/Octave la ricerca dell’elemento più grande in modulo nella colonna
k-esima, sotto la diagonale principale e il corrispondente scambio della riga r con
quella k, si realizza come segue:
76 Appunti di Calcolo Numerico con codici in Matlab/Octave

[M,r]=max(abs(a(k+1:n,k)));
t=a(k,:); a(k,:)=a(r,:); a(r,:)=t

Con questa strategia si ha una riduzione dell’ errore algoritmo e quindi maggiore
stabilità. Infatti, detto
(k) (k)
|ar,k | = max |ai,k | ,
k≤i≤n

gli elementi di A(k+1) saranno tali che


(k+1) (k) (k) (k) (k)
|ai,j | = |ai,j − mi,k ak,j | ≤ |ai,j | + |ak,j | . (3.18)

La disuguaglianza deriva dal fatto che per costruzione |mi,k | ≤ 1. Detto poi
(k) (k)
aM = max1≤i,j≤n |ai,j | , da (3.18) otteniamo

(n) (n−1) (n−2) (1)


aM ≤ 2aM ≤ 22 aM ≤ · · · ≤ 2n−1 aM . (3.19)

Pertanto la strategia del pivot parziale per righe garantisce maggiore stabilità al
MEG. È da osservare che la maggiorazione (3.19) non è quasi mai raggiunta.
Vediamo come è possibile implementare la tecnica del pivot parziale per righe,
facendo uso di un vettore p che memorizza solo gli scambi di righe. All’inizio
pi = i, i = 1, ..., n. Il significato di pi è il seguente: ai,j è memorizzato nella
posizione di indice di riga pi e colonna j (e bi nella posizione indicata da pi ).
Quando si scambia la riga k con la riga r, si scambia pk e pr cosicchè l’indice di
riga che contiene il pivot è pr .

E SEMPIO 16. Mettiamo in un’unica matrice, la matrice dei coefficienti, il vettore


colonna del termine noto e il vettore degli scambi, come segue:
⎛ ⎞
2 3 −1 5 1
⎝ 4 4 −3 3 2 ⎠ ,
−2 3 −1 1 3

• Primo passo. L’elemento pivot che vale 4, si trova in riga 2. Pertanto scambier-
emo p2 e p1 e l’indice del pivot sarà 2. Otteniamo i moltiplicatori m(1) = 1/2 e
m(2) = −1/2 e la nuova matrice
⎛ ⎞
0 1 1/2 7/2 2
⎝ 4 4 −3 3 1 ⎠,
0 5 −5/2 5/2 3

• Secondo passo. L’elemento pivot, che vale 5, si trova in riga 3. Pertanto


dobbiamo scambiare p2 e p3 . Il moltiplicatore è m = 1/5. Abbiamo allora
⎛ ⎞
0 0 1 3 2
⎝ 4 4 −3 3 3 ⎠,
0 5 −5/2 5/2 1
3 - Soluzione di sistemi lineari 77

A questo punto, per applicare la sostituzione all’indietro, partiremo da p3 = 1 ovvero


dalla prima riga ricavando x3 = 3. Poi si passa a p2 = 3, quindi alla terza riga,
ricavando x2 dall’equazione 5x2 − 15/2 = 5/2 che ci dà x2 = 2. Infine essendo p1 = 2
dalla seconda equazione determineremo x1 che, dopo aver risolto 4x1 + 8 − 9 = 3 mi
darà x1 = 1. È facile provare che il vettore x = (1, 2, 3)T è la soluzione del sistema
lineare.
La tecnica del pivoting parziale si può applicare in alternativa alle colonne
ottenendo il cosidetto pivot parziale per colonne.
Se invece la ricerca del massimo la facciamo su tutta la sottomatrice A(k + 1 :
n, k + 1 : n), ovvero quella di indici di riga e colonna compresi tra k + 1 e n,
allora parleremo di pivoting totale . In questo caso se r e s sono gl’indici di riga
e colonna corrispondenti nella matrice A(k) , allora dovremo scambiare la riga k
con la riga r e la colonna k con la colonna s.

3.4.2 Metodo di Gauss e fattorizzazione LU di matrici


Faremo vedere che il MEG altro non è che la fattorizzazione della matrice del
sistema A = LU con L triangolare inferiore con elementi diagonali tutti uguali
a 1 e U triangolare superiore. Ma prima di tutto enunciamo il teorema che ci
garantisce quando è attuabile la fattorizzazione LU di una matrice quadrata A.
Teorema 5. Sia A una matrice quadrata di ordine n e siano Ak , k = 1, . . . , n le
sottomatrici principali di testa. Ovvero
a11 a12
A1 = (a11 ), A2 =
a21 a22
⎛ ⎞
a11 ··· a1k
⎜ .. .. .. ⎟
Ak = ⎝ . . . ⎠
ak1 akk
cosicché An = A. Se |Ak | = 0, k = 1, ..., n allora esiste unica la fattorizzazione di
A nella forma LU , con L triangolare inferiore con elementi diagonali uguali a 1 e
U triangolare superiore. Altrimenti esiste una matrice di permutazione P (i cui
elementi sono 0 e 1) tale che P A = LU .
Facciamo un paio di esempi che ci consentono di capire meglio il Teorema 5.
E SEMPIO 17.
La matrice ⎛ ⎞
1 2 −1
A = ⎝ −1 −1 2 ⎠ ,
1 1 2
soddisfa le ipotesi del Teorema 5. Si vede facilmente che A può fattorizzarsi come
⎛ ⎞⎛ ⎞
1 0 0 1 2 −1
A = ⎝ −1 1 0 ⎠ ⎝ 0 1 1 ⎠ .
1 −1 1 0 0 4
78 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SEMPIO 18. La matrice


⎛ ⎞
1 2 −1
B = ⎝ −1 −2 0 ⎠
1 1 2

non soddisfa le ipotesi del Teorema 5. Infatti

1 2
det(B2 ) = det =0.
−1 −2

Però scambiando la seconda e terza riga mediante la matrice di permutazione


⎛ ⎞
1 0 0
P =⎝ 0 0 1 ⎠
0 1 0

allora avremo
⎛ ⎞ ⎛ ⎞⎛ ⎞
1 2 −1 1 0 0 1 2 −1
PB = ⎝ 1 1 2 ⎠=⎝ 1 1 0 ⎠⎝ 0 −1 3 ⎠ .
−1 −2 0 −1 0 1 0 0 −1

È facile far vedere che si sarebbe ottenuta un’altra fattorizzazione se avessimo usato
un’altra matrice di permutazione
⎛ ⎞
0 0 1
P1 = ⎝ 0 1 0 ⎠
1 0 0

ovvero scambiando la prima e la terza riga di B.

Ricordiamo che in Matlab/Octave esiste la funzione lu la cui chiamata com-


pleta si fa scrivendo il comando [L,U,P] = lu(A), con ovvio significato delle ma-
trici coinvolte. Se effettuassimo invece la chiamata [L,U]=lu(A), la matrice L
potrà non essere triangolare inferiore ma L=P*M con M triangolare inferiore e P
matrice di permutazione che serve al pivoting per righe di A. Ad esempio, se
A=hilb(4), il comando [L,U]=lu(A) restituisce

L =
1.0000 0 0 0
0.5000 1.0000 1.0000 0
0.3333 1.0000 0 0
0.2500 0.9000 -0.6000 1.0000
U =
1.0000 0.5000 0.3333 0.2500
0 0.0833 0.0889 0.0833
0 0 -0.0056 -0.0083
0 0 0 0.0004
3 - Soluzione di sistemi lineari 79

mentre [L,U,P]=lu(A)

L =
1.0000 0 0 0
0.3333 1.0000 0 0
0.5000 1.0000 1.0000 0
0.2500 0.9000 -0.6000 1.0000
U =
1.0000 0.5000 0.3333 0.2500
0 0.0833 0.0889 0.0833
0 0 -0.0056 -0.0083
0 0 0 0.0004
P =
1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

con L triangolare inferiore con elementi diagonali 1.

3.4.3 Matrici elementari di Gauss


In questa breve sottosezione facciamo vedere chi sono realmente le matrici L e U
della fattorizzazione LU . Il generico passo di eliminazione è infatti equivalente
alla premoltiplicazione per la matrice Mk = I −mk eTk dove I è la matrice identica
e ⎛ ⎞ ⎛ ⎞
0 0
⎜ .. ⎟ ⎜ .. ⎟
⎜ . ⎟ ⎜ . ⎟
⎜ ⎟ ⎜ ⎟
⎜ mk+1,k ⎟ ⎜ ⎟
mk = ⎜ ⎟ , ek = ⎜ 1 ⎟ ← k
⎜ mk+2,k ⎟ ⎜ 0 ⎟
⎜ ⎟ ⎜ ⎟
⎜ .. ⎟ ⎜ . ⎟
⎝ . ⎠ ⎝ .. ⎠
mn,k 0
(k) (k)
con mi,k = ai,k /ak,k . Pertanto la k-esima matrice elementare di Gauss è
⎛ ⎞
1
⎜ .. ⎟
⎜ . 0 ⎟
⎜ ⎟
⎜ 1 ⎟
Mk = ⎜
⎜ 0
⎟ ,
⎟ (3.20)
⎜ −mk+1,k ⎟
⎜ .. .. ⎟
⎝ . . ⎠
−mn,k 1

Quindi dopo gli n − 1 passi di eliminazione

Mn−1 · · · M2 M1 A = A(n) .
80 Appunti di Calcolo Numerico con codici in Matlab/Octave

Ecco che le matrici L e U non sono altro che

L = (Mn−1 · · · M1 )−1 = M1−1 · · · Mn−1


−1
; U = A(n) . (3.21)

È facile provare che


⎛ ⎞
1
⎜ .. ⎟
⎜ . 0 ⎟
⎜ ⎟
⎜ 1 ⎟
Mk−1 =⎜
⎜ 0


⎜ mk+1,k ⎟
⎜ .. .. ⎟
⎝ . . ⎠
mn,k 1

da cui
⎛ ⎞
1 0
⎜ m2,1 1 ⎟
⎜ ⎟
⎜ .. .. .. ⎟
⎜ . . . ⎟
L=⎜
⎜ ..
⎟ .

⎜ .. ⎟
⎜ . . ⎟
⎝ ⎠
mn,1 ··· mn,n−1 1

Infine nel caso generale in cui siano richieste ad ogni passo delle matrici di per-
mutazione, ovvero
(Mn−1 Pn−1 ) · · · (M1 P1 )A = U

posto P = Pn−1 · · · P1 otterremo


−1
L = P (Mn−1 Pn−1 · · · M1 P1 ) .

Osservazioni

• Nota la fattorizzazione LU di una matrice A o, più in generale, la fattoriz-


zazione LU = P A, la soluzione del sistema lineare Ax = b si farà risolvendo
due sistemi triangolori Lz = P b U x = z.
La soluzione di un sistema triangolare costa O(n2 ). Complessivamente,
come visto nella sezione precedente, la soluzione di un sistema lineare con
il MEG  o equivalentemente la fattorizzazione LU della matrice A, costa
n3
O 3 .

• Grazie alla fattorizzazione LU di A possiamo )n anche calcolare il determi-


nante di A. Infatti, |A| = |LU | = |L| |U | = i=1 ui,i essendo |L| = 1. Questo
vale anche nel caso P A = LU , essendo il determinante di una matrice di
permutazione ±1.
3 - Soluzione di sistemi lineari 81

3.4.4 Il metodo di Cholesky


Si applica quando la matrice A è simmetrica definita positiva. Vista la simmetria,
A si potrà fattorizzare nella forma
⎛ ⎞
h1,1
⎜ .. .. ⎟
⎜ . . 0 ⎟
T
A=HH , H =⎜ . ⎜ ⎟ , hi,i > 0 .
.. ⎟
⎝ .. . ⎠
hn,1 · · · hn,n

Come determiniamo la matrice H? Basta fare il prodotto H H T e identificare gli


elementi corrispondenti. Le formule (compatte) per calcolare gli elementi di H
sono


h1,1 = a1,1
' j−1
(
1
hi,j = ai,j − hi,k hj,k , i = 2, . . . , n ; j = 1, . . . , n
hj,j
k=1
.
/
/ i−1
hi,i = 0ai,i − h2i,k .
k=1

Una possibile implementazione della fattorizzazione di Cholesky è nella fun-


zione Matlab, cholesky.m qui sotto riportata.
function h=cholesky(a)
%-----------------------------------
% input
% a=matrice iniziale (simm. def. +)
%
% output
% h, matrice tale che h*h’=a
%-----------------------------------
n=size(a); h(1,1)=sqrt(a(1,1));
for i=2:n,
for j=1:i-1,
s=h(i,1:j-1)*h(j,1:j-1);
h(i,j)=1/h(j,j)*(a(i,j)-s);
end
h(i,i)=sqrt(a(i,i)-sum(h(i,1:i-1)^2));
end

Grazie alla simmetria di A si verifica facilmente che


1. la complessità è metà del MEG ovvero O(n3 /6);
82 Appunti di Calcolo Numerico con codici in Matlab/Octave

2. la matrice H può essere memorizzata nella stessa area di memoria di A


invece che allocare memoria aggiuntiva.

Infine, in Matlab/Octave la fattorizzazione di Cholesky si ottiene usando il


comando H=chol(A).

3.4.5 Algoritmo di Thomas per matrici tridiagonali


Si consideri la matrice tridiagonale
⎛ ⎞
a1 c1 0
⎜ .. ⎟
⎜ b2 a2 . ⎟
A=⎜ ⎜


⎝ .. ⎠
. cn−1
0 bn an

Se la fattorizzazione LU di A esiste, allora L e U sono due matrici bidiagonali


(inferiore e superiore, rispettivamente) della forma
⎛ ⎞ ⎛ ⎞
1 0 α 1 c1 0
⎜ β2 1 ⎟ ⎜ . ⎟
⎜ ⎟ ⎜
⎜ α2 . . ⎟
⎟ .
L=⎜ . . ⎟ , U =⎜ ⎟
⎝ .. .. ⎠ ⎝ ..
. cn−1 ⎠
0 βn 1 0 αn

I coefficienti incogniti si determinano imponendo l’uguaglianza L U = A, medi-


ante il seguente Algoritmo di Thomas

bi
α1 = a 1 , βi = , αi = ai − βi ci−1 , i = 2, ..., n .
αi−1

Data una matrice (sparsa) A, il comando Matlab/Octave spdiags(A), che gen-


eralizza diag, viene usato in 5 modi differenti.

1. B = spdiags(A): estrae tutte le diagonali non nulle di una matrice A, m×n.


B è una matrice min(m, n) × p le cui colonne sono le p diagonali non nulle di
A.

2. [B,d] = spdiags(A): restituisce un vettore d, length(d)=p, le cui compo-


nenti intere specificano le diagonali di A.

3. B = spdiags(A,d): estrae le diagonali specificate da d.

4. A = spdiags(B,d,A): rimpiazza le diagonali specificate da d con le colonne


di B. L’ output è in formato sparso.

5. A = spdiags(B,d,m,n): crea una matrice sparsa m×n prendendo le colonne


di B e ponendole lungo le diagonali specificate da d.
3 - Soluzione di sistemi lineari 83

E SERCIZIO 31. Come esercizio, si chiede di costruire una matrice tridiagonale


T con i comandi Matlab/Octave

>> b=ones(10,1); a=2*b; c=3*b;


>> T=spdiags([b a c],-1:1,10,10);

Risolvere quindi il sistema T*x=d con l’algoritmo di Thomas, con d scelto cosicché
si abbia x=ones(10,1). Quante operazioni si risparmiano rispetto alla fattoriz-
zazione classica LU fatta con Gauss?

3.4.6 Raffinamento iterativo


Sia x̂ la soluzione del sistema Ax = b calcolata mediante l’algoritmo di Gauss,
MEG. Il raffinamento iterativo detto anche metodo post-iterativo consiste dei
3 seguenti passi

1. calcola r = b − Ax̂;

2. risolvi il sistema Ad = r usando per A la fattorizzazione LU usata per


risolvere Ax = b;

3. poni y = x̂ + d

ripeti finché
d
> tol
y
dove tol è una prefissata tolleranza. Ovvero ci si arresterà quando l’errore rela-
tivo rispetto alla soluzione y risulta essere minore o uguale a tol.
Nota: di solito (cioè in assenza di errori di arrotondamento) bastano 1-2 iter-
azioni per convergere. Il metodo serve come stabilizzatore del MEG.
Una funzione Matlab/Octave che implementa l’algoritmo del raffinamento
iterativo si può scrivere come segue.

function y=RafIter(x,L,U,tol)
%--------------------------------------------
% Inputs:
% x = soluzione con MEG
% L, U = matrici della fattorizzazione LU di A
% tol = tolleranza
%
% Output:
% y = soluzione ‘‘raffinata’’
%--------------------------------------------
kmax=20; % numero massimo d’iterazioni
A=L*U;
b=A*x; % determino il termine noto
84 Appunti di Calcolo Numerico con codici in Matlab/Octave

r=b-A*x; % residuo iniziale


% Risolvo il sistema Ad=r, sapendo che A=LU
z=L\r; d=U\z; y=x+d;
k=1; %contatore delle iterazioni
while (norm(d)/norm(y)> tol & k<=kmax)
x=y; r=b-A*x; z=L\r; d=U\z;
y=x+d; k=k+1;
end

3.5 Calcolo dell’inversa di una matrice: cenni


Un metodo semplice e immediato di calcolo dell’inversa di una matrice A non
singolare è questo: risolvi gli n sistemi non omogenei

A xi = ei , i = 1, ..., n , (3.22)

con xi vettore che rappresenta la i-esima colonna della matrice inversa e ei il


vettore di tutti zeri eccetto che per la i-esima componente che vale 1. Purtroppo
questa tecnica è molto costosa: O(n4 ).
Ma il calcolo di A−1 può essere fatto più semplicemente usando la fattoriz-
zazione A = LU e si ha A−1 = U −1 L−1 . Detta Y = L−1 , da L possiamo ricavare
Y chiedendo che LY = Y L = I mediante le formule


⎪ lj,j yj,j = 1







⎨ lj+1,j yj,j + lj+1,j+1 yj+1,j = 0

⎪ ..

⎪ .






ln,j yj,j + ln,j+1 yj+1,j + · · · + ln,n yn,j = 0

valide per j = 1, . . . , n. Ora ricordando che L ha elementi diagonali unitari, dalle


relazioni precedenti possiamo ricavare i valori di Y come segue

y=eye(n); %inizializzo con la matrice identita’


for j=1:n-1,
for i=j+1:n,
s=l(i,1:j-1)*y(1:j-1,j)
y(i,j)=-s;
end
end

In maniera analoga si procede per il calcolo di Z = U −1 .


Un metodo piú efficiente è il seguente (cfr. Du Croz J., Higham N. IMA J. Nu-
mer. Anal. 12:1-19, 1992). Esso risolve l’equazione U XL = I, supponendo X
3 - Soluzione di sistemi lineari 85

parzialmente nota ad ogni step. L’idea é di partizionare le matrici X,L e U come


segue:

u1,1 uT1,2 x1,1 xT1,2 1 0T


U= X= L=
0 T
U2,2 x2,1 T
X2,2 l2,1 LT2,2

dove i blocchi (1,1) sono scalari e la sottomatrice X2,2 si assume già nota. Quindi
il resto di X si calcola risolvendo le equazioni:

x2,1 = −X2,2T
l2,1
x1,2 = −u1,2 X2,2
T T T
/u1,1 .
1
x1,1 = u1,1 − xT1,2 l2,1

In maniera algoritmica, usando notazioni Matlab/Octave, si può sintetizzare


come segue, facendo attenzione al fatto che il blocco X(k+1 : n, k+1 : n) si assume
già noto. All’inizio dovremo conoscere l’elemento xn,n che si può determinare
dall’equazione U XL = I.
for k=n-1:-1:1,
X(k+1:n,k)=-X(k+1:n,k+1:n)*L(k+1:n,k)
X(k,k+1:n)=-U(k,k+1:n)*X(k+1:n,k+1:n)/U(k,k)
X(k,k)=1/U(k,k)-X(k,k+1:n)*L(k+1:n,k)
end;

E SERCIZIO 32. Scrivere degli scripts Matlab che implementano i metodi su


descritti. Come matrice A si consideri la matrice ottenuta usando la funzione
gfpp del Toolbox The Matrix Computational Toolbox (MCT) di N. Higham
(www.maths.manchester.ac.uk/∼higham/mctoolbox/). La funzione può essere
usata con la sintassi A=gfpp(n) generando una matrice il cui fattore di crescita
degli elementi è 2n−1 , come per l’eliminazione gaussiana con pivoting parziale per
righe e/o colonne.

• Verificare che la matrice gfpp(n) dà un fattore di crescita per MEG con
pivoting parziale pari a 2n−1 .

• Sempre nel MCT Toolbox, esiste la funzione gep che data una matrice,
anche rettangolare, applica l’eliminazione gaussiana con pivoting parziale
o completo, restituisce , tra le altre informazioni, la fattorizzazione LU e
il fattore di crescita dei suoi elementi. Far vedere che se si usa la matrice
gep(gfpp(n),’c’) il fattore di crescita risulta uguale a 2.

Informazioni sul MCT si possono anche leggere nel report [17].


86 Appunti di Calcolo Numerico con codici in Matlab/Octave

3.6 Metodi iterativi


La filosofia di questi metodi sta nell’approssimare la soluzione del sistema lin-
eare Ax = b con una successione di vettori {xk , k ≥ 0}, a partire da un vettore
iniziale x0 ∈ Rn , con l’obiettivo che converga verso la soluzione x del sistema.
A differenza dei metodi diretti, in questi metodi non si altera la struttura della
matrice e pertanto sono utilizzati prevalentemente quando la matrice è sparsa.
La matrice A di ordine n, che supponiamo sia non singolare, si può decom-
porre come
A=M −N
con la richiesta che det(M ) = 0 e facilmente invertibile. Pertanto

Mx − Nx = b (3.23)
Mx = Nx + b (3.24)
x = M −1 N x + M −1 b (3.25)

da cui, ponendo P = M −1 N e q = M −1 b, la soluzione di Ax = b è ricondotta al


sistema x = P x + q. Scelto x(0) , costruiremo la successione

x(i+1) = P x(i) + q, i = 0, 1, . . . (3.26)

Definizione 10. La successione {x(i) } si dirà convergente al vettore x, e si scrive

lim x(i) = x ,
i→∞

se per i → ∞ le componenti di x(i) convergono verso le corrispondenti componenti


di x.
La (3.26) rappresenta un metodo iterativo per la soluzione di Ax = b, con P
che si chiama matrice d’iterazione.
Definizione 11. Un metodo iterativo si dice convergente, se per ogni vettore
iniziale x(0) la successione {x(i) } è convergente.
E SEMPIO 19. Siano
⎛ 1

2 0 0
P =⎝ 0 1
2 0 ⎠ , q = 0, con x = 0 .
0 0 2

Partendo da x(0) = (1, 0, 0)T costruiremo la successione


⎛ 1 ⎞⎛ ⎞ ⎛ 1 ⎞
2 0 0 1 2
x(1) = P · x(0) = ⎝ 0 12 0 ⎠⎝ 0 ⎠ = ⎝ 0 ⎠
0 0 2 0 0
⎛ 1 ⎞⎛ ⎞ ⎛ 1 ⎞
22 0 0 1 22
x(2) = P · x(1) = P 2 · x(0) ⎝ 0 2
1
2 0 ⎠⎝ 0 ⎠ = ⎝ 0 ⎠
0 0 22 0 0
3 - Soluzione di sistemi lineari 87

e continuando otterremo ⎛ 1

2i
x(i) = ⎝ 0 ⎠ .
0
Pertanto per i → ∞ la successione converge verso x. Si verifica facilmente che par-
T
1
tendo da x(0) = (0, 1, 1)T si avrebbe x(i) = 0, i , 2i e quindi una successione
2
divergente.

A questo punto dobbiamo chiarire sotto quali condizioni il metodo iterativo


risulta essere convergente.

Teorema 6. Condizione necessaria per la convergenza è che esista una norma


matrice indotta  ·  per la quale risulta P  < 1.

Dim. Sia ek = x(k) − x l’errore al passo k. Abbiamo

ek = x(k) − x = P x(k−1) − q − P x + q = P (x(k−1) − x) = P ek−1 , k = 1, 2, ....

Ma P ek−1 = · · · = P k−1 e(0) . Da cui

ek  ≤ P k e0  ≤ P k e0  .

Se quindi P  < 1, allora limk→∞ P k = 0 e anche ek  → 0 ∀ k . Per la conti-


nuità della norma concludiamo che limk→∞ ek = 0 da cui l’asserto. 
Ricordando che vale
ρ(P ) ≤ P ,
per ogni norma indotta, la condizione necessaria e sufficiente per la convergenza
di un metodo iterativo è contenuta nel seguente teorema.

Teorema 7. Sia P di ordine n. Allora

lim P k = 0 ⇐⇒ ρ(P ) < 1 .


k→∞


Prima di passare ai metodi, concludiamo questa parte sulle generalità dicendo
quando numericamente consideriamo convergente un metodo iterativo. Fissata
una tolleranza  e indicato un numero massimo d’iterazioni kmax, il test d’arresto
che valuteremo sarà

x(k) − x(k−1)  ≤ x(k)  ∨ k > kmax

ovvero xk sarà una buona approssimazione di x quando l’errore relativo è sotto


una prefissata tolleranza. Ma il metodo si arresta anche quando k > kmax. In
quest’ultimo caso molto probabilmente avremo fallito e onde evitare che si iteri
all’infinito è buona norma inserire questo ulteriore controllo.
88 Appunti di Calcolo Numerico con codici in Matlab/Octave

Ma possiamo anche fare le seguenti considerazioni. I metodi iterativi, per la


soluzione di un sistema lineare Ax = b, teoricamente richiedono un numero in-
finito di iterazioni. Nella pratica ciò non è ragionevole poiché invece che x ci si
accontenta di una sua approssimazione x̃ o più concretamente di xk , l’iterata ad
un certo passo k del metodo, per la quale l’errore sia inferiore ad una prescelta
tolleranza . Ma l’errore è a sua volta una quantità incognita perchè dipende
dalla soluzione esatta. Nella pratica ci si rifà a degli stimatori dell’errore a pos-
teriori.
(a) Un primo stimatore è il residuo ad ogni iterazione
r k = b − Axk .
In tal caso ci arresteremo in corrispondenza a quel kmin tale che
rkmin  ≤ b . (3.27)
Infatti, ricordando che Ax = b, la (3.27) altro non è che il test sull’errore
relativo poiché 1 1 1 1
1 x − xk 1 1 Ax − Axk 1
1 1=1 1.
1 x 1 1 Ax 1
Quindi, l’errore relativo
x − xkmin  A−1 (b − A xkmin ) A−1 rkmin 
= ≤ ≤ κ(A) ,
x x x
dove l’ultimo passaggio si ottiene dalla (3.27) e ricordando che
b
≤ A .
x
Perció, il controllo sul residuo ha senso solo se κ(A), il numero di condizion-
amento della matrice A, è ragionevolmente piccolo.
(b) Alternativamente si può calcolare il cosidetto incremento δ k = x(k+1) − x(k) .
In tal caso il metodo si arresterà al passo kmin per cui
δ kmin  ≤ b .

Nel caso in cui la matrice di iterazione P (non la matrice del sistema!) è


simmetrica e definita positiva, posto ek = xk − x, in norma euclidea si avrà
ek  = ek+1 − δ k  ≤ P ek  + δ k  = ρ(P )ek  + δ k  .
Per la convergenza, ρ(P ) < 1, avremo alla fine
1
ek  ≤ δ k  . (3.28)
1 − ρ(P )
Nota: se P non è simmetrica e definita positiva si arriva alla stessa conclu-
sione con P  al posto di ρ(P ).
In conclusione: il controllo sull’incremento è un buon stimatore quanto più
ρ(P ) 1.
3 - Soluzione di sistemi lineari 89

3.6.1 I metodi di Jacobi e Gauss-Seidel


Anzitutto facciamo alcune posizioni. Data la matrice quadrata A indichiamo con
D la matrice dei valori diagonali di A, ovvero di = ai,i e con B e C le matrici
triangolari inferiori e superiori rispettivamente ottenute nel seguente modo

−ai,j i>j 0 i≥j


bi,j = ci,j = ,
0 i≤j −ai,j i<j

con A = D − (B + C).
Nel metodo di Jacobi le matrici M e N prima definite sono

M = D, N = B + C .

Pertanto se ai,i = 0, ∀i, allora M è non singolare. La matrice di iterazione di


Jacobi è
J = M −1 N = D−1 (B + C) .
Il metodo iterativo di Jacobi si può allora scrivere in termini vettoriali come

x(k) = Jx(k−1) + D−1 b, k ≥ 1 , (3.29)

o per componenti come


⎧ ⎫
1 ⎨ ⎬
n
(k) (k−1)
xi = − ai,j xj + bi , i = 1, . . . , n. (3.30)
ai,i ⎩ ⎭
j=1,j =i

Nota ⎛ a a ⎞
0 − a1,2
1,1
... − a1,n
1,1
⎜ − a2,1 a
− a2,n ⎟
⎜ a2,2 0 ... ⎟
J =⎜ ⎟ .
2,2
⎜ .. ⎟
⎝ . ⎠
an,1
− an,n 0
Nel metodo di Gauss-Seidel, o semplicemente G-S, le matrici M e N prima def-
inite sono
M = D − B, N = C .
La matrice di iterazione di Gauss-Seidel è

G = M −1 N = (D − B)−1 C .

Osserviamo che

x(k) = (D − B)−1 Cx(k−1) + (D − B)−1 b


(D − B)x(k) = Cx(k−1) + b
Dx(k) = Bx(k) + Cx(k−1) + b
90 Appunti di Calcolo Numerico con codici in Matlab/Octave

da cui otteniamo che, in termini vettoriali, il metodo di G-S si può scrivere come

x(k) = D−1 Bx(k) + D−1 Cx(k−1) + D−1 b, k ≥ 1 , (3.31)

o per componenti come


⎧ ⎫
1 ⎨ i−1 n ⎬
(k) (k) (k−1)
xi = − ai,j xj − ai,j xj + bi , i = 1, . . . , n. (3.32)
ai,i ⎩ j=1 j=i+1

Dalle equazioni (3.29) e (3.31) si comprende perchè il metodo di Jacobi viene


anche detto degli spostamenti simultanei mentre quello di G-S degli spostamenti
successivi. Ma il vantaggio di G-S rispetto a Jacobi sta soprattutto nel poter
memorizzare le componenti di x(k) nella stessa area di memoria di x(k−1) .
Prima di discutere delle condizioni sotto le quali i metodi di Jacobi e G-S
convergono, premettiamo alcune definizioni.
Definizione 12. Una matrice A si dice diagonalmente dominante per righe (o
anche a predominanza diagonale per righe) se
n
|ai,i | ≥ |ai,j | (3.33)
j=1,j =i

ed esiste un indice s per cui la disuguaglianza vale in senso stretto. La matrice si


dice invece diagonalmente dominante in senso stretto per righe (o a predomi-
nanza diagonale stretta per righe) se la (3.33) vale per ogni i = 1, ..., n.
Analoga definizione vale per colonne.
Definizione 13. Un grafo orientato si dice fortemente connesso se per ogni
1 ≤ i, j ≤ n, i = j esiste un cammino orientato che parte da pi ed arriva a pj (con
pi , pj nodi del grafo).
Data una matrice A, il grafo ad essa associato si ottiene definendo tanti nodi
pi quanti il numero n (dimensione della matrice) con archi corrispondenti agli
elementi non nulli di A. Ovvero, se ai,j = 0 allora si disegnerà un arco che va da
pi a pj .
Definizione 14. Una matrice A si dice riducibile se e solo se il suo grafo ori-
entatato non è fortemente connesso, altrimenti si dice irriducibile.
E SEMPIO 20. La matrice
⎛ ⎞
1 0 −1 0
⎜ 2 3 −2 1 ⎟
A=⎜
⎝ −1

0 −2 0 ⎠
1 −1 1 4

ha il grafo che non è fortemente connesso. Infatti non esiste un arco orientato che va
da p1 a p4 .
3 - Soluzione di sistemi lineari 91

Vale il seguente Teorema.


Teorema 8. Sia A = M − N la decomposizione di A che, nel caso di Jacobi
equivale ad M = D, N = B + C, mentre nel caso di G-S, M = D − B e N = C. Se
una delle seguenti ipotesi è verificata
(a) A è strettamente diagonalmente dominante per righe o per colonne;
(b) A è diagonalmente dominante e irriducibile;
allora ρ(M −1 N ) < 1 e quindi i metodi di Jacobi o di G-S sono convergenti.
Proposizione 4. Se vale (a) allora il metodo di Jacobi converge ,ovvero l’associata
matrice PJ è convergente.
Dim. Dobbiamo provare che ρ(PJ ) < 1 con PJ = D−1 (B+C) matrice d’iterazione
di Jacobi. Dapprima osserviamo che, essendo A diagonalmente dominante in
senso stretto, non ha elementi diagonali nulli. Siano λ e x un generico autoval-
n
ore e il corrispondente autovettore di PJ , ovvero, per componenti, pi,j xj =
j=1
λ xi , i = 1, . . . , n. Possiamo assumere che max |xi | = 1. Sia k l’indice in cui
1≤i≤n
viene assunto il massimo. Avremo
 
 n   
  n
 ai,j 
|λ| =  pk,j xj  ≤ 

<1

j =k,j=1  j=1,j =k ak,k

e vista la generalità di λ si conclude che ρ(PJ ) < 1. 


Osservazione. La proprietà (a) non implica che PJ è non singolare. Come
esempio, consideriamo la matrice
⎡ ⎤
3 1 1
A=⎣ 0 3 0 ⎦.
−1 −1 −3

L’associata matrice di Jacobi


⎡ ⎤
0 −1/3 −1/3
J =⎣ 0 0 0 ⎦,
−1/3 −1/3 0

ha un autovalore nullo e quindi determinante nullo.


Vale anche il seguente risultato.
Teorema 9. Sia A tridiagonale di dimensione n con ai,i = 0, i = 1, . . . , n. Al-
lora i metodi di Jacobi e di Gauss-Seidel sono o entrambi convergenti o entrambi
divergenti. Se convergono, Gauss-Seidel converge più velocemente di Jacobi e si
ha
ρ(PGS ) = ρ2 (PJ ) .
92 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SEMPIO 21. La matrice


⎛ ⎞
4 −1 1 1
⎜ 0 −4 −1 1 ⎟
A=⎜
⎝ −1 −1

4 1 ⎠
1 −1 0 4

ha il grafo che è fortemente connesso essendo diagonalmente dominante in senso


stretto per colonne. Le matrici d’iterazione di Jacobi (J) e G-S (G) sono
⎛ ⎞ ⎛ ⎞
0 −1 1 1 0 4 −4 −4
1⎜ 0 0 1 −1 ⎟ ⎟, G= 1 ⎜ 0
⎜ 0 −4 4 ⎟
J =− ⎜ ⎝ ⎠ ⎝
⎟ .
4 −1 −1 0 1 16 0 1 −2 −4 ⎠
1 −1 0 0 0 −1 0 2

È facile vedere che ρ(J) ≈ 0.4 < 1 come pure ρ(G) ≈ 0.18 < 1. Pertanto sia il metodo
di Jacobi che di G-S convergono. Si noti inoltre che ρ(G) < ρ(J) il che conferma che
se entrambi convergono, G-S converge più velocemente.
Nel prossimo esempio facciamo vedere che se A non è strettamente diagonale-
mente dominante, ma solo diagonalmente dominante, non è detto che il metodo
di Jacobi e di G-S siano convergenti.
E SEMPIO 22. La matrice
⎛ ⎞
−4 −1 1 1
⎜ 0 −4 0 −4 ⎟
A=⎜
⎝ 1

1 4 1 ⎠
0 −4 0 4

È facile vedere che ρ(J) = ρ(G) = 1, pertanto sia il metodo di Jacobi che di G-S non
convergono.
Infine un esempio di matrice diagonalmente dominante con grafo stretta-
mente connesso
E SEMPIO 23. Data ⎛ ⎞
1 −1 0 0
⎜ 0 1 1 0 ⎟
A=⎜
⎝ 0

0 −1 1 ⎠
−1 0 0 −3
che è diagonalmente dominante (non in senso stretto) con grafo fortemente connesso.
La matrice di Jacobi è ⎛ ⎞
0 1 0 0
⎜ 0 0 −1 0 ⎟
J =⎜ ⎝ 0 0

0 1 ⎠
− 13 0 0 0
che risulta essere convergente avendo cerchi di Gerschgorin centrati nell’origine con
raggi ≤ 1. Gli autovalori sono infatti {±0.76, 0 ± 0.76i}.
3 - Soluzione di sistemi lineari 93

Il codice Matlab/Octave, jacobi.m in Appendice C è una implementazione del


metodo di Jacobi, mentre GuassSeidel.m è il codice per il metodo di G-S. Il codice
GaussRil.m, è più generale e può essere utilizzato anche per il metodo SOR che
viene presentato nel prossimo paragrafo. Infatti, come faremo vedere, il metodo
di G-S è un particolare metodo di rilassamento.

3.6.2 Il metodo SOR o di rilassamento


La filosofia di questo metodo sta nel determinare un parametro ω di accelerazione
della convergenza del metodo di G-S. Partiamo considerando l’uguaglianza

ωAx = ωb, ω = 0, ω ∈ R .

Usando il fatto che vale ωA = M − N , ricordando lo splitting A = D − B − C e


osservando che ω(D − B − C) + D − D = M − N , una scelta per le matrici M e N
è la seguente
M = D − ω B , N = (1 − ω)D + ω C .
Come si vede immediatamente, quando ω = 1 , il predetto splitting equivale al
metodo di G-S.
Se det(M ) = 0 allora ricaviamo il metodo

x(k) = (D − ωB)−1 [(1 − ω)D + ωC] x(k−1) + ω(D − ωB)−1 b , k = 0, 1, . . . (3.34)

con matrice d’iterazione, dipendente da ω, data da

H(ω) = (D − ωB)−1 [(1 − ω)D + ωC] . (3.35)

Dalla (3.34) ricaviamo

Dx(k) − ωBx(k) = (1 − ω)Dx(k−1) + ωCx(k−1) + ωb ,


2 3
x(k) = (1 − ω)x(k−1) + ωD(−1) Bx(k) + Cx(k−1) + b ,

che per componenti diventa


⎡ ⎤
i−1 n
(k) (k−1) ai,j (k) ai,j (k−1) ⎦
xi = (1 − ω)xi + ω ⎣bi − x − x , i = 1, ..., n . (3.36)
j=1
ai,i a
j=i+1 i,i

Facciamo notare come il termine dentro parentesi quadre rappresenti la soluzione


al passo k ottenuta con il metodo di G-S. Pertanto la componente i-esima calco-
lata con il metodo SOR si può scrivere
(k) (k−1) (k)
xi = (1 − ω)xi + ωxi,GS

che, come prima osservato, coincide con il metodo di G-S per ω = 1. Il parametro
ω serve ad accelerare la convergenza del metodo del metodo iterativo di G-S.
94 Appunti di Calcolo Numerico con codici in Matlab/Octave

Teorema 10. Condizione necessaria per la convergenza del metodo SOR è che

0 < ω < 2. (3.37)

1. Se A è simmetrica definita positiva e ω soddisfa la (3.37) allora SOR con-


verge, ovvero la condizione è anche sufficiente.

2. Se A è tridiagonale, vale la (3.37) e gli autovalori della matrice d’iterazione


di Jacobi, J, sono reali e t.c. ρ(J) < 1, allora esiste uno e uno solo ω0 t.c.

ρ(H(ω0 )) = min ρ(H(ω)) , (3.38)


0<ω<2

il cui valore è
2
ω0 =  . (3.39)
1+ 1 − ρ2 (J)

Facciamo solamente vedere che richiedere che 0 < ω < 2 implica ρ(H(ω)) < 1.
Infatti,

det(H(ω)) = det(D − ωB)−1 det((1 − ω)D + ωC))


)n
(1 − ω)n ( i=1 dii )
= )n = (1 − ω)n .
i=1 d ii
)n
Ma det(H(ω)) = i=1 λi , il che implica che il prodotto degli autovalori è (1 − ω)n .
Esisterà quindi almeno un autovalore il cui modulo ≥ |1 − ω|. Siccome, per la
convergenza, deve risultare che |1 − ω| < 1 si ottiene la condizione richiesta,
0 < ω < 2.

Se 0 < ω < 1 il metodo si dice di sottorilassamento mentre se 1 < ω < 2 il


metodo si dice di sovrarilassamento. Facciamo inoltre notare, che quando ω = 0,
H(ω) = I e ρ(H(ω)) = 1.

E SEMPIO 24. Sia ⎧



⎪ 2 i=j



A = (ai,j ) = −1 |i − j| = 1





0 altrimenti
Quando n = 4, si verifica che ρ(J) ≈ 0.901 ed essendo tridiagonale simmetrica possi-
amo determinare ω0 , ottenendo il valore ω0 ≈ 1.4 e ρ(H(ω0 )) ≈ 0.4.

Il grafico dell’andamento del raggio spettrale al variare di ω, relativamente


all’ Esempio 24 ma con n = 10, è visibile in Figura 3.1.
In generale, per determinare ω0 , nel caso di una matrice tridiagonale simmet-
rica, diagonalmente dominante, possiamo avvalerci del codice SOROmegaZero.m in
Appendice C.
3 - Soluzione di sistemi lineari 95

Figura 3.1: Raggio spettrale di H(ω) con n = 10, ottenuto con la funzione
SOROmegaZero.m. Il valore ottimale calcolato è ω0 = 1.5727.

Per comprendere meglio la “filosofia” del metodo SOR, suggeriamo di se-


guito un paio di esercizi dei quali si chiede di scrivere i corrispondenti scripts
Matlab/Octave.
E SERCIZIO 33. Si consideri il sistema lineare
⎛ ⎞⎛ ⎞ ⎛ ⎞
4 0 1 1 x1 1
⎜ 0 4 0 1 ⎟ ⎜ x2 ⎟ ⎜ 2 ⎟
⎜ ⎟⎜ ⎟ ⎜ ⎟ .
⎝ 1 0 4 0 ⎠ ⎝ x3 ⎠ = ⎝ 3 ⎠
1 1 0 4 x4 4
Si risolva il sistema con il metodo iterativo di Gauss-Seidel a partire dalla
soluzione iniziale (0, 0, 0, 0) con precisone di 1.0e − 6. Si determini inoltre il
fattore ottimale di rilassamento per il metodo SOR. Scrivere un M-file che
assolva a dette richieste, calcolando anche il numero di iterazioni effettuate.
Facoltativo: Determinare la soluzione con il metodo SOR, usando come
fattore quello ottimo di (sovra)rilassamento.
E SERCIZIO 34. Si consideri il sistema lineare
⎛ ⎞⎛ ⎞ ⎛ ⎞
7 4 −7 x1 4
⎝ 4 5 −3 ⎠ ⎝ x2 ⎠ = ⎝ 6 ⎠ .
−7 −3 8 x3 −2
Si determini sperimentalmente il fattore ottimale di rilassamento per il
96 Appunti di Calcolo Numerico con codici in Matlab/Octave

metodo SOR nel seguente modo a partire dal vettore iniziale (0, 0, 0). In prat-
ica si scelgano alcuni 0 < ωi < 2 e per ognuno di essi si eseguano 10-15
iterazioni. Quell’ ωi che stabilizza le soluzioni è da considerarsi quello ”ot-
timale” (si osservi che la soluzione del sistema è il vettore (1,1,1)). Perció
per sapere quale ω segliere si suggerisce di calcolare per ogni i norm([1; 1;
1]-x(ωi ),inf), dove x(ωi ) è la soluzione dopo 10-15 iterazioni dell’ SOR con
ωi .
Facoltativo: Sia A decomposta al solito come A = D − B − C e ricordando
che la matrice di iterazione del metodo SOR è:

Hω = (D − ω B)−1 [(1 − ω) D + ω C]

si disegni la funzione r :]0, 2[→ R, tale che r(ω) = ρ(Hω ). Verificare quindi
se il valore empirico scelto è ”vicino” al valore ”ottimale” teorico. Scrivere un
M-file che assolva a dette richieste, calcolando anche il numero di iterazioni
effettuate.

3.7 Metodi del gradiente: cenni


Se la matrice A è simmetrica definita positiva, la soluzione di Ax = b equivale a
trovare il minimo x ∈ Rn della forma quadratica
1 T
Φ(x) = x Ax − xT b . (3.40)
2
Infatti, essendo A simmetrica
1 T
∇Φ(x) = (A + A)x − b = Ax − b .
2
Pertanto se x è il minimo, si avrebbe ∇Φ(x) = 0 ovvero Ax = b. Vale anche il
viceversa. Se Ax = b
1
Φ(x) = Φ(y − x + x) = Φ(x) + (x − y)T A(x − y) > Φ(y) ,
2
per ogni y = x, essendo A simmetrica definita positiva.
Come procedere per trovare il minimo di Φ? Mediante il metodo del gradiente.
• scegli x(0) ∈ Rn ;
• scegli opportune direzioni d(k) lungo le quali minimizzare Φ (si noti che la
direzione ottimale, che congiunge x(0) con x non è nota);
• determina la soluzione al passo k + 1 come
x(k+1) = x(k) + αk d(k) , k ≥ 0
dove αk ∈ R indica la lunghezza del passo nelle direzione d(k) .
3 - Soluzione di sistemi lineari 97

Dobbiamo determinare la direzione di discesa d(k) e αk .

(i) Quale direzione di discesa prendiamo? Quella di massima pendenza:

d(k) = −∇Φ(x(k) ) = −(Ax(k) − b) = r(k) , (3.41)

ovvero il residuo al passo k.

(ii) Determiniamo αk come il minimo del polinomio di grado 2 in α, P (α) =


Φ(x(k) + αr(k) ). Chiedendo che la derivata si annulli si ottiene
T
r(k) r(k)
αk = T
. (3.42)
r(k) A r(k)

A questo punto abbiamo tutti gl’ingrendienti per l’algoritmo del metodo del gra-
diente
Scelto x(0) ∈ Rn , per k = 0, 1, ... finchè si converge, esegui i seguenti passi

1. r(k) = b − Ax(k) ,
T
r (k) r (k)
2. αk = r (k) T Ar (k)

3. x(k+1) = x(k) + αk r(k) .

Vale anche il seguente risultato di convergenza.

Teorema 11. Se A è simmetrica definita positiva, il metodo del gradiente con-


verge per ogni scelta del vettore iniziale x(0) . Definita la A-norma xA = xT A x,
allora in tale norma l’ errore verifica
k
κ2 (A) − 1
e(k+1) A ≤ e(0) A .
κ2 (A) + 1

3.7.1 Il metodo del gradiente coniugato


Il metodo del gradiente ha il ”difetto” di convergere lentamente, poiché la conver-
genza è a zig-zag (vedi Figura 3.2). Questo fenomeno è dovuto alla richiesta che
T
le direzioni siano ortogonali, ovvero r(k+1) r(k) = 0.
Con il metodo del gradiente coniugato, si chiede invece che le direzioni siano
A-ortogonali
T
d(k) Ad(j) = 0, per, k = j . (3.43)

Questa idea, in assenza di errori, consentirebbe di raggiungere la soluzione in un


numero di passi ≤ n.
Le cose da fare sono quindi le seguenti.
98 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 3.2: Convergenza a zig-zag del metodo del gradiente

(i) Scegliere la direzione di discesa d(k+1) . Essa non sarà più il residuo al passo
k + 1 ma tale che

d(k+1) = r(k+1) + βk d(k) , βk ∈ R.

Per determinare βk chiederemo la A-ortogonalità delle direzioni


T T
d(k) Ad(k+1) = d(k) A(r(k+1) + βk d(k) ) = 0,

la cui soluzione mi permette di determinare βk


T
d(k) Ar(k+1)
βk = − T
. (3.44)
d(k) Ad(k)

(ii) Scelta la direzione cercheremo, come per il metodo del gradiente, il minimo
di

P (α) = Φ(x(k) + αd(k) )


1 (k)
= (x + αd(k) )T A(x(k) + αd(k) ) − (x(k) + αd(k) )T b .
2
T
Poiché P  (α) = d(k) (Ax(k) − b) + αd(k) Ad(k) , il minimo richiesto sarà
T
d(k) r(k)
αk = T
. (3.45)
d(k) Ad(k)

Ecco quindi l’algoritmo del gradiente coniugato.


Scelto x(0) ∈ Rn , sia d(0) = r(0) , per k = 0, 1, ... finchè si converge, esegui i
seguenti passi
3 - Soluzione di sistemi lineari 99
T T
d(k) r (k) r (k) r (k)
1. αk = d(k) T Ad(k)
= d(k) T Ad(k)

2. x(k+1) = x(k) + αk d(k) .


3. r(k+1) = r(k) − αk Ad(k) .
(k) T (k+1) T
r (k+1) r (k+1)
4. βk = − dd(k) TAr
Ad(k)
= r (k) T r (k)

5. d(k+1) = r(k+1) + βk d(k) .


Inoltre, per la convergenza, vale il seguente teorema.
Teorema 12. Se A è simmetrica definita positiva, il metodo del gradiente coni-
ugato converge per ogni scelta del vettore iniziale x(0) , in al piú n iterazioni. La
A-norma dell’ errore soddisfa
' (k
(k+1) κ2 (A) − 1
e A ≤ 2  e(0) A .
κ2 (A) + 1
La rapidità con cui il metodo del gradiente coinugato converge, dipende dal
numero di condizionamento della matrice del sistema A. Per questa ragione, si
utilizzano tecniche di precondizionamento della matrice, allo scopo di diminuirne
il numero di condizionamento. Di questo aspetto, importante ai fini computazion-
ali, non ci occupiamo in questa sede, poiché richiederebbe altre nozioni. Riman-
diamo invece alla lettura del bellissimo Technical Report [29], dove queste ed
altre questioni computazionali sono ben esplicitate.

3.8 Sistemi sovra e sottodeterminati


Quando parliamo di sistemi sovradeterminati pensiamo a sistemi lineari del tipo
A x = b con matrice m × n, m > n (ovvero più equazioni che incognite). Se m < n
il sistema si dice sottodeterminato.
In generale un sistema sovradeterminato non ha soluzione, pertanto si cerca
la “migliore” soluzione nel senso che ora chiariremo. Dato b ∈ Rm , diremo che
x∗ ∈ Rn è la migliore soluzione del sistema sovradeterminato, in quanto mini-
mizza la norma 2 del residuo r = b − Ax. Detto altrimenti,
Φ(x∗ ) = b − Ax∗ 22 ≤ minn b − Ax22 = minn Φ(x) . (3.46)
x∈R x∈R

Definizione 15. Il vettore x∗, quando esiste, si dice soluzione ai minimi quadrati
del sistema Ax = b.
La soluzione ai minimi quadrati è caratterizzata dal seguente teorema.
Teorema 13. Sia A ∈ Rm×n , b ∈ Rm . Se x∗ soddisfa l’equazione
AT (b − Ax∗ ) = 0 (3.47)
allora per ogni y ∈ Rn si ha

b − Ax∗ 2 ≤ b − Ay2 . (3.48)


100 Appunti di Calcolo Numerico con codici in Matlab/Octave

Dim. Indico con rx∗ = b − Ax∗ e ry = b − Ay. Ora,


ry = b − Ax∗ + Ax∗ − Ay = rx∗ + A(x∗ − y) ,
da cui
(rx∗ + A(x∗ − y)) (rx∗ + A(x∗ − y))
T
ryT ry =
= rxT∗ rx∗ + rxT∗ A(x∗ − y) + (x∗ − y)T AT rx∗ + (x∗ − y)T AT A(x∗ − y) .
Pertanto, usando la (3.47), otteniamo
ry 22 = rx∗ 22 + A(x∗ − y)22 ≥ rx∗ 22 .
Questo conclude la dimostrazione. 
Seguono due interessanti osservazioni.
1. Dalla (3.47) segue che per ogni vettore z ∈ Rn
(Az)T (b − Ax) = 0 ,
ovvero il residuo è ortogonale alla soluzione x ai minimi quadrati. Detto
altrimenti, il vettore z sta rg(A) = {y ∈ Rm , y = Ax, ∀x ∈ Rn }.
2. Sempre dalla (3.47), segue che la soluzione x∗ ai minimi quadrati è soluzione
delle equazioni normali
(AT A)x∗ = AT b . (3.49)

Circa il sistema (3.49), sapendo che la matrice A ha rango r = min{m, n}, se ha


rango pieno allora è non singolare e B = AT A è simmetrica, definita positiva.
Infatti, vale il seguente risultato.
Teorema 14. La matrice AT A è non singolare se e solo se le colonne di A sono
linearmente indipendenti.
Dim. Se le colonne di A sono linearmente indipendenti, preso x = 0, Ax = 0,
avremo
xT (AT A)x = (Ax)T (Ax) = Ax22 > 0 .
Quindi AT A è definita positiva e det(AT A) > 0 ovvero AT A è non singolare.
Se le colonne sono linearmente dipendenti, allora ∀ z = 0, Az = 0 ma anche
AT Az = 0 che implica che AT A è singolare. 
Sotto le ipotesi di questo teorema, allora esiste un’unica soluzione del sistema
(nel senso dei minimi quadrati) e il corrispondente sistema si può risolvere me-
diante la fattorizzazione di Cholesky di B.
Approfondimenti. A causa degli immancabili errori d’arrotondamento il
calcolo di AT A può introdurre la perdita di cifre significative con il risultato che
AT A non è più definita positiva. In alternativa invece della fattorizzazione di
Cholesky si usa la fattorizzazione QR di A.
Proposizione 5. Ogni matrice A ∈ Rm×n , m ≥ n si può scrivere unicamente
come A = QR con Q ortogonale quadrata di ordine m e R ∈ Rm×n triangolare
superiore con le righe di indice k > n + 1 tutte nulle.
3 - Soluzione di sistemi lineari 101

3.8.1 Fattorizzazione QR di matrici


La fattorizzazione QR di una matrice si può realizzare tramite, ma non solo,
trasformazioni ortogonali di Householder. Si tratta di matrici di riflessione. In-
fatti, dalla Figura 3.3, è chiaro che il vettore x , riflesso di x rispetto all’iperpiano
π, si ottiene come
x = x − 2 v T x v
dove x è un versore ortogonale a π. Pertanto, se indichiamo con Qv la matrice
della trasformazione, che dipende dalla scelta di v, avremo

Qv = I − 2 v v T . (3.50)

La matrice Qv si chiama matrice di Householder. È facile provare che Qv sod-

Figura 3.3: Riflessione di vettore x rispetto all’iperpiano π

disfa alle due seguenti proprietà


• Qv è simmetrica.
• Qv è ortogonale.
Si deduce quindi che Q2v = I, ovvero che è una matrice involutiva.
La trasformazione di Householder può essere usata per riflettere un vettore
in modo tale che tutte le sue coordinate, eccetto una, siano zero. Per semplicità
di notazione, traslasciamo l’indice v nella definzione di Qv e scriveremo Q, per
indicare la matrice di Houselholder. Detto x un generico vettore di lunghezza
|α| (per questioni di stabilità si può assumere che α abbia lo stesso segno di x1 ),
detto e1 = (1, 0, . . . , 0)T , la matrice Qv si può allora costruire come segue
1. u = x − α e1
u
2. v = u 2

3. Q = I − 2 v vT .
102 Appunti di Calcolo Numerico con codici in Matlab/Octave

Pertanto Q x = (α, 0, . . . , 0)T .


Questo modo di procedere, si può applicare ad una generica matrice rettango-
lare A, m × n allo scopo di trasformarla in forma triangolare superiore. Al primo
passo, costruiremo Q1 di Houselholder usando la prima colonna di A cosicché
⎡ ⎤
α1
⎢ 0 ⎥
⎢ ⎥
Q1 A = ⎢ . ⎥.
⎣ .. A  ⎦
0
Questa modifica può essere ripetuta per la A mediante una matrice di Housh-
older Q2 . Si noti che Q2 più piccola della Q1 . Poiché vogliamo che sia reale per
operare su Q1 A invece di A abbiamo bisogno di espandere questa nella parte
superiore sinistra, riempiendola di 1, o in generale:
 
Ik 0
Qk = .
0 Qk

Dopo p iterazioni, p = min m − 1, n avremo

R = Qp Qp−1 · · · Q1 A

e Q = Q1 · · · Qp è una matrice ortogonale (perchè prodotto di matrici ortogonali).


In definitiva A = QR rappresenta la fattorizzazione QR di A.


Se viene usata la fattorizzazione QR di A, la soluzione ai minimi quadrati di
A si può scrivere come
x∗ = R̃−1 Q̃T b ,
dove R̃ ∈ Rn×n , Q̃ ∈ Rm×n con R̃ = R(1 : n, 1 : n) e Q̃ = Q(1 : m, 1 : n) e R̃ non
singolare.
E SEMPIO 25. Dati tre punti A,B,C sopra il livello del mare. Per misurare le rispettive
altezze sopra il mare, calcoliamo le altezze h1 , h2 , h3 tra altri punti D,E,F ed i punti
A,B,C, nonchè le altezze h4 , h5 , h6 tra i punti AB, BC e AC rispettivamente. I valori
trovati sono
h1 = 1, h2 = 2, h3 = 3 ;
h4 = 1, h5 = 2, h6 = 1 .
Pertanto, ciascuna misurazione da origine ad un sistema lineare che rappresenta la
relazione tra le altezze dei punti A,B,C, che indichiamo con xA , xB , xC
⎛ ⎞ ⎛ ⎞
1 0 0 1
⎜ 0 1 0 ⎟⎛ ⎞ ⎜ 2 ⎟
⎜ ⎟ xA ⎜ ⎟
⎜ 0 0 1 ⎟ ⎜ ⎟
⎜ ⎟ ⎝ xB ⎠ = ⎜ 3 ⎟ .
⎜ −1 1 0 ⎟⎟ ⎜ 1 ⎟
⎜ xC ⎜ ⎟
⎝ 0 −1 1 ⎠ ⎝ 2 ⎠
−1 0 1 1
3 - Soluzione di sistemi lineari 103

Le equazioni normali sono


⎛ ⎞⎛ ⎞ ⎛ ⎞
−3 −1 −1 xA −1
⎝ −1 3 −1 ⎠ ⎝ xB ⎠ = ⎝ 1 ⎠ .
−1 −1 3 xC 6

Risolvendo, ad esempio con la fattorizzazione di Cholesky (ma anche MEG va bene


ugualmente) troviamo la soluzione

7 5
xA = 3, xB = , xC = ,
4 4
con residuo  T
b − Ax = − 14 , 1
4, 0, 2
4,
3
4, − 34
che è ortogonale alle colonne di A.

3.9 Soluzione di sistemi non lineari con il metodo di


Newton
Un sistema non-lineare di n funzioni in n incognite, si può scrivere come il sis-
tema ⎧

⎪ f1 (x1 , . . . , xn ) = 0

⎨ f2 (x1 , . . . , xn ) = 0
.. (3.51)

⎪ .


fn (x1 , . . . , xn ) = 0
dove fi : Rn → R, i = 1, ..., n sono funzioni non lineari.
Posto f = (f1 , . . . , fn )T , x = (x1 , . . . , xn )T e indicato con 0 lo zero di Rn , il sis-
tema (3.51) può riscriversi compattamente come f (x) = 0. Inoltre, se indichiamo
con n
∂fi
Jf (x) =
∂xj i,j=1
la matrice jacobiana, allora possiamo risolvere il predetto sistema con il metodo
di Newton, che formuleremo come segue

risolvi Jf (x(k) )δx(k) = −f (x(k) ), k = 0, 1, ... (3.52)


x(k+1) = x(k) + δx(k) . (3.53)

Il metodo consiste nel risolvere ad ogni passo il sistema lineare (3.52) con matrice
del sistema che è la matrice jacobiana.
Due semplici sistemi non lineari

E SEMPIO 26. ⎧ 2
⎨ x1 + x22 = 0
ex1 + ex2 = log(x3 )

x 1 x2 x3 = 5
104 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SEMPIO 27.
x21 + x22 = 1
 πx
sin 2 1 + x32 = 0
Per implementare in Matlab/Octave il metodo di Newton avremo bisogno di
una soluzione iniziale x0 , due funzioni fun e jfun che definiscono la funzione f
e la matrice jacobiana Jf , rispettivamente. Come test d’arresto, come al solito,
cicleremo finchè
x(k+1) − x(k)  ≤ tolx(k)  ∨ k > kmax .

3.10 Esercizi proposti

E SERCIZIO 35. Per n = 2 : 50, si prendano i vettori


• x1=0:n;
• x2=0:1/n:1;
• x3=-0.5:1/n:0.5
Si faccia un plot comparativo usando semilogy, per comprendere il comporta-
mento dei numeri di condizionamento delle matrici di Vandermonde costruite
sui vettori x1, x2 e x3. Cosa si osserva?
E SERCIZIO 36. Si consideri il vettore v=[4 1 zeros(1,n)] e la matrice A =
toeplitz(v). Usando il comando find si trovino gli elementi diversi da zero
nei casi n = 4 : 10. Qual’è la formula del numero degli elementi non nulli di
A? La matrice può considerarsi sparsa?
E SERCIZIO 37. Si consideri il sistema Ax = b con A = toeplitz([4 1 0 0
0 0]) e b scelto cosicchè la soluzione esatta sia x = [2, 2, 2, 2, 2, 2]T . Lo si
risolva con l’ eliminazione di Gauss e con l’ algoritmo di Thomas per sistemi
tridiagonali. Nell’eliminazione gaussiana è necessario usare la strategia del
pivoting?
E SERCIZIO 38. Si consideri la matrice
⎛ ⎞
1 α α
A=⎝ α 1 α ⎠
α α 1
Provare graficamente, nel piano (α, ρ(α)), che se 12 ≤ α < 1 il metodo di
Gauss-Seidel è convergente mentre quello di Jacobi non lo è.
Sia ora α = 23 e b = [1 − 1 3] . Risolvere il sistema Ax = b con Gauss-
Seidel: calcolando anche il numero di iterazioni.
Trovare la soluzione anche con SOR con ω ∈ [1.2, 1.8]. Come varia il nu-
mero di iterazioni al variare di ω?
3 - Soluzione di sistemi lineari 105

E SERCIZIO 39. Dato n ≥ 2 si considerino le matrici Ak , k = 1, ..., n − 1 di


dimensione n definite come segue:
⎧ k
⎨ ai,i = n
ak = −1 |i − j| = k .
⎩ i,j
0 altrimenti

Sia inoltre b = ones(n, 1).


Si risolvano gli n − 1 sistemi lineari
Ak x = b
con il metodo iterativo di Jacobi. La M-function che implementa il metodo
di Jacobi dovrà restituire la soluzione, il numero di iterazioni e il massimo
autovalore in modulo della matrice di iterazione di Jacobi.
Provare servendosi di alcuni grafici, che all’aumentare di k (la grandezza
della banda) il numero di iterazioni decresce fino a che k = floor((n + 1)/2)
per poi stabilizzarsi. Perchè?
Facoltativo: sia ora b = 1 : n e k = n − 1. Risolvere il sistema An−1 x = b
sia con Jacobi che con Gauss-Seidel. Quale dei due metodi è più veloce?
E SERCIZIO 40. Data la matrice tridiagonale
⎡ ⎤
d −1
⎢ .. ⎥
⎢ −1 d . ⎥
A=⎢ ⎢
⎥,

⎣ . .. . . . −1 ⎦
−1 d

con d ≥ 2, si risolva il sistema lineare A x = b con b tale che x = (1, . . . , 1)T . Va-
lutando la norma euclidea della differenza tra due iterate successive, ovvero
δk+1 = x(k+1) − x(k) 
nei casi d = 2, 3 presentiamo in tabella alcune di tali differenze
d=2 d=3
.. ..
. .
456 7.2754e − 3 16 1.0229e − 4
457 7.2616e − 3 17 6.5117e − 5
458 7.2477e − 3 18 4.1563e − 5
459 7.2340e − 3 19 2.6593e − 5
• Si stimi in norma 2, il numero di iterazioni m necessarie nei casi d = 2
e d = 3 affinchè la differenza xk+m − xk+m−1  ≤ 1.e − 9 partendo da
k = 458 e k = 18, rispettivamente. (Sugg.: È noto che
δk+1 ≤ Ck δk
106 Appunti di Calcolo Numerico con codici in Matlab/Octave

con Ck la norma 2 della matrice d’iterazione al passo k. Usando i valori


tabulati, dapprima si determini un’ approssimazione di Ck nei due casi
d = 2 e d = 3 e quindi iterando ... )

• Scrivere inoltre un programma Matlab che risolve il sistema precedente


usando il metodo di Jacobi, prendendo come dati in ingresso d, n, b, tol,
senza allocare la matrice A e la matrice di iterazione di Jacobi, partendo
da x0 = 0. Lo si applichi nel caso d = 3, n = 10, b=ones(n,1) e tol =
1.e − 9.

E SERCIZIO 41. . Dati i sistemi lineari A1 x = b e A2 y = b con


⎡ ⎤ ⎡ ⎤
1 2 3 4 5 1 2 3 4 5
⎢ 2 13 18 23 28 ⎥ ⎢ 0 3 4 5 6 ⎥
⎢ ⎥ ⎢ ⎥
A1 = ⎢
⎢ 3 18 50 62 74 ⎥ A2 = ⎢
⎥ ⎢ 0 0 5 6 7 ⎥

⎣ 4 23 62 126 148 ⎦ ⎣ 0 0 0 7 8 ⎦
5 28 74 148 255 0 0 0 0 9
e il termine noto
b = [15, 18, 18, 15, 9]T .

1. Risolvere i due sistemi con un opportuno metodo diretto.

2. Sia δb = rand(5, 1) ∗ 1.e − 3 una perturbazione del vettore b. Si risolvano


ora i due sistemi perturbati A1 x = b + δb e A2 y = b + δb. Confrontando
le nuove soluzioni con quelle ottenute al punto precedente, dire quale
sistema risulta meglio condizionato analizzando la quantità

Exrel 2
,
Ebrel 2

dove E rel indica l’errore relativo.


Osservazione. A1 = AT2 A2 , quindi i numeri di condizionamento in
norma 2 di A1 e A2 saranno legati ..... Inoltre questo garantisce che A1 è
simmetrica definita positiva per cui sarà possibile applicare il metodo....

E SERCIZIO 42. Si consideri la matrice


⎛ ⎞
−0.5 α 0.5
A = ⎝ 0.5 −0.5 α ⎠ , α ∈ R. (3.54)
α 0.5 −0.5

1. Individuare un intervallo Iα di valori di α in cui la matrice d’iterazione


del metodo di Gauss-Seidel è convergente. (Sugg.: calcolare al variare
di α il raggio spettrale usando eig e quindi .... ).
3 - Soluzione di sistemi lineari 107

2. Preso α∗ ∈ Iα , risolvere il sistema Ax = b con b tale che x = [1, 1, 1]T ,


con il metodo di Gauss-Seidel con tol = 1.e − 6, determinando anche
il numero di iterazioni e come test di arresto sul residuo rk = b − Axk ,
ovvero iterando finchè rk  > tolb.

E SERCIZIO 43. Data la matrice

A = diag(ones(7, 1) ∗ 10) + diag(ones(6, 1) ∗ 3, +1) + diag(ones(6, 1) ∗ 3, −1)

e il termine noto
b = [1 2 3 4 5 6 7]T .

1. Dire perchè convergono i metodi di Jacobi e Gauss-Seidel.

2. Fissata la tolleranza τ = 1.e − 9 e sia P la matrice di iterazione tale che


P  < 1, allora risolvendo

P k
x1 − x0  < τ
1 − P 

possiamo calcolare a priori il numero di iterazioni k necessarie per ot-


tenere una soluzione a meno di τ . Partendo dalla soluzione iniaziale
x0=0 e usando la norma infinito,  ∞ determinare k sia per il metodo
di Jacobi che Gauss-Seidel.

3. Verificare sperimentalmente i risultati ottenuti applicando i metodi di


Jacobi e Gauss-Seidel, rispettivamente, alla soluzione del sistema A x =
b.

E SERCIZIO 44. . Data la matrice A=pascal(5) di ordine n = 5,

1. Determinare M = max1≤i≤n {λi }, m = min1≤i≤n {λi } . Usare tol = 1.e −


6.

2. Studiare il metodo iterativo (di Richardson stazionario) dipendente


dal parametro reale θ ∈ [0, 1/2]

x(k+1) = x(k) − θ(Ax(k) + b) , k ≥ 0 . (3.55)

Si chiede di verificare graficamente per quali valori di θ il metodo con-


verge.

3. Sia θ∗ = min{0 ≤ θ ≤ 1/2} per cui il metodo iterativo converge. Siano


b ∈ Rn tale che x=ones(n,1) e x0=zeros(n,1). Risolvere quindi il sis-
tema Ax = b con il metodo iterativo (3.56).
108 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 45. Data la matrice


⎡ ⎤
7 2 −2 0 0
⎢ −3 6 0 1 0 ⎥
⎢ ⎥
A=⎢ ⎢ 0 1/2 5 1/3 0 ⎥

⎣ 0 0 −3 5 1 ⎦
−3 0 0 1 8

1. Senza calcolarlo, dire perchè det(A) > 0.


2. La matrice è irriducibile?
3. Si consideri ora il sistema lineare Ax = b la cui soluzione è x=ones(5,1).
Partendo da x(0) = [0, 0, 0, 0, 1]T e usando il metodo iterativo x(k+1) =
(A − θI)x(k) + θb con θ = 1/2, si determini x(1) . Si calcolino le norme
x(1) 1 , x(1) 2 e x(1) ∞ (fornendo i risultati approssimati a 2 deci-
mali).
E SERCIZIO 46. Si consideri la matrice A ∈ R10×10
⎡ ⎤
5 −1
⎢ −1 5 −1 ⎥
⎢ ⎥
⎢ −1 5 −1 ⎥
A=⎢ ⎥,
⎢ . . .. ⎥
⎣ . . ⎦
−1 5

e il vettore b = ones(10, 1).


1. Si dica (senza fare calcoli) se i metodi iterativi di Jacobi e Gauss-Seidel
convergono alla soluzione del sistema Ax = b.
2. Si consideri ora il metodo iterativo di Richardson stazionario per la
soluzione di Ax = b:

x(k+1) = (I − α A)x(k) + α b

dove α ∈ [0.01, 0.3] è un parametro di accelerazione. Si chiede di sti-


mare il parametro ottimale α∗ (quello per il cui il metodo di Richardson
converge più rapidamente).
3. Produrre un grafico comparativo dell’errore assoluto, in funzione
del numero delle iterazioni fatte, ottenuto con i metodi di Jacobi,
Gauss-Seidel e Richardson stazionario con parametro α∗ . Usare:
x0 = zeros(10, 1), tol = 1.e − 6, nmax = 100.
E SERCIZIO 47. Si consideri la matrice di ordine n = 10, A =
pentadiag(−1, −1, 10, −1, −1) che possiamo decomporre in A=M+D+N con
D = diag([9, 9, ..., 9]), M = pentadiag(−1, −1, 1, 0, 0) e N=A-M-D.
Si considerino i seguenti schemi iterativi
3 - Soluzione di sistemi lineari 109

1. (M + D)x(k+1) = −N x(k) + q ,

2. Dx(k+1) = −(M + N )x(k) + q ,

3. (M + N )x(k+1) = −Dx(k) + q .

Dire quali di essi è convergente analizzando il raggio spettrale delle matrici


d’iterazione.
Sia poi q=1:10. Si calcoli la soluzione del sistema A x = q
con uno dei metodi convergenti, a partire dalla soluzione iniziale
x(0) =[ones(2,1);zeros(8,1)] a meno di tol = 1.e − 6.

E SERCIZIO 48. Si consideri la matrice di ordine n = 10, A =


pentadiag(−1, −1, α, −1, −1), con α ∈ [0.5, 1.5], che possiamo decomporre in
A = M + D + N con D = diag([α − 1, ...., α − 1]), M = pentadiag(−1, −1, 1, 0, 0)
e N = A − M − D.

1. Per quale valore α∗ il metodo iterativo (M + N )x(k+1) = −Dx(k) + q


risulta essere convergente più velocemente?

2. Sia poi q=1:10. Si calcoli la soluzione del sistema A x = q a partire dalla


soluzione iniziale x(0) =[ones(5,1);zeros(5,1)] a meno di tol = 1.e−6.

E SERCIZIO 49. Data la matrice A=diag(1:n) di ordine n = 5,

(a) Studiare il metodo di Richardson stazionario

x(k+1) = (I − θA)x(k) + θ b , k ≥ 0 . (3.56)


al variare di θ ∈ [0, 2/3]. Si chiede di verificare graficamente per quali
valori di θ il metodo converge.

(b) Sia θ∗ tale che ρ(θ∗ ) = min{ρ(θ), 0 ≤ θ ≤ 2/3}. Siano b ∈ Rn cosicché


x=ones(n,1). Inoltre x0=zeros(n,1). Risolvere quindi il sistema Ax = b
con il metodo iterativo (3.56) a meno di tol = 1.e − 6 con test sull’errore
relativo.

(c) Ripetere i calcoli con n = 3, 10. Cosa si nota e cosa si può osservare? I
risultati cambiano se θ ∈ [0, 1]?

E SERCIZIO 50. • Risolvere il sistema non lineare


4
f1 (x1 , x2 ) = x21 + x22 = 1
f2 (x1 , x2 ) = sin(πx1 /2) + x32

con il metodo di Newton. Si usi una tolleranza pari a 10−6 , un numero


massimo di iterazioni pari a 150 e un vettore iniziale x(0) = [1, 1]T .
110 Appunti di Calcolo Numerico con codici in Matlab/Octave

• Si risolva lo stesso sistema non lineare usando sempre la matrice Jaco-


biana relativa al primo passo e aggiornando la matrice Jacobiana ogni
r iterazioni, ove r è il più piccolo numero di iterazioni che permette di
ottenere la soluzione con la tolleranza richiesta calcolando solo due volte
la matrice Jacobiana.

• Si risolva poi lo stesso sistema non lineare usando la function fsolve di


Matlab/Octave.
4
Autovalori di matrici
4.1 Autovalori di matrici
Iniziamo introducendo alcune utili definizioni.
Definizione 16. Data una matrice quadrata A ∈ Rn×n , si chiama autovalore
di A, quel numero reale o complesso λ tale che per ogni vettore x = 0 soddisfa
l’equazione
Ax = λx . (4.1)
Il vettore x viene detto autovettore associato all’autovalore λ. Osserviamo
che l’autovettore x non è unico. Infatti, se α ∈ R è un qualsiasi numero reale non
nullo, allora il vettore y = αx è ancora un autovettore associato all’autovalore λ.
Se l’autovettore x è noto, il corrispondente autovalore si può determinare us-
ando il quoziente di Rayleigh
xT Ax
λ= . (4.2)
xT x
Dalla definizione segue che λ è autovalore di A se è una radice del polinomio
caratteristico
pA (λ) = det(A − λ I) .
Infatti, l’equazione (4.1) è equivalente a
(A − λI)x = 0
ma essendo x = 0 essa sarà soddisfatta se e solo se la matrice A − λI risulta
essere singolare. Inoltre, il polinomio caratterisco associato ad una matrice A di
ordine n, ha n radici reali e/o complesse. Se λ ∈ C è autovalore di A, anche λ̄ è
un autovalore complesso di A.
Premettiamo due utili risultati circa gli autovalori di matrici con struttura. Il
primo ci ricorda che le trasfomazioni per similitudine conservano gli autovalori.
Mentre il secondo ci ricorda che le matrici simmetriche hanno autovalori reali.
Proposizione 6. Matrici simili hanno gli stessi autovalori
Dim. Siano A e B simili, ovvero P −1 AP = B, con P invertibile. Ora, se λ è
autovalore di A e x = 0 è l’autovettore associato, allora
BP −1 x = P −1 Ax = λP −1 x .
Quindi λ è autovalore di B con autovettore associato P −1 x. 
112 Appunti di Calcolo Numerico con codici in Matlab/Octave

Proposizione 7. Matrici simmetriche hanno autovalori reali.


Dim. Sia A = AT e per assurdo abbia un autovalore complesso λ = a + ib, b =
0. La matrice A − λI è singolare e lo è pure

B = (A − λI)(A − λ̄I) = (A − aI)2 + b2 I .

Sia ora x autovettore (non nullo) di B relativo all’autovalore 0. Certamente vale

0 = xT Bx = xT (A − aI)2 + b2 xT x .

Posto y = (A − aI)x, poiché A è simmetrica, la relazione precedente diventa

y T y + b2 x T x = 0

che non può essere essendo yT y ≥ 0, xT x > 0 e b2 > 0 



Definizione 17. Una matrice A ∈ Rn×n è diagonalizzabile, se esiste una matrice


U ∈ Rn×n tale che
U −1 AU = Λ , (4.3)
con Λ = diag(λ1 , . . . , λn ) e U che ha per colonne gli n autovettori di A (che formano
una base per Rn ).
Nel caso di matrice rettangolare non parliamo di autovalori ma di valori
singolari. Vale il seguente risultato noto come decomposizione ai valori singo-
lari (o SVD).
Teorema 15. Sia A ∈ Rm×n . Allora esistono due matrici ortogonali U ∈ Rm×m
e V ∈ Rn×n tali che
U T AV = Σ , (4.4)
con Σ = diag(σ1 , . . . , σp ) ∈ Rm×n , p = min{m, n}, σ1 ≥ σ2 ≥ · · · ≥ σp ≥ 0.
I numeri σi sono i valori singolari di A di cui parleremo più oltre nella
sezione dedicata alla soluzione del problema del cosidetto data fitting e decompo-
sizione SVD, Sezione 5.11.
Infine c’è un interessante risultato di localizzazione degli autovalori di una
matrice.
Definizione 18. Data A di ordine n, i cerchi
n
(r)
Ci = {z ∈ C : |z − ai,i | ≤ |ai,j | } , i = 1, . . . , n (4.5)
j=1,j =i

n
(c)
Ci = {z ∈ C : |z − ai,i | ≤ |aj,i | } , i = 1, . . . , n (4.6)
j=1,j =i

sono cerchi riga e colonna e sono detti i cerchi di Gerschgorin associati alla
matrice A.
4 - Autovalori di matrici 113

Vale infatti il seguente Teorema


Teorema 16. (primo Teorema di Gerschgorin)
Gli autovalori di A appartengono alle regioni del piano complesso
5
n
(r)
5
n
(c)
R= Ci , C= Ci ,
i=1 i=1

unione dei cerchi riga e colonna rispettivamente. Pertanto essi appartengono an-
che alla loro intersezione R ∩ C.
A supporto di questo Teorema facciamo un esempio tratto da [24, p. 89].
E SEMPIO 28. Sia ⎛ ⎞
4 −1 1 0 0
⎜ 1 3 −1 0 0 ⎟
⎜ ⎟
A=⎜
⎜ 0 1 1 0 0 ⎟

⎝ 0 0 0 2 1 ⎠
0 0 0 1 8
√ √
i cui autovalori sono λ1 = 5 + 10, λ2 = λ3 = 3, λ4 = 2 e λ5 = 5 − 10. I cerchi riga
sono

R1 = {z : |z − 4| ≤ 2}; R2 = {z : |z − 3| ≤ 2}; R3 = {z : |z − 1| ≤ 1},


R4 = {z : |z − 2| ≤ 1}; R5 = {z : |z − 8| ≤ 1} .

quelli colonna sono

C1 = {z : |z − 4| ≤ 1}; C2 = {z : |z − 3| ≤ 2}; C3 = {z : |z − 1| ≤ 2},


C4 = {z : |z − 2| ≤ 1}; C5 = {z : |z − 8| ≤ 1} .

I grafici dei corrispondenti cerchi di Gerschgorin sono riprodotti in Figura 4.2. È


facile osservare che gli autovalori stanno nell’insieme

R 2 ∪ R3 ∪ R4 ∪ R5

poiché R2 = C2 , R4 ⊂ R2 ; C1 , C4 ⊂ C2 e R5 = C5 .
L’Esempio 28, ci suggerisce che se A è simmetrica allora le regioni R e C del
Teorema 16 coincidono ed essendo gli autovalori di matrici simmetriche reali, la
loro intersezione è formata dall’unione di intervalli dell’asse reale.
Un’applicazione del primo Teorema di Gerschgorin è la seguente
Proposizione 8. Se A è diagonalmente dominante in senso stretto allora è non
singolare.
Dim. La dimostrazione è ora facilitata dalla conoscenza dei cerchi di Ger-
schgorin. Infatti, se A è diagonalmente dominante in senso stretto vale la disug-
uaglianza
 
n
 ai,j 
 
 ai,i  < 1 .
j=1,j =i
114 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 4.1: Cerchi di Gerschgorin della matrice A dell’ Esempio 28: sopra i
cerchi riga e sotto quelli colonna.

Ciò implica che


 
|z − ai,i |
n
 ai,j 
=   (4.7)
|ai,i |  ai,i  < 1 ,
j=1,j =i

da cui
|z − ai,i | < |ai,i | .

La matrice A ha quindi cerchi di Gerschgorin che non passano mai per l’origine
e pertanto non potrà mai avere autovalori nulli. 
Gerschgorin diede anche un’altra caratterizzazione

Teorema 17. (secondo Teorema di Gerschgorin)


Se l’unione dei cerchi di Gerschgorin è formata da due sottinsiemi disgiunti
A1 e A2 , ovvero per R (o C) si abbia

R = A1 ∪ A2 , A1 ∩ A2 = ∅

con A1 formato da n1 cerchi e A2 da n2 con n1 +n2 = n. Allora in A1 sono contenuti


n1 autovalori e in A2 i rimanenti n2 .
4 - Autovalori di matrici 115

E SEMPIO 29. Come esempio, consideriamo la matrice


⎛ ⎞
−1 1 0
A=⎝ 1 6 1 ⎠
1 −2 8
i cui cerchi sono come in figura

Figura 4.2: Cerchi riga di Gerschgorin della matrice A dell’ Esempio 29.

come si nota ci sono due sottinsiemi disgiunti e quindi un autovalore cadrà nel
cerchio di più a sinistra e due nell’insieme formato dagli altri due cerchi.

La funzione CerchiGerschgorin.m, in Appendice C, consente di costruire e


plottare i cerchi di Gerschgorin.
Infine, ricordando che ρ(A) ≤ A per ogni norma indotta, una sovrastima
dell’autovalore di modulo più grande è appunto A.
Le domande più frequenti quando si ha a che fare con problemi di autovalori
sono le seguenti.

1. Quali autovalori desideriamo conoscere? Il più grande in modulo o il più


piccolo in modulo? E cosa si può dire dei corrispondenti autovettori?

2. E se volessimo determinare tutti gli autovalori e autovettori?

3. La struttura della matrice che ruolo gioca nei metodi di calcolo?


116 Appunti di Calcolo Numerico con codici in Matlab/Octave

4.2 Il metodo delle potenze


Il metodo delle potenze permette di determinare l’autovalore di modulo massimo.
Supponiamo che gli autovalori di A possano essere ordinati come segue:

|λ1 | > |λ2 | ≥ |λ3 | ≥ · · · ≥ |λn | ,

con λ1 ben distinto dai rimanenti autovalori. Sia x1 l’autovettore corrispondente


a λ1 .
Se gli autovettori di A sono linearmente indipendenti, λ1 e x1 si possono de-
terminare come segue

1. Dato il vettore iniziale x(0) , poniamo y(0) = x(0) /x(0) .

2. Per k = 1, 2, ... calcolo

x(k)
x(k) = Ay(k−1) , y(k) = , λ(k) = (y(k) )T A y(k) .
x(k) 

La procedura si arresta in corrispondenza al primo indice k tale che |λ(k) −


λ(k−1) | < |λ(k) |.
Il predetto metodo costruisce due successioni convergenti

lim y(k) = αx1 , lim λ(k) = λ1 .


k→∞ k→∞

Perchè si chiama metodo delle potenze? Basta osservare che y(k) = r(k) Ak y(0) ,
cioè appaiono le potenze della matrice A, con

&
k
1
r(k) = .
i=1
x(i) 

Infatti,

Ay (0)
• y (1) = ;
x(1) 

Ay (1) A2 y (0)
• y (2) = = ;
x(2)  x(1) x(2) 

Ay (2) A3 y (0)
• y (3) = (3)
= (1) ;
x  x x(2) x(3) 
• ....

La funzione MetPotenze.m, in Appendice C, implementa il metodo delle potenze.


4 - Autovalori di matrici 117

4.2.1 Convergenza
Gli autovettori
n x1 , . . . , xn sono linearmente indipendenti, cosicché possiamo scri-
vere x(0) = i=1 α1 xi da cui
n
y (0) = β (0) αi xi , β (0) = 1/x(0)  .
i=1

(i) Al primo passo


n n
x(1) = Ay (0) = β (0) A αi xi = β (0) α i λi x i
i=1 i=1
n −1
y (1) = β (1) αi λi xi , β (1) = x(0) x(1) 
i=1

(ii) Al passo k
' (−1
n &
k
y (k) = β (k) αi λki xi , β (k) = x(i) 
i=1 i=0

da cui ' (
n k
(k) λi
y = λk1 β (k) α1 x 1 + αi xi ,
i=2
λ1
 
 
Poiché  λλ1i  < 1, i = 2, ..., n allora lim y (k) = x1 ovvero la successione dei vettori
k→∞
y (k) converge alla direzione dell’autovettore x1 purchè α1 = 0. Nel caso in cui
α1 = 0 e |λ2 | > |λ3 |, il processo dovrebbe convergere verso λ2 . Però a causa degli
(inevitabili) errori di arrotondamento comporta la comparsa di una componente
nella direzione di x1 anche se questa non era presente nel vettore iniziale x(0) ,
quindi α1 = 0 e il metodo converge ancora a λ1 . Vediamo questo fatto nell’esempio
seguente.

E SEMPIO 30. Consideriamo la matrice


⎡ ⎤
−2 1 0 0
⎢ 1 −2 1 0 ⎥
A=⎢ ⎣ 0


1 −2 1
0 0 1 −2

i cui autovalori (con 5 cifre decimali) sono −3.61903, −2.61803, −1.38197 e −0.38197.
Applicando il metodo delle potenze con vettore iniziale x(0) = [3, 4, 4, 3]T converge
al secondo autovalore più grande in modulo. Lo stesso accade partendo da x(0) =
[0, 0, 0, 0]T oppure x(0) = [1, 2, 2, 1]T perchè tale vettore ha componenti uguali lungo
xk2 e xk3 . Per evitare questo basterà considerare un vettore le cui componenti sono
scelte casualmente (random).
118 Appunti di Calcolo Numerico con codici in Matlab/Octave

(k)
Quando però |λ2 | ≈ |λ1 |, la successione {λ1 } converge verso λ1 molto lenta-
mente e in tal caso il metodo viene usato come stima iniziale per il metodo delle
potenze inverse che vedremo oltre.
Inoltre, se la matrice
' A non ( è simmetrica, la convergenza all’autovalore di
 λ2 k
modulo massimo è O   . Quando A è simmetrica la convergenza rad-
λ1
 2k
 λ2 
doppia, ovvero é O  λ1  .
 
 λ2 
Concludendo, il rapporto   è importante ai fini della velocità di conver-
λ1
genza del metodo delle potenze. Il prossimo esempio ci fa capire proprio questo
fatto.

E SEMPIO 31. Si consideri la matrice


⎛ ⎞
−7 −9 9
A1 = ⎝ 11 13 −9 ⎠
−16 −16 20
 
 λ2 
i cui autovalori sono λ1 = 20, λ2 = 4, λ3 = 2 con   ≈ 0.2. Si può provare che
λ1
partendo dal vettore x(0) = [1, 1, 1]T con tol = 1.e − 6, il metodo delle potenze
(implementato nella funzione MetPotenze.m) converge a λ1 in 10 iterazioni.
Se consideriamo invece la matrice
⎛ ⎞
−4 −5 4
A2 = ⎝ 14 15 −5 ⎠
−1 −1 11
 
√ √  λ2 
che ha autovalori λ1 = 5+21
2 , λ2 = 5−21
2 , λ3 = 1. In tal caso   ≈ 0.81 con la
λ1
conseguenza che il metodo, con gli stessi valori di tol e x(0) , impiega 58 iterazioni per
determinare l’autovalore di modulo massimo.

E SERCIZIO 51. Si consideri, per α ∈ R, la famiglia di matrici


⎛ ⎞
α 2 3 10
⎜ 5 12 10 7 ⎟
A=⎜ ⎝ 9 7 6

13 ⎠
4 16 18 0

Provare che se α = 30 il metodo converge all’autovalore di modulo massimo in 27


iterazioni, mentre se α = −30 il metodo richiede ben 1304 iterazioni partendo da
x(0) =ones(4,1) con tolleranza  = 1.e − 10. Come mai questo fatto?
Per verificare l’esattezza dei calcoli, usare la funzione eig(A) di Matlab/Octave
che restituisce tutti gli autovalori di una matrice quadrata A. Come ulteriore con-
trollo determinare anche il residuo A x1 − λ1 x1 .
4 - Autovalori di matrici 119

4.3 Il metodo delle potenze inverse


Per determinare l’autovalore di modulo minimo, basta ricordare che A−1 ha au-
tovalori che sono i reciprochi degli autovalori della matrice A. Infatti, se λ è
autovalore di A associato all’autovettore x, allora da Ax = λx deduciamo che
1
x = A−1 x. Ovvero 1/λ è autovalore di A−1 associato al vettore x.
λ
Da un punto di vista implementativo, al passo k invece di definire x(k) =
−1 (k−1)
A y risolveremo, con uno dei metodi numerici visti al capitolo precedente,
il sistema
Ax(k) = y (k−1) .
Se fosse nota la fattorizzazione LU o quella di Cholesky (nel caso A sia simmet-
rica definita positiva), basterà ricordarla ed usarla ad ogni passo k.

E SERCIZIO 52. Si consideri la matrice dell’Esercizio 51, con gli stessi valori del
parametro α, determinare l’autovalore di modulo minimo λn mediante il metodo
delle potenze inverse (ovvero il metodo delle potenze applicato ad A−1 ). Usare
x(0) =ones(4,1) e tolleranza  = 1.e − 10.

4.3.1 Il metodo delle potenze inverse con shift


Data una matrice quadrata A n × n, a coefficienti reali, i cui autovalori possono
essere ordinati come segue:

|λ1 | > |λ2 | ≥ |λ3 | ≥ · · · ≥ |λn | .

Con il metodo delle potenze con shift è possibile cercare l’ autovalore di A, più
vicino ad numero η fissato. In pratica si tratta di applicare il metodo delle potenze
inverse per il calcolo dell’autovalore minimo λmin (Aη ) della matrice Aη = A − η I.
L’autovalore cercato, dipendente da η, è λη = λmin (Aη ) + η.
Per individuare un valore η da cui partire, si possono costruire i cerchi di
(r) (c)
Gerschgorin, Ci e Ci , i = 1, ..., n (vedi (4.5) e (4.6)), associati alle righe e alle
colonne di A, rispettivamente (vedasi la funzione CerchiGerschgorin.m).

E SERCIZIO 53. Cercare l’/gli autovalore/i di A, con α = −30, più vicino/i al nu-
mero η = −15. In pratica si tratta di applicare il metodo delle potenze inverse per
il calcolo dell’autovalore minimo della matrice Aη = A − η I. Quindi l’autovalore
cercato sarà λη = λmin (Aη ) + η.
Come cambia il numero delle iterazioni se prendiamo η = −17? Prendere
x(0) =ones(4,1) e tolleranza  = 1.e − 10.

4.3.2 Metodo delle potenze e metodo di Bernoulli


Dato il polinomio
n
pn (x) = ai xi , a0 an = 0 ,
i=0
120 Appunti di Calcolo Numerico con codici in Matlab/Octave

per determinare la radice ξ1 di modulo massimo si può usare il metodo di Bernoulli.


Tale metodo consiste nell’applicare il metodo delle potenze alla matrice (di Frobe-
nius), detta anche matrice companion
⎛ ⎞
0 1 0 ··· 0
⎜ .. .. ⎟
⎜ . . ⎟
⎜ ⎟
F =⎜ ⎜ .. .. ⎟.
. . ⎟
⎜ ⎟
⎝ 0 ... 0 1 ⎠
− aan0 − aan1 . . . − an−2
an − an−1
an

Per calcolare tutti i rimanenti autovalori si opera poi per deflazione, ovvero
applicando il metodo alle sottomatrici di ordine n−1, n−2, . . . , 1 che si ottengono
mediante trasformazioni per similitudine con matrici ortogonali (quali le matrici
di Householder).
Facciamo vedere su un semplice esempio come calcolare la radice più grande
in modulo, che chiameremo ξ1 , e la successiva radice più grande in modulo ξ2 .

E SEMPIO 32. Calcolare ξ1 per il polinomio

p6 (x) = 13x6 − 364x5 + 2912x4 − 9984x3 + 16640x2 − 13312x + 4096 ,

usando tolleranza tol = 1.e − 6.


Calcolare quindi (per deflazione) ξ2 la seconda radice più grande in modulo. Per
calcolare ξ2 , si suggerisce dapprima di costruire la matrice P di Householder tale

ξ1 aT
PFPT =
0 F1

cosicchè P x1 = e1 con x1 autovettore associato a ξ1 (calcolato al passo 1) e e1 =


(1, 0, ..., 0)T . La matrice P si può costruire mediante il seguente codice Matlab:
% Costruisco la matrice di Householder P t.c. P*x1=(1,0,...,0)
x12=norm(x1,2); beta=1/(x12*(x12+abs(x1(1)) ));
v(1)=sign(x1(1))*(abs(x1(1))+x12); v(2:n)=x1(2:n);
P=eye(n)-beta*v’*v; % n = dimensione matrice

Pertanto, per calcolare ξ2 si applicherà il metodo delle potenze alla matrice F1 .


Confrontare i risultati con la funzione roots(c), con c vettore dei coefficienti del
polinomio p6 (x), aiutandosi anche con un grafico.
Una possibile implementazione in Matlab/Octave del metodo di Bernoulli, per cal-
colare tutte le radici della matrice di Frobenius è presentata nella funzione metBernoulli
in Appendice C.

4.4 Il metodo QR
Se si desiderano tutti gli autovalori di una matrice, bisogna ricorrere a tecniche
che consentono dapprima di ridurre la matrice ad una forma più semplice medi-
4 - Autovalori di matrici 121

ante trasformazioni per similitudine pervenendo a una forma triangolare supe-


riore o diagonale: il calcolo degli autovalori diventa cosı̀ notevolemente semplifi-
cato. Questa è la filosofia delle trasformazioni con matrici ortogonali di House-
holder o Givens. Su tale filosofia si basa infatti il metodo QR e le sue varianti.

Il metodo QR fa uso della fattorizzazione QR della matrice A. La fattoriz-


zazione QR di A consiste nel premoltiplicare A ad ogni passo k per una matrice
ortogonale, di Householder o Givens, cosicchè dopo n−1 passi (Un−1 · · · U1 )A = R,
con R triangolare superiore. La matrice Q richiesta è

Q = (Un−1 · · · U1 )−1 = (Un−1 · · · U1 )T .

Il metodo QR per autovalori si descrive come segue. Sia A ∈ Rn×n ; data


(0)
Q ∈ Rn×n ortogonale (cioè QT Q = I) e posto T (0) = (Q(0) )T AQ(0) , per k =
1, 2, . . . finché converge esegui

• mediante la fattorizzazione QR di A (ad esempio usando la funzione qr


di Matlab/Octave o una propria implementazione), determinare T (k−1) =
Q(k) R(k) ;

• quindi, porre T (k) = R(k) Q(k) = (Q(k) )T T (k−1) Q(k) .

Se A ha autovalori reali e distinti in modulo il metodo converge ad una ma-


trice triangolare superiore i cui autovalori stanno sulla diagonale principale. Nel
caso in cui gli autovalori non soddisfino la predetta condizione, la successione
converge verso una matrice con forma triangolare a blocchi, come si vede nel
prossimo esempio.

E SEMPIO 33. Data ⎡ ⎤


0 0 2
A=⎣ 1 0 1 ⎦.
0 1 1
Dopo 25 iterazioni del QR, si perviene alla matrice in forma ”quasi” triangolare (di
Hessenberg superiore)
⎡ ⎤
2 1.069 0.9258
T (25) = ⎣ 0 −0.5 0.866 ⎦ ,
0 −0.866 −0.5

i cui autovalori sono λ1 = 2 e λ2,3 che si determinano dal blocco


 
−0.5 0.866
,
−0.866 −0.5

che sono complessi coniugati λ2,3 = −0.5 ± 0.866 i.

Vale la seguente Proposizione


122 Appunti di Calcolo Numerico con codici in Matlab/Octave

Proposizione 9. Data A ∈ Rn×n , esiste Q ∈ Rn×n ortogonale e una matrice


B ∈ Rn×n triangolare superiore a blocchi tale che
⎛ ⎞
R1,1 R1,2 · · · R1,m
⎜ R2,2 · · · R2,m ⎟
⎜ ⎟
B = QT AQ = ⎜ .. .. ⎟ (4.8)
⎝ . . ⎠
0 Rm,m

dove Ri,i , i = 1, ..., m è un blocco 2 × 2 con autovalori complessi coniugati o un


blocco 1 × 1 nel caso l’autovalore sia un numero reale. La somma delle dimensioni
dei blocchi Ri,i , i = 1, ..., m è pari ad n. Inoltre
2 3
Q = lim Q(0) · · · Q(k) ,
k→∞
dove Q(k) è la k-esima matrice ortogonale generata al passo k della fattorizzazione
QR di A.
La matrice con blocchi Ri,j viene detta la decomposizione reale di Schur di A.
Poiché il metodo ha lo scopo di annullare gli elementi della parte triangolare
inferiore sotto la diagonale principale partendo dall’elemento in basso a sinistra,
un possibile test di arresto è che al passo k
n−1  
 (k) 
Ti+1,i  < 
i=1

ovvero che tutti gli elementi della sottodiagonale siano in modulo minori di una
prescelta tolleranza  (vedasi più sotto).
La funzione Matlab/Octave MetQR (vedasi i Codici Matlab/Octave online) im-
plementa il metodo QR per la ricerca di autovalori, mentre la funzione ConvergenzaQR
verifica se il metodo QR converge, controllando che gli elementi della sottodiago-
nale siano tutti in modulo minori di una fissata tolleranza.

4.4.1 Il metodo QR con shift


Dalla Proposizione 9, abbiamo visto che il metodo QR converge, nel caso generale,
verso una matrice triangolare superiore a blocchi. Risolvendo quindi il problema
degli autovalori sui blocchi, si avranno tutti gli autovalori di A (vedasi l’Esempio
33).
Il metodo QR ha velocità che dipende
 dai rapporti |λi /λj |, i > j ed in parti-
 λi+1 
colare dal numero max1≤i≤n−1  λi , più questo numero è vicino ad 1 e più lenta
sarà la convergenza, pocihé A ha ha autovalori vicini in modulo. In questi casi,
conviene applicare la tecnica di traslazione dello spettro, o tecnica dello shift, che
serve anche ad accelerare la convergenza.
Il metodo QR con singolo shift consiste nella seguente iterazione: data l’appros-
simazione μ ∈ R di un autovalore λ di A, consideriamo la forma di Hessenberg di
A, ovvero T (0) = (Q(0) )T AQ(0) (in Matlab/Octave si ottiene usando la funzione
hess.m).
4 - Autovalori di matrici 123

Quindi
• per k = 1, 2, . . . mediante la fattorizzazione QR di A (usare la funzione
Matlab/Octave qr), fattorizzare T (k−1) come segue: T (k−1) − μI = Q(k) R(k) ;
• porre T (k) = R(k) Q(k) + μI.
Osserviamo che Q(k) T (k) = Q(k) R(k) Q(k) +μQ(k) = T (k−1) Q(k) , ovvero T (k) e T (k−1)
sono simili e pertanto hanno gli stessi autovalori.
L’effetto dello shift sulla convergenza è il seguente. Supponiamo che A abbia
autovalori che possiamo ordinare

|λ1 − μ| ≥ |λ2 − μ| ≥ · · · |λn − μ|


(k)
si può provare che per 1 < i ≤ n, ti,i−1 → 0 con velocità proporzionale a
 
 λi − μ k
 
 λi−1 − μ 

estendendo cosı̀ lo stesso risultato di convergenza visto per il metodo QR anche


al QR con shift. Questo suggerisce, di scegliere per μ un valore che approssima
λn cosicchè
|λn − μ| < |λi − μ| , i = 1, . . . , n − 1 .

(k)
Per tale scelta di μ, l’elemento tn,n−1 , generato dalla precedente iterazione, tende
rapidamente a zero al crescere di k. Se per caso μ fosse un autovalore della
(k) (k)
matrice T (k) , e anche di A, tn,n−1 = 0 e tn,n = μ. Questo suggerisce in ultima
istanza di scegliere
μ = t(k)
n,n .

Con questa scelta, si dimostra, la convergenza del metodo è quadratica, nel senso
che se
(k)
tn,n−1
= αk < 1, per qualche k ≥ 0
T (0) 2
allora
(k+1)
tn,n−1
= O(αk2 ) .
T (0) 2
Nel caso di matrice simmetrica, si dimostra (cf. [15]) che la convergenza è cubica.
Di questo fatto possiamo tenere conto durante l’esecuzione del metodo QR con
(k)
singolo shift, controllando il valore di |tn,n−1 | e ponendolo uguale a zero se risulta

(k) (k)
|tn,n−1 | <  |tn−1,n−1 | + |t(k)
n,n |  ≈ eps. (4.9)

Questo sarà il test da usare nell’implementazione del metodo QR con shift. Se,
(k)
la matrice A è in forma di Hessenberg superiore, l’azzeramento di tn,n−1 implica
124 Appunti di Calcolo Numerico con codici in Matlab/Octave

(k)
che tn,n sarà una buona approssimazione di λn . Quindi, noto λn la ricerca dei
rimanenti autovalori si farà sulla matrice T (k) (1 : n − 1, 1 : n − 1), riducendo di
volta in volta la dimensione del problema fino a determinare tutti gli autovalori
di A. In pratica una strategia di tipo deflattivo.
Il metodo QR con singolo shift è implementato nella funzione MetQRShift.



E SERCIZIO 54. Calcolare con il metodo QR tutti gli autovalori di A=[30 1 2 3;


4 15 -4 -2; -1 0 3 5; -3 5 0 -1];. Determinare anche il numero di iterazioni
fatte.

E SERCIZIO 55. Si consideri la matrice A (tratta da [26, pag. 178])


⎛ ⎞
17 24 1 8 15
⎜ 23 5 7 14 16 ⎟
⎜ ⎟
A=⎜ ⎜ 4 6 13 20 22 ⎟⎟ ,
⎝ 10 12 19 21 3 ⎠
11 18 25 2 9

i cui autovalori (arrotondati a due decimali ) sono λ1 = 65, λ2,3 = ±21.28 e


λ4,5 = ±13.13. Calcolare, se possibile, tutti gli autovalori sia con il metodo QR che
con il metodo QR con shift.

4.5 Autovalori di matrici simmetriche


Quando la matrice A ∈ Rn×n è tridiagonale simmetrica o simmetrica, per la
ricerca dei corrispondenti autovalori si usano il metodo delle successioni di Sturm
e il metodo di Jacobi, rispettivamente.

4.5.1 Il metodo delle successioni di Sturm


Sia A ∈ Rn×n tridiagonale simmetrica. Indichiamo con d e b i vettori diagonale
e extradiagonali (sopra e sotto la diagonale principale) di dimensioni n e n − 1,
rispettivamente.
Sia Ai il minore principale di ordine i di A. Posto p0 (x) = 1, indichiamo con
pi (x) = det(Ai − xIi ). Si ha

p1 (x) = d1 − x; (4.10)
pi (x) = (di − x) pi−1 (x) − b2i−1 pi−2 (x), i = 2, ..., n.

Alla fine pn (x) = det(A − xI). La successione {pi (x)} è detta una successione
di Sturm. Vale il seguente risultato (la cui dimostrazione si trova in [2, pagg.
345-346]).
4 - Autovalori di matrici 125

Teorema 18.
1. p0 (x) non cambia segno;
2. se pi (x) = 0 allora pi−1 (x)pi+1 (x) < 0, per i = 1, 2, . . . , n − 1 ; (alternanza
degli zeri)
3. se pn (x) = 0 allora pn (x)pn−1 (x) < 0 (e quindi pn (x) ha tutti zeri di molteplicità
1).
Detto altrimenti, per i = 2, ..., n gli autovalori di Ai−1 separano quelli di Ai ,
ovvero
λi (Ai ) < λi−1 (Ai−1 ) < λi−1 (Ai ) < · · · < λ2 (Ai ) < λ1 (Ai−1 ) < λ1 (Ai ) . (4.11)

Inoltre, per ogni reale ν, definiamo


Sν = {p0 (ν), p1 (ν), . . . , pn (ν)} . (4.12)
Allora s(ν), il numero di cambiamenti di segno in Sν , indica il numero di auto-
valori di A strettamente minori di ν. Vale inoltre,
Teorema 19. Se pi (x), i = 0, 1, . . . , n è una successione di Sturm, il numero
s(b) − s(a) indica il numero di zeri di pn (x) appartenenti all’intervallo [a, b).
Da un punto di vista implementativo, per costruire A, noti i vettori d e b,
basta usare il comando Matlab/Octave A=diag(d)+diag(b,1)+diag(b,-1). Quindi
si può procedere come segue:
• Scelgo un valore reale ν e costruisco l’insieme Sν . Qui bisogna implementare
le formule (4.10), ottenendo in output un array che contiene i numeri pi (ν),
i = 0, 1, ..., n.
• Determino il numero s(ν) che mi dirà, grazie alla (4.11), quanti autovalori
di A sono minori in senso stretto, di ν.
• Esiste un metodo, detto metodo di Givens, per determinare tutti gli autoval-
ori di una matrice A tridiagonale simmetrica. Poniamo b0 = bn = 0 allora
l’intervallo I = [α, β] con

α = min (di − (|bi | + |bi−1 |)), β = max (di + (|bi | + |bi−1 |)) , (4.13)
1≤i≤n 1≤i≤n

conterrà tutti gli autovalori di A (infatti α e β indicano gli estremi dell’intervallo


di Gerschgorin).
Una volta determinato I = [α, β], per determinare λi , l’i-esimo autovalore
di A, mediante il metodo di bisezione si opera come segue: si construiscono
le successioni a(i) e b(i) con a(0) = α, b(0) = β; quindi si calcola c(0) = (a(0) +
b(0) )/2, grazie alla proprietà (4.11), se s(c(0) ) > n − i allora b(1) = c(0)
∗ ∗
altrimenti a(1) = c(0) . Si continua finchè ad un passo k ∗ , |b(k ) − a(k ) | ≤
∗ ∗
tol(|a(k ) | + |b(k ) |).
Procederemo poi in modo sistematico per calcolare tutti gli altri autovalori.
126 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 56. Data la matrice tridiagonale avente diagonale principale il vet-


tore d=ones(1,n) e sopra e sotto diagonali il vettore b=-2*ones(1,n-1). Con n = 4,
calcolarne tutti gli autovalori usando il metodo di Givens delle successioni di
Sturm.

Per facilitare l’implemetazione presentiamo la funzione succSturm.m che costru-


isce le successione di Sturm e i suoi cambiamenti di segno.

function [p,cs]=succSturm(d,b,x)
%-----------------------------------------------
% Calcolo della successione di Sturm ’p’ in x
% a partire dai vettori d e b
% e dei corrispondenti cambiamenti di segno ’cs’
%-----------------------------------------------
n=length(d); p(1)=1; p(2)=d(1)-x; for i=2:n,
p(i+1)=(d(i)-x)*p(i)-b(i-1)^2*p(i-1);
end
cs=0; %contatore cambi di segno
s=0; %contatore dei segni costanti
for i=2:length(p),
if(p(i)*p(i-1)<=0),
cs=cs+1;
end
if(p(i)==0),
s=s+1;
end
end
cs=cs-s;
return

4.5.2 Il metodo di Jacobi

Il metodo, come detto, si applica a matrici simmetriche. Genera una successione


di matrici A(k) ortogonalmente simili ad A e convergenti verso una matrice diag-
onale i cui elementi sono gli autovalori di A.
Si parte da A(0) = A. Per k = 1, 2, . . . si fissa una coppia di interi p e q con
1 ≤ p < q ≤ n e si costruisce

A(k) = (Gpq )T A(k−1) Gpq (4.14)

(ortogonalmente simile ad A) cosicchè

(k)
ai,j = 0, se (i, j) = (p, q) .
4 - Autovalori di matrici 127

La matrice Gpq è la matrice ortogonale di rotazione di Givens definita come segue


⎡ ⎤
1 0
⎢ .. ⎥
⎢ . ⎥
⎢ ⎥
⎢ cos(θ) sin(θ) ⎥
⎢ ⎥
⎢ . .. ⎥
Gpq = ⎢ ⎥.
⎢ ⎥
⎢ − sin(θ) cos(θ) ⎥
⎢ ⎥
⎢ .. ⎥
⎣ . ⎦
0 1

Siano c = cos(θ) e s = sin(θ). Allora, gli elementi di A(k) che variano rispetto a
quelli di A(k−1) per effetto della trasformazione (4.14) si ottengono risolvendo il
sistema
6 7  T 6 (k−1) 7 
(k) (k) (k−1)
app apq c s app apq c s
(k) (k) = (k−1) (k−1) . (4.15)
apq aqq −s c apq aqq −s c

Il nostro scopo è trovare l’angolo θ che consente al passo k di annullare gli ele-
(k−1)
menti extradiagonali di A(k−1) interessati dalla trasformazione. Ora, se apq =
(k−1)
0, allora c = 1 e s = 0. Se invece apq = 0, posto t = s/c = tan(θ), il sistema
(4.15) equivale alla soluzione dell’equazione
(k−1) (k−1)
aqq − app
t2 + 2ηt − 1 = 0, con η = (k−1)
. (4.16)
2apq

Nell’equazione precedente,
 se η ≥ 0 si sceglie la radice t = 1/(η + 1 + η 2 ) altri-
2
menti t = −1/(−η + 1 + η ). Quindi c e s risultano
1
c= √ , s = ct .
1 + t2
La convergenza del metodo si verifica calcolando la seguente quantità, valida
per una generica matrice M
⎛ ⎞1/2 ' (
n n 1/2

Φ(M ) = ⎝ m2ij ⎠ = M 2F − m2ii . (4.17)


i,j=1,i=j i=1

Il metodo garantisce che Φ(A(k) ) ≤ Φ(A(k−1) ), ∀k. Infatti

n n
Φ(A(k) ) = a2i,j − a2i,i − 2|ap,q |
i,j=1 i=1
(k−1)
= Φ(A ) − 2|ap,q | (4.18)
(k−1)
< Φ(A ).
128 Appunti di Calcolo Numerico con codici in Matlab/Octave

Una strategia ottimale di scelta degli indici p, q tale che Φ(A(k) ) ≤ Φ(A(k−1) ) sia
sempre verificata, è quella di scegliere l’elemento di A(k−1) tale che
(k−1)
|a(k−1)
p,q | = max |ai,j |.
i=j

Vale infatti il seguente

Teorema 20. La successione A(k) generata con il metodo di Jacobi è convergente


verso una matrice diagonale e si ha limk→∞ Φ(A(k) ) = 0 .

Dim. Essendo ap,q un elemento non principale di massimo modulo di A(k) ,


risulta
Φ(A(k−1) )
a2p,q ≥ .
n(n − 1)
Dalla (4.18),

Φ(A(k−1) )
Φ(A(k) ) ≤ Φ(A(k−1) ) − 2 = αΦ(A(k−1) )
n(n − 1)
2
con α = 1 − n(n−1) < 1, n ≥ 2. Continuando,

Φ(A(k) ) ≤ αk−1 Φ(A(1) )

da cui la conclusione. 
Una M-function che implementa il metodo di Jacobi, data A e una tolleranza
tol e che restituisce la matrice diagonale D degli autovalori, il numero di iter-
azioni effettuate e la quantità Φ(·), è la funzione symJacobi.

4.6 Esercizi proposti

E SERCIZIO 57. Data la matrice simmetrica.


⎛ ⎞
4 1 0 0 0
⎜ 1 3 2 0 0 ⎟
⎜ ⎟
A=⎜ ⎜ 0 2 −1 −4 0


⎝ 0 0 −4 6 2 ⎠
0 0 0 2 5

1. Localizzare, mediante i cerchi di Gerschgorin, gli autovalori di A e dare


alcune stime ”a priori”.

2. Determinare tutti gli autovalori con il metodo più idoneo per la strut-
tura della matrice.
4 - Autovalori di matrici 129

E SERCIZIO 58. Data la matrice simmetrica.


⎛ ⎞
4 1 1 0
⎜ 1 3 2 3 ⎟
A=⎜ ⎝ 1 2 −1 −2


0 3 −2 5

1. mediante il metodo delle potenze determinare l’autovalore di modulo


massimo M , con precisione tol = 1.e − 6;

2. mediante il metodo delle potenze inverse determinare l’autovalore di


modulo minimo m, con precisione tol = 1.e − 6;

3. si determinino infine gli altri due autovalori (interni a [−M, M ].)

E SERCIZIO 59. Data la matrice A di ordine n = 5,


⎛ ⎞
17 24 1 8 15
⎜ 23 5 7 14 16 ⎟
⎜ ⎟
A=⎜ ⎜ 4 6 13 20 22 ⎟ ⎟ ,
⎝ 10 12 19 21 3 ⎠
11 18 25 2 9

i cui autovalori (arrotondati a due decimali ) sono λ1 = 65, λ2,3 = ±21.28


e λ4,5 = ±13.13. Calcolare tutti gli autovalori con il metodo QR con shift.
Costruire una tabella che riporti i valori della sequenza
(k)
1 |tn,n−1 |
ρk = 1 + log (k−1) , k = 1, 2, ....
log ηk |tn,n−1 |

(k)
con ηk = |tn,n−1 |/T (0) 2 , T (0) = (Q(0) )T A Q(0) e Q(0) (la prima delle ma-
trici ortogonali usati nella fattorizzazione QR di A) che faccia vedere che la
convergenza del metodo è quadratica.

E SERCIZIO 60. Si considerino le matrici


⎛ ⎞ ⎛ ⎞
−7 −9 9 −4 −5 4
A1 = ⎝ 11 13 −9 ⎠ A2 = ⎝ 14 15 −5 ⎠ (4.19)
−16 −16 20 −1 −1 11

entrambe con autovalori reali e distinti.

1. Calcolare tutti gli autovalori di A1 e A2 , mediante il metodo delle inverse


con shift (usare tol = 1.e − 6).

2. Si dica perchè il metodo delle potenze per il calcolo dell’autovalore di


modulo massimo ci impiega di più nel caso della matrice A2 ?
130 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 61. Si consideri la matrice


⎛ 1 2 ⎞
3 3 2 3
⎜ 1 0 −1 2 ⎟
A=⎜
⎝ 0
⎟ . (4.20)
0 − 53 − 23 ⎠
0 0 1 0

1. Perchè il metodo delle potenze non funziona per il calcolo dell’autovalore


di modulo massimo?
2. Calcolare l’autovalore di modulo massimo e il corrispondente autovet-
tore con il metodo delle potenze con shift.

E SERCIZIO 62. Data la matrice di Hilbert di ordine 4 (in Matlab hilb(4)), i


cui autovalori (arrotondati) sono λ1 = 1.5002, λ2 = 0.1691, λ3 = 0.0067, λ4 =
0.0001. Calcolare detti autovalori usando il metodo di Jacobi con una toller-
anza tol=1.e-15. In quante iterazioni converge il metodo? Calcolare an-
che ad ogni iterazione la quantità Φ(A(k) ) per verificare che decresce. (Sugg.
Usare la funzione symJacobi.m (implementare le M-functions calcoloCeS e
calcoloProdottoGtDG)).
5
Interpolazione e
approssimazione
Nelle applicazioni si conoscono solitamente dati provenienti da campionamenti
di una funzione f sui valori xi , i = 0, . . . , n, ovvero (xi , f (xi )) oppure dati sparsi
provenienti di misurazioni (xi , yi ), i = 0, ..., n. Il problema dell’interpolazione con-
siste nel trovare una funzione f˜ tale da soddisfare le condizioni d’interpolazione

f˜(xi ) = f (xi ), oppure , f˜(xi ) = yi . (5.1)

A seconda della forma di f˜ parleremo di interpolazione

• polinomiale, quando f˜(x) = pn (x) con pn (x) = a0 +a1 x+· · ·+an xn ; polinomio
di grado ≤ n;

• polinomiale a tratti quando in ognuno dei sotto intervalli Ik = [xk , xk+1 ], k =


0, . . . , n − 1, f˜ coincide con un polinomio di fissato grado (generalmente di
grado basso, m = 2, 3). Nel caso in cui questo polinomio sia una spline
polinomiale parleremo d’interpolazione spline;

• trigonometrica quando f˜(x) = a−M e−iM x + · · · + aM eiM x , con M = n/2


se n pari oppure M = (n − 1)/2 se n è dispari. Infatti, ricordando che
M
eix = cos(ix) + i sin(ix), allora f˜(x) = c20 + k=1 ck cos(kx) + bk sin(kx) che
come vedremo al paragrafo §5.10, ck e bk sono legati agli ak dalle relazioni

ck = ak + a−k
bk = i(ak − a−k ) .

pn (x)
• razionale in tal caso f˜(x) = rm,n (x) = qm (x) , con pn e qm polinomi di grado
n e m, rispettivamente (qm = 0 su R).

Nel seguito concentremo l’attenzione sull’interpolazione polinomiale, polino-


miale a tratti, splines nonché trigonometrica.Non ci occuperemo dell’interpolazione
razionale, rimandando gl’interessati, ad esempio, alla monografia [30, vol.1, p. 45
e ss].
132 Appunti di Calcolo Numerico con codici in Matlab/Octave

5.1 Interpolazione polinomiale


Il seguente Teorema dice che il problema dell’interpolazione polinomiale ha un’unica
soluzione se i punti d’interpolazione xi , su cui costruiremo il polinomio inter-
polante, sono distinti.
Teorema 21. Dati n + 1 punti (xi , yi ), i = 0, ..., n con xi = xj , i = j, esiste un
unico polinomio di grado n, pn (x) = a0 + a1 x + · · · + an xn per cui

pn (xi ) = yi , i = 0, . . . , n (5.2)

Dim. Le condizioni (5.2) sono equivalenti al sistema lineare


⎛ ⎞⎛ ⎞ ⎛ ⎞
1 x0 x20 . . . xn0 a0 y0
⎜ 1 x1 x21 . . . xn1 ⎟ ⎜ a1 ⎟ ⎜ y1 ⎟
⎜ ⎟⎜ ⎟ ⎜ ⎟
⎜ .. .. ⎟ ⎜ .. ⎟ = ⎜ .. ⎟ (5.3)
⎝ . . ⎠⎝ . ⎠ ⎝ . ⎠
1 xn x2n ... xnn an yn

la cui matrice A altro non è che la matrice di Vandermonde per la quale vale
&
n
det(V ) = (xi − xj ) . (5.4)
i,j=0, i<j

Seguendo [9, p. 24], per induzione su n, facciamo vedere che vale la relazione
(5.4).
Per n = 1, det(V ) = x1 − x0 . Sia n ≥ 2. Ora, det(V ) può essere visto come
det(V (x0 , . . . , xn )). Per valutare det(V ) possiamo procedere come segue. Consid-
eriamo la funzione

det(V (x)) = det(V (x0 , . . . , xn−1 , x))

che è un polinomio di grado ≤ n che si annulla in x0 , . . . , xn−1. Pertanto det(V (x))=


C(x − x0 ) · · · (x − xn−1 ) . Per calcolare la costante C basta sviluppare il determi-
nante rispetto all’ultima riga, ed essendo il coefficiente di xn uguale a

det(V (x0 , . . . , xn−1 ))

si ottiene

det(V (x0 , . . . , xn )) = det(V (x0 , . . . , xn−1 ))(x − x0 ) · · · (x − xn−1 ) .

Sostituendo poi x con xn si conclude.


Pertanto il determinante di Vandermonde è diverso zero perchè xi = xj , i = j
e perció la soluzione esiste ed è unica. 

Una dimostrazione alternativa di unicità è la seguente. Per assurdo esistano


due polinomi d’interpolazione, pn e qn (quindi tali che pn (xi ) = qn (xi ) = yi ). Allora
dn = pn − qn è un polinomio di grado ≤ n che si annulla negli n + 1 punti xi . Il
che implica che dn ≡ 0 ovvero pn = qn contraddicendo l’ipotesi che pn = qn .
5 - Interpolazione e approssimazione 133

E SEMPIO 34. Si consideri la funzione di Runge


1
g(x) = , x ∈ [−5, 5] (5.5)
1 + x2
Sugli n + 1 punti equispaziati xi = −5 + ih, i = 0, 1, ..., n, h = 10/n si costruisca il
polinomio d’interpolazione di grado n, pn (x) = an xn + an−1 xn−1 + . . . + a1 x + a0 . Si
tratta di risolvere il sistema lineare

V a = y

con a = (a0 , a1 , ..., an )T , y = (g(x0 ), g(x1 ), ..., g(xn ))T e V la matrice di Vandermonde.
Ad esempio se n = 3, x0 = −5, x1 = −5 + 10/3 ≈ −1.667, x2 = −5 + 20/3 ≈
1.667, x3 = 5 il sistema diventa
⎛ ⎞ ⎛ ⎞ ⎛ 1 ⎞
1 −5 25 −125 a0 26 ≈ 0.04
⎜ 1 −1.667 2.779 −4.63 ⎟ ⎜ a1 ⎟ ⎜ 0.26 ⎟
V =⎜ ⎝ 1 1.667
⎟ ⎜ ⎟=⎜ ⎟.
2.779 4.63 ⎠ ⎝ a2 ⎠ ⎝ 0.26 ⎠
1 5 25 125 a3 0.04


Il concetto di condizioni d’interpolazione può essere generalizzato, come ve-
diamo nel prossimo esempio, considerando non solo i valori della funzione nei
nodi ma altri valori.
20
E SEMPIO 35. Si consideri la funzione f (x) = − 5 ex ristretta all’intervallo
1 + x2
[0, 1]. Determinare l’unico polinomio di secondo grado, p2 (x) = a0 + a1 x + a2 x2 tale
che  
1 1
p2 (0) = f (0), p2 (1) = f (1), p2 (x)dx = f (x)dx .
0 0
Si tratta di risolvere il sistema lineare con matrice non singolare
⎛ ⎞
1 0 0
A=⎝ 1 1 1 ⎠
1 12 31

e termine noto ⎛ ⎞
15
⎜ 5(2 − e) ⎟
⎜ ⎟
b=⎜
⎜  1


⎝ ⎠
f (t)dt
0

L’integrale definito è facilmente calcolabile analiticamente ottenendo 20 arctan(1) −


5(e−1) = 5π −5e+5 ≈ 7.1166 . Risolvendo il sistema si trovano i valori dei coefficienti
del polinomio. Il sistema lo possiamo risolvere anche numericamente con il MEG o
usando la funzione Matlab/Octave "\": otteniamo a0 = 15, a1 = −10.118; a2 =
−8.474. Il grafico della funzione e del polinomio sono visibili in Fig. 5.1.
134 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 5.1: Funzione e polinomio d’interpolazione dell’Esempio 35

5.2 Forma di Lagrange dell’interpolante


Se il sistema (5.3) fosse del tipo Ia = y, con I matrice identità, a l’array dei
coefficienti incogniti e y l’array dei valori, la soluzione sarebbe immediata, ovvero
ai = yi , i = 0, . . . , n. Pertanto un’idea è di considerare una base polinomiale
b0 (x), · · · , bn (x) che verifichi la proprietà bi (xi ) = 1, bi (xj ) = 0, j = i. I polinomi
elementari di Lagrange sono la base cercata. Infatti, essi sono definiti a partire
dai punti d’interpolazione xi come segue

&
n
x − xj
li (x) = . (5.6)
xi − xj
j=0,j =i

I polinomi li , i = 0, . . . , n sono polinomi di grado n, valgono 1 quando x = xi e


0 altrimenti, cioè li (xj ) = δi,j (vedasi Figura 5.2). Pertanto possiamo esprimere
il polinomio d’interpolazione pn (x), costruito sull’insieme (xi , f (xi )), i = 0, ..., n,
come
n
pn (x) = li (x)f (xi ) . (5.7)
i=0

Inoltre vale la seguente identità


n
li (x) = 1 ,
i=0

che altro non è che il polinomio d’interpolazione della funzione f (x) ≡ 1.


5 - Interpolazione e approssimazione 135

Figura 5.2: Grafico di alcuni polinomi elementari di Lagrange.

&
n
Posto ωn (x) = (x − xi ) è facile provare che
i=0

ωn (x)
li (x) = .
(x − xi )ωn (xi )

Posto
&
n
1 1
wi = = 
xi − xj ωn (xi )
j=0,j =i

una forma alternativa del polinomio d’interpolazione è (cfr. [1, 3]):


n
wi f (xi )
pn (x) = ωn (x) .
i=0
(x − xi )

Con tale nuova forma, detta (prima) formula baricentrica, si ha il vantaggio che
se i coefficienti wi sono precalcolati, per valutare il polinomio pn (x), serviranno
O(n) flops (valutando ωn (x) e i pesi wi /(x − xi )) al posto di O(n2 ) flops necessarie
per valutare ciascun polinomio elementare di Lagrange.
Non solo. Se aggiungiamo un altro nodo, xn+1 , allora i pesi diventeranno

wi∗ = wi /(xn+1 − xi ), i = 0, . . . , n
1
wn+1 = )n+1 .
i=0,i=n+1 (xn+1 − xi )
136 Appunti di Calcolo Numerico con codici in Matlab/Octave
n
wj
Infine, se g(x) ≡ 1 allora g(x) = ωn (x) . In definitiva, il polinomio
j=0
x − xj
d’interpolazione diventa
n wj
j=0 x−xj f (xj )
pn (x) = n wj , (5.8)
j=0 x−xj

relazione detta seconda formula baricentrica. In questo caso le funzioni elemen-


tari di base, sono
wj
x−xj
bj (x) = n wj j = 0, . . . , n .
j=0 x−xj

Come osservazione finale, ricordando che i polinomi elementari li valgono 1


in xi e zero negli altri punti xj , j = i, ma possono assumere valore maggiore di 1
in modulo, come si evince anche dalla Figura 5.2.
E SEMPIO 36. Consideriamo il caso n = 1. I punti che prendiamo sono (x0 , f (x0 )) e
(x1 , f (x1 )). Il corrispondente sistema di Vandermonde è

1 x0 a0 f (x0 )
= .
1 x1 a1 f (x1 )

La matrice inversa è
1 x1 −x0
x1 − x0 −1 1
e pertanto avremo la soluzione

a0 1 x1 f (x0 ) − x0 f (x1 )
= .
a1 x1 − x0 −f (x0 ) + f (x1 )

Quindi il polinomio p1 (x) è

x1 f (x0 ) − x0 f (x1 ) f (x1 ) − f (x0 )


p1 (x) = + x
x1 − x0 x1 − x0
ed evidenziando f (x0 ), f (x1 ) possiamo anche riscriverlo in forma di Lagrange
x1 − x x − x0
p1 (x) = f (x0 ) + f (x1 )
x1 − x0 x1 − x0
dove sono ben visibili i polinomi l0 , l1 .
Le funzioni Matlab/Octave lagrai.m e lagrai target.m in Appendice C, con-
sentono di calcolare l’i-esimo polinomio elementare di Lagrange nel punto x o su
un vettore di valori, rispettivamente.

Nel caso di nodi xi equispaziati , cioè xi − xi−1 = h ovvero xi = x0 + i h, i =


0, ..., n, i polinomi elementari assumono una forma particolarmente interessante
dal punto di vista implementativo.
5 - Interpolazione e approssimazione 137

Con il cambio di variabile x(t) = x0 + t h, t = 0, . . . , n, li (x) sarà una funzione


di t, ovvero
&n
x0 + t h − x 0 − j h & n
t−j
li (t) = = .
x 0 + i h − x0 − j h i−j
j=0,j =i j=0,j =i

Detta ora ωn+1 (t) = t(t − 1) · · · (t − n), risulta


&
n
ωn+1 (t)
(t − j) = , (5.9)
t−i
j=0,j =i

&
n &
i−1 &
n
(i − j) = (i − j) · (i − j) = (−1)n−i i!(n − i)! , (5.10)
j=0,j =i j=0 j=i+1

da cui
n
ωn+1 (t) n yi
pn (t) = (−1)n−i . (5.11)
n! i=0
i (t − i)
Quando i nodi sono equispaziati, è facile verificare che per il calcolo di pn (t) sono
necessarie n2 /2 addizioni e 4n moltiplicazioni.
E SERCIZIO 63. Costruire la funzione Matlab/Octave che calcola l’i-esimo poli-
nomio elementare di Lagrange su nodi equispaziati facendo uso delle formule
(5.9) e (5.10). Costruire quindi il polinomio interpolante mediante la (5.11).

5.2.1 Analisi dell’errore d’interpolazione


Sia f (x) definita su [a, b]. Detto pn (x) il polinomio d’interpolazione sugli n + 1
punti a due a due distinti x0 , . . . , xn , indicheremo con

rn (x) = f (x) − pn (x)

la funzione errore per la quale si ha rn (xi ) = 0, i = 0, ..., n.


Teorema 22. Se f ∈ C n+1 [a, b], allora

f (n+1) (ξ)
rn (x) = (x − x0 ) · · · (x − xn ) , (5.12)
(n + 1)!
con ξ ∈ (a, b) e xi distinti.
Dim. Se x = xi , l’errore è nullo e quindi il risultato è ovvio.
Sia ora x = xi , allora preso un qualsiasi t ∈ Ix (Ix il più piccolo intervallo che
contiene i punti x0 , ..., xn , x) possiamo definire la funzione ausialiaria
ωn (t)rn (x)
g(t) = rn (t) − .
ωn (x)
Poiché f ∈ C n+1 (Ix ) segue che g ∈ C n+1 (Ix ) ed ha n + 2 zeri distinti in Ix . Infatti
g(xi ) = 0, i = 0, . . . , n e g(x) = 0. Allora per il teorema di Rolle, g  ha n + 1 zeri e
cosı̀ via finché g (n+1) ha un solo zero, che indichiamo con ξ.
138 Appunti di Calcolo Numerico con codici in Matlab/Octave

(n+1) (n+1)
Ma rn (t) = f (n+1) (t) e ωn = (n + 1)! pertanto
(n + 1)!
g (n+1) (t) = f (n+1) (t) − rn (x) .
ωn (x)
Quando valutiamo questa espressione in t = ξ otteniamo il risultato richiesto. 
E SEMPIO 37. Calcoliamo l’errore d’interpolazione lineare, ovvero per n = 1. Dal

Teorema 5.12, r1 (x) = (x − x0 )(x − x1 ) f 2(ξ) , ξ ∈ (x0 , x1 ). Ora,
(x0 − x1 )2
max |(x − x0 )(x − x1 )| = .
x∈(x0 ,x1 ) 4
Se indichiamo con M2 = maxx∈(x0 ,x1 ) |f  (x)|, possiamo dare la seguente maggio-
razione

(x0 − x1 )2
|r1 (x)| ≤ M2 .
8
2 sin x
Ad esempio, per f (x) = tan(x), x ∈ [1.35, 1.36], sapendo che f  (x) = ,
cos3 x
troveremo |r1 (x)| ≤ 0.24 · 10−2 .

E SEMPIO 38. Per approssimare x̄, dove x̄ non è un quadrato perfetto, possiamo
interpolare come segue. Siano x0 , x1 , x2 i quadrati perfetti più vicini ad x̄, dei quali
consideriamo le loro radici. Si tratta quindi di costruire
√ il polinomio di grado 2, p2 (x),

interpolante i dati (xi , xi ), i = 0, 1, 2. Allora x̄ ≈ p2 (x̄).
Se x̄ = 0.6, consideriamo i tre punti
√ √ √
(0.49, 0.49 = 0.7), (0.64, 0.64 = 0.8), (0.81, 0.81 = 0.9)
ed il relativo polinomio√ d’interpolazione p2 (x). Il valore p2 (0.6) ≈ 0.774 ci darà
un’approssimazione di 0.6 (vedi Figura 5.3).
Circa l’errore che commettiamo, si tratta di stimare √ l’errore in [0.49, 0.81]. Ora
essendo ω2 (x) = (x−0.49)(x−0.64)(x−0.81), g(x) = x t.c. g (3) (x) = 8 √3x5 , l’errore
in modulo è
3
|r2 (x)| ≤ |ω3 (x)|  , ξ ∈ [0.49, 0.81] .
3! 8 ξ 5
Infine,
0.924 · 10−3
|r2 (0.6)| ≤  ≤ 0.35 · 10−3 .
16 (0.49)5

5.3 Errore d’interpolazione e fenomeno di Runge


Se xi = xi−1 + h, i = 1, . . . , n, con x0 dato e h > 0, si può provare che
 n 
&  hn+1
 
 (x − xi ) ≤ n! .
  4
i=0

La dimostrazione, per induzione, procede come segue.


5 - Interpolazione e approssimazione 139

Figura 5.3: La parabola dell’Esempio 38.

• Per n = 1, abbiamo due punti x0 , x1 distanti h. La funzione |(x−x0 )(x−x1 )|,


come visto nell’Esempio 37, è una parabola il cui massimo, nel vertice, vale
h2 /4. Questo prova il passo iniziale dell’induzione.
• Sia vera per n+1 punti, x0 , . . . , xn . Prendiamo un altro punto xn+1 . Avremo
&
n+1 &
n
hn+1 hn+2
| (x − xi )| = | (x − xi )| · |x − xn+1 | ≤ n! (n + 1)h = (n + 1)! .
 4 4
i=0 i=0 ind.

Pertanto l’errore d’interpolazione, per punti equispaziati, si maggiora come segue:


  hn+1
 
max |rn (x)| ≤ max f (n+1) (x) . (5.13)
x∈I x∈I 4(n + 1)
n+1
La disuguaglianza (5.13) ci dice che nonostante per h → 0, limh→0 4(n+1) h
= 0
l’errore non è detto vada a zero. Ciò dipende dall’ordine di infinito della derivata
hn+1
n + 1-esima rispetto al fattore 4(n+1) . Vediamolo su un esempio.

E SEMPIO 39. Per costruire il polinomio di grado n = 2 interpolante f (x) = ex+1


in [0, 1] su nodi equispaziati, dovremo consderare i punti x0 = 0, x1 = 0.5, x1 = 1.
Pertanto l’errore d’interpolazione si maggiorerà come segue
h3
R := max |r2 (x)| ≤ max (ex+1 )(3) .
x∈[0,1] 4 · 3 x∈[0,1]
Se si fanno i conti, arrotondando a 2 cifre decimali, risulta che R ≤ 0.08.


Riconsideriamo l’Esempio 34, ovvero la funzione di Runge:
1
g(x) = , x ∈ [−5, 5] (5.14)
1 + x2
140 Appunti di Calcolo Numerico con codici in Matlab/Octave

Sugli n + 1 punti equispaziati xi = −5 + i h, i = 0, ..., n, h = 10/n consideriamo il


polinomio d’interpolazione di grado n. Runge osservò che nonostante g ∈ C ∞ (R),
l’errore g(x) − pn (x) tende a crescere con n. In particolare dimostrò che se |x| >
3.63 il polinomio si discosta sempre più dalla funzione oscillando enormemente.
In Figura 5.4 si vede la funzione di Runge e il suo polinomio d’interpolazione di
grado 10 su nodi equispaziati e nodi di Chebyshev (che descriveremo oltre).

Figura 5.4: Funzione di Runge e polinomio d’interpolazione su nodi equispaziati


e di Chebyshev.

• Prima domanda: come evitare il fenomeno di Runge?


Una prima risposta è quella di usare i punti di Chebyshev invece dei punti
equispaziati. In [−1, 1] i nodi di Chebyshev sono gli zeri del polinomio or-
togonale di Chebsyhev (di prima specie) di grado n, Tn (x) = cos(n arccos x).
5 - Interpolazione e approssimazione 141

Infatti risolvendo Tn (x) = 0 si ha arccos x = (2k − 1) 2n


π
, k = 1, . . . , n, da cui
i punti

(C) 2k − 1 π
xk = cos , k = 1, . . . , n . (5.15)
n 2

– Si tratta di punti distinti ed interni all’intervallo [−1, 1].


– Osserviamo che, se invece di [−1, 1] consideriamo il generico intervallo
[a, b], allora applicando la trasformazione lineare che manda l’intervallo
[−1, 1] in [a, b] i punti corrispondenti sono

a + b b − a (C)
xk = + xk
2 2
(C)
dove xk sono i nodi di Chebsyehv in [−1, 1]. In alcuni testi (vedasi
ad es. [25, p. 78]) si considerano come nodi di Chebyshev i punti di
(CL)
Chebyshev-Lobatto, xk = cos(kπ/n), k = 0, . . . , n, che includono
pure gli estremi dell’intervallo.

Da un punto di vista geometrico, i punti di Chebyshev sono le proiezioni


sull’intervallo [−1, 1] dei punti equispaziati sul semicerchio di diametro [−1, 1]
(vedasi Figura 5.5). Come si vede dal grafico, se prendiamo 2 punti a e b di
[−1, 1] ottenuti come proiezione di punti equispaziati sul semicerchio, vale
la relazione
| arccos(a) − arccos(b)| = |θa − θb | = cost .
Questo dice che i punti di Chebyshev hanno la distribuzione dell’arcocoseno.

Figura 5.5: 10 punti di Chebyshev.


142 Appunti di Calcolo Numerico con codici in Matlab/Octave

• Seconda domanda: perchè i punti di Chebyshev sono migliori di quelli


equispaziati?
Una prima risposta è grafica (vedasi Figura 5.4)... ma non basta! Nella
prossima sessione presenteremo una risposta matematicamente più for-
male basata sullo studio della costante di Lebesgue.

Osservazione. Oltre ai punti di Chebsyshev, esistono i punti di Fekete, che ven-


gono definiti come i punti che massimizzano il determinante di Vandermonde,
e le sequenze di Leja. Entrambi questi insiemi di nodi, hanno la distribuzione
asintotica dell’arcocoseno. Per maggiori dettagli sui punti di Fekete, loro pro-
prietà e aspetti computazionali si rimanda i recenti articoli [4, 5]. Per dettagli
sulle sequenze di Leja e le loro applicazioni si rimanda all’articolo [12] nonché
all’Appendice C.

5.3.1 La costante di Lebesgue


Indichiamo con X la matrice triangolare inferiore di dimensione infinita, i cui
elementi xi,j sono punti appartenenti all’intervallo [a, b]. Inoltre per ogni n ≥ 0,
la riga n-esima ha n + 1 elementi (corrispondenti ai punti su cui costruiremo
il polinomio d’interpolazione di grado n). Sia pfn (x) il polinomio di grado n che
interpola la funzione f usando gli n + 1 nodi della n-esima riga di X.
Fissata X e la funzione f , indichiamo con

En,∞ (X) = f − pfn ∞ , n = 0, 1, .... (5.16)

l’errore in norma infinito tra f e il suo polinomio d’interpolazione. Indichiamo


con p∗n ∈ Pn il polinomio di migliore approssimazione uniforme di grado n di f
per il quale consideriamo

En∗ = f − p∗n ∞ ≤ f − qn ∞ , ∀ qn ∈ Pn . (5.17)

Teorema 23. Sia f ∈ C[a, b] e X come prima. Allora

En,∞ (X) ≤ (1 + Λn (X))En∗ , n = 0, 1, . . . (5.18)

con
n
Λn (X) = max |li (x)|
x∈[a,b]
i=0

che si chiama costante di Lebesgue.

Osservazioni.

• Il polinomio di migliore approssimazione, se esiste, è unico (cfr. ad esempio


[9, 28]).

• È facile provare che Λn (X) ≥ 1.


5 - Interpolazione e approssimazione 143

Dal Teorema 23, En∗ dipende solo dalla regolarità di f e quindi è indipendente
dall’insieme dei punti d’interpolazione X, mentre non lo è Λn (X). Pertanto se
desideriamo diminuire l’errore d’interpolazione la scelta del vettore dei nodi è
fondamentale (per diminuire il valore di Λn ). Si dimostra (vedi ad esempio [28])
che la crescita asintotica (ovvero per n → ∞) della costante di Lebesgue per nodi
equispaziati Xe e nodi di Chebyshev Xc è :
2n+1
Λn (Xe ) ≈
n e loge n
2
Λn (Xc ) ≈ loge (n + 1) .
π
In entrambi i casi per n → ∞ la costante di Lebesgue tende ad infinito, ma per
i nodi di Chebyshev la crescita è logaritmica invece che esponenziale. Inoltre,
è stato dimostrato da Bernstein (1918) che, per ogni n ≥ 1, Λn (Xc ) ≤ σ(n) con
σ(n) = π2 log(n + 1) + 1 .
Per avere un’idea dell’andamento della costante di Lebesgue per punti di
Chebyshev, in Tabella 5.1 sono riportati alcuni valori di Λn (Xc ) e di σ(n) (ar-
rotondati alla terza cifra decimale). I valori di Λn (Xc ) sono stati calcolati con la
funzione CostLebesgue.m (vedi appendice C).

n Λn (Xc ) σ(n)
2 1.189 1.699
5 1.828 2.141
10 2.232 2.527
15 2.412 2.765
20 2.477 2.938

Tabella 5.1: Confronti dei valori della costante di Lebesgue per punti di Chebsy-
shev e della funzione σ(n)

Come ultima osservazione, i nodi di Chebyshev sono nodi quasi-ottimali. In-


fatti, sempre in [28, pag. 101], si osserva che esiste un’insieme X ∗ di nodi ottimali
anche se il loro calcolo non è semplice. Ma, come provato da L. Brutman in SIAM
J. Numer. Anal. 15 (1978), l’insieme dei nodi di Chebsyhev estesi (o espansi),
4 (C)
8
xk
T̂ = x̂k = , k = 1, . . . , n
cos(π/2n)
che si ottengono dai punti di Chebyshev tramite dilatazione (vedi Fig. 5.6), è
utile per tutti gli usi più frequenti e quindi essi possono essere considerati come
nodi “ottimali“ sull’intervallo.

5.3.2 Stabilità dell’interpolazione polinomiale


Dati (xi , f (xi )), i = 0, . . . , n, invece dei valori f (xi ) consideriamo dei valori per-
˜
turbati f˜(xi ). Indichiamo con pfn il polinomio di grado n che interpola (xi , f˜(xi )),
144 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 5.6: 10 punti di Chebyshev (o) e Chebyshev estesi (*) in [−1, 1].

i = 0, . . . , n. Allora,
 
 n 
˜ 
pfn − pfn ∞ = max  lj (x) f (xj ) − f˜(xj )  (5.19)
x∈[a,b]  
j=0
n
≤ max |lj (x)| max |f (xi ) − f˜(xi )| . (5.20)
x∈[a,b] 0≤i≤n
j=0
n
Essendo Λn (X) := maxx∈[a,b] j=0 |lj (x)|, con X = {x0 , . . . , xn }, la costante di
Lebesgue si può interpretare come il numero di condizionamento del problema
d’interpolazione polinomiale.
E SEMPIO 40. Consideriamo la funzione f (x) = sin(2πx), x ∈ [−1, 1] che desideriamo
interpolare su 22 nodi equispaziati. Consideriamo poi i valori perturbati f˜(xi ) tali
che
δ := max |f (xi ) − f˜(xi )| ≈ 4.5 10−2 .
0≤i≤21
˜
Costruiamo pf21
e pf21 .
Mediante la (5.20) otteniamo la stima Λ21 ≈ 4500. Ovvero
il problema è sensibile alle perturbazioni (che ritroviamo soprattutto nei punti di
massima oscillazione della funzione).

5.4 Polinomio interpolante in forma di Newton


Si può esprimere il polinomio di interpolazione di grado n della funzione f , pfn (x),
in forma di Newton:
pfn (x) = b0 + b1 (x − x0 ) + b2 (x − x0 )(x − x1 ) + · · · + bn (x − x0 ) · · · (x − xn−1 ) ,
dove bi rappresenta la differenza divisa di ordine i della funzione f . Per com-
prendere come costruire sifatto polinomio, dobbiamo dapprima introdurre le dif-
ferenze divise di una funzione.
5 - Interpolazione e approssimazione 145

Figura 5.7: Funzione dell’Esempio 40

5.4.1 Differenze divise e loro proprietà


Definizione 19. Dati n + 1 punti distinti x0 , . . . , xn e i valori yi = f (xi ), la
differenza divisa di ordine 0 della funzione f è f [xi ] = f (xi ), la differenza divisa
f [xi+1 ] − f [xi ]
di ordine 1 è f [xi , xi+1 ] = e ricorsivamente, la differenza di ordine
xi+1 − xi
k è
f [xi+1 , . . . , xi+k ] − f [xi , . . . , xi+k−1 ]
f [xi , . . . , xi+k ] = . (5.21)
xi+k − xi

1. La differenza divisa di ordine k + 1 di un polinomio di grado k è identica-


mente nulla. Vediamolo su un esempio.

E SEMPIO 41. Consideriamo i punti {−1, 2, 3, 5} e f (x) = x2 + 1. La tabella


delle differenze divise è la seguente

xi yi ordine 1 ordine 2 ordine 3


-1 2
2 5 1
3 10 5 1
5 26 8 1 0

Tabella 5.2: Differenze divise della funzione x2 + 1


146 Appunti di Calcolo Numerico con codici in Matlab/Octave

2. La differenza divisa di ordine n, si esprime come


n
f (xj )
f [x0 , . . . , xn ] = (−1)j ) . (5.22)
j=0 i=0,i>j (xi − xj )

Questa proprietà deriva dalla cosidetta forma determinantale delle differenze


divise. Se prendiamo infatti l’insieme di punti distinti X = {xi , i = 0, . . . , n}
e indichiamo con
QX (g0 , . . . , gn ) = (gj (xi ))i,j=0,...,n
la matrice i cui elementi sono le valutazioni delle funzioni gj nei punti xi ,
si ha

f [x0 , . . . , xn ] = detQX (1, x, . . . , xn−1 , f )/detQX (1, x, . . . , xn−1 , xn ) . (5.23)

3. Le differenze divise sono invariati rispetto all’ordine dei nodi. Ovvero

f [x0 , . . . , xk ] = f [xi0 , . . . , xik ] (5.24)

dove (i0 , . . . , ik ) è una qualsiasi permutazione di (0, . . . , k). Questa proprietà


è una diretta conseguenza della formula (5.22).

Di tutte le predette proprietà, il lettore curioso può trovare la dimostrazione ad


esempio in [2, pag. 384 e ss.].
Possiamo osservare che il polinomio

pfn (x) = f [x0 ] + f [x0 , x1 ](x − x0 ) + · · · + f [x0 , . . . , xn ](x − x0 ) · · · (x − xn−1 ) (5.25)

è interpolante la funzione f (x) nei punti xi : infatti pn (xi ) = f (xi ). Per l’unicità
del polinomio d’interpolazione possiamo dire che esso è il polinomio d’interpolazione!
La (5.25) è detta la forma di Newton del polinomio d’interpolazione che potremo
riscrivere più semplicemente come

pfn (x) = b0 + b1 (x − x0 ) + b2 (x − x0 )(x − x1 ) + · · · + bn (x − x0 ) · · · (x − xn−1 ) , (5.26)

dove bi rappresenta la differenza divisa di ordine i della funzione f .

5.4.2 Algoritmo delle differenze divise


Per determinare i coefficienti bi , i = 0, ..., n in (5.26), l’algoritmo delle differenze
divise è descritto nella funzione DiffDivise.m (cfr. Appendice C).
Alla fine, il valore del polinomio pn in x, si determina con lo schema di Hörner:

p = bn ; (5.27)
p = (x − xi )p + bi , i = n − 1, ..., 0
5 - Interpolazione e approssimazione 147

L’errore d’ interpolazione si può esprimere usando le differenze divise di or-


dine n + 1 della funzione f . Ricordando che per l’errore vale
' n (
& f (n+1) (ξ)
En (f ) = f (x) − pn (x) =
f
(x − xi ) . (5.28)
i=0
(n + 1)!

facciamo ora vedere il legame esistente con le differenze divise. Vale il seguente
risultato:
Proposizione 10. Se f ∈ C n+1 (I), allora

f (n+1) (ξ)
= f [x0 , ..., xn , x] , (5.29)
(n + 1)!

con ξ punto che appartiene al più piccolo intervallo che contiene x0 , . . . , xn , x.


Dim. Dati x0 , . . . , xn e i valori corrispondenti della funzione f (xi ), i = 0, ..., n,
indichiamo con pfn il polinomio d’interpolazione. Preso poi un punto x, diverso dai
punti xi , che consideriamo come un altro punto xn+1 d’interpolazione, costruiamo
pfn+1 . Grazie alla formula di Newton dell’interpolante

pfn+1 (t) = pfn (t) + (t − x0 ) · · · (t − xn )f [x0 , . . . , xn , t] .

Per t = x, pfn+1 (x) = f (x), da cui

En (x) = f (x) − pfn (x) = pfn+1 (x) − pfn (x) (5.30)


= (x − x0 ) · · · (x − xn )f [x0 , . . . , xn , x]
= ωn+1 (x)f [x0 , . . . , xn , x] .

Essendo f ∈ C n+1 (I) (poiché x è un punto d’interpolazione) e ricordando che

f (n+1) (ξ)
En (x) = (x − x0 ) · · · (x − xn ) , (5.31)
(n + 1)!

dal confronto di (5.30) e (5.31) si conclude. 



5.4.3 Formula di Hermite-Genocchi per le differenze divise


Questa formula è interessante perchè permette di estendere la forma di Newton
dell’interpolante anche al caso di punti ripetuti.
Teorema 24. Siano dati n + 1 punti distinti x0 , x1 , ..., xn e sia f ∈ C n (I) con I il
più piccolo intervallo che li contiene. Allora

f [x0 , x1 ..., xn ] = f (n) (x0 t0 + · · · + xn tn )dt1 dt2 . . . dtn , (5.32)
τn
148 Appunti di Calcolo Numerico con codici in Matlab/Octave

dove t0 = 1 − (t1 + t2 + ... + tn ) e l’integrale è fatto sul simplesso


4 n
8
τn = (t1 , t2 , . . . , tn ) : ti ≥ 0, ti ≤ 1 .
i=1

n
Dim. Come prima cosa, osserviamo che t0 ≥ 0 e i=0 ti = 1.
La dimostrazione di (5.32) si fa per induzione su n.

1. Se n = 1, τ1 = [0, 1]. L’equazione (5.32) diventa


 1  1
f  (t0 x0 + t1 x1 )dt1 = f  (x0 + t1 (x1 − x0 ))dt1
0 0
1
= f (x0 + t1 (x1 − x0 ))|tt11 =1
=0
x1 − x0
f (x1 ) − f (x0 )
= = f [x0 , x1 ] .
x1 − x0

2. Nel caso n = 2, τ2 è il triangolo di vertici (0, 0), (1, 0), (0, 1).

f  (t0 x0 + t1 x1 + t2 x2 )dt1 dt2 =
τ2
 1  1−t1
= f  (x0 + t1 (x1 − x0 ) + t2 (x2 − x0 ))dt2 dt1
0 0
 1
1
= f  (x0 + t1 (x1 − x0 ) + t2 (x2 − x0 ))|tt22 =1−t
=0
1
dt1
0 x2 − x0
 1
1
= f  (x2 + t1 (x1 − x2 ))dt1 −
x2 − x0 0
 1 9

− f (x0 + t1 (x1 − x0 ))dt1
0
1
= {f [x1 , x2 ] − f [x0 , x1 ]} = f [x0 , x1 , x2 ] .
x2 − x0

3. Nel caso generale si integrerà prima rispetto ad una variabile per ridurre
la dimensione, quindi per ipotesi induttiva si conclude.

Questo conclude la dimostrazione.


Nel caso in cui tutti punti ”collassano” in x0 (ciò ha senso poichè la funzione
f [x0 , ..., xn ] è continua nelle sue variabili) usando le proprietà delle differenze
divise avremo

f [x0 , ..., x0 ] = f (n) (x0 )dt1 · · · dtn = f (n) (x0 ) · Voln (τn )
   τn
n+1 volte
5 - Interpolazione e approssimazione 149

ove Voln (τn ) indica il volume n-dimensionale del simplesso τn . Ora, ricordando
1
la relazione Voln (τn ) = si ottiene la formula
n!

f (n) (x0 )
f [x0 , . . . , x0 ] = . (5.33)
   n!
n+1 volte

La proprietà (5.33) possiamo applicarla nel seguente semplice esercizio.



E SERCIZIO 64. Stimare le differenze divise di ordine 3 della funzione f (x) = 1 + x2
sui punti {0, 1, 1, 2}, arrotondandone il risultato a 2 cifre decinmali.

O SSERVAZIONE . Se di una funzione f (x) si conoscono il valore in un punto


x0 e i valori delle derivate fino all’ordine k in x0 , la tabella delle differenze divise
f  (x0 )
è la Tabella 5.3. dove f [x0 , x0 ] = f  (x0 ), f [x0 , x0 , x0 ] = e f [x0 , . . . , x0 ] =
2   
k+1 volte

x0 f [x0 ] f [x0 , x0 ] → f [x0 , x0 , x0 ] ... f [x0 , . . . , x0 ]


  
k+1 volte
x0 f [x0 ] f [x0 , x0 ] !
.. .. ..
. . .
.. .. ..
. . . f [x0 , x0 , x0 ]
x0 f [x0 ] f [x0 , x0 ]

Tabella 5.3: Tabella delle differenze divise per un punto ripetuto k + 1 volte

f (k) (x0 )
. In questo caso quindi il polinomio d’interpolazione in forma Newton
k!
coinciderà con la formula di Taylor.

5.5 Interpolazione di Hermite


Il polinomio osculatore di Hermite (dal latino, osculare che significa baciare) è
quel polinomio p2n+1 (x), di grado 2n + 1 costruito usando n + 1 distinti xi , i =
0, ..., n che soddisfa le 2n + 2 condizioni

p2n+1 (xi ) = f (xi ), p2n+1 (xi ) = f  (xi ) , i = 0, . . . , n . (5.34)

In forma di Lagrange, il polinomio osculatore di Hermite si scrive come segue:


n n
p2n+1 (x) = ui (x)f (xi ) + vi (x)f  (xi ) (5.35)
i=0 i=0
150 Appunti di Calcolo Numerico con codici in Matlab/Octave

dove i polinomi ui (x) e vi (x) sono funzioni dei polinomi elementari di Lagrange,
ovvero

ui (x) = [1 − li (xi )(x − xi )]li2 (x), (5.36)


vi (x) = (x − xi )li2 (x) . (5.37)

È facile verificare che i polinomi ui (x) e vi (x) hanno grado 2n+1 e per essi valgono
le condizioni

ui (xk ) = δi,k ,

vi (xk ) = 0, ui (xk ) = 0, ∀ k
vi (xk ) = δi,k .

Ne segue che il polinomio (5.35) ha grado ≤ 2n + 1 e soddisfa le condizioni


d’interpolazione (5.34).
Il polimomio (5.35) si può costruire anche in forma di Newton mediante la
seguente tabella delle differenze divise: dove f [xi , xi ] = f  (xi ), i = 0, ..., n. Per

x0 f [x0 ]
f [x0 , x0 ]
x0 f [x0 ] f [x0 , x0 , x1 ]
..
f [x0 , x1 ] .
x1 f [x1 ] f [x0 , x1 , x1 ]
f [x1 , x1 ]
.. ..
x1 f [x1 ] . . f [x0 , x0 , . . . , xn , xn ]
..
.
.. .. ..
. . . f [x0 , x0 , xn ]
f [xn−1 , xn ]
xn f [xn ] f [x0 , xn , xn ]
f [xn , xn ]
xn f [xn ]

Tabella 5.4: Tabella delle differenze divise per l’interpolazione di Hermite

suggerimenti implementativi del polinomio osculatore di Hermite in forma di


Newton, rimandiamo all’Esercizio 72.
Possiamo anche estendere la formula dell’errore d’interpolazione,(5.12) o (5.28),
al caso in cui il polinomio sia costruito su nodi non necessariamente distinti.

Teorema 25. Se f (x) ∈ C n+1 [a, b], esiste un punto ξ = ξ(x) ∈ (a, b) tale che

f (n+1) (ξ)
f [x0 , x1 , . . . , xn , x] = . (5.38)
(n + 1)!
5 - Interpolazione e approssimazione 151

Se f (x) ∈ C n+2 [a, b], esiste un punto η = η(x) ∈ (a, b) tale che

d f (n+2) (η)
f [x0 , x1 , . . . , xn , x] = . (5.39)
dx (n + 2)!

Infine, se i punti x0 , . . . , xn , x sono tutti coincidenti allora ξ = η = x.

Dim. Applicando il teorema della media integrale alla funzione f [x0 , x1 , . . . , xn , x]


espressa mediante la formula di Hermite-Genocchi, si ha
 1  t1  tn
(n+1)
f [x0 , x1 , . . . , xn , x] = f (ξ) dt1 dt2 . . . dtn
0 0 0

da cui deriva immediatamente la (5.38). La (5.39) si ottiene in maniera analoga


osservando che
d
f [x0 , x1 , . . . , xn , x] = f [x0 , x1 , . . . , xn , x, x] .
dx

Questo conclude la dimostrazione. 

5.6 Algoritmo di Neville


Dati a, b, estremi dell’intervallo di interpolazione, n il numero dei nodi di interpo-
lazione, x, y array di dimensione n che contengono i nodi equispaziati e il valore
della funzione f = (f (x0 ), . . . , f (xn )) nei nodi equispaziati xi = a + (b − a) ni , i =
0, ..., n. Posto yi = f (xi ), indichiamo con x ∈ [a, b] il punto su cui valutare il
polinomio interpolante allora il polinomio interpolante in x è ottenuto con la
seguente formula iterativa, nota come schema d’interpolazione di Neville:

pi = yi , i = 0, . . . , n;

allora
p1,...,k (x)(x − x0 ) − p0,...,k−1 (x)(x − xk )
p0,...,k (x) = (5.40)
xk − x0
è il polinomio d’interpolazione su x0 , . . . , xk . Pertanto alla fine, p0,1,...,n (x) rappre-
senterà il valore in x del polinomio d’interpolazione di grado n costruito mediante
l’uso dei punti (xi , yi ).
Il vantaggio di questa tecnica, è che il polinomio d’interpolazione viene costru-
ito come una successione di polinomi di grado crescente, per cui il procedimento
si arresterà quando è raggiunto il grado richiesto.
In Tabella 5.5 riportiamo lo schema triangolare di Neville nel caso cubico.
Come si può facilmente verificare, i polinomi della prima riga p0,...,s , s = 0, . . . , 3
hanno grado crescente da 0 a 3.
152 Appunti di Calcolo Numerico con codici in Matlab/Octave

x0 y0 p0,1 (x) p0,1,2 (x) p0,1,2,3 (x)


x1 y1 p1,2 (x) p1,2,3 (x)
x2 y2 p2,3 (x)
x3 y3

Tabella 5.5: Schema di Neville, per n = 3.

E SERCIZIO 65. Si valuti il polinomio di Neville di grado 3 ≤ n ≤ 10, inter-


polante la funzione
sin(x)
f (x) = , x ∈ [0, 2π],
(1 + ex )
su punti dell’intervallo e si determini anche l’errore d’interpolazione. Fare
il grafico della funzione, dell’interpolante di Neville e quello dell’errore al
variare di n.

5.7 Interpolazione polinomiale a tratti: cenni


L’idea sottostante a questa tecnica è di limitare il grado del polinomio di interpo-
lazione aumentando la flessibilità dell’interpolante.
:n
Si parte da una suddivisione Δ = i=1 Ii , dove Ii è il generico sottointervallo
in cui si è suddiviso l’intervallo [a, b], e si opera un’approssimazione polinomi-
ale di grado basso su ogni sottointervallo Ii . Rispetto all’interpolazione (globale)
su tutto l’intervallo, pur perdendo in regolarità, questa tecnica migliora la de-
scrizione della funzione da approssimare.
È assai diffuso l’uso dell’ interpolazione lineare a tratti che genera una fun-
zione che si presenta come un segmento di retta su ogni sottointervallo e come
una spezzata sull’intero intervallo dove risulta continua ma non necessariamente
derivabile. Dati i punti x0 , . . . , xn (non necessarimente equispaziati) di I = [x0 , xn ]
e i valori f (xi ), i = 0, . . . , n, indichiamo con Ii = [xi , xi+1 ] l’i-esimo intervallino.
Su ognuno degli n sotto-intervalli Ii , i = 0, ..., n − 1, iniziamo con l’approssimare
f con un polinomio lineare a tratti. Ovvero, su Ii , costruiamo
f (xi+1 ) − f (xi )
pf1,hi (x) = f (xi ) + (x − xi ) , (5.41)
xi+1 − xi

dove l’indice hi in pf1,hi ci ricorda che gli intervallini non hanno tutti la stessa
ampiezza.
Posto H = max0≤i≤n−1 hi , vale il seguente risultato.
Proposizione 11. Se f ∈ C 2 (I), allora
H2
max |f (x) − pf1,H (x)| ≤ max |f  (x)| . (5.42)
x∈I 8 x∈I
5 - Interpolazione e approssimazione 153

La proposizione dice che se f è sufficientemente regolare allora il polinomio


lineare e continuo a tratti converge alla funzione con H → 0.
Facciamo notare come le funzioni fplot e plot di Matlab costruiscano proprio
l’interpolante lineare a tratti.

E SEMPIO 42. Consideriamo i valori della funzione sin nei punti equispaziati xi =
i, i = 0, ..., 10. Usando le seguenti istruzioni Matlab/Octave, facciamo vedere come
plot produca l’interpolante lineare a tratti (vedasi Figura 5.8).

x=1:10; y=sin(x);
xx=0:0.01:10; yy=sin(xx);
plot(x,y,’-’,xx,yy,’:r’)

Figura 5.8: Funzione seno (linea punteggiata) e la sua interpolante lineare a


tratti (linea continua)

La generalizzazione dell’interpolante lineare a tratti è l’interpolazione poli-


nomiale (continua) a tratti.

Definizione 20. s è un polinomio continuo a tratti in [a,b] di grado k se s ∈ C[a, b]


e se esistono dei punti ξi , i = 0, ..., n a = ξ0 < ξ1 < · · · < ξn = b cosicché s è un
polinomio di grado ≤ k su ciascun intervallino [ξi , ξi+1 ], i = 0, ..., n − 1 .

Nella sezione che segue introdurremo brevemente le funzioni splines polino-


miali che rappresentano tuttora uno degli strumenti più flessibili, sia in termini
di ordine di approssimazione che di efficienza computazionale, per l’approssimazione
sia di funzioni che di dati. In pratica le funzioni splines sono un ottimo compro-
messo per chi desidera un strumento matematico sufficientemente duttile, effi-
ciente e preciso per approssimare e/o interpolare.
154 Appunti di Calcolo Numerico con codici in Matlab/Octave

5.8 Esercizi proposti

E SERCIZIO 66. Si consideri la funzione

f (x) = log(2 + x) , x ∈ [−1, 1] .

Indichiamo con pn il polinomio di interpolazione di grado ≤ n costruito us-


ando i punti
2k + 1
xk = cos π , k = 0, 1, ..., n
2n
noti come punti di Chebysehv. Sotto tale ipotesi, è noto che l’errore di interpo-
lazione si può maggiorare come segue:

f (n+1) ∞ −n
f − pn ∞ ≤ 2 . (5.43)
(n + 1)!

1. Nel caso n = 4, si determini una maggiorazione dell’errore usando la


(5.43).
2. Nel caso in cui il polinomio di interpolazione, sia invece scrivibile in
forma in Taylor come

f  (0) f  (0) 2 f (n) (0) n


tn (x) = f (0) + x+ x + ··· + x , (5.44)
1! 2! n!
l’errore nel generico punto x si esprime come

f (n+1) (ξ) n+1


f (x) − tn (x) = x , −1 < ξ < 1 .
(n + 1)!

Determinare una maggiorazione di

f − t4 ∞ = max |f (x) − t4 (x)| ,


−1≤x≤1

e confrontare il risultato con quello ottenuto nel caso dei punti di Cheby-
shev.
3. Facoltativo: Plottare in un unico grafico, f (x), p4 (x) e t4 (x).
20
E SERCIZIO 67. Si consideri la funzione f (x) = x + ex + − 5 ristretta
1 + x2
all’intervallo [−2, 2].
1. Determinare il polinomio d’interpolazione di grado 5 in forma di New-
ton sui nodi equispaziati xk = −2 + kh, k = 0, ..., 5.
2. Calcolare l’errore d’interpolazione in un generico punto x ∈ (−2, 2).
5 - Interpolazione e approssimazione 155

3. Ripetere i calcoli usando i punti di Chebyshev.


E SERCIZIO 68. Calcolare la costante di Lebesgue sui punti equispaziati
{0, 0.5, 1}.
E SERCIZIO 69. Stimare le differenze divise di ordine 3 della funzione f (x) =

2 + x2 nei punti {0, 1, 1, 2} (arrotondare il risultato a 2 cifre decimali).
20
E SERCIZIO 70. Si consideri la funzione f (x) = −5 sin(ex ) ristretta
1 + log(x2 )
all’intervallo [1, 2]. Determinare l’unico polinomio (d’interpolazione) di sec-
ondo grado, p2 (x) = a0 + a1 x + a2 x2 tale che
 2  2
p2 (1) = f (1), p2 (2) = f (2), p2 (x)dx = f (x)dx .
1 1
Per il calcolo dell’integrale della funzione usare la funzione quadl di Matlab,
con tolleranza di 1.e − 6. Fare quindi il grafico della funzione, del polinomio
e di f − p2 ∞ .
E SERCIZIO 71. Si consideri la funzione f (x) = cos(x3 ) (x − 2 π) e−x , x ∈
[0, π]. Sperimentalmente si determini il grado del polinomio d’interpolazione,
costruito sui nodi di Chebsyhev in [0, π], che approssima f (x) in norma in-
finito a meno di tol = 1.e − 4.
E SERCIZIO 72. È noto che se f ∈ C 1 [a, b] e x0 , ..., xn sono n + 1 punti distinti
esiste un unico polinomio di grado 2n + 1 che interpola f (x) e f  (x) nei punti
xi . Tale polinomio è quello di Hermite
n 2 3
H2n+1 (x) = f (xi )Hn,i (x) + f  (xi )Ĥn,i (x) , (5.45)
i=0

con Hn,i (x) e Ĥn,i (x) polinomi di Hermite di grado n, definiti come
; <
Hn,i (x) = 1 − 2(x − xi )Ln,i (xi ) L2n,i (x)
Ĥn,i (x) = (x − xi )L2n,i (x)
ove Ln,i (x) è l’i-esimo polinomio di Lagrange di grado n.
Implementare (5.45) è computazionalmente costoso. Si può alternativa-
mente usare lo schema di interpolazione nella forma di Newton nel seguente
modo. Si considerano i punti
{z0 , z1 , z2 , z3 , ..., z2n+1 } = {x0 , x0 , x1 , x1 , ..., xn , xn }
e i corrispondenti valori della funzione f e della sua derivata prima f  nei
punti, cosicchè il polinomio H2n+1 (x) si può scrivere nella forma equiva-
lente
H2n+1 (x) = q0,0 + q1,1 (x − x0 ) + q2,2 (x − x0 )2 + q3,3 (x − x0 )2 (x − x1(5.46)
)
2 2
+ q4,4 (x − x0 ) (x − x1 ) +
+ · · · + q2n+1,2n+1 (x − x0 )2 (x − x1 )2 · · · (x − xn−1 )2 (x − xn ) .
156 Appunti di Calcolo Numerico con codici in Matlab/Octave

Il problema è quindi ricondotto a determinare i coefficienti qi,i , come per


lo schema di interpolazione di Newton. In pratica q0,0 = f [z0 ], q1,1 = f [z0 , z1 ]
ecc..
Sia Algoritmo 1 lo schema alle differenze divise che calcola i suddetti
coefficienti, restituendo l’array (q0,0 , q1,1 , ...., q2n+1,2n+1 ).
Scrivere un programma Matlab/Octave che implementa l’Algoritmo 1
e costruisce il polinomio di interpolazione di Hermite mediante (5.46). Si
consideri f (x) = sin(ex − 2), x ∈ [0, 2].
Produrre anche il grafico di f e del polinomio interpolante.
Qual è il massimo errore tra la funzione e l’interpolante? L’errore ha
analogie con l’errore d’interpolazione classico (solo sui dati)?
5 - Interpolazione e approssimazione 157

5.9 Funzioni Spline


Per avere un quadro completo dell’argomento, che richiederebbe una trattazione
molto più estesa, rinviamo il lettore interessato alla fondamentale monografia di
Carl de Boor [10] oppure al più recente e compatto volume ad opera dell’autore
[11].
Definizione 21. Si dice che s è una funzione spline di grado k se oltre ad essere un
polinomio di grado k è C k−1 [a, b]. In tal caso i punti xi , i = 1, ..., n − 1 vengono detti
nodi (interni).
Notazione: S(k; x0 , x1 , ..., xn ) è lo spazio lineare delle splines di grado k.
Una spline si può scrivere
k n−1
1
s(x) = c j xj + dj (x − xj )k+ , x ∈ [a, b]. (5.47)
j=0
k! j=1

La funzione (x − xj )k+ si chiama potenza troncata ed è definita come segue:

(x − xj )k x > xj
(x − xj )k+ = .
0 x ≤ xj

In (5.47) ci sono k + n parametri (cj e dj ), ciò implica che lo spazio delle splines
di grado k ha dimensione n + k.
E SEMPIO 43. Le splines cubiche, che sono anche le più usate, si ottengono per k =
3. Il comando Matlab/Octave spline costruisce proprio splines cubiche. Vedremo
nel paragrafo 5.9.3 come costruire splines cubiche interpolanti imponendo diverse
condizioni sui nodi di bordo.

Ordine di approssimazione: se f ∈ C k+1 [a, b] e se n (numero nodi) è variabile,


allora si prova che
min f − s = O(hk+1 )
s∈S(k;ξ0 ,ξ1 ,...,ξn )

con h = max |xi+1 − xi |.


1≤i≤n−1

5.9.1 B-splines
Sia {x1 , x2 , ..., xn } (o {xi }+∞
i=−∞ ) una sequenza finita (o infinita) crescente di nu-
meri reali (xi < xi+1 ), detti nodi che per ora assumiamo distinti.
Definizione 22. La i-esima B-Spline di ordine k, che si indica con B(x; xi , ..., xi+k )
(grado k − 1) è la k-esima differenza divisa della potenza troncata p(x; t) = (x −
t)k−1
+
B(x; xi , ..., xi+k ) = (xi+k − xi )p[xi , ..., xi+k ](x) ,
dove con p[·](x) si è indicata la k-esima differenza divisa costruita sui nodi xi , xi+1 ,
..., xi+k di p(x; ·) vista come funzione di x.
158 Appunti di Calcolo Numerico con codici in Matlab/Octave

Nota. Per capire meglio questa definizione, suggeriamo di costruirsi le B-


splines lineari, ovvero per k = 2.

Proposizione 12. Alcune proprietà delle B-Splines.

• Bi,k (x) = 0 se x ∈ (xi , xi+k ].

• Bi,k > 0 nel suo supporto [xi , xi+k )


∞
• ∀x ∈ R, i=−∞ Bi,k (x) = 1 o equivalentemente

Bi,k (x)dx = 1 .
R

Le B-splines sono quindi a supporto compatto, positive e formano una par-


tizione dell’unità.
Relazione di ricorrenza. Si basa sulla regola di Steffensen per la differenza
divisa del prodotto di due funzioni f e g, nota come regola di Steffensen.

Proposizione 13. Siano f e g due funzioni sufficientemente differenziabili e i


punti x1 ≤ ... ≤ xn+1 siano dati. Allora

n+1
(f · g)[x1 , ..., xn+1 ] = f [x1 , ..., xj ]g[xj , ..., xn+1 ] (5.48)
j=1

Pertanto, se riscriviamo la funzione potenza p(x; t) = (x − t)k+ come il prodotto


delle funzioni f (x) = (x − t) e g(x) = (x − t)k−1
+ , possiamo applicare la regola
di Steffensen per ottenere la seguente relazione di ricorrenza (utile ai fini com-
putazionali!) per le B-splines

xi+l − x x − xi
Bi,l (x) = Bi+1,l−1 (x) + Bi,l−1 (x) . (5.49)
xi+l − xi xi+l−1 − xi

dove l indica l’ordine (=grado +1), i l’indice di intervallo. La relazione si in-


nesca a partire da Bi,1 (x) = 1 se x ∈ [ξi , ξi+1 ].
In Figura 5.9, sono rappresentate le B-splines di ordine 3 (quadratiche). La
suddivisione su cui sono costruite ha il secondo nodo doppio e l’ultimo nodo con
molteplicità pari 3. Vedremo nel prossimo paragrafo che scegliendo i nodi multi-
pli, le B-splines e di conseguenza la risultante spline, diventano via via meno re-
golari. In particolare se il nodo ha molteplicità pari all’ordine, la B-spline diventa
discontinua, come in Fig. 5.9 nel caso della prima B-spline (dall’alto) costruita
sui nodi [4, 6, 6, 6]: infatti essa risulta discontinua in 6. La funzione ricorsiva
bspline.m in Appendice C, consente di calcolare la i-esima B-spline di ordine k,
data una partizione xi di nodi, nel generico punto x.
5 - Interpolazione e approssimazione 159

Figura 5.9: Bsplines di ordine 3 (quadratiche).

Figura 5.10: Bsplines quadratiche costruite con la funzione bspline.m sulla


sequenza equispaziata x=linspace(1,10,10)

5.9.2 Interpolazione

Sia f (x) una funzione nota sui punti t1 , t2 , ..., tm . Si desideri interpolarla per
mezzo di una spline S(x) di ordine n (grado n-1) con prescritti nodi interni x1 , ..., xN −1 .
160 Appunti di Calcolo Numerico con codici in Matlab/Octave

Inoltre t1 < t2 < ... < tm e


t1 < x1 < x2 < ... < xN −1 < tm .
I parametri da determinare sono
m=N +n−1
che verranno determinati dalle condizioni d’interpolazione
S(tj ) = f (tj ), j = 1, ..., m . (∗∗)
Per l’unicità della soluzione è necessario che m = N + n − 1 .
I. J. Schoenberg e A. Whitney nel 1953 (cfr. C. de Boor: I.J. Schoenberg: Se-
lected Papers, Vol 2. pp. 342-344) hanno dimostrato che esiste un’unica soluzione
del problema d’interpolazione se e solo se i nodi soddisfano le relazioni
t 1 < x1 < tn+1
t2 < x 2 < tn+2
.. .. (5.50)
. .
tN −1 < xN −1 < tm
Osservazione. Non sono richieste informazioni circa le derivate finali. In tal
caso il problema d’interpolazione è trattato come un normale problema d’interpo -
lazione polinomiale. m
Possiamo scrivere S(x) = i=1 ci Bi (x) , dove Bi sono B-spline di ordine n con
nodi interni la sequenza x1 , ..., xN −1 . Perciò (**) diventa
m
ci Bi (tj ) = f (tj ), j = 1, ..., m . (5.51)
i=1

ovvero, in forma matriciale, Ac = f


Costruiamo le B-splines Bi , i = 1, ..., m. A tale proposito, consideriamo 2n
nodi addizionali: x1−n , . . . , x0 ≤ t1 ; x1−n < x2−n < · · · < x0 .
tm ≥ xN , xN +1 , ..., xN +n−1 ;
xN > xN +1 > · · · > xN +n−1 .
Nota. I 2n nodi addizionali possono essere presi coincidenti (come dimostrato
da Carrasso e Laurent in Information Processing 68, IFIP Congress, Edinburgh
1968, Ed. A.J.H Morell, pp. 86-89).
Per la proprietà delle B-splines di avere supporto minimo cioè
> 0 xi−n ≤ x < xi
!
Bi,n (x) =
"
=0 altrimenti
si ha che la matrice A ha al più n elementi diversi da zero per ogni riga. Non
solo, tale matrice è anche stocastica (somma x righe = somma x colonne = 1)
5 - Interpolazione e approssimazione 161

Figura 5.11: BSpline quadratiche costruite sulla sequenza xi = linspace(-5,5,11)


con aggiunta di nodi multipli, con molteplicità pari all’ordine, agli estremi.

E SEMPIO 44. N = 6, n = 4 (spline cubiche) con nodi


a = t1 < t2 < x1 < t3 < x2 < x3 < t4 < t5 < t6 < x4 < t7 < t8 <
< x5 < t9 = b .
La matrice A (N + n − 1), 9 × 9 sarà :
⎡ ⎤
×
⎢ × × × × ⎥
⎢ ⎥
⎢ × × × × ⎥
⎢ ⎥
⎢ × × × × ⎥
⎢ ⎥
A=⎢ ⎢ × × × × ⎥

⎢ × × × × ⎥
⎢ ⎥
⎢ × × × × ⎥
⎢ ⎥
⎣ × × × × ⎦
×

5.9.3 Interpolazione con splines cubiche


Si consideri una funzione f (x) in un intervallo I = [a, b] della retta reale. Si
prenda una partizione di I (non necessariamente equispaziata)
a = x1 < x2 < ... < xn = b .
Facciamo vedere che il problema d’ interpolazione con una spline cubica è
equivalente alla soluzione di un sistema lineare A · m = d con A matrice tridiag-
onale simmetrica, definita positiva e diagonalmente dominante.
162 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 5.12: Spline cubica interpolante su nodi ”ad hoc” a (sx) e nodi equis-
paziati (dx)

Infatti, su ogni intervallino Ii = [xi , xi+1 ], i = 1, ..., n − 1 la spline è un poli-


nomio cubico, ovvero si (x) = a0,i + a1,i x + a2,i x2 + a3,i x3 . Per determinare univo-
camente la mia spline su I avremo bisogno di 4(n − 1) condizioni (tante quanti i
coefficienti incogniti). Ora, le condizioni d’interpolazione negli n punti xi
si (xi ) = f (xi ), si (xi+1 ) = f (xi+1 ), i = 1, ..., n , (5.52)
2
vanno a sommarsi alle 3(n − 2) condizioni di continuità C nei nodi interni:
si (xi+1 ) = si+1 (xi+1 ) , i = 1, ..., n − 2 , (5.53)
si (xi+1 ) = si+1 (xi+1 ) , i = 1, ..., n − 2 , (5.54)
si (xi+1 ) = si+1 (xi+1 ) , i = 1, ..., n − 2 . (5.55)
In definitiva avremo n + 3(n − 2) = 4n − 6. Restano pertanto due condizioni da
assegnare per rendere univoca la determinazione dei coefficienti incogniti. Tra
le possibili scelte le più usate sono le seguenti.
5 - Interpolazione e approssimazione 163

• s1 (x1 ) = sn (xn ) = 0, in tal caso la spline viene detta naturale;
• nel caso in cui siano noti i valori f  (x1 ) e f  (xn ) s’imporranno le condizioni
s1 (x1 ) = f  (x1 ) e sn (xn ) = f  (xn ), in tal caso la spline viene detta vincolata
o completa;
• nel caso in cui siano f (x) sia periodica di periodo xn − x1 = b − a, ovvero
f (x1 ) = f (xn ) s’imporranno le condizioni s1 (x1 ) = sn (xn ) e s1 (x1 ) = sn (xn ),
in tal caso la spline viene detta periodica.
Indichiamo con m il vettore dei momenti (cfr. eq. (5.55) )
mi = si (xi ), i = 1, ..., n − 1
mn = sn−1 (xn ) .

Questa scelta riduce il numero di equazioni necessarie a determinare la spline.


Infatti, si (x), x ∈ [xi , xi+1 ] è un polinomio di grado al più 1, poiché
x − xi x − xi+1
si (x) = mi+1 − mi (5.56)
hi hi
dove hi = xi+1 − xi . Integrando due volte si ottiene
(x − xi )2 (x − xi+1 )2
si (x) = mi+1 − mi + αi , (5.57)
2hi 2hi
(x − xi )3 (x − xi+1 )3
si (x) = mi+1 − mi + αi (x − xi ) + βi
6hi 6hi
e le costanti αi e βi vengono determinate imponendo le condizioni d’interpolazione
nei nodi. Ovvero
h2i
mi + βi = f (xi )
6
h2i
mi+1 + α i hi + β i = f (xi+1 ) .
6
Da cui ricaveremo βi , αi . In definitiva restano da determinare i momenti mi , i =
1, ..., n. Dalle (5.57) imponendo la continuità della derivata prima nei nodi in-
terni e sostituendo i valori di αi e αi−1 si ottiene il sistema tridiagonale di ordine
n − 2 nelle incognite m1 , . . . , mn
hi−1 hi−1 + hi hi f (xi+1 ) − f (xi ) f (xi ) − f (xi−1 )
mi−1 + mi + mi+1 = − , i = 2, ..., n−1 ,
6 3 6 hi hi−1
(5.58)
I valori di m1 e mn si determineranno imponendo le condizioni aggiuntive (5.53)-
(5.55).

Vediamo ora come costruire la spline cubica vincolata, ovvero la spline cubica
per la quale oltre ai valori della funzione f (x) nei nodi devono essere soddisfatte
le condizioni s (a) = f  (a) e s (b) = f  (b).
164 Appunti di Calcolo Numerico con codici in Matlab/Octave

Per facilitare l’implementazione siano x il vettore dei nodi della partizione,


y il vettorre dei valori della funzione, yi = f (xi ), i siano dati i valori aggiuntivi
y1 = f  (a) e yn = f  (b). Pertanto l’algoritmo dovrà eseguire i seguenti passi.
1. Costruire la matrice A e il vettore d come segue.
• Costruire il vettore h, tale che hi = xi+1 − xi .
yi+1 −yi
• Costruire il vettore d, tale che d1 = y2 −y1 
h1 −y1 , di = hi − yih−y i−1
i−1
, i=
yn −yn−1
2, ..., n − 1 e dn = yn − hn−1 .
• Costruire la matrice A, tridiagonale simmetrica, tale che
h1 hn−1
A1,1 = , An,n =
3 3
e
hi hi−1 (hi + hi−1 )
Ai,i+1 = , Ai,i−1 = , Ai,i = , i = 2, ..., n − 1 .
6 6 3
Infine A1,2 = A2,1 e An,n−1 = An−1,n .
2. Risolvere il sistema A m = d.
3. Visualizzare i punti (xi , yi ), i = 1, ..., n e la spline interpolante definita
nell’intervallo xi ≤ x < xi+1 , i = 1, ..., n − 1 come segue:

(xi+1 − x)3 mi + (x − xi )3 mi+1


s(x) = + C (xi+1 − x) + D (x − xi )
6hi
yi
dove le costanti C, D sono date dalle formule seguenti: C = hi − hi mi
6 e
yi+1 hi mi+1
D= hi − 6 .
Infine, per la ricerca dell’intervallo a cui appartiene il generico punto x, si può
fare una ricerca binaria o sequenziale. Il seguente codice Matlab/Octave esegue
la ricerca sequenziale dell’indice j dell’intervallo a cui appartiene il punto x su
cui desideriamo valutare la spline
function j=search_int(x,d);
%-------------------------------------------------------------
% Cerca l’indice j dell’intervallo a cui appartiene
% il punto x su cui valutare la spline
%-------------------------------------------------------------
for i=1:length(d)-1,
if(x >= d(i) & x < d(i+1))
j=i;
break;
end;
if(x >= d(length(d)-1))
j=length(d)-1; break;
end;
end;
5 - Interpolazione e approssimazione 165

Osservazione. Nel toolbox splines di Matlab/Octave, la funzione csapi, (la cui


chiamata si effettua come pp=csapi(x,y), consente di costruire la spline cubica,
nella forma definita nella struttura ppform pp, che soddisfa alle condizioni al
bordo dette ”not-a-knot”. Tali condizioni prevedono che nel primo nodo interno,
x2 , e nell’ultimo interno xn−1 , sia verificata la condizione
jump s(3) (x2 ) = 0 = jump s(3) (xn ) ,

5.9.4 Teorema del campionamento di Shannon e smoothing


spline
Dato un segnale limitato in banda s(x) esso può essere ricostruito dai suoi cam-
pionamenti (Nyquist rate) sk mediante l’uso della funzione sinc ovvero sinus
sin(π x) sin(x)
cardinalis, sinc(x) = (forma normalizzata) oppure sinc(x) =
πx x
(forma non normalizzata):

s(x) = sk sinc(x − k) . (5.59)


k∈Z
Nota: sinc(0) = 1, sinc(k) = 0, k ∈ Z \ {0}. Nel caso discreto tale campiona-
mento dà stime poco accurate.
In alternativa, si possono usare splines cardinali e relative B-splines
cardinali. B-spline cardinali di ordine n si ottengono facendo la convoluzione n+
1 volte di β 0 (x) = 1, |x| < 1/2, β 0 (x) = 0.5, |x| = 1/2 e altrove 0. limn→∞ β n (x) =
sinc(x).
s(x) = sk β n (x − k) .
k∈Z
Per le B-splines cardinali vale la relazione di ricorrenza
x n − x n−1
β n (x) = β n−1 (x) + β (x − 1) .
n−1 n−1
Tale scelta è più smooth e meno costosa computazionalmente.
Smoothing: è l’altro modo di fare data fitting con spline.
Problema 1. Siano dati i punti (xi , yi ), i = 1, ..., n con yi = f (xi ). Trovare la
funzione f che minimizza
n  xn
(yi − f (xi ))2 + α (f (p) (x))2 dx .
i=1 x1

La risultante curva è un polinomio continuo a tratti di grado 2p − 1 Il primo


termine misura la vicinanza della funzione di fitting dai dati. Il secondo pe-
nalizza la curvatura della funzione e α il collegamento tra i due termini. Se
0 < α < ∞, Schoenberg provò che tale f è la spline naturale di grado 2p − 1. Se
α = 0, f =interpolante polinomiale;
Nota: i dati sono assunti del tipo segnale+rumore
yi = f (xi ) + i , i ≈ N (0, σ 2 ), i = 1, ..., n .
166 Appunti di Calcolo Numerico con codici in Matlab/Octave

5.10 Polinomio d’approssimazione di Bernstein


Si consideri l’intervallo [a, b] = [0, 1]. Sia inoltre k (grado) fissato. La base di
B-spline sulla sequenza di nodi

t0 = . . . = tk = 0, tk+1 = . . . = t2k+1 = 1 ,

Bi,k , i = 0, 1, ..., k sono polinomi di grado k su [0,1] che verificano la ricorrenza:

Bi,k (x) = xBi,k−1 (x) + (1 − x)Bi+1,k−1 (x) , (5.60)

che è quella delle B-splines con le opportune modifiche. Sono detti polinomi di
Bernstein di grado k e si denotano con Bik (x) o βik (x).

Teorema 26. (Teorema di Weierstrass)


Sia f ∈ C[a, b]. Dato  > 0 è sempre possibile trovare un polinomio pn (x) (di grado
sufficientemente grande) tale che

|f (x) − pn (x)| ≤ , ∀x ∈ [a, b] .

Definizione 23. Sia f definita su [0, 1]. Il polinomio approssimante di Bernstein


di grado n associato ad f è
n
k n k
Bn (f ; x) = f( ) x (1 − x)n−k .
n k
k=0

Nota: Bn (f ; 0) = f (0), Bn (f ; 1) = f (1) (“quasi” interpolante) e

n k
Bk,n (x) = x (1 − x)n−k (5.61)
k

che sono i polinomi elementari di Bernstein.Circa la convergenza dell’approssimazione


di Bernstein, vale il seguente risultato (dovuto a Bernstein) (cfr. [22, p. 5]).

Teorema 27. Sia f (x) limitata in [0,1]. Allora

lim Bn (f ; x) = f (x)
n→∞

su ogni punto x ∈ [0, 1] dove f è continua. Se inoltre f ∈ C[0, 1] allora il limite vale
uniformemente.

Come corollario a questo teorema possiamo ri-ottenere il Teorema di Weier-


strass.

Corollario 1. Se f ∈ C[0, 1], allora per ogni  > 0 e per n sufficientemente grande

|f (x) − Bn (f ; x)| ≤  ∀x ∈ [0, 1] .

Concludiamo con l’approssimazione con operatori di Bernstein


5 - Interpolazione e approssimazione 167

Figura 5.13: Polinomi elementari di Bernstein di grado 3

5.10.1 Curve B-splines e di Bézier


Sia t ∈ [α, β] ⊂ R il parametro di una curva parametrica e P0 , P1 , ..., Pn−1 , n punti
del piano.

1. La curva B-spline di ordine m associata al poligono di controllo indi-


viduato dai punti Pi è la curva

n−1
S(t) = Pi Bi,m (t), t ∈ [α, β] .
i=0

2. La curva di Bézier di grado n − 1 associata al poligono di controllo


individuato dai punti Pi è la curva

n−1
S(t) = Pi Bin−1 (t), t ∈ [α, β] .
i=0

Bin−1 (t): polinomi di Bernstein. Come per le funzioni spline, valgono


gli stessi algoritmi di valutazione, derivazione e “knot-insertion”. In par-
ticolare, l’algoritmo di valutazione viene chiamato di De Casteljau. Le
cose interessanti in questo “nuovo” contesto sono relative alle condizioni
di adiacenza tra curve di Bézier, che si esprimono come differenze finite “in
avanti” dei punti di controllo, agli algoritmi di suddivisione e al blossom-
ing. Tali curve sono però solo interpolanti agli estremi dell’intervallo (dei
parametri) e approssimano il “convex-hull” della curva. Esse sono invari-
anti per affinità, simmetriche e “variation-diminishing”.
168 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 5.14: f (x) = x(x − 1), x ∈ [0, 1] approssimata con un polinomio di


Bernstein di grado 20

5.10.2 Algoritmo di De Casteljau


I polinomi di Bernstein hanno trovato applicazione nella geometria computazionale
e in particolare modo nella descrizione di curve e superfici di Bézier, che sono
funzioni polinomiali che si ottengono con ripetute interpolazioni lineari.
Consideriamo in questa sezione un algoritmo per la costruzione di curve di Bezier
noto col nome di Algoritmo di De Casteljau (descritto ad esempio in [13]).

Algoritmo 4. Dato un insieme B = {P0 , . . . , Pn } di punti del piano e t ∈ R


(usualmente t ∈ [0, 1]), il generico punto appartenente alla curva di Bézier si
determina con i seguenti passi:
1. {P asso di inizializzazione}
(0)
bi (t) = Pi (5.62)

2. {P asso iterativo}
(r) (r−1) (r−1)
bi (t) = (1 − t)bi (t) + tbi+1 (t) r=1,...,n i=0,...,n−r (5.63)

La curva di Bézier calcolata con l’algoritmo 4 è quindi ottenuta con combi-


nazioni baricentriche ripetute. In Figura 5.15 è descritto il funzionamento
dell’algoritmo di De Casteljau.
5 - Interpolazione e approssimazione 169

b1b
``bb`
1

 H
1
, H ```
 , bH ``` b
 , ! ! ! b21
HH `b2
 , !
b ! H e
!3 H
b
,
b20!
 b0 HHe
b10 , He 1
b
, Hebb2
H

b
 e
b0 eb
b3

Figura 5.15: Costruzione di una curva di Bézier di grado 3 con l’algoritmo di De


Casteljau.

(r)
Proposizione 14. I punti bi (t) possono essere espressi in termini di polinomi
di Bernstein Bjr di grado r risultando
r
(r)
bi (t) = Pi+j Bjr (t) i = 0, ..., n − r (5.64)
j=0

Dim. Induzione su r.
(r) (5.63) (r−1) (r−1)
bi (t) = (1 − t)bi (t) + tbi+1 (t)
i+r−1 i+r
(5.64)
= (1 − t) r−1
Pj Bj−i (t) + t r−1
Pj Bj−i−1 (t)
j=i j=i

Usiamo il fatto che Bjr (t) = 0 se j ∈ {0, ..., n}. Riordinando gli indici otteniamo

i+r i+r
(1 − t) r−1
Pj Bj−i (t) + t r−1
Pj Bj−i−1 (t) =
j=i j=i
⎡ ⎤
i+r
⎢ ⎥ i+r
Pj ⎢
⎣(1 − t)Bj−i (t)
r−1 r−1
+ tBj−i−1 (t)⎥ = r
Pj Bj−i (t)
j=i  ⎦ j=i
r
Bj−i (t)

Questo conclude la dimostrazione

Usando l’algoritmo di De Casteljau e la geometria sottostante possiamo de-


durre delle proprietà possedute dalle curve di Bézier. Di queste ricordiamo
l’invarianza per affinità, l’interpolazione nei punti estremi dell’intervallo
di approssimazione, la proprietà di convex hull1 , la simmetria e come per i
polinomi di Bernstein la caratteristica capacità mimica della curva.
1 Si definisce convex hull l’insieme formato dalle combinazioni convesse di un insieme di punti (di

uno spazio euclideo) detto il poligono di controllo.


170 Appunti di Calcolo Numerico con codici in Matlab/Octave

Un codice per costruire una curva di Bézier è il seguente


function bb=Bezier(Px,Py,t)
%--------------------------------------------------------
% Dati i vettori Px e Py (ascisse e
% ordinate del poligono di controllo rispettivamente)
% e il vettore t dei parametri (di lunghezza m),
% la funzione costruisce la curva di Bezier
% e la salva nella matrice bb (di dimensione 2 x m)
%--------------------------------------------------------
n=length(Px);m=length(t); b=[Px; Py];
for k=1:m
for r=2:n,
for i=1:n-r+1,
b(:,i)=(1-t(k))*b(:,i)+t(k)*b(:,i+1);
end
end
bb(:,k)=b(:,1);
end
5 - Interpolazione e approssimazione 171

5.11 Minimi quadrati discreti e decomposizione SVD


In corrispondenza a punti (nodi) xi e ai valori yi , i = 0, . . . , m provenienti, ad
esempio, da misurazioni sperimentali, il problema dei minimi quadrati discreti
consiste nell’approssimare tali valori con una funzione
n
sn (x) = ci ϕi (x) , n m (5.65)
i=0

ovvero una combinazione lineare di n+1 funzioni linearmente indipendenti {ϕi },


possibilmente facili da costruire. Per determinare sn si chiederà che risulti min-
imo il residuo (quadratico)
m
E(sn ) = (sn (xi ) − yi )2 (5.66)
i=0

La scelta delle ϕi viene dettata di solito da informazioni note sulla distribuzione


dei dati o semplicemente dall’analisi grafica della loro distribuzione. Una scelta
semplice è di prendere ϕi (x) = xi , i = 0, . . . , n. In tal caso il problema si riconduce
alla costruizione di un polinomio di approssimazione.
Dati m + 1 punti (xi , yi ), i = 0, ..., m, ci si propone di trovare un polinomio
di grado n ≤ m (possibilmente n m) t.c. siano minime le deviazioni (errori)
(p(xi ) − fi )2 , i = 0, ..., m.
La soluzione si ricerca minimizzando il seguente funzionale quadratico rispetto
a tutti i polinomi p di grado m
m m
2
E(p) = (p(xi ) − yi )2 = {a0 + a1 xi + · · · + an xni − yi } . (5.67)
i=0 i=0

In effetti, il funzionale E(p) dipendente dai coefficienti del polinomio p, cioè


a0 , . . . , an , pertanto potremo scrivere E(a0 , . . . , an ) per evidenziare tale dipen-
denza. Essendo un funzionale quadratico, il minimo lo si ricerca tra i punti che
annullano le derivate parziali rispetto ai coefficienti. Vale infatti il seguente Teo-
rema

Teorema 28. Condizione necessaria affinchè si raggiunga il minimo è che

∂E
= 0, j = 0, . . . , n . (5.68)
∂aj

Questo da origine al sistema


m
{a0 + a1 xi + · · · + an xni − yi } xji = 0, j = 0, ..., n ,
i=0
172 Appunti di Calcolo Numerico con codici in Matlab/Octave

che in forma matriciale diventa


⎛ m m m ⎞ ⎛ m ⎞
0
⎜ xi xi ··· xni ⎟ ⎜ x0i yi⎟
⎜ i=0 ⎟⎛ ⎞ ⎜ ⎟
⎜ m i=0
m
i=0
m ⎟ a0 ⎜ i=0
m ⎟
⎜ ⎟ ⎜ ⎟
⎜ x x 2
· · · xn+1 ⎟⎜ a1 ⎟ ⎜ x i yi ⎟
⎜ i i i ⎟⎜ ⎟ ⎜ ⎟
⎜ i=0 i=0 i=0 ⎟⎜ .. ⎟=⎜ i=0 ⎟ (5.69)
⎜ . .. .. ⎟⎝ . ⎠ ⎜ .. ⎟
⎜ . ⎟ ⎜ ⎟
⎜ . . . ⎟ an ⎜ . ⎟
⎜ m m m ⎟ ⎜ m ⎟
⎝ ⎠ ⎝ ⎠
xni xn+1
i · · · x2n
i
n
x i yi
i=0 i=0 i=0 i=0

Il sistema (5.69) rappresenta le cosidette equazioni normali e si può scri-


vere compattamente come
Ba = f ,
con B matrice simmetrica e semidefinita positiva di ordine (n + 1) di elementi
m m
bij = xi+j−2
i e z vettore colonna zi = xi−1
j yj oppure, come vederemo più
i=0 j=0
oltre, ricorrendo alla decomposizione SV D della matrice rettangolare A i cui ele-
menti sono ai,j = xj−1
i , i = 1, ..., m + 1, j = 1, ..., n + 1.
Il seguente teorema garantisce l’esistenza e unicità della soluzione del prob-
lema dei minimi quadrati.

Teorema 29. Se i punti x0 , ..., xm sono distinti e n ≤ m allora esiste ed è unico


il polinomio p, deg(p) ≤ n tale che E(p) è minimo. I coefficienti a0 , . . . , an sono
determinati dalla soluzione del sistema (5.69).

5.11.1 Equivalenza tra sistema dei minimi quadrati e de-


compozione SVD
Sia A una matrice rettangolare m × n, m ≥ n che rappresenta la matrice di
un problema di approssimazione dell’ insieme di valori X = {(xi , yi ), i = 1, ..., m}
con polinomi di grado ≤ n − 1, ovvero
n
ai xi−1
j = yj , j = 1, ..., m . (5.70)
i=1

Sappiamo che AT A è n × n simmetrica e semidefinita positiva. Usando, ad es-


empio, il metodo di Jacobi per il calcolo di tutti gli autovalori di AT A possiamo
determinare una matrice ortogonale U e una matrice diagonale D tale che

U T (AT A)U = D . (5.71)

Ora, essendo D = diag(λ1 , . . . , λn ), le cui componenti sono gli autovalori di AT A


in ordine decrescente. Se qualche λi risultasse un numero negativo (di modulo
molto piccolo), lo si può considerare zero, poiché gli autovalori di AT A sono tutti
5 - Interpolazione e approssimazione 173

positivi a meno di errori di arrotondamento dovuti al metodo di calcolo (premoli-


plicazione di A per la sua trasposta) e alla precisone usata.
Da (5.71), posto B = AU (m × n), si ha che

BT B = D . (5.72)

Il che implica che le colonne di B sono ortogonali.


Usando invece la fattorizzazione QR della matrice rettangolare B, determiner-
emo una matrice ortogonale V tale che

V TB = R (5.73)

con R che è zero sotto la diagonale principale. Inoltre, la matrice R è tale che

RT R = B T V T V B = B T B = D ;

Questo fatto ci suggerisce che le colonne di R sono ortogonali. Inoltre, se per


qualche i si ha λi = 0 allora è facile verificare che la corrispondente colonna di R
sarà zero.
Poiché R è triangolare superiore ed è ortogonale, allora essa risulta essere
zero anche sopra la diagonale principale. In definitiva R è diagonale ed ha la
stessa forma della matrice F della decomposizione SVD di A (ricordiamo che
V T AU = F ) cioè ⎛ ⎞
μ1 0 0 0 0
⎜ 0 μ2 0 0 0 ⎟
⎜ ⎟
R=⎜ . .. ⎟ (5.74)
⎝ .. . ⎠
0 ··· 0 μn

Ora avremo che R = F con μi = λi .
In (5.73), essendo B = AU , si ha che la decomposizione SVD richiesta è:

V T AU = R .

Riassumendo, potremo dire che il vantaggio e lo svantaggio di questo approc-


cio sono rispettivamente
1. vantaggio: semplicità di implementazione del metodo, una volta risolto il
problema della ricerca degli autovalori di AT A;
2. svantaggio: si deve fare il prodotto AT A che come noto può portare ad una
perdita di informazioni ed ad un aumento del numero di condizionamento
di A.

Un esempio
Si vuole determinare la funzione che approssima, nel senso dei minimi quadrati i
punti {(xi , yi ), 1 ≤ i ≤ m}, con un polinomio cubico p3 (x) = a1 + a2 x + a3 x2 + a4 x3 .
Questo è quello che in inglese si chiama “data fitting”.
174 Appunti di Calcolo Numerico con codici in Matlab/Octave

Per determinare i coefficienti ai , i = 1, ..., 4 minimizzeremo, invece dell’errore,


l’errore quadratico medio
⎛ ⎞ 12
m
1
E(a1 , a2 , a3 , a4 ) = ⎝ (yj − p3 (xj ))2 ⎠ .
m j=1

Osserviamo che minimizzare E o E 2 è la stessa cosa. Ora, poichè E 2 è una fun-


2
zione convessa, il minimo lo ricercheremo chiedendo che ∂E ∂ai = 0, i = 1, 2, 3, 4.
Ciò dà luogo ad un sistema lineare Aa = y con A, m × 4 e i vettori a, y che sono
4 × 1 e m × 1, rispettivamente.
Vediamo il tutto in un caso concreto.
Si considerino i punti:

t=0:.05:1.0;
y=[.486; .866; .944;
1.144; 1.103; 1.202;
1.166; 1.191; 1.124;
1.095; 1.122; 1.102;
1.099; 1.017; 1.111;
1.117; 1.152; 1.265;
1.380; 1.575; 1.857];

Figura 5.16: Dati da approssimare con il metodo dei minimi quadrati


5 - Interpolazione e approssimazione 175

Una possibile implementazione in Matlab/Octave della decomposizione SVD


di una matrice A, applicata al problema dei minimi quadrati per data fitting, è
come segue.

function [x]=SVD_MinQuad(t,n)
%---------------------------------------
% t=vettore dei punti
% n=grado del polinomio d’approssimazione
%
% x=soluzione del sistema con SVD
%----------------------------------------
m=length(t);

for i=1:m,
a(i,:)=t(i).^(0:n);
end;

[u,d]=eig(a’*a);
b=a*u;
[v,r]=qr(b);
z=inv(r’*r)*r’*(v’*y);
disp(’Soluzione con la decomposizione SVD di A ’);
x=u*z

Eseguendo il codice ecco i risultati.


>> Soluzione con la decomposizione SVD di A

0.5747
4.7259
-11.1282
7.6687

5.11.2 SVD in Matlab/Octave


In questa sottosessione, facciamo vedere come usare Matlab/Octave per deter-
minare la decomposizione SVD (Singular Value Decomposition) di una matrice.
Tale decomposizione, fattorizza una matrice A ∈ Rn×m (anche rettangolare) nel
prodotto
A = U SV T , U ∈ Rn×n , S ∈ Rn×m , V ∈ Rm×m
Gli elementi nella “diagonale” di S sono chiamati valori singolari di A. Tutti gli
altri elementi di S sono nulli. Le matrici U e V sono ortogonali, cioè U T U = In
e V T V = Im , ove In e Im indicano le matrici identità di ordine n e m, rispetti-
vamente. Il comando svd calcola appunto la decomposizione SVD. Vediamo un
esempio.
>> A=[1,2,1;1,3,1;0,1,1;1,1,1]
176 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 5.17: Approssimazione ai minimi quadrati

A =

1 2 1
1 3 1
0 1 1
1 1 1

>> [U,S,V]=svd(A)

U =

-0.5346 0.1091 -0.1889 -0.8165


-0.7186 -0.5603 -0.0547 0.4082
-0.2738 0.2608 0.9258 0.0000
-0.3505 0.7786 -0.3230 0.4082

S =

4.5732 0 0
0 0.7952 0
0 0 0.6736
0 0 0
5 - Interpolazione e approssimazione 177

V =

-0.3507 0.4117 -0.8411


-0.8417 -0.5323 0.0903
-0.4105 0.7397 0.5332

A partire dai fattori U , S e V è possibile calcolare, ancora, la soluzione ai minimi


quadrati di un sistema sovradeterminato

>> b=[1;2;0;1]

b =

1
2
0
1

>> d=U’*b

d =

-2.3223
-0.2329
-0.6213
0.4082

>> s=diag(S)

s =

4.5732
0.7952
0.6736

>> y=d(1:length(s))./s

y =

-0.5078
-0.2929
-0.9224

>> x=V*y
178 Appunti di Calcolo Numerico con codici in Matlab/Octave

x =

0.8333
0.5000
-0.5000

In maniera analoga, è possibile calcolare la soluzione ai minimi quadrati di un


sistema quadrato singolare.

>> A=[1,2,1;1,2,1;0,1,0]

A =

1 2 1
1 2 1
0 1 0

>> b=[1;2;0]

b =

1
2
0

>> [U,S,V]=svd(A)

U =

-0.6873 -0.1664 -0.7071


-0.6873 -0.1664 0.7071
-0.2353 0.9719 0

S =

3.5616 0 0
0 0.5616 0
0 0 0

V =

-0.3859 -0.5925 -0.7071


-0.8379 0.5458 0
-0.3859 -0.5925 0.7071
5 - Interpolazione e approssimazione 179

Il terzo valore singolare vale 0 e dunque non è possibile calcolare y3 = d3 /s3 .


Basta però porre y3 = 0. Si può fare automaticamente con il comando find:
>> d=U’*b

d =
-2.0618
-0.4991
0.7071

>> s=diag(S)

s =
3.5616
0.5616
0

>> y=zeros(size(d))

y =
0
0
0

>> index=find(s~=0)

index =
1
2

>> y(index)=d(index)./s(index)

y =

-0.5789
-0.8888
0

>> x=V*y

x =

0.7500
-0.0000
0.7500
180 Appunti di Calcolo Numerico con codici in Matlab/Octave

Nota bene: si procede in maniera del tutto analoga per sistemi sottodeterminati
(sia quadrati che rettangolari), nel caso in cui si desideri la soluzione di norma
euclidea minima, piuttosto che quella con il maggior numero di zeri. Analoga-
mente quando si desideri la soluzione ai minimi quadrati di norma euclidea min-
ima di sistemi singolari.

5.11.3 Esercizi proposti


E SERCIZIO 73. (Appello del 21/6/06). Si considerino i valori di tabella

xi 1 2.5 3 5 6.5 8 9.3


yi 4 2 3 3.5 3.9 7 5.3

1. determinare il polinomio Pm , di grado m = 3 approssimante le coppie di


valori (xi , yi ) nel senso dei minimi quadrati discreti.
2. Si giustifichi il fatto che per m = 6 il polinomio è interpolante.

3. Si consideri il punto x̄ = 4 e come valore corrispondente ȳ, quello dell’interpolante


lineare sull’intervallo [3,5]. Sia ora |Pm (x̄) − ȳ| l’errore assoluto in x̄. Far
vedere che per m = 2 l’errore è minimo.
5 - Interpolazione e approssimazione 181

5.12 Interpolazione trigonometrica e FFT


Definizione 24. Una funzione della forma
M
tM (x) = (ak cos(kx) + bk sin(kx)) , (5.75)
k=0

si chiama un polinomio trigonometrico di grado M .


Se f : [0, 2π] → C è una funzione periodica di periodo 2π (f (0) = f (2π)), se
si desidera interpolarla negli n + 1 nodi equispaziati xj = 2πj
n , j = 0, . . . , n con
tM (x) chiederemo che siano soddisfatte le condizioni
tM (xj ) = f (xj ), j = 0, . . . , n . (5.76)
Anzitutto osserviamo che tM (x) si può scrivere come segue
• se n è pari e M = n/2
M
a0
tM (x) = + (ak cos(kx) + bk sin(kx)) ; (5.77)
2
k=1

• se n è dispari e M = (n − 1)/2
M
a0
tM (x) = + (ak cos(kx) + bk sin(kx)) + aM +1 cos((M + 1)x) . (5.78)
2
k=1

Ricordando l’identità eix = cos x + i sin x dimostriamo ora la seguente


Proposizione 15.
M
tM (x) = ck eikx ; (5.79)
k=−M
con
ak = ck + c−k
(5.80)
bk = i(ck − c−k ), k = 0, . . . , M .
Dim. Infatti,
M M
ck eikx = ck (cos(kx) + i sin(kx)) =
k=−M k=−M
M M
= ck (cos(kx) + i sin(kx)) + c−k (cos(kx) − i sin(kx)) + c0
k=1 k=1

se n è pari è facile verificare che valgono le (5.80), mentre se n è dispari, osser-


(M +1)
vando che tM (x) = ck eikx , si ha che i ck , k = 0, ..., M sono come in (5.80)
k=−(M +1)
e cM +1 = c−(M +1) = aM +1 /2. 
182 Appunti di Calcolo Numerico con codici in Matlab/Octave

Alla luce della precedente Proposizione, possiamo scrivere tM (x) compatta-


mente come segue
(M +s)
tM (x) = ck eikx
k=−(M +s)

con s = 0 quando n è pari e s = 1 quando n dispari.


Ritorniamo al problema dell’interpolazione trigonometrica, le condizioni di
interpolazione (5.76) si riscrivono come segue

(M +s)
ck eikxj = f (xj ) , j = 0, . . . , n . (5.81)
k=−(M +s)

Moltiplichiamo in (5.81) a sinistra e destra per e−imxj , 0 ≤ m ≤ n e sommiamo


su j. Otteniamo
⎛ ⎞
n (M +s) n
⎝ ck e−imxj eikxj ⎠ = e−imxj f (xj ) . (5.82)
j=0 k=−(M +s) j=0

Introdotta la matrice quadrata T , con tj,k = eik jh , 0 ≤ j ≤ n, k = −M −


s, . . . , M +s, le relazioni (5.82) portano quindi alla soluzione di un sistema lineare
T c = f con con c = {ck }, f = {f (xj )}. Pertanto per trovare i coefficienti incogniti
ck si dovrà fare un prodotto matrice-vettore che costa, in questo caso, (n+1)2 . Per
ottenere un algoritmo più veloce, iniziamo provando una importante proprietà
delle funzioni esponenziali coinvolte.
= >
Lemma 2. Le funzioni eipxj , 0 ≤ p ≤ n formano un sistema ortogonale, ovvero
n
e−imxj eikxj = (n + 1)δk,m , 0 ≤ m ≤ n .
j=0

n
Dim. Infatti, osservando che la somma è j=0 eijh(k−m) con xj = j h, h =
2π/(n + 1).
n
(i) Per k = m è verificata: la somma si riduce j=0 1 = n + 1.

(ii) Per k = m osserviamo che


n  n+1
ixj (k−m) 1 − eih(k−m)
e =
j=0
1 − eih(k−m)

n+1
con numeratore che è uguale a zero poiché eih(k−m) = ei(n+1)h(k−m) =
cos(2π(k − m)) + i sin(2π(k − m)) = 1. Pertanto anche quando k = m vale la
somma. .
5 - Interpolazione e approssimazione 183

Alla luce del precedente Lemma, possiamo concludere che


n
1
ck = e−i kxj f (xj ) , k = −(M + s), . . . , M + s . (5.83)
n+1 j=0

In analogia con le serie di Fourier, i coefficienti ck sono detti trasformata discreta


di Fourier (o DFT) . Ricordiamo infatti, che i coefficienti della serie di Fourier
continua sono  2π
1
γk = e−ikx f (x)dx, k ∈ N .
2π 0
Da un punto di vista computazionale, il calcolo di ogni coefficiente ck in (5.83),
richiede (n + 1) operazioni moltiplicative. Basta infatti osservare che ck , nel caso
n n
M = n2 , è il prodotto scalare dei vettori f = [f (x0 ), . . . , f (xn )] e e = [ei 2 jh , . . . , e−i 2 jh ]
che hanno lunghezza n + 1. Complessivamente, per il calcolo di tutti i coefficienti
il costo è O(n2 ).
Ma è possibile calcolare tutti i ck in modo più efficiente mediante l’algoritmo
noto in inglese col nome di Fast Fourier Transform o FFT.

5.12.1 Algoritmo FFT


2πi
Dato l’insieme X = {x0 , . . . , xn } con m = 2r , r > 1, poniamo ωm = e m cosicché
l’equivalente di ck per l’insieme X, è
n
1 −jk
dk = ωm xj , k = 0, ..., m − 1 .
m j=0

Posto quindi p = 2, q = 2r−1 (cosicchè pq = m)


p−1
' q−1 (
1 −kl 1 −ks
dk = ωm ω xl+ps .
p q s=0 q
l=0

Posto quindi
q−1
(l) 1
ek = ωq−ks xl+ps , l = 0, ..., p − 1 , k = 0, . . . , m − 1 , (5.84)
q s=0

allora
p−1
1 −kl (l)
dk = ωm ek , k = 0, . . . , m − 1 . (5.85)
p
l=0
(l) (l)
Complessità. Iniziamo con l’osservare che, in (5.84), ek+q = ek perchè ωq−q =
(l) (l)
1. Pertanto, per ogni l, calcoleremo solo i coefficienti e0 , . . . , eq−1 che sono una
(l)
trasformata dei valori xl , xl+p , . . . , xl+p(q−1) . Il costo di {ek } è quindi quello di p
(l)
trasformate discrete di ordine q. Ora, calcolando preventivamente ek , il calcolo
184 Appunti di Calcolo Numerico con codici in Matlab/Octave

di dk in (5.85), richiederà mp moltiplicazioni. Essendo m = 2r , il calcolo di dk


richiede 2m moltiplicazioni più il costo di valutare due trasformate discrete di
ordine q = 2r−1 . Continuando, la complessità totale è:

m 2 m m
r
2m+2 2 · +2 2 · 2 +· · ·+2r 2 · r = 2m = 2m r = 2m log2 (m) < m2 .
2 2 2
k=1

Per maggiori dettagli vedasi [1, pag.181 e ss.].


La funzione myFFT.m, in Appendice C, presenta un’implementazione della
FFT.
6
Integrazione
Si desideri calcolare l’integrale definito
 b
f (x)dx .
a

I motivi che inducono a calcolare numericamente un integrale sono svariati: ad


esempio nel caso in cui non si conosca una primitiva di f (x), oppure f (x) sia nota
solo in alcuni punti o ancora f (x) è valutabile su ogni valore di x ma solo me-
diante una routine automatica. In tutti questi casi, si preferiscono le cosidette
formule di quadratura. In pratica una formula di quadratura è una approssi-
mazione dell’integrale che fa uso dei valori della funzione in alcuni punti
 b n
f (x)dx ≈ wi f (xi ) , (6.1)
a i=0

dove xi sono detti nodi di quadratura e i coefficienti wi sono detto pesi della
formula di quadratura.
Nel seguito ci limiteremo allo studio di integrali definiti del tipo
 b
ω(x)f (x)dx
a

dove ω(x) è una funzione positiva su [a, b] detta funzione peso. Le formule di
quadratura che considereremo saranno di tipo interpolatorio costruite sia su nodi
equispaziati che su nodi coincidenti con gli zeri dei polinomi ortogonali rispetto
all’intervallo [a, b] e alla funzione peso ω(x).

6.0.2 Formule di tipo interpolatorio


n
Assegnati i punti distinti x0 , . . . , xn dell’intervallo [a, b] e pn (x) = i=0 li (x)f (xi )
il polinomio d’interpolazione di grado n che interpola f nei punti xi ed En f il
corrispondente errore d’interpolazione. Allora, grazie alla proprietà di linearità
dell’integrale
 n
' ( 
b b b
ω(x)f (x)dx = ω(x) li (x)dx f (xi ) + ω(x) En f (x)dx . (6.2)
a i=0 a a
186 Appunti di Calcolo Numerico con codici in Matlab/Octave

Posto quindi
 b  b
wi = ω(x) li (x)dx, Rn f = ω(x) En f (x)dx ,
a a

allora  b n
ω(x) f (x)dx = wi f (xi ) + Rn f . (6.3)
a i=0
Le formule di quadratura della forma (6.3) si dicono interpolatorie perchè si
basano sul polinomio d’interpolazione della funzione f .
Definizione 25. Una formula di quadratura di tipo interpolatorio si dice esatta
con ordine (o grado) di esattezza n se integra esattamente i polinomi di grado
n.
La definizione appena data afferma che se f (x) ∈ Pn allora En f (x) = 0 e
pertanto anche Rn f = 0. Non solo, se f (x) = 1, x, x2 , . . . , xn e la formula (6.3) è
esatta di ordine n, allora possiamo scrivere
⎧  b

⎪ + · · · + wn ω(x) x0 dx

⎪ w0 =

⎪  b


a

⎨ w 0 x0 + · · · + w n xn = ω(x) xdx
a (6.4)

⎪ .. .. ..

⎪ . . .

⎪  b



⎩ w0 xn0 + · · · + wn xnn = ω(x)xn dx
a
 b
dove gli integrali ω(x)xk , k = 0, . . . , n si chiamano momenti . Il sistema (6.4) è
a
un sistema di ordine n+1 con matrice di Vandermonde che è non singolare poiché
xi = xj . Pertanto il sistema può essere utilizzato per determinare univocamente
i pesi wi , i = 0, . . . , n. L’unicità dei pesi di quadratura ci assicura anche che
non esistono altre formule per i pesi che producono formule di tipo interpolatorio
(6.1).
Osserviamo subito che essendo la matrice di Vandermonde malcondizionata,
dovremmo aspettarci che per n → ∞ le formule di tipo interpolatorio siano insta-
bili. Vedremo in seguito come evitare questi problemi d’instabilità delle formule
di tipo interpolatorio.
Definizione 26. La formula di quadratura di tipo interpolatorio (6.1) si dice
convergente se
n  b
lim wi f (xi ) = ω(x)f (x)dx . (6.5)
n→∞ a
i=0

Si può dimostrare (cfr. [6]) che se f ∈ C[a, b] si ha convergenza se


n
|wi | ≤ C (6.6)
i=0
6 - Integrazione 187

con C una costante indipendente da n. Ovvero si ha convergenza quando i pesi


sono limitati in modulo. Se inoltre f ∈ C k [a, b] si ha anche che
A
|Rn f | ≤ , (6.7)
nk
con A costante positiva. Pertanto più f è regolare e più veloce è la convergenza.

6.0.3 Formule di Newton-Côtes


Le formule di quadratura di Newton-Côtes, di seguito useremo N-C, sono carat-
terizzate dalla scelta di nodi equispaziati: xi = a + ih, h = (b − a)/n. Sono di due
tipi
• formule chiuse: quelle per cui x0 = a, xn = b e xi = x0 + ih, i = 1, . . . , n − 1
con h = (b − a)/n, n ≥ 0;
• formule aperte: quelle per cui x0 = a + h, xn = b − h e xi = x0 + ih, i =
1, . . . , n − 1, h = (b − a)/(n + 2), n ≥ 0.;
I pesi di quadratura wi delle formule di N-C hanno la caratteristica di dipendere
solo da n e h ma non dall’intervallo di quadratura. Infatti, nel caso di formule
chiuse e con ω(x) = 1, posto x = a + th, 0 ≤ t ≤ n, i pesi diventano
 b  n &n
t−j
wi = li (x)dx = h dt . (6.8)
a 0 i−j
j=0,j =i

Posti
 &
n
n
t−j
αi = dt, i = 0, . . . , n , (6.9)
0 i−j
j=0,j =i

che dipendono solo da i e n ma non dai nodi xi , allora la formula di quadratura


diventa
n
In (f ) = h αi f (xi ) .
i=0

Pertanto, i “nuovi” pesi αi si possono tabulare una volta per tutte usando la (6.9).
Osservando che αi = αn−i , potremo limitarci a calcolarne solo la metà.
I pesi αi sono noti col nome di numeri di Côtes. Infine, mediante la proprietà
dei polinomi di Lagrange di formare una partizione dell’unità, otteniamo la re-
n
lazione αi = n.
i=0

Anche nel caso di formule aperte possiamo calcolare i pesi αi . Essendo x0 =


a + h, xn = b − h e xk = a + (k + 1)h, k = 1, . . . , n, si ha
 n+1 & n
t−j
αi = dt, i = 0, . . . , n . (6.10)
−1 i−j
j=0,j =i
188 Appunti di Calcolo Numerico con codici in Matlab/Octave

Nel caso particolare in cui n = 0, essendo l0 (x) = 1, da (6.10) si ha α0 = 2.

E SEMPIO 45. Calcoliamo i coefficienti αi per le formule di N-C chiuse con n = 1, 2.

• Caso n = 1. Essendo x0 = a, x1 = b, e b − a = h, allora


 1
1
α0 = (1 − t)dt = , α 1 = α0 .
0 2

La formula di quadratura corrispondente è la ben nota formula dei trapezi


ovvero
h
I1 (f ) = [f (a) + f (b)] . (6.11)
2
In
 Figura 6.1, facciamo vedere come si comporta la formula per il calcolo di
2
sin (x) dx. L’area evidenziata in colore è il valore approssimato ottenuto
1/2
con la formula dei trapezi. L’errore commesso è rappresentato dalla “differenza”
di area tra il grafico della funzione e l’area colorata.

• Per n = 2, useremo i punti x0 = a, x1 = a+b


2 e x2 = b. Pertanto
 2  2
1 1 4
α0 = (t − 1)(t − 2)dt = , α1 = t(2 − t)dt = , α 2 = α0 .
0 2 3 0 3

Da cui si ottiene la formula di (Cavalieri-)Simpson

h
I2 (f ) = [f (x0 ) + 4f (x1 ) + f (x2 )] . (6.12)
3

 2
Figura 6.1: Regola dei trapezi per il calcolo di sin (x) dx.
1/2
6 - Integrazione 189

E SERCIZIO 74. Costruire una formula di quadratura di N-C a 3 punti di tipo


aperto nota come formula di Milne:
 2h
f (x)dx ≈ w1 f (−h) + w2 f (0) + w3 f (h) .
−2h

Sugg. Determinare i pesi wi chiedendo l’esattezza su 1, x, x2 .

6.0.4 Stima dell’errore di quadratura


Sia f ∈ C k [a, b]. Sotto queste ipotesi di regolarità della funzione, vale il seguente
risultato (la cui dimostrazione si trova ad esempio in [2, p. 721]).
b−a
Proposizione 16. Al solito h = n . Allora
 b
f (k) (ξ)
Rn (f ) = f (x)dx − In (f ) = γn hk+1 , ξ ∈ (a, b) , (6.13)
a k!
con  n
per n pari k =n+2 γn = tπn (t)dt
0
 n
per n dispari k = n + 1 γn = πn (t)dt
0

dove πn (t) = t(t − 1) · · · (t − n).

Riprendiamo l’esempio precedente.


1
• Per n = 1 ed essendo n dispari e k = 2, pertanto γ1 = 0 t(t − 1)dt = −1/6.
Da cui l’errore di quadratura per la formula dei trapezi è:

h3 f (2) (ξ) h3
R1 (f ) = − = − f (2) (ξ), ξ ∈ (a, b) . (6.14)
6 2! 12
2
• Con n = 2, k = 4 e γ2 = 0 t2 (t − 1)(t − 2) = −4/15. La funzione f viene
approssimata con un polinomio di secondo grado ottenendo la formula di
Simpson (6.12). Per l’errore, grazie alla Proposizione 16, otteniamo errore
di quadratura per la formula di Simpson

1 5 (4)
R2 (f ) = − h f (ξ), ξ ∈ (a, b) . (6.15)
90

L’esame dell’errore di quadratura indica due situazioni

1. quando n è pari, le formule di N-C sono esatte per i polinomi di grado n + 1;

2. quando n è dispari, esse sono esatte per polinomi di grado n.


190 Appunti di Calcolo Numerico con codici in Matlab/Octave

n α0 α1 α2 α3 errore
1 1 3 (2)
1 − h f (ξ)
2 12
1 4 1 5 (4)
2 − h f (ξ)
3 3 90
3 9 3 5 (4)
3 − h f (ξ)
8 8 80
14 64 24 8 7 (6)
4 − h f (ξ)
45 45 45 945
95 375 250 275 7 (6)
5 − h f (ξ)
288 288 288 12096
41 216 27 272 9 9 (8)
6 − h f (ξ)
140 140 140 140 1400

Tabella 6.1: Formule di N-C per n = 1, . . . , 6. Per n = 1 si ha la formula del


trapezi, per n = 2 la formula di (Cavalieri-)Simpson e per n = 3 si parla di
formula dei 3/8.

Pertanto, ai fini dell’errore, sono preferibili le formule per n pari, ovvero con n + 1
punti d’interpolazione.
Riassumiamo questi risultati in Tabella 6.1, per valori di n = 1, . . . , 6.

E SEMPIO 46. Vogliamo calcolare


 1
2
I= e−x dx ,
0

con un errore minore o uguale a tol = 0.5 · 10−3 . L’integrale dato si può esprimere
analiticamente mediante la funzione errore, erf (implementata con il nome erf
anche in Matlab/Octave)
 x
2 2
erf(x) = √ e−t dt ,
π 0

il cui grafico è riportato in Figura 6.2 ottenendo



π
I= erf(1) ≈ 0.747 .
2

Mediante le formule date nella Proposizione 16, si tratta di trovare n cosicché


l’errore sia ≤ tol.
6 - Integrazione 191

Figura 6.2: Grafico della funzione errore, erf

• Partiamo con n = 1. Abbiamo bisogno di maxx∈[0,1] |f  (x)|. Essendo f  (x) =


2
2(2x2 −1)e−x , che è strettamente crescente in [0, 1] e per x = 0 (assume il valore
minimo) vale −2 mentre per x = 1 vale 2/e < 1. Pertanto maxx∈[0,1] |f  (x)| = 2.
1
Calcoliamo γ2 = 0 t(t − 1)dt = − 16 e quindi, la stima richiesta, ricordando che
ora h = 1, k = n + 1 perchè n è dispari, sarà

2 · 12
|R1 | ≤ ≈ 0.1667̄ > tol .
6·2
Dobbiamo aumentare n.
• Prendiamo n = 2. Ragionando come prima, abbiamo ora bisogno di
2
max |f (4) (x)| = max |4(4x3 − 12x2 + 3)e−x | = 12 .
x∈[0,1] x∈[0,1]

Ricordando che ora h = 1/2, n = 2, ricaviamo la stima


5
1 1 2
|R2 | ≤ · 12 · = ≈ 4. · 10−3 > tol .
2 90 2880

• Infine prendiamo n = 4. Ragionando allo stesso modo, dobbiamo ora calcolare


2
max |f (6) (x)| = max |8(8x6 − 60x4 + 90x2 − 15)e−x | = 120 .
x∈[0,1] x∈[0,1]

Ricordando che ora h = 1/4, n = 4 (pari), ricaviamo la stima richiesta


1
|R4 | ≤ ≈ 6. · 10−5 <tol .
16128
192 Appunti di Calcolo Numerico con codici in Matlab/Octave

6.0.5 Formule composite o generalizzate


Estendendo la Tabella 6.1 fino a n = 8, si può verificare che alcuni dei pesi wi
risultano negativi (in Tabella 6.2 sono riportati proprio i valori dei αi , i = 0, . . . , 4
per le formule di N-C chiuse). Essendo alcuni di essi negativi, ciò può dar luogo

n α0 α1 α2 α3 α4

3956 23552 3712 41984 18160


8 14175 14175 − 14175 −
14175 14175
Tabella 6.2: Pesi di formule chiuse di N-C con n = 8

ad instabilità dovuta a cancellazione numerica, rendendo pertanto le formule


inutilizzabili per gradi elevati.
Una prima alternativa alle formule di N-C classiche, sono quelle composite o
generalizzate.
A tal proposito, consideriamo l’intervallo [a, b] che suddividiamo in N sottoin-
tervalli mediante i punti equispaziati xk , k = 0, . . . , N (con x0 = a e xN = b).
Grazie alla additività dell’integrale possiamo scrivere
 b  x1  x2  xN N −1  xk+1
f (x)dx = f (x)dx + f (x)dx + · · · + f (x)dx = f (x)dx .
a x0 x1 xN −1 k=0 xk
(6.16)
In ciascuno dei sottointervalli Ik = [xk , xk+1 ] applichiamo ora una formula di N-C
di grado n. Indicato con Ikn (f ) il valore dell’integrale di f sul k-esimo intervallino
Ik , allora
N −1
I(f ) = Ikn (f ) .
k=0

I due casi di nostro interesse sono per n = 1 e n = 2 che corrispondono alla


formula dei trapezi composita detta anche formula trapezoidale e alla formula
di Simpson composita, rispettivamente.

1. Per n = 1, su ogni sotto intervallo Ik = [xk , xk+1 ] si usa la formula dei


trapezi, ovvero
 xk+1
h b−a
f (x)dx ≈ [f (xk ) + f (xk+1 )] h = .
xk 2 N

Mettendo assieme tutti gli integrali avremo la formula trapezoidale


 b
h h h
f (x)dx ≈ [f (a) + f (x1 )] + [f (x1 ) + f (x2 )] + · · · + [f (xN −1 ) + f (xN )]
a 2 2 2
h
= [f (a) + 2f (x1 ) + 2f (x2 ) + · · · + 2f (xN −1 ) + f (b)] . (6.17)
2
6 - Integrazione 193

2. Per n = 2, su ogni intervallino Ik = [xk , xk+1 ] si usa la formula di Simpson.


Ovvero,

 xk+1
h xk + xk+1 b−a
f (x)dx ≈ [f (xk ) + +4f (xk ) + f (xk+1 )] xk = , h= .
xk 3 2 2N
Osservando che su ogni sotto intervallo Ik abbiamo introdotto il punto medio
xk , il che equivale a considerare i punti da zk , k = 0, . . . , 2N . La formula
generalizzata di Simpson è quindi la seguente:

 b
h
[f (a) + 4f (z1 ) + 2f (z2 ) + 4f (z3 ) + · · · + 4f (z2N −1 ) + f (b)]
f (x)dx ≈
a 3
(6.18)
dove al solito a = z0 e b = z2N .
L’osservazione precedente sul numero dei punti si può assumere a priori e
dato N si considereranno sempre 2N + 1 punti.
Come semplice esempio, in Figura 6.3 facciamo vedere come si comporta la
formula trapezoidale rispetto a quella classica. È interessante vedere la dif-
ferenza d’errore tra le due formule.

Figura 6.3: Confronto tra la formula dei trapezi e dei trapezi composita per il
2
calcolo di 0.5 sin (x) dx.

Vediamo ora come si comporta l’errore di quadratura composita.


Supponiamo che f ∈ C s [a, b], sapendo che l’errore nel k-esimo intervallino è
f (s) (ξk ) b−a
rn(k) = γn hs+1 , ξk ∈ (xk , xk+1 ), h = ,
s! N
allora l’errore totale sarà
N −1 N −1 N −1
f (s) (ξk ) hs+1
Rn (f ) = rn(k) = γn hs+1 = γn f (s) (ξk ) . (6.19)
s! s!
k=0 k=0 k=0
194 Appunti di Calcolo Numerico con codici in Matlab/Octave

Si dimostra che vale la seguente uguaglianza

N f (s) (ξ) s+1 f (s) (ξ)


Rn (f ) = γn h = γn (b − a)s+1 ξ ∈ (a, b) . (6.20)
s! s!N s
Nei due casi precedentemente studiati, trapezi e Simpson compositi, valgono le
seguenti formule d’errore:
(b − a)3 
R1 (f ) = − f (ξ) , (6.21)
12N 2
(b − a)5 (4)
R2 (f ) = − f (ξ) . (6.22)
2880N 4
Infine, grazie alla (6.20), ricordando che N dipende da n, se f ∈ C s [a, b] allora
lim |RN (f )| = 0. Ovvero, fissato  > 0, possiamo trovare N tale che |RN +1 | < .
N →∞
 1
2
E SEMPIO 47. Riprendiamo l’Esempio 46. Vogliamo approssimare e−x dx a meno
0
di tol = 0.5 10−3 con le formule composite dei trapezi e di Simpson.
• Trapezi composito. Sapendo che maxx∈[0,1] |f (2) (x)| = 2, si ha |R1 (f )| ≤
1/(6 N 2 ) . Pertanto, affinché |R1 (f )| < tol, dovremo chiedere che N ≥ 19,
ovvero dovremo prendere 20 punti equispaziati.
• Simpson composito. Sapendo che maxx∈[0,1] |f (4) (x)| = 12, si ha |R2 (f )| ≤
12/(2880 N 4 ) . Pertanto, affinché |R2 (f )| < tol, dovremo chiedere che N ≥ 2,
ovvero dovremo prendere 5 punti equispaziati.

6.0.6 Routine adattativa per la quadratura: applicazione


al metodo di Simpson e dei trapezi
L’idea delle routine adattative è di usare punti di integrazione dove “serve”,
ovvero dove la funzione ha maggiori oscillazioni o discontinuità. La tecnica adat-
tativa ha lo scopo di variare la posizione dei nodi secondo il comportamento locale
della funzione integranda, avendo cosı̀ un risparmio sul numero di valutazioni
della funzione integranda.
In appendice C si trova la funzione simp ada.m (che implementa la routine
 b
adattativa di Simpson per il calcolo di f (x)dx . Come input l’utente fornirà
a
gli estremi di integrazione a, b, la tolleranza epss e gli verrà richiesto di passare
un parametro di dilatazione della tolleranza allo scopo di rendere la stima sui
sottointervalli più conservativa possibile, al fine di verificare la disuguaglianza
 b
| ˜ )| ≤  ;
f (x)dx − I(f
a

˜ ) è l’approssimazione dell’integrale calcolata con una formula di quadratura


ove I(f
composita.
6 - Integrazione 195

In output si otterranno il valore approssimato dell’integrale, nella variabile


integral e il numero di valutazioni della funzione integranda in nv.
Le Figure 6.4 e 6.5 mostrano la differenza tra la routine classica e quella
adattativa applicate al calcolo numerico di
 3
100 10
sin( )dx
1 x2 x

con precisione  = 1.e − 5. Dall’output ottenuto, il numero di valutazioni con il


metodo classico è di 256 contro le 161 con la routine adattativa (avendo usato un
fattore di dilatazione 15). Infine l’errore calcolato è di 2.43 · 10−6 con il metodo
classico contro 4.17 · 10−7 con il metodo adattativo.

Figura 6.4: Integrazione con Simpson composito

Alternativamente una funzione Matlab che calcola adattativamente un inte-


grale definito usando il metodo trapezoidale è la seguente. Si parte considerando
una formula base su 3 punti e stimando l’errore usando l’estrapolazione di Richard-
son (vedi sessione 6.4 per dettagli), che sostanzialmente equivale ad usare la
formula di Simpson sugli stessi punti.
Detto 9
˜(i) hi xi + xi−1
I = f (xi−1 ) + 2f ( ) + f (xi ) ,
4 2
l’integrale approssimato con la formula trapezoidale su [xi−1 , xi ] con hi = xi −
xi−1 . Allora
 xi 9
hi xi + xi−1
ei = f (x)dx − I˜(i) ≈ −f (xi−1 ) + 2f ( ) − f (xi ) .
xi−1 12 2
196 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 6.5: Integrazione con Simpson adattativo

Pertanto, se l’errore ei verifica


ei ≤ hi
b−a

(cosicchè quello totale risulta essere ≤ ) allora si conclude altrimenti si procede


alla nuova suddivisione.
La function Matlab/Octave trap ada.m, in Appendice C, fa proprio questo.
In Figura 6.6 si visualizza l’applicazione della routine adattativa trapezoidale
appena descritta al calcolo di
 3
sin(x)
dx
−3 (1 + ex )

con tolleranza  = 1.e − 4. In output il valore approssimato dell’integrale è nella


variabile I, l’errore approssimato in errest e nel vettore x i punti usati per il
calcolo.

Osservazione. Il repository
http://www.mathworks.com/matlabcentral/fileexchange/
che raccoglie il software di scambio degli utenti Matlab, si trova il package
adaptQuad di Matthias Conrad e Nils Papenberg che contiene due routine
iterative per la quadratura adattativa usando sia Simpsons che Lobatto. Per
maggiori informazioni si rinvia al Technical Report [8].
6 - Integrazione 197

Figura 6.6: Integrazione con il metodo dei trapezi adattativo. I punti utilizzati
sono oltre 2000, molti di più di quelli richiesti dalla stima a priori (6.21), ma
distribuiti non uniformemente ma dove la funzione oscilla di maggiormente.

6.1 Polinomi ortogonali


Prima di introdurre le formule di quadratura gaussiane, facciamo dei richiami
sui polinomi ortogonali.
Definizione 27. Un insieme infinito di polinomi {p0 , p1 , . . . , pn , . . .} tali che
pn (x) = an,0 xn + an,1 xn−1 + · · · + an,n ,
è detto ortogonale in [a,b] rispetto ad una funzione peso ω(x) non negativa, se
valgono le relazioni
⎧  b



⎪ ω(x)pn (x)pm (x)dx = 0 m = n
⎨ a

⎪ 


b
⎩ ω(x)(pn (x))2 dx > 0 m=n.
a
 b
Di solito si indica hn = ω(x)(pn (x))2 dx > 0.
a
Alcune importanti proprietà dei polinomi ortogonali sono le seguenti.
(a) La funzione peso non negativa ω(x) e l’intervallo [a, b] definiscono univoca-
mente l’insieme dei polinomi {pn }.
(b) Per ogni n ≥ 1, pn (x) ha esattamente n zeri reali, distinti ed interni ad [a, b].
Inoltre gli zeri di pn (x) separano quelli di pn−1 (x) (tra 2 zeri di pn si trova
uno ed uno solo zero di pn−1 ).
198 Appunti di Calcolo Numerico con codici in Matlab/Octave

(c) Ogni sistema di polinomi ortogonali {pn }, soddisfa ad una relazione di ri-
correnza a 3 termini
pn+1 (x) = (An x + Bn )pn (x) − Cn pn−1 (x), n = 1, 2, . . . (6.23)
dove Cn > 0 e
an+1,0
An = (6.24)
an,0
an+1,1 an,1
Bn = An − , (6.25)
an+1,0 an,0
An hn an+1,2
Cn = = An , (6.26)
An−1 hn−1 an+1,1

Elenchiamo qui di seguito i polinomi ortogonali che per noi rivestono maggior
interesse.
Tn : Polinomi di Chebyshev di prima specie. Sono definiti su [−1, 1], ω(x) =
(1 − x2 )−1/2 e per essi vale la ricorrenza T0 (x) = 1, T1 (x) = x e
Tn+1 (x) = 2xTn (x) − Tn−1 (x), n ≥ 1 . (6.27)
Infatti, ricordando che Tn (x) = cos(n arccos x) n = 0, 1, . . . e la relazione
cos[(n + 1)θ] + cos[(n − 1)θ] = 2 cos θ cos(nθ)
posto θ = cos x si riottiene la (6.27).
Facciamo anche vedere che
Tn (x) = 2n−1 xn + · · · (6.28)
2 3 3−1 3
Infatti, essendo T2 (x) = 2x −1, T3 (x) = 4x −3x = 2 x −3x, per induzione
si ottiene la (6.28).
Infine, gli zeri del polinomio di Chebyshev di prima specie di grado n, che
sono stati introdotti al capitolo dell’ interpolazione polinomiale, sono i punti
di Chebyshev
2k − 1
xk = cos π , k = 1, ..., n .
2n
Un : Polinomi di Chebyshev di seconda specie. Sono definiti su [−1, 1], ω(x) =
(1 − x2 )1/2 e per essi vale la ricorrenza U0 (x) = 1, U1 (x) = 2x e
Un+1 (x) = 2xUn (x) − Un−1 (x), n ≥ 1 .

Pn : Polinomi di Legendre. Sono definiti su [−1, 1], ω(x) = 1 e per essi vale la
ricorrenza P0 (x) = 1, P1 (x) = x e
2n + 1 n
Pn+1 (x) = xPn (x) − Pn−1 (x), n ≥ 1 .
n+1 n+1
(2n)!
In questo caso possiamo anche facilmente calcolare an,0 = 2n (n!)2 e hn =
2/(2n + 1).
6 - Integrazione 199

Ln : Polinomi di Laguerre. Sono definiti su [0, +∞), ω(x) = e−x e per essi vale
la ricorrenza L0 (x) = 1, L1 (x) = 1 − x e

2n + 1 − x n
Ln+1 (x) = Ln (x) − Ln−1 (x), n ≥ 1 .
n+1 n+1
(−1)n
Anche in questo caso possiamo calcolare an,0 = n! e hn = 1.
2
Hn : Polinomi di Hermite. Sono definiti su (−∞, +∞), ω(x) = e−x e per essi
vale la ricorrenza H0 (x) = 1, H1 (x) = 2x e

Hn+1 (x) = 2xHn (x) − 2nHn−1 (x), n ≥ 1 .



In questo caso an,0 = 2n e hn = 2n n! π.

Vale la pena osservare che in [−1, 1] i polinomi ortogonali di Legendre e di Cheb-


syshev sono un caso particolare di una famiglia più generale e associata alla
funzione peso ω(x) = (1 − x)α (1 + x)β , α, β > −1, detti polinomi di Jacobi,
Pnα,β (x). Posto γ = α + β, per essi vale la ricorrenza
α,β
Pn+1 (x) =
(2n + 1 + γ)[(α2 − β 2 ) + (2n + γ + 2)(2n + γ)x] α,β
Pn (x) +
2(n + 1)(n + γ + 1)(2n + γ)
2(n + α)(n + β)(2n + γ + 2) α,β
P (x), n ≥ 1 .
2(n + 1)(n + γ + 1)(2n + γ) n−1

Pertanto, per α = β = 0 otteniamo i polinomi di Legendre, per α = β = −1/2


otteniamo i polinomi di Chebyshev di prima specie e per α = β = 1/2 otteniamo i
polinomi di Chebyshev di seconda specie.



6.2 Formule di quadratura gaussiane


Dato l’intervallo [a, b] e la funzione peso ω(x), siano xi , i = 1, . . . , n gli zeri del
corrispondente polinomio ortogonale di grado n. Allora possiamo scrivere
 b n
ω(x)f (x)dx ≈ Ai f (xi ) (6.29)
a i=1

dove i pesi Ai dipendono dalla particolare formula di quadratura gaussiana.


Prima di dare alcune espressioni esplicite dei pesi di quadratura, enunciamo un
risultato fondamentale per la quadratura gaussiana (la cui dimostrazione si può
trovare, ad esempio, in [26]).
200 Appunti di Calcolo Numerico con codici in Matlab/Octave

Teorema 30. Siano x1 , . . . , xn gli zeri del polinomio ortogonale di grado n rispetto
all’intervallo [a, b] e alla funzione peso ω(x). Supponiamo che i pesi Ai siano stati
determinati cosicché
 b n
ω(x)f (x)dx = Ai f (xi ) + Rn (f ) , (6.30)
a i=1

è esatta per i polinomi di grado ≤ n − 1. Allora la formula (6.30) è esatta per tutti
i polinomi di grado ≤ 2n − 1.
Un’ulteriore caratteristica delle formule di quadratura gaussiane, che è uno
dei motivi per i quali sono preferite rispetto a quelle di N-C, è che i pesi Ai sono
positivi. Infatti vale la rappresentazione
 b  2
1 Pn (x)
Ai = ω(x) dx i = 1, . . . , n , (6.31)
(Pn (xi ))2 a x − xi
dove Pn indica il polinomio ortogonale di grado n relativo all’intervallo [a, b] e
b n
alla funzione peso ω(x). Da questa relazione segue che a ω(x)dx = i=1 Ai =
 n
i=1 |Ai |, pertanto si ha convergenzadelle formule al valore dell’integrale. Per-
n
tanto nel caso [−1, 1], ω(x) = 1, si ha i=1 Ai = 2.

• [a, b] = [−1, 1], ω(x) = (1 − x2 )−1/2 , la corrispondente formula di quadratura


si dice di Gauss-Chebyshev di prima specie, GC1. I pesi sono
(GC1) π
Ai = , ∀i
n
la cui somma è π. I nodi, che sono gli zeri di Chebyshev, sono

(GC1) 2i − 1
xi = cos π i = 1, ..., n .
2n
La (6.29) diventa
 1 n
1 π 2i − 1
f (x) √ dx ≈ f cos π .
−1 1 − x2 n i=1
2n

• Sempre in [−1, 1] ma con ω(x) = (1 − x2 )1/2 : la corrispondente formula


di quadratura si dice di Gauss-Chebyshev di seconda specie, GC2. I pesi
sono
2
(GC2) π iπ
Ai = sin , i = 1, . . . , n .
n+1 n+1
Essendo
n 2
iπ n+1
sin =
i=1
n+1 2
n
(GC2) π
otteniamo il risultato richiesto Ai = .
i=1
2
6 - Integrazione 201

I nodi, che sono gli zeri dei polinomi di Chebyshev di seconda specie, sono

(GC2) i
xi = cos π i = 1, ..., n .
n+1

La (6.29) diventa
 1  n 2
π i i
f (x) 1 − x2 dx ≈ sin π f cos π .
−1 n+1 i=1
n+1 n+1

• Sempre in [−1, 1] ma con ω(x) = 1: la corrispondente formula di quadratura


si dice di Gauss-Legendre. I pesi sono
2
Ai =   2 , i = 0, . . . , n .
(1 − x2i ) Pn+1 (xi )

Riassumiamo nella Tabella 6.3, per n = 1, . . . , 4, i valori dei nodi (zeri) del
polinomio di Legendre e dei corrispondenti pesi. Si noti che sono indicati
n + 1 nodi, poiché per un dato n calcoliamo i = 0, . . . , n nodi e pesi. Ad es-
empio, per n = 1, significa che stiamo considerando il polinomio di grado
2, che ha appunto zeri ±3−1/2 . Per i pesi sono indicati, per simmetria, solo
quelli con i = 0, . . . , # n2 $. Sempre relativamente alla formula di quadratura

n xi Ai

1 ± √13 1

15 5 8
2 ± 5 , 0 9, 9
 √  √ √ √
1 1 1 1
3 ± 35 525 − 70 30 , ± 35 525 + 70 30 36 (18 + 30), 36 (18 − 30)
 √  √ √ √
1 1 128 1 1
4 0, ± 21 245 − 14 70, ± 21 245 + 14 70 225 , 900 (322 + 13 70), 900 (322 − 13 70)

Tabella 6.3: Nodi e pesi per le formule di Gauss-Legendre con n = 1, 2, 3, 4

di Gauss-Legendre, osserviamo che talvolta conviene includere anche gli es-


tremi dell’intervallo, ovvero −1, 1. Si parla allora di formule di quadratura
di Gauss-Legendre-Lobatto. Ora, i nodi x0 = −1 e xn = 1 sono fissati, gli
altri n−1 sono scelti come gli zeri di Pn (x) ottenendo per i pesi l’espressione
2 1
Ai = , i = 0, ..., n .
n(n + 1) (Pn (xi ))2

Pertanto, il grado di esattezza delle formule di Gauss-Legendre-Lobatto


sarà 2n−1. In Tabella 6.4 ricordiamo chi sono i nodi e i pesi per le formule di
Gauss-Legendre-Lobatto con n = 1, 2, 3, 4. Un altro interessante esempio è
202 Appunti di Calcolo Numerico con codici in Matlab/Octave

n xi Ai

1 ±1 1

1 4
2 ±1, 0 3, 3

5 1 5
3 ±1 , ± 5 6, 6

21 1 49 32
4 ±1, ± 7 , 0 10 , 90 , 45

Tabella 6.4: Nodi e pesi per le formule di Gauss-Legendre-Lobatto con n =


1, 2, 3, 4.


fornito dalle formule di Gauss-Chebyshev-Lobatto, in cui ω(x) = 1/ 1 − x2 ,
delle quali i nodi ed i pesi sono come segue
πi
xi = cos ,
n
π
Ai = , d0 = dn = 2, di = 1, 1 ≤ i ≤ n − 1 .
n di
Infine, per quanto riguarda l’errore di quadratura con formule di Gauss-
Legendre (GL) e Gauss-Legendre-Lobatto (GLL), ricordiamo le seguenti for-
mule che per essere applicate richiedono una certa regolarità della funzione
integranda (cfr. [25]).
22n+3 ((n + 1)!)4
I(f ) − IGL (f ) = f (2n+2) (ξ) , ξ ∈ (−1, 1). (6.32)
(2n + 3)((2n + 2)!)3
22n+1 n3 (n + 1)((n − 1)!)4 (2n)
I(f ) − IGLL (f ) = − f (ξ) , ξ ∈ (−1, 1). (6.33)
(2n + 1)((2n)!)3
Due considerazioni conclusive.
1. Le formule gaussiane in [−1, 1] sono estendibili ad un generico intervallo
[a, b] con l’opportuna trasformazione lineare sia sui nodi che sui pesi.
2. In Matlab/Octave la funzione quadl implementa la formula di quadratura
di Gauss-Lobatto. Si chiama con quadl(fun,a,b): in questo caso la toller-
anza di default è 1.e−3 e fun può essere definita sia su un altro M-file di tipo
funzione o mediante fun=inline(’ ’). Per usare una tolleranza definita
dall’utente, tol utente, si userà la chiamata quadl(fun,a,b,tol utente).

Infine, facciamo un esempio di una formula composita gaussiana (a 2 punti).


Essa generalizza infatti la formula di Gauss a 2 punti per il calcolo di
 1 1
g(t)dt ≈ Ai g(ti )
−1 i=0
6 - Integrazione 203

con Ai = 1, i = 0, 1 e t0 = −1/ 3 e t1 = −t0 .
La costruzione viene fatta come segue. Partendo da una suddivisione equis-
paziata consideriamo, invece dei punti xk−1 e xk , i punti

h 1 h 1
yk−1 = xk−1 + 1− √ , yk = xk−1 + 1+ √ .
2 3 2 3

La formula di quadratura di Gauss composita ed il relativo errore assoluto sono:

• Formula di Gauss composita e relativo errore.


n
c h
IG (f ) = (f (yk−1 ) + f (yk )) ,
2
k=1

b − a 4 (4)
I(f ) − IG
c
(f ) = h f (ξ) , ξ ∈ (a, b),
4320

dove al solito h = (b − a)/n.

E SERCIZIO 75. Si calcoli numericamente


 2π
3(e−2π − 1) − 10πe−2π
xe−x cos 2xdx = ≈ −0.12212260462 ,
0 25

mediante le 3 formule composite dei trapezi, di Simpson e di Gauss, per n = 7. Si


determini anche l’errore assoluto. Se invece si prendesse n = 10, come cambierebbe
l’approssimazione?

Un M-file che può essere usato per implementare simultaneamente le formule


composite dei trapezi, di Simpson e di Gauss dell’esercizio precedente, è descritto
in Appendice C. Per il suo utilizzo è necessario definire la funzione integranda
funQ.m.

6.3 Esercizi proposti

E SERCIZIO 76. Calcolare numericamente


 1 
(1 + x2 ) 1 − x2 dx
−1

usando il metodo di Simpson composito. Quanti punti sono necessari affinchè


l’errore assoluto sia < 1.e − 4? Come valore esatto, considerare il valore
dell’integrale ottenuto con quadl a meno di 1.e − 6.
204 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 77. Trovare α1 e x2 cosicché la formula di quadratura


 1
2 1
f (x)dx ≈ α1 f + f (x2 )
0 5 6

sia esatta sui polinomi di primo grado generati da {1, 1 − x}.

E SERCIZIO 78. Data la formula di quadratura


 1
f (x)dx ≈ α1 f (−1) + α2 f (0) + α3 f (1/2) .
−1

Trovare i coefficienti αi cosicché abbia grado di esattezza 2.

E SERCIZIO 79. Si calcoli un’approssimazione di


 2
5 4 15 3
I= x − x + 2 dx
−1 2 2

con le formule di Newton-Côtes di tipo chiuso con n ≤ 4. Ricordiamo che le


formule di Newton-Côtes di tipo chiuso hanno la forma seguente
n
In+1 (f ) = κ · h · cj f (xj )
j=0

dove h = (b − a)/n, xj = a + jh, j = 0, . . . , n e i coefficienti si ricavano della


tabella seguente

n κ c0 c1 c2 c3 c4 c5

1 1/2 1 1
2 1/3 1 4 1
3 3/8 1 3 3 1
4 2/45 7 32 12 32 7
5 5/288 19 75 50 50 75 19

Calcolare anche l’errore assoluto commesso rispetto al valore dell’integrale.

E SERCIZIO 80. Un corpo in caduta libera all’equatore, subisce una devi-


azione dalla verticale dovuta all’ accelerazione di Coriolis. Supponendo che
al tempo t = 0 il corpo sia fermo (cioe‘ x(0)=0, v(0)=0 e a(0)=0) e che la sua
accelerazione di Coriolis sia nota solo negli istanti di tempo di Tabella, si
determini lo spostamento dalla verticale dovuto a tale accelerazione dopo
t = 100 sec..
In tabella elenchiamo al variare del tempo t, i valori dell’accelerazione
a(t):
6 - Integrazione 205

t | 10 15 30 40 50 70 100
-----------------------------------------------
a |.0144 .0216 .0432 .0576 .072 .1008 .1439

Mediante integrazione dell’accelerazione, il suggerimento è quindi di cal-


colare la velocità v(t) negli istanti di tempo indicati usando la formula di
quadratura dei trapezi composita e integrando nuovamente calcolare la devi-
azione x(t) (sempre integrando numericamente con i trapezi compositi) negli
stessi istanti di tempo. Essendo

dv(t) d2 x(t)
a= =
dt dt2
 T
dv(t)
v(T ) = dt = v(T ) − v(0) (6.34)
0 dt
 T
dx(t)
x(T ) = dt = x(T ) − x(0) (6.35)
0 dt
Applicando all’equazione (6.34), la formula di quadratura composita dei
trapezi, si avrebbe

v(0) 0=
10
v(10) = (0.0144 + 0);
2
5
v(15) = v(10) + (0.0144 + 0.0216);
2
ecc...

Applicando ancora all’equazione (6.35), la formula di quadratura composita


dei trapezi, si avrebbe

x(0) = 0
10
x(10) = (v(10) + v(0));
2
5
x(15) = x(10) + (v(10) + v(15));
2
ecc...

• Quale sarebbe la distanza percorsa dal corpo dopo t = 100 sec (suppo-
nendo non ci sia attrito)? Sugg. 1 L’energia potenziale si trasforma in
cinetica, quindi .... Sugg. 2 oppure per la seconda legge della dinamica

d2 x
mg=m
dt2
e integrando due volte si conclude.
206 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 81. Si consideri il seguente integrale definito


 5π
1
sin dx .
1
π
x
1. Dire a priori quanti punti sono necessari, sia col metodo dei trapezi
composito che con il metodo di Simpson composito, per il calcolo
dell’integrale a meno di tol = 1.e − 4. Si suggerisce di costruire una
funzione funQ che valuta sia f (x) = sin(1/x) che le derivate f (2) e f (4) .
2. Calcolare quindi l’integrale con il metodo di Simpson composito usando
il numero minimo di nodi richiesto al punto precedente. Qual è l’errore
assoluto commesso? Come valore esatto usare quello ottenuto con quadl
con tolleranza tol = 1.e − 4. Che conclusione si può trarre osservando
l’errore di approssimazione?
3. Calcolare l’integrale con il metodo di Simpson composito usando i punti
xi = (i + 1)/π, i = 0, ..., 4 e xi = (i − 4)π, i = 5, . . . , 9. (Sugg. Applicare
Simpson composito ai due insiemi di punti sommandone poi il valore
che si ottiene con Simpson nell’intervallo [5/π, π]...)
E SERCIZIO 82. Si consideri il seguente integrale definito
 − π1
1
sin 2
dx .
−π x
1. Dire a priori, analizzando la formula dell’errore, quanti punti sono nec-
essari per il calcolo del precedente integrale con il metodo dei trapezi
composito a meno di tol = 1.e − 3.
2. Calcolare quindi l’integrale con il metodo di trapezi composito usando
20 punti equispaziati tra −π e −5/π e 50 punti equispaziati tra −5/π
e −1/π. Qual è l’errore assoluto commesso? Usare come valore esatto
quello ottenuto con la funzione quadl con la stessa tolleranza.
E SERCIZIO 83. Calcolare numericamente
 1
|x3 − 0.7| dx
−1

usando il metodo dei trapezi composito su 10 sottointervalli di [-1,1]. Con-


frontare poi i risultati con la funzione quadl di Matlab usando come toller-
anza 1.e − 6.
x
E SERCIZIO 84. L’integrale di f (x) = x2 e− 2 cos(x) su [−1, 1] si può approssi-
mare con la formula di Gauss-Legendre
 1 n
f (x)dx ≈ wi f (zi ) . (6.36)
−1 i=1

Il vettore dei nodi z e dei pesi w si possono determinare con la M-function:


6 - Integrazione 207

function [z,w]=zwlegendre(n)
% This function computes nodes z and weights
% w of the Gauss-Legendre quadrature formula.
%---------------------------------------------
% Input:
% n = number of quadrature nodes
%Outputs:
% z = column vector of the nodes
% w = column vector of the weights
%---------------------------------------------
if n<=1
z=[0]; w=[2];
return
end
A=zeros(n); k=[1:n-1];
v=k./(sqrt(4*(k.^2)-1));
A=A+diag(v,1)+diag(v,-1);
[w,z]=eig(A);
nm2=sqrt(diag(w’*w));
w=(2*w(1,:)’.^2)./nm2;
z=diag(z);

Si chiede di calcolare l’integrale (6.36) con la formula di Gauss-Legendre


costruita prendendo n = 2i , i = 0, 1, ..., imax = 8 punti a meno di tol =
1.e − 9. In pratica ci si arresterà quando n > 28 oppure l’errore in modulo
diventa minore di tol, assumendo come valore esatto quello che si ottiene con
la funzione quadl).
E SERCIZIO 85. Assegnati i punti x0 = 0, x1 = 12 , x2 = 1 e la funzione f (x) =
1
1 + x2
1. Determinare il polinomio p2 (x) in forma di Lagrange che interpola f (x)
nei punti assegnati e se ne plottino i rispettivi grafici
2. Dare una maggiorazione dell’errore d’interpolazione di f (x) con p2 (x)
 1  1
3. Approssimare f (x)dx con p2 (x)dx e calcolarne l’errore assoluto.
0 0

4. Quanti punti si dovrebbero considerare per avere un errore ≤ 10−4 con


il metodo di Simpson composito?
E SERCIZIO 86. Usando la formula dell’errore per la regola dei trapezi com-
posita
(b − a)3 (2)
R1 (f ) = − f (ξ)
12N 2
3 1
trovare, per il calcolo di 1 x dx = ln(3), il numero minimo di sottointervalli
N per cui l’ errore R1 (f ) sia minore di tol = 10−2 .
208 Appunti di Calcolo Numerico con codici in Matlab/Octave

6.4 Derivazione
Sia f ∈ C 1 [a, b]. Come possiamo approssimare f  (x̂) in un generico punto x̂ ∈
[a, b]? Vediamo tre approssimazioni utili in molti casi di nostro interesse.

1. Differenze finite in avanti: Δa .


Ricordando che se f è derivabile in x̂ allora

f (x̂ + h) − f (x̂)
f  (x̂) = lim ,
h→0 h

allora una prima approssimazione di f  (x̂) si ottiene usando il rapporto in-


crementale:
f (x̂ + h) − f (x̂)
f  (x̂) ≈ := Δa f (x̂) (6.37)
h
Se f ∈ C 2 [a, b] avremo

h2 
f (x̂ + h) = f (x̂) + hf  (x̂) + f (ξx̂ ) ,
2
con ξx̂ ∈ (x̂, x̂ + h). Pertanto per l’errore avremo l’espressione

h
f  (x̂) − Δa f (x̂) = − f  (ξx̂ ) , (6.38)
2
che tende a zero come h. In pratica Δa f (x̂) fornisce un’approssimazione del
primo ordine della derivata di f in x̂.

2. Differenze finite all’ indietro: Δi .


Come prima, una prima approssimazione di f  (x̂) si ottiene usando il rap-
porto incrementale relativamente al punto x̂ − h:

f (x̂) − f (x̂ − h)
f  (x̂) ≈ := Δi f (x̂) (6.39)
h

Se f ∈ C 2 [a, b] avremo

h2 
f (x̂ − h) = f (x̂) − h f  (x̂) + f (ηx̂ ) ,
2
con ηx̂ ∈ (x̂ − h, x̂). Pertanto per l’errore avremo un’espressione simile alle
differenze finite in avanti
h 
f  (x̂) − Δi f (x̂) = f (ηx̂ ) , (6.40)
2
che tende a zero come h. In pratica Δi f (x̂) fornisce anch’esso un’approssima-
zione del primo ordine della derivata di f in x̂.
6 - Integrazione 209

3. Differenze finite centrali: δ.


Una approssimazione migliore di f  (x̂) si ottiene usando i valori di f in x̂−h
e x̂ + h come segue:
f (x̂ + h) − f (x̂ − h)
f  (x̂) ≈ := δ f (x̂) (6.41)
2h
Infatti, se f ∈ C 3 [a, b]
h2  h3
f (x̂ + h) = f (x̂) + h f  (x̂) + f (x̂) + f (3) (ξx̂ ) ,
2! 3!
con ξx̂ ∈ (x̂, x̂ + h)

h2  h3
f (x̂ − h) = f (x̂) − h f  (x̂) + f (x̂) + f (3) (ηx̂ ) ,
2! 3!
con ηx̂ ∈ (x̂ − h, x̂). Sommando membro a membro e dividendo per 2h otte-
niamo
f (x̂ + h) − f (x̂ − h) h2 
= f  (x̂) + f (3) (ξx̂ ) + f (3) (ηx̂ ) .
2h 12
Pertanto l’errore assume l’espressione
h2 
f  (x̂) − δ f (x̂) = −
f (3) (ξx̂ ) + f (3) (ηx̂ ) , (6.42)
12
che tende a zero come h2 . Osserviamo anche che al tendere di h → 0
anche ξx̂ ) e ηx̂ ) tenderanno allo stesso valore. In pratica δ f (x̂) fornisce
un’approssimazione del secondo ordine della derivata di f in x̂.
Data una suddivisione regolare dell’intervallo [a, b], ovvero i punti xk = a +
kh, k = 0, . . . , n con xn = b, da un punto di vista implementativo le formule
Δa si possono applicare per ogni punto eccetto il punto b; le formule Δi si possono
applicare per ogni punto eccetto il punto a mentre le formule centrali δ si possono
applicare per ogni punto interno dell’intervallo.
Nel caso delle differenze centrali, nei punti x0 e xn si usano invece le seguenti
approssimzioni
1
[−3f (x0 ) + 4f (x1 ) − f (x2 )] in x0 (6.43)
2h
1
[3f (xn ) − 4f (xn−1 ) + f (xn−2 )] in xn , (6.44)
2h
che si ottengono calcolando in x0 (rispettivamente in xn ) la derivata prima del
polinomio d’interpolazione di grado 2 della funzione f .
Infatti, il polinomio di secondo grado relativo ad x0 , si può costruire usando i
punti x0 , x1 , x2 ottenendo
p2 (x) = f (x0 )l0 (x) + f (x1 )l1 (x) + f (x2 )l2 (x)
2
& (x − xj )
dove, al solito, li (x) = . Derivandolo e valutandolo in x0 , sapendo
(xi − xj )
j=0,j =i
che x1 = x0 + h e x2 = x0 + 2h, si ottiene la (6.43).
210 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura 6.7: Grafico che illustra l’errore relativo compiuto dal metodo 1 (dif-
ferenze in avanti), in rosso, col + e dal metodo 2 (differenze finite centrali) in
nero con o, nell’approssimare exp(1).

6.4.1 Un esempio

Vediamo come si comportano le approssimazioni alle differenze finite in avanti


e alle differenze finite centrali nel calcolo della derivata prima della funzione
f (x) = exp(x) nel punto x = 1. Essendo f  (x) = exp(x), il valore da approssimare
è quindi exp(1).
Scriviamo quindi un codice Matlab/Octave che confronta i due metodi sopraci-
tati per valori del passo h della forma h = 2−k , k = 1, . . . , 50 e ne determina anche
l’errore relativo commesso. Il codice si trova nel file mydiff.m in Appendice C.
I grafici di Figura 6.7, mostrano come entrambi i metodi siano instabili. Quando
il passo h è troppo piccolo, l’approssimazione di entrambe peggiora invece di
migliorare. Nel grafico in scala semi-logaritmica, la curva in rosso coi  − +
rappresenta il primo metodo, quella in nero indicata con  − o il secondo. Os-
serviamo che tra i due metodi il secondo sembra avere comunque performance
migliori.
Vediamo di giustificare questo fatto analizzando l’errore. Infatti, come di-
mostrato, l’ errore assoluto con differenze finite in avanti Δa è del tipo

|h| |f (2) (ξ)|


E1 = , ξ ∈ I(x, x0 )
2
6 - Integrazione 211

mentre con le differenze finite centrali δ è


|h|2 | f (3) (ξ1 ) + f (3) (ξ2 )|
E2 = , ξ1 , ξ2 ∈ I(x0 + h, x0 − h)
12
dove I(s, t) è il più piccolo intervallo aperto contenente s e t.
Nel nostro caso essendo f (n) (x) = exp(x) per ogni n ∈ N, e poiché per x ≈ 1 si
ha exp(x) ≈ exp(1) deduciamo

|h| exp(1)
E1 ≈ (6.45)
2
|h|2 exp(1)
E2 ≈ (6.46)
6
Per esercizio verificare se sono buone approssimazioni dell’errore le stime (6.45)
e (6.46).

6.4.2 Metodi di Eulero


In questa breve sottosezione, vediamo come applicare le formule per approssi-
mare la derivata prima alla soluzione di equazioni differenziali del primo ordine.
Consideriamo il problema di Cauchy

y  (t) = f (t, y(t))


(6.47)
y(t0 ) = y0 ,

con f : I × R → R, t0 ∈ I. Dato l’intervallo I = [t0 , T ], T < ∞, prendiamo un


passo h = (T − t0 )/N , con N ≥ 1 che indica il numero dei sottointervalli in cui
suddivideremo I, e i punti tn , 0 ≤ n ≤ N . Sia poi yn il valore approssimato
della soluzione y(tn ), ovvero yn ≈ y(tn ), ottenuto con un metodo discreto per
approssimare y  (t)
Se usiamo il rapporto incrementale in avanti Δa
yn+1 − yn
y  (tn ) ≈ , (6.48)
h
dove yn+1 = y(tn+1 ) e yn = y(tn ). Sostituendo in (6.47), otteniamo la formula del
metodo di Eulero esplicito (EE)

yn+1 = yn + h fn , n = 0, 1, . . . , N − 1 (6.49)

dove abbiamo usato la notazione fn = f (tn , yn ).


Se invece dell’approssimazione (6.48) usiamo il rapporto incrementale Δi
yn+1 − yn
y  (tn+1 ) = (6.50)
h
oppure
yn − yn−1
y  (tn ) = (6.51)
h
212 Appunti di Calcolo Numerico con codici in Matlab/Octave

otterremo il metodo di Eulero implicito (EI) (o all’indietro)

yn+1 = yn + h fn+1 , n = 0, 1, . . . , N − 1 (6.52)

dove fn+1 = f (tn+1 , yn+1 ).


Pertanto, poiché y0 è nota, l’insieme dei valori y1 , . . . , yN rappresentano la
soluzione numerica del nostro problema.

E SEMPIO 48. Crescita di una popolazione. Sia y(t) una popolazione di batteri
(ma questo esempio si può generalizzare al caso di una popolazione di persone) posta
in un ambiente limitato, ovvero dove non possono vivere più di B batteri. Sapendo
che y0 B. Sia C > 0 il fattore di crescita, allora la velocità di cambiamento dei
batteri al tempo t sarà proporzionale al numero dei batteri presistrenti al tempo t, ma
limiata dal fatto che non possono vivere più di B batteri. L’equazione differenziale
corrispondente, detta equazione logistica , è

d y(t) y(t)
= Cy(t) 1 − , (6.53)
dt B

che è un’equazione del primo ordine la cui soluzione ci da il numero di batteri presenti
al tempo t.
Se approssimiamo la derivata con il metodo di Eulero esplicito (6.49) essa diventa

yn+1 = yn + Ch yn (1 − yn /B) n ≥ 0 .

Con Eulero implicito (6.52) essa diventa

yn+1 = yn + Ch yn+1 (1 − yn+1 /B) n ≥ 0 .

In quest’ultimo caso, appare evidente, che usando un metodo implicito per il calcolo
della soluzione al passo tn+1 , si dovrà risolvere, ad ogni passo, un’equazione non
lineare. Nonostante i metodi impliciti siano più costosi essi però sono più stabili
(vedi, ad esempio, [25, 26]).
6 - Integrazione 213

6.5 Estrapolazione di Richardson


In questa sezione presentiamo la tecnica di estrapolazione di Richardson che rap-
presenta uno degli strumenti più interessanti per l’accelerazione di successioni,
ovvero il loro calcolo ”veloce”, e che trova applicazione anche alla quadratura
numerica.
Uno degli ingredienti su cui si basa la tecnica di Richardson è la formula di
sommazione di Eulero-Maclaurin che a sua volta si basa sui numeri di Bernoulli
ovvero il valore in zero dei polinomi di Bernoulli di grado pari.
Presenteremo quindi lo schema di (estrapolazione) di Romberg come appli-
cazione della tecnica di Richardson alla quadratura numerica. A sua volta, la tec-
nica di Romberg si può pensare come l’algoritmo di Neville per la valutazione in
0 del polinomio di interpolazione i cui nodi non sono altro che i passi al quadrato
da cui si parte per raffinare la formula di quadratura (ovvero per aumentarne
l’ordine di convergenza).
Molti dei metodi numerici, quali quelli per l’interpolazione e la quadratura, si
basano sulle informazioni di una certa funzione su un insieme di valori che
dipende da un passo h = 0.
Ad ogni h = 0 posssiamo far corrispondere il valore T (h) di un funzionale lin-
eare e continuo (che rappresenta il processo numerico) che ammette un’espansione
asintotica in termini di potenze di h:

T (h) = τ0 +τ1 hγ1 +τ2 hγ2 +. . .+τm hγm +αm+1 (h)hγm+1 , 0 < γ1 < γ2 < · · · < γm+1 ,
(6.54)
con τi , i = 0, . . . , m indipendenti da h, |αm+1 (h)| ≤ A (ovvero limitata) e γi non
tutti numeri interi. Chiederemo inoltre che τ0 = lim T (h) ovvero, τ0 rappresenta
h→0
la soluzione del problema considerato.
Presentiamo ora due semplici esempi di funzionali lineari che si possono rap-
presentare nella forma (6.54).
E SEMPIO 49. Sia
f (x + h) − f (x − h)
T (h) =
2h
l’operatore alle differenze finite centrali. È noto che T (h) ≈ f  (x). Se f ∈
C 2m+3 [x − a, x + a], m ≥ 0 e |h| ≤ |a|, allora dall’espansione di Taylor possiamo
riscrivere T (h) come segue:
 
1 h2 h2m+3
T (h) = f (x) + f  (x)h + f (2) (x) + ... + [f (2m+3) (x) + o(1)] −
2h 2! (2m + 3)!
 
1 h2 h2m+3
− f (x) − f  (x)h + f (2) (x) + . . . + (−1)2m+3 [f (2m+3) (x) + o(1)] =
2h 2! (2m + 3)!
= τ0 + τ1 h2 + . . . + τm h2m + αm+1 (h)h2m+2 , (6.55)

f (2k+1) (x)
dove τ0 = f  (x), τk = , k = 1, . . . , m + 1 e αm+1 (h) = τm+1 + o(1)1 .
(2k + 1)!
1 Con il simbolo o(1) si intende indicare una quantità che ha ordine di infinitesimo di una costante.
214 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SEMPIO 50. Sia


f (x + h) − f (x)
T (h) =
h
l’operatore alle differenze finite in avanti. Operando come prima si ha

T (h) = τ0 + τ1 h + τ2 h2 . . . + τm hm + αm+1 (h)hm+1 , (6.56)

f (k+1) (x)
dove τk = , k = 0, 1, . . . , m + 1 e αm+1 (h) = τm+1 + o(1).
(k + 1)!
Infine, come già osservato alla sezione 6.4, l’operatore alle differenze finite
centrali è una approssimazione migliore dell’operatore alle difference finite in
avanti, poiché la sua espansione asintotica contiene solo potenze pari di h (cfr.
(6.55) e (6.56)).

La domanda d’obbligo, a questo punto, è la seguente: come possiamo costruire


un metodo generale di estrapolazione?

Dato un metodo di discretizzazione, scegliamo una sequenza di passi, {hi , i = 0, 1,...},


tali che h0 > h1 > h2 > . . . > 0, e calcoliamo T (hi ), i = 0, 1, 2, .... Fissato poi un
indice k, per i ≤ k costruiamo i polinomi

T̃i,k (h) = b0 + b1 hγ1 + ... + bk hγk (6.57)

tali da soddisfare le condizioni d’interpolazione

T̃i,k (hj ) = T (hj ), j = i − k, i − k + 1, . . . , i .

Consideriamo quindi i valori


Ti,k = T̃i,k (0)
come approssimazione di τ0 .2
Ci limiteremo al caso in cui γk = k γ.

Poniamo, z = hγ e zj = hγj , j = 0, 1, ..., m, cosicché

T̃i,k (h) = b0 + b1 z + b2 z 2 + ... + bk z k := Pi,k (z) .

Proviamo un risultato che sostanzialmente afferma che il valore estrapolato


Ti,k altro non è che il valore in z = 0 del polinomio di interpolazione di grado k
sui nodi zj , j = i − k, ..., i che assume il valore T (hj ).
Proposizione 17. In z = 0,
i i
Lagrange (i) (i)
Ti,k := Pi,k (0) = ck,j Pi,k (zj ) = ck,j T (hj ) (6.58)
j=i−k j=i−k

2 Talvolta ai polinomi (6.57) si preferiscono funzioni razionali.


6 - Integrazione 215

dove
(i)
&
i
zs
ck,j =
zs − zj
s = j
s=i−k
sono i polinomi elementari di Lagrange, tali che

i ⎨ 1 p=0
(i)
ck,j zjp = 0 p = 1, ..., k (6.59)

j=i−k (−1)k zi−k zi−k+1 · · · zi p=k+1

(i)
Dim. Osserviamo che i coefficienti ck,j dipendono solo da zj . Consideriamo
i monomi z p , p = 0, 1, ..., k. Riscriviamoli come polinomi di interpolazione di
Lagrange
i & i
z − zs
zp = zjp · p = 0, 1, ..., k .
zj − z s
j=i−k
s = j
s=i−k
Da cui, per z = 0 si ottengono le prime due uguaglianze in (6.59).
Infine, osserviamo che
i &
i
z − zs &
i
z k+1 = zjk+1 · + (z − zs ) . (6.60)
zj − z s
j=i−k
s = j s=i−k

s=i−k

Infatti, poiché z k+1 sta sia a sinistra che a destra della (6.60), il polinomio dif-
ferenza
z k+1 − (membro destro in (6.60)) ∈ Pk
e si annulla nei k + 1 punti zs , s = i − k, ..., i. Cioè esso si annulla identicamente.
Ciò prova la validità della (6.60).
Sostituendo z = 0, si ottiene la terza delle (6.59). 
Siamo in grado di usare l’espansione (6.58). Pertanto, per k < m

(i) ; <
i i
(i)
Ti,k = ck,j T (hj ) = ck,j τ0 + τ1 zj + τ2 zj2 + . . . + τk zjk + zjk+1 (τk+1 + O(hj )) ,
j=i−k j=i−k
(6.61)
e per k = m

(i) ; <
i i
(i)
Ti,m = cm,j T (hj ) = cm,j τ0 + τ1 zj + τ2 zj2 + . . . + τm zjm + zjm+1 αm+1 (hj ) .
j=i−m j=i−m
(6.62)
216 Appunti di Calcolo Numerico con codici in Matlab/Octave

Se i passi hj sono tali che hj = h0 bj , 0 < b < 1, ovvero formano una successione
h
geometrica di ragione b, o in generale hj+1 j
≤ b < 1, ∀ j, si può dimostrare che
esiste una costante Ck dipendente solo da b tale che
i
(i)
|ck,j |zjk+1 ≤ Ck zi−k zi−k+1 · · · zi . (6.63)
j=i−k

Dalle relazioni (6.59) e (6.63) segue che


Ti,k = τ0 + (−1)k zi−k zi−k+1 · · · zi (τk+1 + O(hi−k )), k<m; (6.64)
e
|Ti,m − τ0 | ≤ Mm+1 Cm zi−m zi−m+1 · · · zi , (6.65)
se |αm+1 (hj )| ≤ Mm+1 , per j ≥ 0.
Concludendo, per k fissato e i → ∞
(k+1)γ
|Ti,k − τ0 | = O(zi−k
k+1
) = O(hi−k ). (6.66)
Rappresentando il tutto su un “tableau”, come in Figura 6.8, potremo dire che
Ti,k , ovvero l’ i-esimo elemento della (k + 1)-esima colonna, converge a τ0 con
ordine (k + 1)γ.

Figura 6.8: Tableau dello schema di Richardson per m = 3, con Ti,0 = T (hi ).

6.5.1 Applicazione alla quadratura numerica


 b
Sia f ∈ C 2m+2 [a, b] e si desideri calcolare f (t)dt su una partizione uniforme,
a
xi = a + ih, i = 0, 1, ..., n, h = (b − a)/n, n ≥ 1.
6 - Integrazione 217

Regola trapezoidale
Se si fa uso della formula trapezoidale, è noto che
f (a) f (b)
T (h) = h + f (a + h) + . . . + f (b − h) + .
2 2
Per tale funzionale vale la formula di sommazione di Eulero-Maclaurin:
 b m 
B2l h2l B2m+2
T (h) = f (t)dt+ f (2l−1) (b) − f (2l−1) (a) +h2m+2 (b−a)f (2m+2) (ξ) ,
a (2l)! (2m + 2)!
l=1
(6.67)
con a < ξ < b . La formula precedente ci da una espressione esplicita dell’errore
che si commette approssimando l’integrale di f su [a, b] mediante la formula
trapezoidale. I coefficienti Bk sono i numeri di Bernoulli che sono definiti come il
valore in 0 dei polinomi di Bernoulli di grado k, con k pari (si veda la sottosezione
6.5.3 per alcuni cenni sui polinomi di Bernoulli).
Alla luce di quanto detto, la formula trapezoidale (6.67) si può riscrivere come
T (h) = τ0 + τ1 h2 + . . . + τm h2m + αm+1 h2m+2 , (6.68)
dove
 b
τ0 = f (t)dt
a
B2k 
τk = f (2k−1) (b) − f (2k−1) (a) , k = 1, . . . , m
(2k)!
B2m+2
αm+1 (h) = (b − a)f (2m+2) (ξ(h)) a < ξ(h) < b .
(2m + 2)!
Poiché f (2m+2) ∈ C[a, b], allora esiste una costante L tale che |f (2m+2) (x)| ≤ L,
uniformemente in x. Ció implica che ∃ Mm+1 tale che
b−a
|αm+1 (h)| ≤ Mm+1 , ∀h= , n>0. (6.69)
n
La disequazione (6.69) ci dice che il termine di errore dell’espansione asintotica
(6.68) tende a zero come h → 0. Infine, detta espansione approssima τ0 come un
polinomio in h2 , al tendere a zero di h.

Metodo di Romberg
Per il calcolo di τ0 si può procedere come segue:
h0 h0
1. h0 = b − a, h1 = , . . . ,hm = , con n1 , . . . , nm > 0, m > 0.
n1 nm
2. In corrispondenza determino
Ti,0 = T (hi ) , i = 0, 1, . . . , m ;
dove T (h) è il funzionale (6.68).
218 Appunti di Calcolo Numerico con codici in Matlab/Octave

3. Sia
T̃m,m (h) = a0 + a1 h2 + · · · + am h2m ;
tale che T̃m,m (hi ) = T (hi ), i = 0, 1, . . . , m. Il polinomio T̃m,m altro non è che
il polinomio di interpolazione di Ti,0 .

4. Sia T̃m,m (0) il valore estrapolato di τ0 .


Su queste idee si basa il metodo di Romberg. Le scelte dei passi hi e dei polinomi
T̃i,k sono fatte come segue:
b−a
• hi = , i ≥ 0.
2i
• Per calcolare T̃m,m (0) (ovvero il valore estrapolato di τ0 ) si usa l’algoritmo
di Neville (vedi sottosezione 6.5.4). Per 1 ≤ i ≤ k ≤ m sia T̃i,k il polinomio
di grado k in h2 tale che:

T̃i,k (hj ) = T (hj ), j = i − k, . . . , i


T̃i,k (0) = Ti,k .

A partire da k = 1, l’algoritmo di Neville consente di determinare Ti,k dai


valori di Ti,k−1 e Ti−1,k−1 , usando la formula

Ti,k−1 − Ti−1,k−1
Ti,k = Ti,k−1 + 2 32 , 1≤k≤i≤m. (6.70)
hi−k
hi − 1

La formula (6.70) è l’algoritmo di Neville con xi = h2i (valutato in x = 0).


Per capire meglio il funzionamento del metodo facciamo un’esempio.
E SEMPIO 51. Calcoliamo  1
I= x5 dx .
0

Il valore esatto dell’ integrale è I = 16 . Prendiamo h0 = 1, h1 = 2−1 , h2 = 2−2 .


Calcoliamo mediante la formula trapezoidale i valori T0,0 = 0.5 corrispondente a h20 ,
T1,0 = 0.265625 ≈ 17 2 197
64 corrispondente a h1 e T2,0 = 0.192383 ≈ 1024 corrispondente a
2
h2 . Usiamo la (6.70) per calcolare T1,1 e T2,1 . Un ulteriore applicazione della (6.70)
consente di determinare T2,2 = 0.1666667 ≈ 16 .

Una prima importante proprietà dello schema di Romberg è che ogni Ti,k del
tableau costruito con la (6.70) (vedi Figura 6.8) rappresenta una regola di inte-
grazione lineare, ovvero

Ti,k = α0 f (a) + α1 f (a + hi ) + · · · + αni −1 f (b − hi ) + αni f (b) .


Proposizione 18. Per i = k alcune formule Tk,k rappresentano formule di
quadratura di tipo Newton-Cotes. In particolare
6 - Integrazione 219

• T0,0 è la formula dei trapezi (Ti,0 formule dei trapezi composte);


• T1,1 è la formula di Simpson, (Ti,1 formule di Simpson composte);
• T2,2 è la formula di Milne.
T3,3 non è una formula di N-C.
Dim. Facilmente si prova che
b−a
T0,0 = (f (a) + f (b)) , (f ormula dei trapezi)
2
b−a a+b
T1,0 = (f (a) + 2f ( ) + f (b)) .
22 2
Da cui, mediante l’algoritmo di Neville
T1,0 − T0,0 4 1
T1,1 = T1,0 + = T1,0 − T0,0 .
3 3 3
Sviluppando
b−a 1 4 a+b 1
T1,1 = f (a) + f + f (b) ,
2 3 3 2 3
che è la ben nota formula di Simpson.
Le rimanenti affermazioni si lasciano per esercizio. 
Come ultima osservazione, il metodo di Romberg è un metodo di estrapo-
lazione di Richardson della formula (6.54) in cui l’esponente γk = 2k.

6.5.2 Una implementazione del metodo di Romberg


Il metodo di Romberg per la quadratura si applica usando la seguente ricetta: si
costruisce una tabella, T triangolare (inferiore), la cui prima colonna consiste dei
valori approssimati dell’integrale mediante formule composite dei trapezi costru-
ite usando suddivisioni regolari con N = 2m , m = 0, 1, 2, ...., (ovvero suddivisioni
con 2m + 1 punti). Se indichiamo con Ti,1 , i = 1, 2, . . . l’ elemento dell’ i-esima riga
della prima colonna di T, che contiene il valore approssimato dell’integrale con
i passi hi = 2−i , ovvero 2i + 1 punti, gli elementi delle successive colonne sono
costruiti mediante la ricorrenza
4k Ti,k−1 − Ti−1,k−1
Ti,k = , i = k, . . . , m , k = 0, . . . , m , . (6.71)
4k − 1
Un esempio di tabella di Romberg è visualizzato in Tabella 6.5. Questa tecnica
trova la sua utilità nelle seguenti due proprietà
(a) TN,k è una formula di quadratura del tipo
N
TN,k = Aj,N f (xj,N ) .
j=1
220 Appunti di Calcolo Numerico con codici in Matlab/Octave

T20 ,0

T2,0 T20 ,1

T22 ,0 T21 ,1 T20 ,2

T23 ,0 T22 ,1 T21 ,2 T20 ,3

T24 ,0 T23 ,1 T22 ,2 T2,3 T1,4

.. .. ..
. . .

Tabella 6.5: Tabella del metodo di Romberg

(b) Ciascuna delle formule in una data riga, come ad esempio la riga evidenzi-
ata in Tabella 6.5
T23 ,0 , T22 ,1 , T21 ,2 , T20 ,3
o in generale
T2m ,0 , T2m−1 ,1 , T2m−2 ,2 , T2m−3 ,3 , ....(∗)
è una formula con N = 2m + 1 punti e in ciascuna delle formule (*) i punti
sono gli stessi che in T2m ,0 .
Infine, vale il seguente risultato.
Teorema 31. Ciascuna formula T1,k , T2,k , T3,k , .... è una formula di grado di
esattezza 2k − 1.
Ad esempio, se consideriamo la terza colonna di Tabella 6.5, essa rappresenta
una formula di quadratura esatta sui polinomi di grado 5 (ecco perchè integra
perfettamente la funzione x5 ).

6.5.3 I polinomi di Bernoulli


In questa sottosezione desideriamo richiamare alcune delle caratteristiche salienti
dei polinomi di Bernoulli.
Si parte dall’intervallo I = [0, 1] e per ogni x ∈ I i polinomi di Bernoulli sono
definiti dalle seguenti relazioni:

B0 (x) = 1, (6.72)
1
B1 (x) = x− , (6.73)
2

Bk+1 (x) = (k + 1)Bk (x), k = 1, 2, .... (6.74)

Le relazioni (6.73) e (6.74) consentono di determinare i polinomi di Bernoulli


a meno di una costante di integrazione. Per avere univocità si introducono le
6 - Integrazione 221

ulteriori condizioni
B2l+1 (0) = 0 = B2l+1 (1), l≥1. (6.75)
Si voglia ad esempio determinare B2 (x). Dalle (6.73) e (6.74) si avrebbe B2 (x)
=
2x − 1. Integrando B2 (x) = x2 − x + c. Usando ancora le (6.73) e (6.74) si avrebbe
3
B3 (x) = x3 − x2 + 3cx + d. Usando le condizioni al contorno (6.75) si ottiene
2
d = 0, c = 16 .
Da quanto detto segue che i numeri di Bernoulli sono nulli per i polinomi di
grado dispari (ciò segue da (6.75)) e diversi da zero per quello di grado pari. I
1 1 1
primi 4 numeri pari di Bernoulli sono: B0 = 1, B2 = , B4 = − , B6 = .
6 30 42
Due proprietà facilmente verificabili sono:
1. (−1)k Bk (1 − x) = Bk (x), k ≥ 0;
 1
2. Bk (t)dt = 0, k > 1.
0

Figura 6.9: Alcuni polinomi di Bernoulli.

Per il grafico di alcuni polinomi di Bernoulli, vedasi Fig. 6.9.

6.5.4 Algoritmo di Neville


L’algoritmo di Neville consente di valutare il polinomio interpolante mediante
una successione di interpolazioni lineari di polinomi di grado via via crescente.
Sia Sn = {(xi , yi ), i = 0, 1, ..., n} un insieme di punti in R2 Nella sua forma
originale l’algoritmo funziona come segue:
222 Appunti di Calcolo Numerico con codici in Matlab/Octave

(a) Fase di inizializzazione

Pi,0 = yi , i = 0, 1, ..., n .

(b) Passo iterativo


x − xi−k xi − x
Pi,k = Pi,k−1 + Pi−1,k−1 ,
xi − xi−k xi − xi−k
Pi,k−1 − Pi−1,k−1
Pi,k = Pi,k−1 + x−xi−k , i = 1, ..., n k = i, ..., n .
x−xi − 1

Al termine del processo Pn,n conterrà il valore in x del polinomio di interpo-


lazione di grado n su Sn .
function [n]=neville(x,y,t)
% ----------------------------------------------------
% Valuta in t il polinomio di interpolazione di
% grado length(x)-1, mediante l’algoritmo di Neville
% facendo uso di un solo vettore p
%-----------------------------------------------------
n=length(x); p=y;
for i=2:n,
for k=i:n,
p(k)=(p(k)*(t-x(k-i+1))-p(k-1)*(t-x(k)))/(x(k)-x(k-i+1));
end
end
n=p(n);

Il polinomio interpolante ottenuto con l’algoritmo di Neville, può scriversi


nella forma
i+k
k
Pi,k (x) = lj,i (x)yj
j=i

k
dove i polinomi di grado k, lj,i sono i polinomi elementari di Lagrange.
(x),
Tale algoritmo si può applicare allo schema di Romberg pur di prendere x = 0
e xi = h2i nonché prendendo i = 0, 1, 2, ... e k = 1, ..., i nel passo iterativo.
A
Metodi iterativi ed
equazione logistica
Questa Appendice ha lo scopo di far capire come i modelli di evoluzione di una
popolazione, siano studiabili come metodi iterativi per la ricerca di zeri di fun-
zione. Si tratta di successioni il cui valore corrente dipende da quello prece-
dente tramite una funzione di iterazione, che rappresenta l’evoluzione della popo-
lazione.
Iniziamo ricordando dapprima due tra i più noti e semplici modelli di evoluzione
di una popolazione: il modello lineare di Malthus e quello quadratico di Verhulst.
Poi studieremo brevemente il modello lineare discreto (del modello differenziale)
di Volterra, applicato all’evoluzione di due popolazioni concorrenti, e la sua con-
troparte non lineare noto come modello di Lotka-Volterra.

A.1 Modello lineare di Malthus


Il Rev.do Thomas (Robert) Malthus (?/2/1766- 23/12/1834), curato inglese ad Al-
bury (vicino ad Oxford), nel suo saggio ”An Essay on the Principle of Population”
pubblicato nel 1798, ipotizzò che una popolazione che non ha scambi con l’esterno
cresce sempre più dei propri mezzi di sussistenza.
Aveva delle visioni pessimistiche sia come demografo che come economista.
Predisse che la crescita di una popolazione matematicamente è una crescita geo-
metrica, ovvero il tasso di crescita è lineare.
Se pertanto x0 è il numero di individui iniziali, allora dopo un certo tempo la
popolazione sarà x1 = x0 + g x0 , con g ∈ R che è detto fattore di crescita (o
growth rate). Allora x1 = (1 + g)x0 , x2 = (1 + g)x1 = (1 + g)[(1 + g)x0 ] = (1 + g)2 x0
e al passo k
xk = (1 + g)k x0 g ∈ R (A.1)
che è una progressione geometrica di ragione 1 + g.
Domanda: come varia la popolazione? Risposta: in funzione di g e del valore
iniziale x0 .
Studiamo la successione (o progressione) geometrica (A.1). Essa converge se e
solo se |1 + g| < 1 per ogni popolazione iniziale x0 . Pertanto, si ha convergenza
quando −2 < g < 0. Se −2 < g ≤ −1 allora −1 < 1 + g < 0 cosicché xk sarà
negativo per k dispari e positivo altrimenti. Ovvero non sapremo dire nulla. Se
224 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura A.1: Thomas Malthus

g = −1, 1 + g = 0 e quindi xk = 0, ∀k. Infine, quando −1 < g < 0, 1 + g < 1 per


cui xk < x0 : la popolazione si estingue!
Ci sono due altri casi da considerare:

• g = 0. In tal caso la popolazione rimane inalterata xk = x0 , ∀k.

• Divergenza quando g > 0. Infatti, se 1 + g > 1 che implica xk > xk−1 >
· · · > x0 : la popolazione cresce esponenzialmente.

E SEMPIO 52. Come esempio, consideriamo la popolazione iniziale x0 = 100 e


consideriamo 10 iterazioni, k = 0, 1, ..., 10. L’evoluzione sarà come in Figura A.2

A.2 Il modello non lineare di Verhulst


Pierre Verhulst (Brussels, 28/10/1804-15/2/1849) era un matematico che si inter-
essò di biologia e in particolare della legge di crescita di una popolazione.
Nel 1838 in Verhulst, P. F. Notice sur la loi que la population pursuit dans son ac-
croissement, Corresp. Math. Phys. 10:113-121, propose un nuovo modello di crescita
della popolazione, assumendo non più una crescita costante ma con fattore di
crescita di tipo lineare g(x) = −ax + b, a > 0. Partendo da una popolazione
iniziale x0 , la (A.1) al passo k, si scriverà come

xk+1 = xk + g(xk ) xk = −ax2k + (1 + b)xk . (A.2)

L’equazione (A.2) ha senso se a > −1 e 0 ≤ x ≤ 1+b a (perchè la popolazione deve


essere sempre ≥ 0). Il modello è equivalente alla mappa quadratica

T : R+ −→ R+
(A.3)
x → T (x) = −ax2 + (1 + b)x .
A. Metodi iterativi ed equazione logistica 225

Figura A.2: La progressione di Malthus a partire da una popolazione iniziale di


100 individui per diversi valori di g.

Figura A.3: Pierre Verhlust

Consideriamo la trasformazione lineare x = (1+b) a y, che mappa l’intervallo [0, (1+


b)/a], dove la parabola di (A.3) è T (x) ≥ 0 in [0, 1]. Otteniamo
2
1+b 1+b
T̃ (y) = −a y 2 + (1 + b) · y (A.4)
a a
Semplificando
T̃ (y) = −κy 2 + κy (A.5)
2
(1+b)
avendo posto κ = a , vedi Fig. A.4.
226 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura A.4: La trasformazione lineare della parabola T (x) ≥ 0 in [0, 1]

Possiamo allora studiare la mappa discreta


xk+1 = −κ x2k + κ xk , 0 < κ ≤ 4. (A.6)
Il processo iterativo (A.6) si chiama processo logistico discreto. Pertanto,
partendo da un x0 ∈ (0, 1], scelto un valore di κ ∈ (0, 4], itereremo la mappa
(A.6) un certo numero di volte, ottenendo un punto del cosidetto diagramma di
Verhulst.
Riassumendo, indichiamo in tabella A.1, le differenze tra i due approcci.

A.2.1 Isometrie, dilatazioni e contrazioni


In entrambi i procedimenti di Malthus e Verhulst, partendo da un x0 e da una
funzione T : R → R si è generata una successione di valori {xn }n≥0 tale che
xn+1 = T (xn ), n = 0, 1, . . . Consideriamo allora la successione
xn+1 = T (xn ), n = 0, 1, 2, . . . (A.7)
A. Metodi iterativi ed equazione logistica 227

Figura A.5: Iterazione del processo di Verhulst che origina il ben noto dia-
gramma di biforcazione

Malthus: lineare Verhulst: non lineare


fattore di crescita costante g ⎧lineare g(x) = ax + b
⎨ x0
x0
processo xn+1 = −kx2n + kxn
xn+1 = (1 + g)xn ⎩
k = (1 + b)2 /a
trasformazione T (x) = (1 + g)x T (x) = −kx2 + kx

Tabella A.1: Tabella di confronto tra le iterazioni di Malthus e Verhlust

essa sarà detta

• una isometria se

|T (xn+1 ) − T (xn )| = |xn+1 − xn |, ∀n ∈ N (A.8)

• una dilatazione se

|T (xn+1 ) − T (xn )| > |xn+1 − xn |, ∀n ∈ N (A.9)

• oppure una contrazione se

|T (xn+1 ) − T (xn )| < κ |xn+1 − xn |, ∀n ∈ N, κ ∈ [0, 1) (A.10)

Vale il seguente Teorema del punto fisso di (Banach-)Caccioppoli


228 Appunti di Calcolo Numerico con codici in Matlab/Octave

Teorema 32. Ogni contrazione T : R → R ammette un unico punto fisso,


x = T (x ).
Partendo da un fissato x0 il processo
xn+1 = T (xn ) , n = 0, 1, 2, ...
è un’approssimazione di x che migliora ad ogni passo, cioè
|xn+1 − x | < |xn − x |, n = 0, 1, 2, ...
Il punto x è detto appunto punto fisso della contrazione T .

Figura A.6: Renato Caccioppoli

Se T è una contrazione, allora esiste un κ ∈ [0, 1) tale che


|T (xn+1 ) − T (xn )| < κ |xn+1 − xn |, ∀n ∈ N, (A.11)
ovvero
|T (xn+1 ) − T (xn )|
< 1. (A.12)
|xn+1 − xn |
La disuguaglianza (A.12) ci dice che il ”rapporto incrementale” è sempre mi-
nore di 1. Quando |xn+1 − xn | ≤  allora il rapporto incrementale approssima
la derivata di T in xn .

A.2.2 Semplici esempi di processi iterativi


1. Processo di traslazione: T (x) = x + a. Le progressioni aritmetiche, come
la capitalizzazione semplice degli interessi, sono processi di traslazione.
Sono processi isometrici.
A. Metodi iterativi ed equazione logistica 229

2. Processo omotetico: T (x) = mx.


• |m| < 1, è una contrazione.
• |m| > 1,è una dilatazione.
• |m| = 1, è una isometria (identità se m = 1 e simmetria rispetto
l’origine se m = −1).
Le progressioni geometriche, quali la capitalizzazione composta degli inter-
essi, sono esempi di processi omotetici.
La rappresentazione grafica dei processi iterativi si ottiene seguendo questa ”ricetta”
1. In un riferimento cartesiano ortogonale, tracciamo il grafico della trasfor-
mazione T e della funzione identica y = x, come evidenziato in A.7.

Figura A.7: Rappresentazione di un processo iterativo.

2. Fissato quindi un punto iniziale x0 , costruiamo la sua immagine x1 = T (x0 )


sull’asse delle ordinate. Per simulare il procedimento di retroazione, ripor-
tiamo in ascissa il valore x1 attraverso la funzione identica y = x. Calco-
liamo quindi x2 = T (x1 ) e riportiamo il suo valore in ascissa. Procediamo
iterativamente per calcolare xk+1 = T (xk ).
In Figura A.8 il primo fotogramma illustra un processo shift; nel secondo e
nel terzo due processi omotetici di contrazione con attrattore nullo. Il quarto
fotogramma rappresenta infine un processo espansivo.
E SEMPIO 53. Esempi di un processo iterativo convergente Fig. A.9 e di processo
iterativo divergente Fig. A.10. Infine alcune iterazioni di Verhulst per diversi valori
di κ si trovano nelle Figure A.11-A.13.
230 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura A.8: Processi iterativi per diversi valori di m.

Figura A.9: Processo convergente


A. Metodi iterativi ed equazione logistica 231

Figura A.10: Processo divergente

A.3 Modello lineare di Volterra


A.3.1 Interazione tra 2 popolazioni: modello lineare di Volterra
Si suppone che il tasso di crescita delle 2 popolazioni sia proporzionale e costante
al numero di individui di ciascuna (nonché diverso per le 2 popolazioni).
xn+1 − xn = a xn + b yn =⇒ xn+1 = (1 + a)xn + b yn (A.13)
yn+1 − yn = c xn + d yn =⇒ yn+1 = c xn + (1 + d) yn (A.14)
con xn , yn gli individui al passo n.
Equivalentemente
xn+1 1+a b xn
=
yn+1 c 1+d yn

T : R2 −→ R2 , T (X) = X  := A · X
con A matrice dei coefficienti e X = [x y] .
Consideriamo come Esempio Figura A.14
Cerchiamo di chiarire il significato dei coefficienti cooperazione: a e d (di
ciascuna popolazione, rispetto se stessa) sono negativi, ciascuna specie - da sola
- si estinguerebbe (contrazione). Ma sono positivi i coefficienti di crescita b e
c (di ciascuna popolazione, rispetto all’altra), la presenza dell’altra specie può
rallentare o addirittura inibire il processo di estinzione.
232 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura A.11: Processo di Verhulst convergente con x0 = 0.1, κ = 3.

segno dei coeff. evoluzione del sistema


a, b, c, d
− + +− cooperazione
+ − −+ competizione
+ + −− prede-predatori

competizione: il segno dei coefficienti di crescita è l’opposto del caso della


cooperazione. Ciascuna specie esploderebbe (crescita) se non ci fosse l’altra ad
inibire tale processo. La competizione fa sı̀ che una delle due specie si estingue e
l’altra esplode, come mostrato nella prossima figura.

preda-predatore: il segno dei coefficienti di crescita a, b è positivo mentre


quelli della seconda specie, c, d sono negativi. Si possono interpretare le due
specie come una popolazione di prede x ed una di predatori y, da cui il nome di
modello preda-predatore.
A. Metodi iterativi ed equazione logistica 233

Figura A.12: Processo di Verhulst convergente con x0 = 0.1, κ = 3.9

A.4 Modello non lineare di Lotka-Volterra


In analogia a quanto fatto nel caso unidimensionale (nel passare da Malthus a
Verhulst):

dx/dt = x(a − by) (A.15)


dy/dt = −y(c − dx) (A.16)

xn+1 − xn = (a − byn ) xn (A.17)


yn+1 − yn = (c xn − d) yn (A.18)

con xn , yn gli individui al passo n, a, b, c, d > 0.


Pertanto, partendo dalle popolazioni iniziali x0 , y0 otteniamo il sistema non
lineare

xn+1 = (a + 1)xn − bxn yn (A.19)


yn+1 = c xn yn + (1 − d) yn (A.20)

dove
234 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura A.13: Processo di Verhulst divergente con x0 = 0.1, κ = 4.1

Figura A.14: Qui x0 = 10, y0 = 20 e a = b = 0.1, c = 0.01, d = 0 .

• la prima equazione è quella della popolazione delle prede (che si assume


abbiano una riserva di cibo illimitata);

• la seconda equazione è quella della popolazione dei predatori.


A. Metodi iterativi ed equazione logistica 235

Figura A.15: Valori scelti: x0 = 10, y0 = 20 e a = −0.01, b = 0.2 c = 0.1, d =


−0.0001 .

Figura A.16: Valori scelti: x0 = 10, y0 = 20 e a = −0.1, b = 1.0 c = −0.1, d = 0.1

In Figura A.19 presentiamo un esempio di evoluzione mediante lo schema non


lineare di Lotka-Volterra.
236 Appunti di Calcolo Numerico con codici in Matlab/Octave

Figura A.17: Valori scelti: x0 = 10, y0 = 20 e a = 0.01, b = 0.02 c = −0.01, d =


−0.2

Figura A.18: Alfred J. Lotka (1880-1949)(sx) e Vito Volterra (1860-1940)(dx)


A. Metodi iterativi ed equazione logistica 237

Figura A.19: Valori scelti: x0 = 2000, y0 = 600, a = 0.1, b = 0.00008333333, c =


0.00004, d = 0.04.
B
Interpolazione: aspetti
implementativi e
applicazioni
Questa appendice è stata scritta insieme al Prof. Marco Caliari dell’Università
di Verona a cui va il mio personale ringraziamento.

B.1 Richiami sull’interpolazione polinomiale


Data una funzione f : [a, b] → R e un insieme {xi }ni=1 ⊂ [a, b], sia pn−1 f (x) il
polinomio di grado n − 1 interpolatore di f nei punti xi (cioè pn−1 f (xi ) = f (xi ).
Chiameremo i punti xi nodi di interpolazione (o, più semplicemente, nodi). Un
generico punto x̄ ∈ [a, b] in cui si valuta Ln−1 f sarà chiamato nodo target (o, più
semplicemente, target).

I n nodi di Chebyshev sono gli zeri del polinomio di Chebyshev di


 grado n Tn (x) =
jπ+ π
cos(n arccos(x)) (vedasi anche §5.1). Dunque, xj+1 = cos n
2
, j = 0, . . . , n − 1.
Si chiamano
 n nodi di Chebyshev estesi (o di Chebyshev–Lobatto) i nodi x̄j+1 =

cos n−1 , j = 0, . . . , n − 1. Tali nodi appartengono all’intervallo [−1, 1]. I nodi
di Chebyshev relativi ad un intervallo generico [a, b] si ottengono semplicemente
per traslazione e scalatura.

B.1.1 Interpolazione di Lagrange


Dato un insieme di n coppie di interpolazione {(xi , yi )}ni=1 , il polinomio elementare
di Lagrange i-esimo (di grado n − 1) è

&n
(x − xj )
Li (x) = .
j=1
xi − xj
j =i

Il codice Matlab/Octave per il calcolo dei polinomi di Lagrange su vettori (colonna)


di punti target x è riportato nella funzione lagrai target.m di Appendice E .
240 Appunti di Calcolo Numerico con codici in Matlab/Octave

Il polinomio di interpolazione si scrive dunque


n
pn−1 (x) = yi Li (x) .
i=1

B.1.2 Sistema di Vandermonde


Dato il polinomio

pn−1 (x) = a1 xn−1 + a2 xn−2 + . . . + an−1 x + an

e n coppie di interpolazione {(xi , yi )}ni=1 , il corrispondente sistema di Vander-


monde si scrive
⎛ n−1 ⎞⎛ ⎞ ⎛ ⎞
x1 xn−2
1 ... x1 1 a1 y1
⎜x2n−1 n−2
1⎟ ⎜ ⎟ ⎜ ⎟
⎜ x 2 . . . x2 ⎟ ⎜ a 2 ⎟ ⎜ y2 ⎟
⎜ .. .. .. .. ⎟ ⎜ .. ⎟ = ⎜ .. ⎟
⎜ . .⎟ ⎜ ⎟ ⎜ ⎟ (B.1)
⎜ . ... . ⎟⎜ . ⎟ ⎜ . ⎟
⎝xn−1 xn−2 . . . xn−1 1 ⎠ ⎝ an−1 ⎠ ⎝yn−1 ⎠
n−1 n−1
xn−1
n xn−2
n ... xn 1 an yn

Il calcolo della matrice di Vandermonde si può fare con il codice Matlab/Octave


in Tabella B.1. oppure usando la funzione Matlab/Octave vander.

function V = vandermonde(nodi)
%
% V = vandermonde(nodi)
%
n = length(nodi);
V = repmat(nodi’,1,n).^repmat([n-1:-1:0],n,1);

Tabella B.1: Matrice di Vandermonde.

B.1.3 Interpolazione di Newton


Data una funzione f , definiamo le differenze divise nel seguente modo:

f [x] = f (x)
f [x] − f [x1 ]
f [x1 , x] =
x − x1
... = ...
f [x1 , x2 , . . . , xk−1 , x] − f [x1 , x2 , . . . , xk−1 , xk ]
f [x1 , x2 , . . . , xk−1 , xk , x] =
x − xk
Per il calcolo delle differenze divise ci possiamo avvalere della funzione DiffDivise
di Appendice E.
B. Interpolazione: aspetti implementativi e applicazioni 241

Il polinomio d’interpolazione nella forma di Newton si scrive quindi

p0 f (x) = d1
w = (x − x1 )
pi f (x) = pi−1 f (x) + di+1 w, i = 1, . . . , n − 1
w = w · (x − xi+1 ), i = 1, . . . , n − 1

ove
di = f [x1 , . . . , xi ] .

Il calcolo delle differenze divise e la costruzione del polinomio di interpolazione


possono essere fatti nel medesimo ciclo for.
Sfruttando la rappresentazione dell’errore
⎛ ⎞ ⎛ ⎞
&
i &
i
f (x)−pi−1 f (x) = ⎝ (x − xj )⎠ f [x1 , . . . , xi , x] ≈ ⎝ (x − xj )⎠ f [x1 , . . . , xi , xi+1 ]
j=1 j=1
(B.2)
è possibile implementare un algoritmo per la formula di interpolazione di New-
ton adattativo, che si interrompa cioè non appena la stima dell’errore è più pic-
cola di una fissata tolleranza.
Dato il polinomio interpolatore nella forma di Newton

pn−1 (x) = d1 + d2 (x − x1 ) + . . . + dn (x − x1 ) · . . . · (x − xn−1 ) ,

si vede che le differenze divise soddisfano il sistema lineare


⎛ ⎞⎛ ⎞ ⎛ ⎞
0 ... ... 0 1 dn f (x1 )
⎜ 0 ... 0 (x2 − x1 ) 1⎟ ⎜dn−1 ⎟ ⎜ f (x2 ) ⎟
⎜ .. .. .. ⎟ ⎜ ⎟ ⎜ ⎟
⎜ .. .. ⎟⎜ . ⎟ ⎜ .. ⎟
⎜ . . . . . ⎟ ⎜ .. ⎟ = ⎜ . ⎟
⎜ )n−2 ⎟⎜ ⎟ ⎜ ⎟
⎝ 0 j=1 (xn−1 − xj ) ... (xn−1 − x1 ) 1⎠ ⎝ d2 ⎠ ⎝f (xn−1 )⎠
)n−1
j=1 (xn − xj ) (xn − x1 )
... ... 1 d1 f (xn )
(B.3)

B.1.4 Interpolazione polinomiale a tratti


Data una funzione f : [a, b] → R e un’insieme {xi }ni=1 ⊂ [a, b] di nodi ordinati,
consideriamo l’interpolante polinomiale a tratti Lck−1 f di grado k − 1. Su ogni
intervallo hi = xi+1 − xi essa coincide con il polinomio di grado k − 1

ai,1 (x − xi )k−1 + ai,2 (x − xi )k−2 + . . . + ai,k−1 (x − xi ) + ai,k . (B.4)

Dunque, l’interpolante polinomiale a tratti è completamente nota una volta noti


i nodi e i coefficienti di ogni polinomio.
242 Appunti di Calcolo Numerico con codici in Matlab/Octave

B.1.5 Strutture in Matlab/Octave


In Matlab/Octave è possibile definire delle strutture, cioè degli insiemi (non ordi-
nati) di oggetti. Per esempio, le istruzioni

S.a = 1;
S.b = [1,2];

generano la struttura S

S =
{
a = 1
b =
1 2
}

L’interpolazione polinomiale a tratti è definita mediante una struttura solita-


mente chiamata pp (piecewise polynomial), che contiene gli oggetti pp.x (vettore
colonna dei nodi), pp.P (matrice dei coefficienti), pp.n (numero di polinomi), pp.k
(grado polinomiale aumentato di uno) e pp.d (numero di valori assunti dai poli-
nomi). La matrice P ha dimensione n × k e, con riferimento a (B.4),

Pij = ai,j .

Nota una struttura pp, è possibile valutare il valore dell’interpolante in un gener-


ico target x̄ con il comando ppval(pp,xbar).

B.1.6 Splines cubiche


Le splines cubiche sono implementate da Matlab/Octave con il comando spline
che accetta in input il vettore dei nodi e il vettore dei valori e restituisce la strut-
tura associata. La spline cubica costruita è nota come not-a-knot, ossia viene
imposta la continuità della derivata terza (generalemente discontinua) nei nodi
x2 e xn−1 . Lo stesso comando permette di generare anche le splines vincolate: è
sufficiente che il vettore dei valori abbia due elementi in più rispetto al vettore
dei nodi. Il primo e l’ultimo valore verranno usati per imporre il valore della
derivata alle estremità dell’intervallo.

Implementazione di splines cubiche naturali in Matlab/Octave

Con le notazioni usate fino ad ora, si può costruire una spline cubica S a partire
dalla sua derivata seconda nell’intervallo generico [xi , xi+1 ]

 mi+1 − mi
S[x i ,xi+1 ]
(x) = (x − xi ) + mi , i = 1, . . . , n − 1 (B.5)
hi
B. Interpolazione: aspetti implementativi e applicazioni 243

ove mi = S  (xi ) sono incogniti, con m1 = mn = 0. Integrando due volte la (B.5),


si ottiene

 mi+1 − mi
S[x i ,xi+1 ]
(x) = (x − xi )2 + mi (x − xi ) + ai
2hi
mi+1 − mi mi
S[xi ,xi+1 ] (x) = (x − xi )3 + (x − xi )2 + ai (x − xi ) + bi
6hi 2

ove le costanti ai e bi sono da determinare. Innanzitutto, richiedendo la proprietà


di interpolazione, cioè S[xi ,xi+1 ] (xj ) = f (xj ), j = i, i + 1, si ottiene

bi = f (xi ),
f (xi+1 ) − f (xi ) hi hi
ai = − (mi+1 − mi ) − mi =
hi 6 2
f (xi+1 ) − f (xi ) hi hi
= − mi+1 − mi
hi 6 3

A questo punto, richiedendo la continuità della derivata prima, cioè S[x i−1 ,xi ]
(xi ) =

S[xi ,xi+1 ] (xi ) per i = 2, . . . , n − 1, si ottiene

hi−1 hi−1 + hi hi f (xi+1 ) − f (xi ) f (xi ) − f (xi−1 )


mi−1 + mi + mi+1 = − . (B.6)
6 3 6 hi hi−1

Risulta chiaro che ci sono n − 2 equazioni e n incognite mi .

Splines cubiche naturali Si impone che il valore della derivata seconda agli
estremi dell’intervallo sia 0. Dunque m1 = mn = 0. Il sistema lineare (B.6)
diventa allora
⎛ ⎞⎛ ⎞ ⎛ ⎞
1 0 ... ... ... 0 m1 d1
⎜ h61 h1 +h 2 h2
0 ... 0 ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 3 6 ⎟ ⎜ m2 ⎟ ⎜ d2 ⎟
⎜ .. .. .. .. .. ⎟ ⎜ .. ⎟ ⎜ .. ⎟
⎜0 . . . . . ⎟ ⎜ ⎟ ⎜ ⎟
⎜ ⎟⎜ . ⎟ = ⎜ . ⎟
⎜ .. .. .. .. .. ⎟ ⎜ . ⎟ ⎜ . ⎟
⎜ . . . . . 0 ⎟ ⎜ . ⎟ ⎜ . ⎟
⎜ ⎟⎜ . ⎟ ⎜ . ⎟
⎝0 ... 0 hn−2 hn−2 +hn−1 hn−1 ⎠ ⎝
mn−1 ⎠ ⎝dn−1 ⎠
6 3 6
0 ... ... ... 0 1 mn dn

con d1 = dn = 0 e di = f (xi+1h)−f
i
(xi )
− f (xi )−f (xi−1 )
hi−1 , i = 2, . . . , n−1. L’algoritmo
per il calcolo della struttura associata ad una spline cubica naturale è ri-
portato in Tabella B.2.

Splines cubiche vincolate Si impongono due valori d1 e d2 per la derivata
S  (x1 ) e S  (xn ), rispettivamente. Si ricava dunque

a1 = d1
mn − mn−1
(xn − xn−1 )2 + mn−1 (xn − xn−1 ) + an−1 = dn
2hn−1
244 Appunti di Calcolo Numerico con codici in Matlab/Octave

function pp = splinenaturale(x,y)
%
% function pp = splinenaturale(x,y)
%
n = length(x);
x = x(:);
y = y(:);
h = x(2:n)-x(1:n-1);
d1 = h(2:n-2)/6;
d0 = (h(1:n-2)+h(2:n-1))/3;
rhs = (y(3:n)-y(2:n-1))./h(2:n-1)-(y(2:n-1)-y(1:n-2))./h(1:n-2);
S = diag(d1,-1)+diag(d0)+diag(d1,1);
m = zeros(n,1);
m(2:n-1) = S\rhs;
a = (y(2:n)-y(1:n-1))./h(1:n-1)-h(1:n-1).*(m(2:n)/6+m(1:n-1)/3);
b = y(1:n-1);
pp.x = x;
pp.P = [(m(2:n)-m(1:n-1))./(6*h),m(1:n-1)/2,a,b];
pp.k = 4;
pp.n = n-1;
pp.d = 1;

Tabella B.2: Spline cubica naturale.

da cui
h1 h1 f (x2 ) − f (x1 )
m1 + m2 = − d1
3 6 h1
hn−1 hn−1 f (xn ) − f (xn−1 )
mn−1 + mn = dn −
6 3 hn−1

Il sistema lineare da risolvere diventa dunque


⎛h h1
⎞⎛ ⎞ ⎛ ⎞
1
3 6 0 ... ... 0 m1 d1
⎜ h1 h1 +h2 h2 ⎟⎜ m ⎟ ⎜ d ⎟
⎜6 3 6 0 ... 0 ⎟⎜ 2 ⎟ ⎜ 2 ⎟
⎜ .. .. .. .. .. ⎟⎜ . ⎟ ⎜ . ⎟
⎜0 . . . . . ⎟⎜ . ⎟ ⎜ . ⎟
⎜ ⎟⎜ . ⎟ ⎜ . ⎟
⎜ . .. .. .. .. ⎟⎜ . ⎟ = ⎜ . ⎟
⎜ . ⎟
⎜ . . . . . 0 ⎟⎜ . ⎟ ⎜ . ⎟
⎜ . ⎟ ⎜ . ⎟
⎜ hn−1 ⎟ ⎝
⎝0 ... 0 hn−2
6
hn−2 +hn−1
3 6
⎠ mn−1 ⎠ ⎝dn−1 ⎠
hn−1 hn−1 mn dn
0 ... ... 0 6 3

f (x2 )−f (x1 ) f (xn )−f (xn−1


con d1 = h1 − d1 e dn = dn − hn−1 .
B. Interpolazione: aspetti implementativi e applicazioni 245

Splines cubiche periodiche Si impone S  (x1 ) = S  (xn ) e S  (x1 ) = S  (xn ). Si


ricava dunque
m1 = mn
mn − mn−1
a1 = hn−1 + mn−1 hn−1 + an−1
2
da cui
m1 − mn = 0
h1 h1 hn−1 hn−1 f (x2 ) − f (x1 ) f (xn ) − f (xn−1 )
m1 + m2 + mn−1 + mn = −
3 6 6 3 h1 hn−1
Il sistema lineare da risolvere diventa dunque
⎛ ⎞⎛ ⎞ ⎛ ⎞
1 0 ... ... ... 0 −1 m1 d1
⎜ h1 h1 +h2 0 ⎟ ⎟⎜ m2 ⎟ ⎜ ⎟
h2
⎜6 0 ... ...
⎜0
3 6
h2 +h3 ⎟⎜ ⎟ ⎜ d2 ⎟

h2 h3
0 . . . 0 ⎟ ⎜ m ⎟ ⎜ d ⎟
⎜ . 6 3 6 ⎜ 3 ⎟ ⎜ 3 ⎟
⎜ .. .. .. .. .. .. .. ⎟⎟ ⎜ .. ⎟ ⎜ .. ⎟
⎜ . . . . . . ⎜ ⎟ ⎜
⎟⎜ . ⎟ = ⎜ . ⎟
⎜ . . . . . . . ⎟⎜ . ⎟ ⎜ . ⎟ ⎟
⎜ . .. .. .. .. .. .. ⎟ .. ⎟ ⎜ .. ⎟
⎜ . ⎟⎜⎜ ⎟ ⎜ ⎟
⎜ hn−1 ⎟ ⎝
⎝0 ... ... 0 hn−26
hn−2 +hn−1
3 6
⎠ mn−1 ⎠ ⎝dn−1 ⎠
h1 h1 hn−1 hn−1 mn dn
3 6 0 ... 0 6 3

f (x2 )−f (x1 ) f (xn )−f (xn−1 )


con d1 = 0 e dn = h1 − hn−1 .

Splines cubiche not-a-knot Si impone la continuità della derivata terza in x2


e xn−1 . Si ricava dunque
m2 − m1 m 3 − m2
=
h1 h2
mn−1 − mn−2 mn − mn−1
=
hn−2 hn−1
da cui
1 1 1 1
m1 − + m2 + m3 = 0
h1 h1 h2 h2
1 1 1 1
mn−2 − + mn−1 + mn = 0
hn−2 hn−2 hn−1 hn−1
Il sistema lineare da risolvere diventa dunque
⎛1 ⎞⎛ ⎞ ⎛ ⎞
h1 − h11 − h12 − h12 0 ... 0 m1 d1
⎜ h1 h1 +h2 h2 ⎟⎜ m ⎟ ⎜ d ⎟
⎜6 3 6 0 ... 0 ⎟⎜ 2 ⎟ ⎜ 2 ⎟
⎜ . . . .. .. ⎟⎜ . ⎟ ⎜ . ⎟
⎜0 .. .. .. . . ⎟⎜ . ⎟ ⎜ . ⎟
⎜ ⎟⎜ . ⎟ ⎜ . ⎟
⎜ . .. .. .. .. ⎟⎜ . ⎟ = ⎜ . ⎟
⎜ . ⎟
⎜ . . . . . 0 ⎟⎜ . ⎟ ⎜ . ⎟
⎜ . ⎟ ⎜ . ⎟
⎜ hn−1 ⎟ ⎝
⎝0 ... 0 hn−2
6
hn−2 +hn−1
3 6
⎠ mn−1 ⎠ ⎝dn−1 ⎠
1 1 1 1
0 ... 0 hn−2 − hn−2 − hn−1 h
n−1
mn dn

con d1 = dn = 0.
246 Appunti di Calcolo Numerico con codici in Matlab/Octave

Rappresentazione dell’errore
Supponiamo di usare un metodo di interpolazione polinomiale a tratti di grado
k − 1 in un intervallo [a, b] e consideriamo due diverse discretizzazioni, rispetti-
vamente con n1 e n2 nodi, con intervalli di lunghezza media h1 = (b − a)/(n1 − 1)
e h2 = (b − a)/(n2 − 1). Gli errori di approssimazione saranno verosimilmente
err1 = Chk1 e err2 = Chk2 . Si ha dunque
k
err2 h2
=
err1 h1
da cui

log err2 − log err1 = k(log h2 − log h1 ) = −k(log(n2 − 1) − log(n1 − 1)) .

Dunque, rappresentando in un grafico logaritmico-logaritmico l’errore in dipen-


denza dal numero di nodi, la pendenza della retta corrisponde al grado di ap-
prossimazione del metodo, cambiato di segno.

B.1.7 Compressione di dati


Supponiamo di avere un insieme molto grande di coppie di nodi/valori {(xi , yi )}N
i=1
e di non conoscere la funzione che associa il valore al nodo corrispondente. Ci
poniamo il problema di comprimere i dati, ossia memorizzare il minor numero di
coefficienti pur mantenendo un sufficiente grado di accuratezza. Una prima idea
potrebbe essere quella di selezionare alcuni dei nodi, diciamo n, e di costruire
la spline cubica su quei nodi. Il costo di memorizzazione, oltre ai nodi, sarebbe
dunque pari a 4(n − 1). Rimarrebbe il problema di scegliere i nodi da memoriz-
zare, visto che non si suppone siano equispaziati.
Si potrebbe ridurre il costo di memorizzazione (a n) usando un unico polinomio
interpolatore: rimarrebbe il problema della scelta dei nodi e, probabilmente, si
aggiungerebbe un problema di mal condizionamento sempre dovuto alla scelta
dei nodi.
Un’idea che combina le tecniche discusse è la seguente: si usa una interpo-
lazione a tratti (anche lineare) per ricostruire i valori della funzione sconosciuta
in corrispondenza di n nodi di Chebyshev. Si usa poi un unico polinomio interpo-
latore su quei nodi. Il rapporto di compressione è 2N/n, considerando che non è
necessario memorizzare i nodi di Chebyshev, ma solo i coefficienti del polinomio
interpolatore (e trascurando i due estremi dell’intervallo).

B.1.8 Esercizi proposti

E SERCIZIO 87. Si implementi una function y =


interplagrange(nodi,valori,x) per la formula di interpolazione nella
forma di Lagrange.
B. Interpolazione: aspetti implementativi e applicazioni 247

E SERCIZIO 88. Si testi l’interpolazione nella forma di Lagrange della fun-


zione di Runge nell’intervallo [−5, 5] su nodi equispaziati. Si prendano rispet-
tivamente n = 11, 21, 31, 41, 51 nodi di interpolazione e si valuti l’interpolante
su 5(n − 1) + 1 nodi target equispaziati. Si producano delle figure mettendo
in evidenza i nodi di interpolazione, la funzione di Runge e l’interpolante.
E SERCIZIO 89. Si implementi una function y = chebyshev(n) per il calcolo
dei nodi di Chebyshev nell’intervallo [−1, 1].
E SERCIZIO 90. Si ripeta l’esercizio 88 usando nodi di interpolazione di
Chebyshev anziché nodi equispaziati.
E SERCIZIO 91. Si implementi una function V = vandermonde(nodi) per il
calcolo della matrice di Vandermonde definita in (B.1).
E SERCIZIO 92. Si implementi una function y =
interpvandermonde(nodi,valori,x) per la formula di interpolazione
mediante matrice di Vandermonde. Si spieghino i risultati ottenuti.
E SERCIZIO 93. Si ripeta l’esercizio 88, usando la formula di interpolazione
mediante matrice di Vandermonde. Si usi il metodo di Hörner (vedasi Sezione
2.6.1, tabella 2.3) per la valutazione del polinomio.
E SERCIZIO 94. Si implementi una function y =
interpnewton(nodi,valori,x) per il calcolo del polinomio di interpolazione
nella forma di Newton.
E SERCIZIO 95. Si ripeta l’esercizio 88, usando la formula di interpolazione
di Newton.
E SERCIZIO 96. Si modifichi l’implementazione dell’interpolazione nella
forma di Newton, in modo da prevedere come parametro opzionale di input
la tolleranza per l’errore (in norma infinito) di interpolazione, stimato come
in (B.2). Nel caso la tolleranza non sia raggiunta, l’algoritmo si interrompe
all’ultimo nodo di interpolazione. La function deve fornire in uscita il numero
di iterazioni e la stima dell’errore.
E SERCIZIO 97. Si considerino n = 21 nodi di interpolazione equispaziati
nell’intervallo [−5, 5]. Si interpoli in forma di Newton la funzione y = cos(x)
sull’insieme di nodi target {−2, 0, 1} per diverse tolleranze e, successivamente,
sull’insieme di nodi target {−2π, π}. Si spieghino i risultati ottenuti.
E SERCIZIO 98. Si calcolino i numeri di condizionamento della matrice di
Vandermonde (B.1) e della matrice dei coefficienti dell’interpolazione di New-
ton, da ordine 2 a 20 (considerando nodi equispaziati in [−1, 1] e se ne produca
un grafico semilogaritmico nelle ordinate. Si discutano i risultati.
E SERCIZIO 99. Si implementi una function pp = lintrat(x,y) per
l’interpolazione lineare a tratti.
248 Appunti di Calcolo Numerico con codici in Matlab/Octave

E SERCIZIO 100. Si verifichi, mediante un grafico logaritmico-logaritmico,


il grado di approssimazione (errore in norma infinito) delle splines cubiche
naturali per la funzione di Runge. Si considerino un numero di nodi di in-
terpolazione equispaziati nell’intervallo [−5, 5] da n = 11 a n = 91 e 102 nodi
target equispaziati.
E SERCIZIO 101. Si ripeta l’esercizio precedente con l’interpolazione lineare
a tratti.

E SERCIZIO 102. Data la struttura associata ad una spline cubica, si ricavi


la corrispondente struttura per la derivata seconda.
E SERCIZIO 103. Si ripeta l’esercizio 100, confrontando però la derivata sec-
onda della funzione di Runge e la derivata seconda della spline cubica not-a-
knot associata.

E SERCIZIO 104. Si considerino le coppie {(xi , yi )} ove gli xi sono N = 1001


nodi equispaziati nell’intervallo [0, 2π] e yi = sin(xi ). Mediante il procedi-
mento descritto in § B.1.7 (interpolazione lineare a tratti e interpolazione su
nodi di Chebyshev estesi), si determini il minimo grado n necessario per com-
primere i dati con un errore in norma infinito inferiore a 10−5 . Si determini
poi l’errore in corrispondenza del rapporto di compressione 286. Infine, si
giustifichi la stagnazione dell’errore di approssimazione per grado di interpo-
lazione maggiore di 10.
249

C
Codici Matlab/Octave
I codici relativi alle funzioni citate dalla presente trattazione, sono scaricabili al
link
http://www.math.unipd.it/∼demarchi/CN2006-07/CodiciMatlab.pdf
I codici sono parte integrante del presente libro. Invitiamo il lettore a farne il
download.
C
Indice analitico
Analisi degli errori, 17
Analisi errori
Condizionamento, 26
errore algoritmico, 26
Errore assoluto, 23
Errore inerente, 23
Metodo stabile o instabile, 26
Numero di condizionamento, 26
Problema ben(mal) condizionato, 26
Stabilità, 26
Appendice A, 219
Modello lineare di Malthus, 219
Modello lineare di Volterra, 227
competizione, 228
cooperazione, 227
preda-predatore, 228
Modello non lineare di Lotka-Volterra, 229
Modello non lineare di Verhulst, 220
diagramma di biforcazione, 222
Teorema di (Banach)-Cacciopoli, 223
Appendice B, 234, 235
Appendice C, 245
Aritmetica di macchina, 17
arrotondamento, 21
base di numerazione, 17
bias, 20
Calcolo di , 22
Cancellazione numerica, 24
Errore relativo, 23
esponente, 17
mantissa, 17
notazione floating-point, 17
notazione in virgola mobile, 17
numero macchina, 18
precisione macchina, 22
rappresentazione normalizzata, 17
252 Appunti di Calcolo Numerico con codici in Matlab/Octave

troncamento, 21
Autovalori di matrici, 111
autovalore, 111
autovettore, 111
cerchi di Gerschgorin, 112
metodo delle potenze, 116
convergenza, 117
Metodo QR
decomposizione reale di Schur, 122
polinomio caratteristico, 111
quoziente di Rayleigh, 111

Calcolo di π, 28
Algoritmo di Archimede per π, 28
Algoritmo di Viète per π, 28
Algoritmo di Wallis per π, 29
Calcolo di autovalori di matrici
Autovalori di matrici simmetrice, 124
metodi di Jacobi, 126
Successione di Sturm, 124
matrice di Householder, 120
Metodo delle potenze
metodo di Bernoulli, 119
Metodo delle potenze inverse, 119
shift, 119
Metodo QR, 120
shift, 122
valori singolari, 112
Contenuto dei Capitoli, 10

Decomposizione SVD, 170

Fast Fourier Transform (FFT), 180


Algoritmo, 182
Complessità, 182
polinomio trigonometrico, 180
trasformata discreta di Fourier (DFT), 182
Funzione erf, 190

GNU Octave, 5

Integrazione, 208
Estrapolazione di Richardson, 208
Algoritmo di Neville, 216
formula di sommazione di Eulero-Maclaurin, 212
Formule composite o generalizzate, 192
Formula generalizzata di Simpson, 193
Indice analitico 253

Formula trapezoidale, 192


Formule di Newton-Côtes, 187
Formula dei trapezi, 188
Formula di (Cavalieri-)Simpson, 188
Formule aperte, 187
Formule chiuse, 187
Numeri di Côtes, 187
Stime d’errore, 189
Formule di tipo interpolatorio, 185
Ordine di esattezza, 186
Momenti, 186
Formule gaussiane, 199
di Gauss-Chebyshev di prima specie, 200
di Gauss-Chebyshev di seconda specie, 200
di Gauss-Legendre, 201
di Gauss-Legendre-Lobatto, 201
errore di quadratura, 202
Metodo di Romberg, 212
Implementazione, 214
Nodi di quadratura, 185
Pesi di quadratura, 185
polinomi di Bernoulli, 215
Polinomi ortogonali, 197
di Chebyshev di prima specie, 198
di Chebyshev di seconda specie, 198
di Hermite, 199
di Jacobi, 199
di Laguerre, 199
di Legendre, 198
Proprietà, 197
Routine adattativa per la quadratura, 194
Integrazione , 185
Interpolazione, 131
polinomiale, 131
a tratti, 152
algorimo di Neville, 151
condizioni d’interpolazione, 133
Costante di Lebesgue, 142
differenze divise, 145
distribuzione dell’ arcocoseno, 141
errore d’interpolazione, 137
errore d’interpolazione lineare, 138
fenomeno di Runge, 138
forma di Hermite, 149
forma di Lagrange, 134
forma di Newton, 144
254 Appunti di Calcolo Numerico con codici in Matlab/Octave

funzione di Runge, 133, 139


nodi di Chebyshev estesi, 143
nodi equispaziati, 136
polinomi elementari di Lagrange, 134
polinomio di migliore approssimazione uniforme, 142
prima formula baricentrica, 135
punti di Chebyshev, 140
punti di Chebyshev-Lobatto, 141
punti di Fekete, 142
punti di Leja, 142
seconda formula baricentrica, 136
Teorema esistenza e unicità, 132
Vandermonde, 132
polinomiale a tratti, 131
razionale, 131
trigonometrica, 131
Introduzione alla seconda edizione, 5

Lista delle figure, 13


Lista delle tabelle, 15

Matlab, 5
Matrice a blocchi, 63
Matrice di Hessenberg superiore, 63
Matrice di permutazione, 77
Matrice diagonale, 62
Matrice inversa, 64
Matrice simmetrica definita positiva, 65
Matrice trasposta, 63
Matrice triangolare inferiore, 63
Matrice triangolare superiore, 62
Matrice tridiagonale, 63
Minimi quadrati discreti, 170
decomposizione SVD, 172
equazioni normali, 171
funzionale quadratico, 170
residuo quadratico, 170
SVD in Matlab/Octave, 174

realmax, 23
realmin, 23

Soluzione di sistemi lineari, 59


Algoritmo di Thomas per matrici tridiagonali, 82
Cenni al calcolo dell’inversa, 84
Condizionamento del problema, 69
Numero di condizionamento, 69
Indice analitico 255

Cose basilari sulle matrici, 59


Determinante e autovalori di matrici, 64
Fattorizzazione QR di matrici, 101
Matrice di Hilbert, 70
Matrice di Vandermonde, 70
Stime crescita del numero di condizionamento, 71
Metodi di Jacobi e Gauss-Seidel, 89
Metodo Cholesky, 81
metodo del gradiente, 96
metodo del gradiente coniugato, 97
metodo del gradiente coniugato: algoritmo, 98
metodo del gradiente: algoritmo, 97
Metodo di Eliminazione di Gauss, 72
Algoritmo di eliminazione, 74
Complessità, 75
Fattorizzazione LU, 77
Matrici elementari di Gauss, 79
Sostituzione all’indietro, 74
Strategia del pivot parziale, 75
Strategia del pivot totale, 77
Metodo di rilassamento SOR, 93
sottrilassamento, 94
sovrarilassamento, 94
Norme di vettore e di matrice, 66
Norma 1, 66
Norma euclidea, 66
Norma infinito, 66
Norma p, 66
Operazioni aritmetiche con le matrici, 59
Raffinamento iterativo, 83
Sistemi sovra e sottodeterminati, 99
Soluzione di sistemi non lineari con il metodo di Newton, 103
Splines, 169
B-splines, 156
nodi multipli, 157
proprietà, 157
Regola di Steffensen, 157
supporto minimo, 159
curve B-splines e di Bézier, 166
Algoritmo di De Casteljau, 167
poligono di controllo, 166
interpolazione, 159
condizioni di Carrasso e Laurent, 159
splines cubiche, 160
splines cubiche naturali, 162
splines cubiche periodiche, 162
256 Appunti di Calcolo Numerico con codici in Matlab/Octave

splines cubiche vincolate, 162


nodi, 156
ordine di approssimazione, 156
Polinomi elementari di Bernstein, 166
Polinomio approssimante di Bernstein, 165
potenza troncata, 156
smoothing spline, 164
Teorema del campionamento di Shannon, 164
funzione sinc, 164
Nyquist rate, 164

Tecnica di Richardson, 217

Zeri di funzione, 35
Accelerazione di Aitken, 50
Algoritmo di bisezione, 36
Calcolo di radici di polinomi
Deflazione, 52
Metodo di Newton-Hörner, 54
capitalizzazione composta, 35
Iterazione di punto fisso, 37
Ordine di convergenza, 39
Teorema delle contrazioni, 38
Teorema di Ostrowski, 38
Test d’arresto, 41
Metodo delle corde, 48
Metodo delle secanti, 48
Ordine di convergenza, 48
Metodo di bisezione, 36
Metodo di Newton, 42
Radici multiple, 44
Teorema di convergenza, 43
Metodo di Steffensen, 49
modello preda-predatore, 35
Schema di Hörner, 53
Bibliografia
[1] K. E. Atkinson, An Introduction to Numerical Analysis, Second Edition, Wi-
ley, New York, 1989.
[2] R. Bevilacqua, D. Bini, M. Capovani e O. Menchi Metodi Numerici, Zanichelli,
1992.
[3] J.-P. Berrut, Lloyd N. Trefethen, Barycentric Lagrange Interpolation, SIAM
Rev. 46(3) (2004), pp. 501-517.
[4] L. Bos, S. De Marchi, A. Sommariva e M. Vianello, Computing multivariate
Fekete and Leja points by numerical linear algebra, SIAM J. Num. Anal. Vol.
48(5) (2010), pp. 1984-1999.
[5] L. Bos, S. De Marchi, A. Sommariva e M. Vianello, Weakly Admissible Meshes
and Discrete Extremal Sets, Numer. Math. Theor. Meth. Appl. Vol. 4(1) (2011),
pp. 1-12
[6] V. Comincioli, Analisi numerica: metodi, modelli, applicazioni. E-book, Apo-
geo, 2005.
[7] V. Comincioli, Analisi numerica. Complementi e problemi, McGraw-Hill Com-
panies, 1991.
[8] M. Conrad e N. Papenberg, Iterative Adaptive Simpsons and Lobatto Quadra-
ture in Matlab, TR-2008-012 Mathematics and Computer Science, Emory Uni-
versity, 2008.
[9] P. J. Davis, Interpolation & Approximation, Dover Publications Inc., New
York, 1975.
[10] C. de Boor, A Practical Guide to Splines, Springer-Verlag, New York, 1978.
[11] S. De Marchi, Funzioni splines univariate, Forum Ed. Udinese, Seconda ed.,
2001 (con floppy).
[12] S. De Marchi, On Leja sequences: some results and applications Appl. Math.
Comput. 152(3) (2004), 621-647
[13] G. Farin, Curves and Surfaces for CAGD: A Practical Guide, Third Edition,
Academic Press, San Diego, 1993.
[14] Gautschi, W., Inglese, G., Lower bounds for the condition numbers of Van-
dermonde matrices, Numer. Math., 52(3) (1988), pp. 241-250.
[15] G. Golub, Charles F. Van Loan Matrix computation, The Johns Hopkins Uni-
versity Press, Terza Edizione, 1996.
258 Appunti di Calcolo Numerico con codici in Matlab/Octave

[16] D. Greenspan, V. Casulli Numerical Analysis for Applied Mathematics, Sci-


ence and Engineering, Addison-Wesley, 1988.

[17] Higham, N. J., The Matrix Computation Toolbox for MATLAB, University
of Manchester, Numerical Analysis Report No. 410, (2002).

[18] Higham, N. J., The Scaling and Squaring Method for the Matrix Exponen-
tial Revisited, SIAM J. Matrix Anal. Appl., 26(4) (2005), pp. 1179-1193.

[19] E. Isaacson, H. Bishop Keller, Analysis of Numerical Methods, John Wiley


& Sons, New York, 1966.

[20] J. Lambert, Numerical methods for Ordinary Differential Equations, Weley,


1991.

[21] Lax, P. D. e Richtmyer, R. D. Survey of the stability of linear finite difference


equations. Comm. Pure Appl. Math. 9 (1956), 267–293.

[22] G. G. Lorentz, Bernstein Polynomials, Chelsea Publishing Company, New


York, 1986.

[23] Moler, C. B. and C. F. Van Loan, Nineteen Dubious Ways to Compute the
Exponential of a Matrix, SIAM Review 20, 1978, pp. 801-836.

[24] G. Monegato Elementi di Calcolo Numerico, Levrotto&Bella, Torino, 1995.

[25] A. Quarteroni, F. Saleri Introduzione al Calcolo Scientifico, Esercizi e prob-


lemi risolti in Matlab, Terza Ed., Springer-Verlag, Milano, 2006.

[26] A. Quarteroni, R. Sacco e F. Saleri Matematica Numerica, Seconda Ed.,


Springer-Verlag, Milano, 2004.

[27] R. D. Richtmyer e K. W. Morton, Difference Methods fo Initial-value Prob-


lems, Wiley-Interscience, 1967.

[28] T. J. Rivlin, An Introduction to the Approximation of Functions, Dover Pub-


lications Inc., New York, 1969.

[29] J. R. Schewchuk, An Introduction to the Conjugate Gradient Method Without


the Agonizing Pain, CMU-CS-94-125, Carnegie Mellon University (1994).
[30] J. Stoer, Bulirsch Introduction to Numerical Analysis Ed. Springer-Verlag,
Berlin, 1980.
Ritratti e foto di alcuni matematici che hanno contribuito
allo sviluppo del calcolo numerico

(1.1) Isaac Newton: 1643-1727 (1.2) Leonhard Euler: 1707- (1.3) Joseph-Louis Lagrange:
1783 1736-1813

Figura 1: Newton, Eulero e Lagrange

(2.1) Carl Friedrich Gauss: (2.2) William Hörner : 1786- (2.3) Augustin-Louis Cauchy:
1777-1855 1837 1789-1857

Figura 2: Gauss, Hörner e Cauchy


(3.1) Pafnutij Lv́ovic Čebyšëv: (3.2) Carl David Tolmé Runge: (3.3) Martin Wilhelm Kutta:
1821-1894 1856-1927 1867-1944

Figura 3: Chebyshev, Runge e Kutta

(4.1) Eric Harold Neville: (4.2) Alexander Craig Aitken: (4.3) Gene Howard Golub: 1932-
1889-1961 1895-1967 2007

Figura 4: Neville, Aitken e Golub

Potrebbero piacerti anche