Sei sulla pagina 1di 50

Note per il corso di

Laboratorio di Fisica Computazionale


(A. A. 2022/23)

Sistemi di equazioni lineari


Prof. G. Profeta
Dipartimento di Scienze Fisiche e Chimiche
Linear algebra Università degli Studi dell’Aquila
26 ottobre 2022
on scientific programming in C++ and finally Franek’s text [30] on memory as a programming con-
cept in C and C++. Good allround texts on C/C++ programming in engineering and science are the
books by Flowers [17] and Barton and Nackman [18]. See also the online lecture notes on C/C++ at
. For Fortran 90/95 we recommend the online lec-
tures at . These web pages contain extensive refer-
ences to other C/C++ and Fortran 90/95 resources. Both web pages contain enough material, lecture
notes and exercises, in order to serve as material for own studies.

Figure 4.1: Segmentation fault, again and again! Alas, this is a situation you must likely will end up
in, unless you initialize, access, allocate or deallocate properly your arrays. Many program development
environments such as Dev C++ at provide debugging possibilities. In section 4.5
we present some simple examples of how to use the debugger GDB within the text editor emacs. Beware
however that there may be segmentation errors which occur due to errors in libraries of the operating
system. This author spent two weeks on tracing a segmentation error from a program which run perfectly
Indice

Indice 1

Listings 2

1 Sistemi di equazioni lineari 3


1.1 Definizioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Soluzione sistemi di equazioni lineari . . . . . . . . . . . . . . . . . . . . 6
1.2.1 Metodo di back e forward substitution . . . . . . . . . . . . . . . . . 7
1.2.2 Metodo di eliminazione di Gauss . . . . . . . . . . . . . . . . . . . 9
1.3 Inversa di una matrice: metodo di Gauss-Jordan . . . . . . . . . . . . . . . . 11
1.4 Sistemi di equazioni non lineari: Newton-Raphson method . . . . . . . . . 14
1.4.1 Matrici tridiagonali: Metodo ricorsivo . . . . . . . . . . . . . . . . 15

2 Interpolazioni 17
2.0.1 Metodo di Vandermonde . . . . . . . . . . . . . . . . . . . . . . . . 17
2.0.2 Spline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3 Regressioni 23
3.1 Funzioni lineari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Regressione mediante combinazione lineare di funzioni . . . . . . . . . . . 26

4 Librerie scientifiche 29
4.1 BLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 Lapack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 Diagonalizzazione di una matrice . . . . . . . . . . . . . . . . . . . . . . . 43
4.3.1 Matrici Hermitiane . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.3.2 Librerie Lapack per la diagonalizzazione . . . . . . . . . . . . . . . 44
4.3.3 Soluzione sistema lineare mediante diagonalizzazione . . . . . . . . 48

1
Listings

1.1 routine di back-substitution . . . . . . . . . . . . . . . . . . . . . . . . . . 8


schema_gauss1.f90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
schema_gauss2.f90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Metodo di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1 script Gnuplot 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 script Gnuplot 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1 script Gnuplot 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1 codice prodotto scalare con Blas . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 header della routine sger di Blas . . . . . . . . . . . . . . . . . . . . . . . 30
4.3 codice che utilizza la libreria sgemm di Blas . . . . . . . . . . . . . . . . . 32
sgesv.f90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
linear.f90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.4 routine Lapack dsyev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.5 codice di diagonalizzazione mediante Lapack . . . . . . . . . . . . . . . . 46

2
Capitolo 1

Sistemi di equazioni lineari

1.1 Definizioni
Le matrici (o arrays) rappresentano unIntroduzione
insieme
Matrici
di variabili dello stesso tipo. I vettori sono
array ad una dimensione (vettore), mentre una matrice representa un array a più dimensioni
Funzioni intrinseche
Tipi derivati

(fino ad un massimo di 7 in Fortran)


Rappresentazione di una array a una e due dimensioni

RIGA 1 RIGA 1

RIGA 2 RIGA 2

RIGA 3 RIGA 3

RIGA 4 RIGA 4

RIGA 5 RIGA 5

COLONNA 1 COLONNA 2 COLONNA 3 COLONNA 4

Array a una dimensione Array a due dimensioni

Fondamenti di Informatica T (A-K) Matrici e strutture

Figura 1.1: Struttura di dati ordinati in un vettore ed una matrice

Matrici e vettori vanno dichiarati nella sezione di dichiarazione delle variabili. È necessario
specificare, oltre al tipo (INTEGER, REAL, DOUBLE PRECISION, LOGICAL, COMPLEX)
anche il numero di dimensioni e di elementi per ogni dimensione.
Per esempio la struttura di una matrice A matrice è:
 
a11 a12 a13 a14
a21 a22 a23 a24 
A= a31 a32 a33 a34 
 (1.1)
a41 a42 a43 a44
con ai,j ∈ R

3
4 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

Un vettore unidimensionale sarà rappresentato come :


 
x1
 x2 
x ∈ R =  ..  (1.2)
 
.
xn

Esempio 1
REAL , DIMENSION (10) :: A , A1 , A2
REAL , DIMENSION (1:10) : : B
REAL , DIMENSION (0:9) :: C
REAL :: D ( -4:5)
INTEGER , DIMENSION (2 ,3) : : E
REAL , DIMENSION (5) :: A3 = (/1. ,2. ,3. ,4. ,5./)
In un qualsiasi punto del programma
A3 = (/1. ,2. ,3. ,4. ,5./)

Alcune definizioni:

• Rango: Numero di dimensioni (fino ad un massimo di 7)

• Limiti : Per ogni matrice, è necessario definire il limite inferiore e superiore degli indici.
Se non specificato, il limite inferiore viene assunto pari a 1.

• Estensione: Numero di elementi delle matrice in ciascuna dimensione

• Size: Numero totale di elementi o, se specificato esplicitamente, numero di elementi in


quella dimensione

• Conforme: Due matrici si dicono conformi se hanno la stessa forma.

• Matrice inversa: se esiste è la matrice tale che AA−1 = 1.

• Matrice tridiagonale: matrice i cui unici elementi non nulli sono quelli sulla diagonale
i = j, sottodiagonale i = j + 1 e sovradiagonale i = j − 1.

• matrice simmetrica: A = AT

• matrice reale ortogonale: A = (AT )−1

• matrice reale: A = A∗

• matrice Hermitiana: A = A†

• matrice unitaria: A = (A† )−1


1.1. DEFINIZIONI 5

Esempio 2 La matrice (o il vettore), nel suo complesso, viene indicata dal


nome della variabile che la rappresenta, senza gli indici. Questa caratteristica del
FORTRAN 90 permette di operare sull’intero vettore o matrice in forma molto
sintetica.

A = 0.0 E =0
! Se due vettori ( o matrici ) sono conformi e ’ possibile scrivere
A = A1 + A2
! fa la somma degli elementi corrispondenti di A1e A2
! assegna il risultato al corrispondente elemento di A
A (:) = A1 (:) + A2 (:)
! notazione analoga alla precedente ,
! ma in cui viene esplicitata la forma delle variabili
B=A

Esercizio 1 Scrivere una subroutine (M AT M AT (A, B, n, m, r, C)) che ese-


gua il prodotto di due matrici A(n, m) e B(m, r). La subroutine deve prendere
n, m e r, di tali matrici
in entrata: 1) le matrici da moltiplicare, 2) le dimensioniP
e rimandi in uscita la matrice C = A · B, ovvero Cij = k Aik Bkj .
Considerare il caso con n = 3, m = 4 e r = 5 (le entrate delle matrici possono
essere generiche e devono essere lette da un file esterno nominato 0 matrici.dat0 ).

Calcolare lo stesso prodotto con la funzione intrinseca del F ortran90, M AT M U L(A, B),
e comparare i due risultati calcolando la differenza tra le matrici ottenute nei due
casi (C − D).
6 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

1.2 Soluzione sistemi di equazioni lineari


La soluzione di sistemi di equazioni lineari costituisce una parte fondamentale nel processo di
risoluzione dei problemi di fisica e di carattere scientifico in generale.
In questa sezione descriveremo alcuni metodi per la soluzione di tali sistemi, che rappre-
sentano la base per tecniche numeriche più complesse ed efficienti.

Esempio 3 Risolvere il seguente sistema di equazioni lineari:



2x + 5y = 31
3x + 2y = 19.

che può essere scritto nella forma compatta:

Az = b

con A ( 23 51 ) , z = ( xy ) e b = ( 31
19 )

Con il metodo di Cramer, si può risolvere il sistema calcolando il determinante della matrice
A:

1.
2 5
det(A) =
= 2 × 2 − 5 × 3 = −11
3 2

2. calcolo di x e y
31 5

19 2
x= =3
−11

2 31

3 19
y= =5
−11
Il numero di operazioni richiesto per la soluzione è: passo 1 : 2 moltiplicazioni ed 1
sottrazione, passo 2: 4 moltiplicazioni, 2 divisioni e 2 sottrazioni. Quindi per un sistema
2 × 2 mediante metodo di Cramer avremo bisogno di 11 f lop (il f lop rappresenta una delle 4
operazioni floating point).
Possiamo generalizzare il ragionamento ed ottenere il numero di operazioni necessarie per
risolvere un sistema di equazioni lineari di ordine n.

• Avremo bisogno di n + 1 determinanti di ordine n,

– Ciascuno dei quali richiede la somma di n termini ottenuti mediante 1 + (n − 1)!


moltiplicazioni.
– Quindi il numero totale per gli (n + 1) determinanti avremo (n + 1)n((1 + (n −
1)!)) = (n + 1)n(n − 1)! + (n + 1)n.
1.2. SOLUZIONE SISTEMI DI EQUAZIONI LINEARI 7

Quindi la complessità del metodo di Cramer sarà O((n + 1)!).


Per esempio per un sistema con n = 5 (molto semplice!), avremo bisogno di 720 operazioni,
mentre per n = 20 le operazioni saranno 5.1× 1019 . Per comprenderne la complessità, basta
controllare quanti f lops al secondo è capace di operare il vostro personal computer e stimare
il tempo per risolvere un sistema di equazioni lineari di ordine 20.

1.2.1 Metodo di back e forward substitution


È evidente che il seguente sistema di equazioni è particolarmente facile da risolvere:

7x1 +0 +0 = 3
0. +6.5x2 +0 = 2
0 +0 −8x3 = 1.4

Infatti si può ricavare x1 dalla prima equazione (x1 = 37 ), x2 dalla seconda e così via. In
generale, un sistema diagonale è un sistema lineare del tipo:


 a11 x1 = b1
a x = b2



 22 2
a33 x3 = b3
 . .. ..



 .
 a x =b
n,n n n

in cui ai,j = 0 se i 6= j. La soluzione di tale sistema è data da xi = b1 /ai,i , con i = 1, ....n


(se ai,i 6= 0 per i = 1, ....n). La complessità dell’algoritmo è in questo caso è O(n). Ci sono
altri sistemi semplici da risolvere. Per esempio:

2x1 +3x2 +5x3 = 10
+5x2 +7x3 = 2
8x3 = −1

In questo caso dall’ultima equazione possiamo ricavare x3 e sostituire (metodo di sostituzione


all’indietro, back) via via nelle altre equazioni trovando x2 e x1 . Il numero di operazioni in
questo caso saranno :

1. passo 1: 1 f lop,
2. passo 2: 3 f lops,
3. passo 3: 5 f lops.

In generale, chiamiamo Sistema Triangolare Superiore un sistema lineare del tipo:




 u1,1 x1 +u1,2 x2 +u1,3 x3 + . . . u1,n xn = b1
u2,2 x2 +u2,3 x3 + . . . u2,n xn = b2




+u3,3 x3 + . . . u3,n xn = b3
 ... ..



 .
 un,n xn = bn
8 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

Se ui,i 6= 0 per i = 1, ...., n, la soluzione di questo sistema può essere ottenuta mediante il
metodo di back-substitution:

1. Dalla n-esima equazione otteniatamo: xn = bn /un,n

2. Dalla i-esima equazione, per i = n − 1, n − 2, ....., 1 abbiamo:


n
X
xi = (bi − ui,i+1 · xi+1 − ui,i+2 · xi+2 − ....... − ui,n · xn )/ui,i = (bi − ui,k · xk )/ui,i
k=i+1

La complessitá del metodo è di ordine O(n2 ) Uno schema dell’implementazione è riportato


di seguito.
Listing 1.1: routine di back-substitution
program back - sub

! Soluzione di un sistema di equazioni


! con matrice triangolare superiore
! mediante metodo back - substitution

! Parametri di input

n : intero ( dimensione del sistema )


u (n , n ) : reale ( matrice del sistema )
b ( n ) : reale ( vettore dei termini noti )

! parametri di output
x ( n ) : reale ( vettore delle soluzioni )

! inizio codice
x ( n )= b ( n )/ u (n , n )

do i =n -1 , 1 , -1
x ( i )= b ( i )
do j = i +1 , n
x ( i )= x ( i ) - u (i , j )* x ( j )
enddo
x ( i )= x ( i )/ u (i , i )
enddo

stop
end
1.2. SOLUZIONE SISTEMI DI EQUAZIONI LINEARI 9

1.2.2 Metodo di eliminazione di Gauss


Nel caso in cui la matrice del sistema non sia diagonale o triangolare (superiore o inferiore), il
metodo di eliminazione di Gauss permette di risolvere comunque il sistema. Si consideri il
caso generale di risoluzione del sistema:

Ax = b
con A matrice dei coefficienti del sistema:
 
a1,1 a1,2 . . . a1,n
 a2,1 a2,2 . . . a2,n 
A =  .. ..  ,
 
..
 . . ... . 
an,1 an,2 . . . an,n
   
x1 b1
 x2   b2 
x =  ..  e b =  ..  vettori delle incognite e termini noti, rispettivamente. Lo scopo
   
. .
xn bn
del metodo è quello di trasformare la matrice mediante opportune combinazioni lineari delle
equazioni in una matrice triangolare superiore (o inferiore).

• Passo 1: annullamento di tutte le componenti della I colonna di A, tranne di a1,1 .


Si sottrae dalla riga i-esima (per i = 2, 3, ..., n) la I riga della matrice A moltiplicata
ai,1
per mi,1 = a1,1
Analoga operazione va eseguita sul vettore dei termini noti.

• passo 2: Si ripete il procedimento per le componenti della II colonna della matrice


ottenuta al passo I.
Si sottrae alla riga i-esima, per i = 3, 4, ...n la II riga della matrice moltiplicata per
(1)
ai,2
mi,2 = (1) .
a2,2
(1)
Dove ai,j = ai,j − mi,1 a1,j , i, j = 2, 3, ...n

Il metodo termina dopo n − 1 passi, dopodichè la matrice sarà triangolare superiore e potrà
essere risolta mediante back − substitution.
Diamo anche in questo caso uno schema implementativo del metodo.
10 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

subroutine gauss ( in : a ,b ,n , out : x )

integer :: k , n
real :: a [n , n ] , b [ n ]

do k =1 , n -1

[ passo di eliminazione
in colonna k ]

enddo
end subroutine
Per procedere al "passo di eliminazione della colonna k-esima dobbiamo calcolare per ogni
riga i-esima i moltiplicatori mi,k e transformare la riga i-esima. Quindi la procedura interna
al primo ciclo è:
subroutine gauss ( in : a ,b ,n , out : x )

integer :: k , n
real :: a [n , n ] , b [ n ]

do k =1 , n -1

do i = k +1 , n
[ calcolo del moltiplicatore $m_ {i , k } $ ]
[ trasformare la $i$ - esima riga di A ^{ k -1}]
[ trasformare l ’$i$ - esimo elemento di $b ^{ k -1} $ ]
enddo

enddo
end subroutine
A questo punto lo schema generale per l’algoritmo di eliminazione di Gauss per trasformare
una matrice in triangolare superiore sarà:
Listing 1.2: Metodo di Gauss
subroutine gauss ( in : a ,b ,n , out : x )

! PARAMETRI DI INPUT
integer :: n { dimensione del sistema }
real :: a (n , n ) b ( n ) { matrice del sistema }
real :: b ( n ) { vettore termini noti }

! PARAMETRI DI OUTPUT
real :: a (n , n ) { matrice triangolare superiore }
real :: b ( n ) { vett . termini noti triangolare sup }
1.3. INVERSA DI UNA MATRICE: METODO DI GAUSS-JORDAN 11

! VARIABILI LOCALI
integer :: i ,j , k

do k =1 , n -1 { ciclo sui passi }

do i = k +1 , n
c = a (i , k )/ a (k , k ) { calcolo moltiplicatori }
a (i , k )=0.0
b ( i )= b ( i ) - c * b ( k )

do j = k +1 , n
a (i , j )= a (i , j ) - c * a (k , j ) { trasf . matr . attiva }
enddo

enddo

enddo

stop
end
La risoluzione di un sistema di equazioni lineari di ordine n mediante l’algoritmo di elimina-
zione di Gauss e di back-substitution ha una complessità dell’ordine di

TGauss+Back (n) = O(n3 )

Esercizio 2 Generare una matrice 4 × 4 con entrate a piacere reali.

• Applicare il metodo di Gauss per la riduzione a forma triangolare.


• Stampare su un file la matrice in forma triangolare ottenuta.
• Applicare il metodo di back-substitution per trovare la soluzione della
matrice triangolare.
• Stampare il vettore soluzione.
• Verificare mediante sostituzione diretta che la soluzione sia esatta.

1.3 Inversa di una matrice: metodo di Gauss-Jordan


Sappiamo che l?inverso di un numero reale a 6= 0 è l?unico numero reale b (indicato con a−1 )
che moltiplicato a destra (o sinistra) per a dà per risultato il numero reale uno,

(ab) = (ba) = 1
12 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

.
Sia A una matrice di tipo m × n, e sia B una matrice di tipo n × m; diciamo che:
• B è un?inversa destra di A se AB = Im ;
• B è un?inversa sinistra di A se BA = In ;
• B è un?inversa di A se AB = Im e BA = In .
La matrice inversa di A viene indicata con A−1 .
Chiedersi se una matrice  
1 2
A=
3 4
ha un’inversa significa trovare una matrice
 
p r
B=
q s

tale che     
1 2 p r 1 0
= e
3 4 q s 0 1
Ovvero le colonne di B saranno soluzioni dei due sistemi lineari
         
1 2 p 1 1 2 r 0
= e =
3 4 q 0 3 4 s 1

Ovvero  
−2 1
B=
1.5 −0.5
Che è inversa destra e sinistra, dunque è l’inversa di A. Nota l’inversa possiamo eventualmente
risolvere il sistema di equazioni lineare Ax = b, come x = A−1 b.
Ammettiamo di avere una matrice quadrata A di ordine n, vogliamo trovare la matrice
incognita X, tale che AX = In . Questa equazione matriciale equivale a n sistemi lineari del
tipo:
AX(:, h) = In (:, h), h = 1, ...., n
ciascuno avente come matrice dei coefficienti la matrice A, come colonna delle soluzioni
una colonna di A e come termini noti una colonna di In . Essendo A non singolare, ogni
sistema ammetterà una soluzione, ovvero esisteranno n vettori colonna s1 , ....., sn , tali che

Ash = In (:, h), h = 1, ...., n

e pertanto la matrice [s1 , s2 , ..., sn ] sarà l’inversa della matrice A, AS = In .


I calcoli necessari alla soluzione degli n sistemi di equazioni lineari possono essere
convenientemente fatti "in parallelo" mediante la matrice "aumentata" [A|In ], che può essere
trasformata mediante operazioni elementari nella matrice [In |B]. La matrice B sarà pertanto
la matrice inversa di A, B = A−1 .
L’implementazione del metodo è la seguente:
1.3. INVERSA DI UNA MATRICE: METODO DI GAUSS-JORDAN 13

! leggere la matrice A ( n x n )
do i =1 , n
read (10 ,*)( A (i , j ) , j =1 , n )
enddo

! definire la matrice aumentata [ A | I ] n x 2 n


do i =1 , n
do j =1 , n
if ( i == j ) the
A (i , j + n )=1
else
A (i , j + n )=0
endif
end do
end do

! applicare il metodo di Gauss - Jordan

do i =1 , n ! righe
do j =1 , n ! colonne

if ( i . ne . j ) then
m = A (j , i )/ A (i , i ) ! moltiplicatori
do k =1 ,2* n
A (j , k )= A (j , k ) - A (i , k )* m
enddo
end if
end do
end do

! troviamo la matrice A ^ -1
do i =1 , n
do j = n +1 ,2* n
A (i , j )= A (i , j )/ A (i , i )
enddo
enddo
14 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

1.4 Sistemi di equazioni non lineari: Newton-Raphson


method
Si vuole risolvere un sistema di equazioni non-lineari in più dimensioni, del tipo:
 
f1 (x1 , . . . , xn )
f2 (x1 , . . . , xn )
f (x) =  =0
 
..
 . 
fn (x1 , ..., xn )
Dove x è il vettore delle incognite x = (x1 , . . . , xn ) e f è il vettore delle funzioni.
Scelto un punto nello spazio Rn , x0 = (x01 , . . . , x02 ), espandiamo le funzioni, fi (x), i =
1, n, intorno a tale punto,

n
X ∂fi
fi (x1 + ∆x1 , . . . , xn + ∆xn ) ' fi (x01 , . . . , x0n ) + ∆xj = 0, per i = 1, n
j=1
∂xj

Ovvero in forma esplicita, avremo:



f1 (x01 , . . . , x0n ) + nj=1 ∂f1
P

 ∂xj
∆xj = 0
 f2 (x0 , . . . , x0 ) + Pn
 ∂f2
∆xj = 0

1 n j=1 ∂xj
.
.. .. = x0 + J|x0 ∆x


 .
 fn (x0 , . . . , x0 ) + Pn ∂fn
j=1 ∂xj ∆xj = 0

1 n

definendo la matrice Jacobiana:


 ∂f1 ∂f1 
∂x1
. . . ∂x n
∂f2 ∂f2

∂x1
. . . ∂x n

J = .
 
 .. .. .. 
. . 
∂fn ∂fn
∂x1
. . . ∂x n x0
Pertanto, considerando ∆x = (x1 − x0 ), possiamo riscrivere,

f (x0 ) + J|x0 (x1 − x0 ) = 0


e risolta per trovare lo zero della funzione, x1 = x0 − J −1 f (x0 ), in maniera iterativa partendo
da una soluzione di prova, xr , e ad ogni passo aggiornare la soluzione al passo r + 1,
xr+1 = xr − J −1 f (xr )

Esercizio 3 Risolvere il seguente sistema di equazioni non lineari partendo dal


punto x0 = (1.5, 2) e dal punto x0 = (2, 3):
 2
x +y 2 −2 = 0
ex−1 +y 3 −2 = 0

Soluzione: x = (1, 1)
1.4. SISTEMI DI EQUAZIONI NON LINEARI: NEWTON-RAPHSON METHOD 15

1.4.1 Matrici tridiagonali: Metodo ricorsivo


In diverse applicazioni la matrice A del sistema Ax = b ha elementi non nulli diagonale prin-
cipale e su quelle adiacenti, matrice tridiagonale. In tal caso il sistema può essere facilmente
risolto evitando il metodo di eliminazione di Gauss. Definiamo le matrici e vettori associati
con il sistema di equazioni, nel caso tridiagonale.
 
β1 γ1 0 . . 0
α2 β2 γ2 0 . 0 
 
 0 α3 β3 γ3 0 . 
A= ,
 . . . . . . 

. . . αN −1 βN −1 γN −1 
. . . 0 αN βN
   
x1 b1
 x2   b2 
x =  ..  e b =  .. 
   
 .   . 
xN bN
Il sistema di equazioni sarà dunque della forma:

β1 x1 + γ1 x2 s = b1

αi xi−1 + βi xi + γi xi+1 = bi ; i = 2, ..., N − 1

αN xN −1 + βN xN = bN .

Facciamo un ansatz per la soluzione generale, introducendo le variabili ausiliarie gi e hi :

xi+1 = gi xi + hi per i = 1, ..., N − 1 (1.3)

Per definire tali variabili si parte dai valori gN −1 e hN −1 (gli ultimi, che definiranno xN ) e si
procede a ritroso. Invertiamo l’ultima equazione del sistema:
   
αN bN
xN = − xN −1 +
βN βN

confrontiamo con l0 ansatz per i = N − 1

xN = gN −1 xN −1 + hN −1

Dal confronto di quest’ultima con l’ansatz otteniamo,

αN bN
gN −1 = − e hN −1 =
βN βN

Inseriamo adesso l’ansatz (1.3) nell’equazione generica valida per i = N − 1, .., 2.


16 CAPITOLO 1. SISTEMI DI EQUAZIONI LINEARI

αi xi−1 + βi xi + γi xi+1 = bi (1.4)


αi xi−1 + βi xi + γi (gi xi + hi ) = bi (1.5)
   
αi bi − γi hi
xi = − xi−1 + (1.6)
βi + gi γi βi + gi γi

Otteniamo delle espressioni per le le funzioni ricorsive, g e h:


αi bi − γi hi
gi−1 = − e hi−1 = per (i = N − 1, ..., 2) (1.7)
βi + γi gi βi + γi gi
α2
Per esempio, mediante le formule (1.7), avremo che g1 = gi−1 (per i = 2) = − β2 +γ 2 g2
e
b2 −γ2 h2
h1 = β2 +γ2 g2 . Quindi, partendo dall’espressione per gN e hN e risalendo mediante le (1.7),
possiamo trovare tutti i coefficienti g1 e h1 per i = 1, N − 1.
Adesso, invece, procediamo in "avanti", per trovare le soluzioni del sistema di equazioni
lineari.
Partiamo dalla prima equazione:

   
γ1 b1
x1 = − x2 + (dal sistema di equazioni)
β1 β1
e, mediante l’ansatz
x2 = g1 x1 + h1 con g1 e h1 noti

Sostituendo x2 nell’espressione di x1 otteniamo il primo termine del vettore soluzione:


b1 − γ1 h1
x1 = (1.8)
β1 + γ1 g1
A questo punto, possiamo utilizzare la formula ricorsiva

xi+1 = gi xi + hi ; i = 1, ..., N − 1

per risolvere il sistema lineare in esame Ax = b.

Esercizio 4
Risolvere il seguente sistema di equazioni lineari mediante il metodo ricorsivo:


 2x1 −x2 0 0 0 = 1
−x 2x −x 0 0 = 1

 1
 2 3
0 −x2 2x3 −x4 0 = 1
0 0 −x3 2x4 −x5 = 1




0 0 0 −x4 2x5 = 1

Capitolo 2

Interpolazioni

In questa sezione tratteremo dei metodi numerici per interpolare un set di dati (che possiamo
immaginare come delle misure sperimentali) composte da (n + 1) coppie cartesiane (xi , yi )
con i = 0, ....n, mediante un polinomio p(x) di grado n.

p(x) = an xn + an−1 xn−1 + an−2 xn−2 + ................ + a0 (2.1)

2.0.1 Metodo di Vandermonde


Il metodo numerico è relativamente semplice ed immediato.
Imponiamo che il polinomio p(x) "passi" perfettamente sui punti sperimentali assegnati,
p(xj ) = yj , ∀ 0 ≤ j ≤ n.


 an xn0 + an−1 xn−1
0 + . . . + a0 = y 0
n n−1
an x1 + an−1 x1 + ..... + a0 = y1



... (2.2)
 ..


 .
a xn + a xn−1 + ..... + a = y

n n n−1 n 0 n

Le precedenti equazioni danno vita ad un sistema di equazioni lineari nelle incognite (ai , 0 ≤
i ≤ n) del tipo V T a = y, con la matrice V T (trasposta della matrice di Vandermonde, V)
definita come:
 
1 1 1 1 ... 1
 x0 x1 x2 x3 . . . xn 
V =  .. (2.3)
 

. 
n n n n n
x0 x1 x2 x3 . . . xn

con a = (a0 , a1 , a2 , . . . , an )T e y = (y0 , y1 , y2 , . . . , yn )T . Il polinomio trovato mediante la


soluzione del sistema di equazioni lineari è unico.

Esercizio 5

17
18 CAPITOLO 2. INTERPOLAZIONI

Sono dati i seguenti punti sperimentali (2, 5), (4, 8), (5, 8.4), (6, 7.2), (8, 4.2), tro-
vare, mediante il metodo di Vandermorde, i coefficienti del polinomio di quarto
grado che interpola i dati sperimentali. Graficare i punti sperimentali e la curva
di interpolazione ottenuta.

Proponiamo di seguito lo script Gnuplot (che può essere chiamato plot.gnu e lanciato all’inter-
no di Gnuplot mediante il comando load plot.gnu) ed il grafico relativo all’interpolazione
proposta.
Listing 2.1: script Gnuplot 1
set xlabel " asse X " font " Helvetica ,20 "
set ylabel " asse Y " font " Helvetica ,20 "

set key font " ,20 "

set ytics font " Helvetica ,12 "


set xtics font " Helvetica ,12 "

set title " Interpolazione " font " Helvetica ,22 "

a1 = 14.733333
a2 = -13.072222
a3 =5.736111
a4 = -0.911111
a5 =0.047222

plot [1:9] [3:10] ’ dati . dat ’ w p pt 7 ps 2


replot a1 + a2 * x + a3 * x **2+ a4 * x **3+ a5 * x **4 ls 1 lw 2 lc rgb " blue "

2.0.2 Spline
Consideriamo in questa sezione una particolare tecnica di interpolazione basata su un insieme
di polinomi opportunamente raccordati tra di loro in modo tale che la funzione interpolatrice,
definita a tratti, sia continua almeno fino ad un dato ordine di derivate in ogni punto dell’in-
tervallo. A differenza dell’interpolazione polinomiale, che utilizza un unico polinomio per
approssimare la funzione su tutto l’intervallo di definizione, l’interpolazione spline è ottenuta
suddividendo l’intervallo in più sotto-intervalli ( [xk , xk+1 ] con k = 1, . . . , N −1) e scegliendo
per ciascuno di essi un polinomio di grado d (di solito piccolo). Verrà poi imposto che due
polinomi successivi si saldino in modo liscio, cioè osservando la continuità delle prime d-1
derivate. La funzione che si ottiene con un procedimento di questo genere si chiama funzione
spline. L’interpolazione lineare, che utilizza una funzione lineare, ossia un polinomio di grado
1, su ogni sotto-intervallo può essere considerata un caso particolare di interpolazione spline.
Questo tipo di algoritmi risultano essenziali in molteplici campi quali la fisica, la matematica,
la computer grafica, etc... Vediamo nel dettaglio l’algoritmo numerico con cui è possibile
ricavare i coefficienti dei polinomi di interpolazione.
19

Interpolazione
10
'dati.dat'
a1 + a2*x + a3*x**2 + a4*x**3 + a5*x**4
9

7
asse Y

3
1 2 3 4 5 6 7 8 9
asse X

Figura 2.1: Soluzione dell’esercizio 5

Immaginiamo di avere N + 1 punti da voler interpolare, come in Figura2.2 definiti in un


dominio [x0 , xN ] con yi = y(xi ).

Spline
10
'dati.dat'
9

7
asse Y

3
1 2 3 4 5 6 7 8 9
asse X

Figura 2.2: Punti assegnati per effettuare lo spline

Dividiamo tale intervallo in N intervalli, definiti come [xi , xi+1 ] per i = 0 . . . N e


consideriamo la seguente funzione interpolativa definita a tratti e le sue derivate prime e
20 CAPITOLO 2. INTERPOLAZIONI

seconde:


 s0 (x) se x0 ≤ x ≤ x1
 s1 (x) se x1 ≤ x ≤ x2



S(x) = s2 (x) se x2 ≤ x ≤ x3 (2.4)
 ..



 .
s (x)
N −1 se xN −1 ≤ x ≤ xN
con 
 si (x) = ai (x − xi )3 + bi (x − xi )2 + ci (x − xi ) + di
s0 (x) = 3ai (x − xi )2 + 2bi (x − xi ) + ci (2.5)
 00i
si (x) = 6ai (x − xi ) + 2bi
A questo punto imponiamo alcune condizioni che la S(x) deve soddisfare:

• La S(x) deve interpolare tutti i dati: S(xi ) = yi per i = 0 . . . N . Imponendo tale


condizione tramite le definizioni 2.5, otteniamo che di = yi per i = 0 . . . N .

• La S(x) deve essere continua sui punti xi , pertanto si−1 (xi ) = si (xi ). Ovvero, chia-
mando hi−1 = (xi − xi−1 )

si (xi ) = di
(2.6)
si−1 (xi ) = ai−1 h3i−1 + bi−1 h2i−1 + ci−1 hi−1 + di−1

Pertanto di = ai−1 h3i−1 + bi−1 h2i−1 + ci−1 hi−1 + di−1

• La derivata prima di S(x) sia continua, ovvero s0i (xi ) = s0i−1 (xi ).

s0i (xi ) = ci

(2.7)
s0i−1 (xi ) = 3ai−1 h2i−1 + 2bi−1 hi−1 + ci−1

Pertanto ci = 3ai−1 h2i−1 + 2bi−1 hi−1 + ci−1

• La derivata seconda continua.


 00
si (xi ) = 2bi
(2.8)
s00i−1 (xi ) = 6ai−1 hi−1 + 2bi−1

Pertanto 2bi = 6ai−1 hi−1 + 2bi−1

Le condizioni possono essere utilizzare per calcolare i coefficienti ai , bi , ci , di , vediamo come.


−Mi
Per semplicità definiamo Mi = s00i (xi ) ed otteniamo dalla 2.8 ai = Mi+1 6hi
e bi = M2 i .
Dalla definizione di si (x), invece otteniamo (sostituendo le espressioni appena trovate per
−Mi 3
ai , bi e di ), yi+1 = Mi+1
6hi
hi + M2 i h2i + ci hi + yi
Ovviamente per calcolare i coefficienti abbiamo bisogno delle Mi che dipendono esse
stesse dai coefficienti che vogliamo trovare. Possiamo trovare un’espressione ricorsiva che
lega i Mi dalla definizione dalla continuità delle derivate prime, da cui otteniamo:
21

 
yi+1 − yi 2hi Mi + hi Mi+1 Mi + Mi−1 Mi−1 yi − yi−1 2hi−1 Mi−1 + hi Mi
− =3 h2i−1 +2 hi−1 − −
hi 6 6hi−1 2 hi−1 6

che può essere ulteriormente semplificata come :


 
yi+1 − yi yi − yi−1
hi−1 Mi−1 + 2(hi−1 − hi )Mi + hi Mi+1 = 6 −
hi hi−1
Questa è un’equazione ricorsiva valida (per N + 1 punti da interpolare) però solo per
i = 1 . . . N , pertanto per iniziare il processo ricorsivo dobbiamo fornire esplicitamente M0 e
MN .
Una scelta abbastanza utilizzata è considerare M0 = MN = 0. In questo modo l’equazione
ricorsiva (per i = 1 . . . N ) può essere scritta come un sistema di equazioni lineari, HM = Y
con H definita come :

 
2(h0 + h1 ) h1 0 . . 0

 h1 2(h1 + h2 ) h2 0 . 0 

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

 . . . . . . 
. . . . hN −2 2(hN −2 + hN −1 )
   y2 −y1 y1 −y0 
M1 h1
− h0
 M2   y3 −y2 − y2 −y1 
h2 h1
e M =  ..  e Y = 6 
   
.. 
 .   . 
yn −yn−1 yn−1 −yn−2
Mn hn−1
− hn−2

Esercizio 6 Utilizzando gli stessi dati dell’esercizio 5, effettuare uno spline


mediante il metodo descritto nella sezione precedente. Graficare i punti speri-
mentali, la curva (definita a tratti) di spline calcolata e confrontarla con la curva
di interpolazione polinomiale ottenuta con il metodo di Vandermonde.
22 CAPITOLO 2. INTERPOLAZIONI

Listing 2.2: script Gnuplot 2


set xlabel
set ylabel
set key font " ,20 "
set ytics font " Helvetica ,12 "
set xtics font " Helvetica ,12 "
set title " Spline " font " Helvetica ,22 "
plot [1:10] [3:12] " dati_spline . dat " w p pt 7 ps 2
a1 = 14.733333
a2 = -13.072222
a3 =5.736111
a4 = -0.911111
a5 =0.047222
replot a1 + a2 * x + a3 * x **2+ a4 * x **3+ a5 * x **4
ls 1 lw 2 lc rgb " #6 d78ab "
replot for [ IDX =0:3] " spline . dat "
index IDX u 1:2 with l lt IDX +1 lw 2

Spline
12
'dati.dat'
11 a1+a2*x+a3*x**2+a4*x**3+a5*x**4
'spline.dat' index IDX u 1:2
10 'spline.dat' index IDX u 1:2
'spline.dat' index IDX u 1:2
9 'spline.dat' index IDX u 1:2
asse Y

3
1 2 3 4 5 6 7 8 9 10
asse X

Figura 2.3: Spline relativo ai dati nell’esercizio 5. Le curve di colori differenti rappresentano
le funzioni cubiche per ogni intervallo [xi − xi+1 ]per i = 0, N − 1. Notare la continuità
della funziona e sue derivate nei punti di raccordo ed inoltre la differenza con la funzione
interpolatrice.
Capitolo 3

Regressioni

La regressione tramite minimi quadrati viene molto utilizzata in fisica per estrarre quantità
fisiche mediante il confronto tra teorie analitiche e risultati sperimentali. In generale, gli
andamenti teorici predetti dalle teorie analitiche dipendono da parametri fisici non sempre
misurabili, pertanto gli andamenti teorici dipenderanno da alcuni parametri specifici. Si
possono avere informazioni utili su tali parametri (o quantità fisiche) cercando il miglior
accordo con i dati sperimentali a disposizione.
Ammettiamo pertanto di avere a disposizione n coppie di punti sperimentali (xi , yi ), i =
1, n.

3.1 Funzioni lineari


Gli andamenti lineari, e le funzioni lineari in generale, sono ovviamente tra i più frequenti in
ambito sperimentale (rappresenta il primo termine di uno sviluppo in serie) e rappresentano
spesso una prima e valida approssimazione di molti andamenti fisici. Ammettiamo di voler
"fittare" i dati sperimentali mediante la curva y = αx + β, utilizzando i parametri α e β
come parametri di regressione. A differenza dei metodi interpolativi, qui il numero di dati
sperimentali è (in genere) molto più grande del numero dei parametri a disposizione (2 nel
caso lineare), pertanto la curva non potrà interpolare perfettamente tutti i dati sperimentali.
Possiamo però richiedere che la somma dei residui, ovvero, una misura della distanza della
curva dai punti sperimentali, sia minima. Il residuo della curva y(x) dal punto (xi , yi ) è
definito come:
ri = yi − y(xi ) = yi − (αxi + β).
Cercheremo quei coefficienti, α e β, tali che la somma dei residui al quadrato, ρ, sia minima.
Definiamo la funzione ρ,
n
X n
X
ρ= ri2 = (yi − (αxi + β))2 .
i i

Per minimizzare rispetto ad α e β azzeriamo le derivate prime:


∂ρ ∂ρ
=0 e =0
∂α ∂β

23
24 CAPITOLO 3. REGRESSIONI

Effettuando le derivate parziali,

∂ρ Pn
= 2(xi )(yi − (αxi + β)) = 0
∂α i=1
∂ρ P n
= 2(−1)(yi − (αxi + β)) = 0
∂β i=1

Le precedenti rappresentano un sistema di equazioni lineari nelle incognite α e β che possono


essere riscritte come:

n
X n
X n
X
α x2i +β xi = xi yi
i=1 i=1 i=1
n
X Xn
α xi + βn = yi
i=1 i=1

Pn 2 Pn    Pn 
Pi=1 xi i=1 xi α i=1 xi y i
n = P n (3.1)
i=1 xi n β i=1 yi .

e risolte mediante i metodi discussi in precedenza.


Una quantità utile per valutare la bontà della regressione è il cosiddetto parametro R2
definito come,
(ŷi − ȳ)2
P
2
R =P .
(yi − ȳ)2
Dove ŷi è il valore della funzione usata per fittare i dati nei punti xi (per esempio nel P caso
1
lineare, ŷi = c0 +c1 xi ), mentre ȳ rappresenta la media dei valori yi (sperimentali), ȳ = m yi .
Utilizzando la definizione di ρ, possiamo anche scrivere:
ρ
R2 = 1 − P .
(yi − ȳ)2

Valori di R2 prossimi ad 1, indicheranno una buona qualità della regressione, mentre valori
prossimi allo zero indicano che la funzione di regressione non segue bene l’andamento dei
dati sperimentali.

Esercizio 7 Sono dati i valori sperimentali della misura della velocità angolare
(rad/s) di un disco in funzione del tempo:
Riportare i dati sperimentali su un file, e mediante una regressione lineare, cal-
colare il valore dell’accelerazione angolare e valutare il parametro R2 . Infine,
graficare la retta di regressione insieme ai dati sperimentali. Confrontare il ri-
sultato della regressione con le stesse quantità ottenute mediante Gnuplot (vedi
Figura (3.1)).
3.1. FUNZIONI LINEARI 25

Tempo ω(rad/s)
0 100
2 90
4 82
6 80
8 75
10 65
12 60
14 52

Listing 3.1: script Gnuplot 1


set xlabel
set ylabel
set key font " ,20 "
set ytics font " Helvetica ,12 "
set xtics font " Helvetica ,12 "
set ylabel " Frequenza ( rad / s ) " font " Helvetica ,12 "
set xlabel " Tempo ( s ) " font " Helvetica ,12 "
set title " Reegressione minimi quadrati " font " Helvetica ,22 "
plot " data_least_square . dat " w p pt 7 ps 2

f ( x )= a + b * x

fit f ( x ) ’ data_least_square . dat ’ via a , b

replot f ( x ) w l lw 4
26 CAPITOLO 3. REGRESSIONI

Figura 3.1: Regressione lineare ottenuta mediante lo script Gnuplot riportato. La retta di
regressione è indicata in verde, mentre i punti rappresentano i dati in Tabella (7).

3.2 Regressione mediante combinazione lineare di


funzioni
A questo punto possiamo facilmente generalizzare il ragionamento effettuato nella sezione
precedente ed immaginare di voler regredire i nostri dati sperimentali con una generica
combinazione lineare di m funzioni, fj (x), j = 1, m, ovvero:
m
X
y(x) = cj fj (x),
j=1

Per esempio, volendo usare una cubica (y(x) = 1 + x + x2 + x3 ) possiamo scegliere m = 4


con f1 = 1, f2 = x, f3 = x2 , f4 = x31 Tipicamente il numero di funzioni usate sarà minore
del numero di dati da fittare, m < n, pertanto avremo sempre a che fare con un problema di n
equazioni in m incognite, over-determinato, senza soluzioni (in generale).
Come nel caso precedente, possiamo richiedere la minimizzazione della somma dei residui.
Definiamo i due vettori y e c che rappresentano il vettore dei dati "sperimentali" e dei
coefficienti dell’espansione, rispettivamente.
   
y1 c1
 y2   c2 
y =  ..  , c =  ..  ,
   
.  . 
yn cm

Inoltre, definiamo la matrice n × m:


1
La regressione sarà comunque lineare, dato che la dipendenza con i coefficienti è comunque lineare.
Regressioni non-lineari utilizzerebbero funzioni del tipo, sin(c1 x), ec2 x , etc... in cui la dipendenza dai coefficienti
è, appunto, non lineare (non tratteremo questo tipo di regressioni).
3.2. REGRESSIONE MEDIANTE COMBINAZIONE LINEARE DI FUNZIONI 27

 
f1 (x1 ) f2 (x1 ) . . . fm (x1 )
 f1 (x2 ) f2 (x2 ) . . . fm (x2 ) 
A =  ..
 
.. .. .. 
 . . . . 
f1 (xn ) f2 (xn ) . . . fm (xn )
Come detto in precedenza, per m < n, l’equazione Ac = y (che impone il passaggio della
funzione di regressione sui punti sperimentali) è over-determinato. Definiamo pertanto il
vettore dei residui:
r = y − Ac
e il suo modulo quadro,

n
X
ρ= ri2 = r T r
i=1
= (y − Ac)T (y − Ac) (3.2)
= y T y − cT AT y − y T Ac + cT AT Ac.

L’espressione può essere semplificata considerando che ρ è uno scalare, pertanto ogni termine
della somma deve essere tale, ovvero uguale al suo trasposto. Quindi:

cT AT y = (cT AT y)T = y T Ac.

Sostituendo nella (3.2), avremo:

ρ = y T y − 2y T Ac + cT AT Ac.

Come in precedenza, vogliamo minimizzare ρ, azzerando le derivate parziali rispetto ai


∂ρ
coefficienti, ∂c j
per j = 1, ..., m.
Adottiamo la convenzione di Einstein per le somme, ammettendo una sommatoria in tutto
il range permesso per gli indici ripetuti. Con questa notazione:

ρ = yi yi − 2yi Aik ck + ci ATik Akl cl .

Effettuiamo le derivate parziali:

∂ρ ∂ck ∂ci T ∂cl


= −2yi Aik + Aik Akl cl + ci ATik Akl .
∂cj ∂cj ∂cj ∂cj

Notiamo che (
∂ci 1, se i = j;
=
∂cj 0, se i 6= j
Quindi,
∂ρ
= −2yi Aij + ATjk Akl cl + ci ATik Akj .
∂cj
28 CAPITOLO 3. REGRESSIONI

Ora:
ci ATik Akj = ci Aki Akj
= Akj Aki ci
= ATjk Aki ci
= ATjk Akl cl
Pertanto, avremo che
∂ρ
= −2yi Aij + 2ATjk Akl cl .
∂cj
Azzerando le derivate parziali, abbiamo:

ATjk Akl cl = yi Aij ovvero ATjk Akl cl = ATji yi ,

ovvero, in notazione matriciale avremo,

AT Ac = AT y

che rappresenta un’equazione (detta normale) per i coefficienti del polinomio c, risolvibile
mediante i metodi precedentemente discussi.

Esercizio 8
x 1 2 3 4 5 6
Considerare i seguenti dati:
y 10 5.49 0.89 -0.14 -1.07 0.84
Stimare, mediante il calcolo del parametro R2 la bontà delle regressioni effettuate
con le seguenti funzioni, y1 (x) = a + bx + cx2 e y2 (x) = cx1 + c2 x.
Capitolo 4

Librerie scientifiche

4.1 BLAS
Le librerie BLAS (Basic Linear Algebra Subprograms) sono routine standard che forniscono
elementi di base per l’esecuzione delle operazioni su vettori e matrici. Le procedure all’interno
di tale libreria consentono di effettuare calcoli scientifici di basso livello, come il calcolo
del prodotto scalare tra due vettori, prodotto matrice per vettore, etc. Poichè le BLAS sono
particolarmente efficienti, portatili, e ampiamente disponibili, sono comunemente usate per lo
sviluppo di software di algebra lineare di alta qualità.

4.1.0.1 Struttura della chiamata ad una libreria BLAS


Le librerie BLAS hanno tre livelli di funzionalità :

• livello 1: contengono routines che eseguono operazioni del tipo αx + y

• livello 2 : routine per le operazioni tra matrici e vettori, ovvero : αAx + βy

• livello 3: operazioni tra matrici: αAB + βC

L’elenco di tutte le routine contenute nelle librerie BLAS può essere raggiunto sul sito ufficiale
http://www.netlib.org/blas/, dove sono riportate tutte le routine di livello 1, 2 e 3 in
singola, doppia precisione e complesse.

Esempio di chiamata BLAS : riportiamo di seguito un esempio di una chiamata BLAS


livello 1, che esegue un prodotto scalare tra due vettori:
Listing 4.1: codice prodotto scalare con Blas
program dot_main

! SDOT

! Purpose :
! SDOT forms the dot product of two vectors .

29
30 CAPITOLO 4. LIBRERIE SCIENTIFICHE

! uses unrolled loops for increments equal to one .


! Parameters
! [ in ] N
! N is INTEGER
! number of elements in input vector ( s )
! [ in ] SX
! SX is REAL array , dimension ( 1 + ( N - 1 )* abs ( INCX )
! [ in ] INCX
! INCX is INTEGER
! storage spacing between elements of SX
! [ in ] SY
! SY is REAL array , dimension ( 1 + ( N - 1 )* abs ( INCY )
! [ in ] INCY
! INCY is INTEGER
! storage spacing between elements of SY

real :: x (10) , y (10) , sdot , res


integer :: n , incx , incy , i
external sdot
n = 5
incx = 2
incy = 1
do i = 1 , 10
x ( i ) = 2.0 e0
y ( i ) = 1.0 e0
end do
res = sdot (n , x , incx , y , incy )
print * , " SDOT = " , res
stop
end
Equivalentemente per le BLAS livello 2, avremo per esempio una chiamata alla routine
sger, la quale dati 2 vettori di input x e y e la matrice A ha come output αxyT + A:

Listing 4.2: header della routine sger di Blas


program ger_main

! Purpose :
! SGER performs the rank 1 operation
!
! A := alpha * x * y ** T + A ,
!
! where alpha is a scalar ,
! x is an m element vector ,
4.1. BLAS 31

! y is an n element
! vector and A is an m by n matrix .
!
! subroutine sger ( integer M , real ALPHA
! real , dimension (*) X ,
! integer INCX , real , dimension (*) Y ,
! integer INCY , real ,
! dimension ( lda ,*) A , integer LDA )
!
! Parameters
! [ in ] M
! M is INTEGER
! On entry , M specifies the number
! of rows of the matrix A .
! M must be at least zero .
! [ in ] N
! N is INTEGER
! On entry , N specifies the number of columns
! of the matrix A .
! N must be at least zero .
! [ in ] ALPHA
! ALPHA is REAL
! On entry , ALPHA specifies the scalar alpha .
! [ in ] X
! X is REAL array , dimension at least
! ( 1 + ( m - 1 )* abs ( INCX ) ).
! Before entry , the incremented array X
! must contain the m
! element vector x .
! [ in ] INCX
! INCX is INTEGER
! On entry , INCX specifies the increment
! for the elements of
! X . INCX must not be zero .
! [ in ] Y
! Y is REAL array , dimension at least
! ( 1 + ( n - 1 )* abs ( INCY ) ).
! Before entry , the incremented array
! Y must contain the n
! element vector y .
! [ in ] INCY
! INCY is INTEGER
! On entry , INCY specifies the increment
! for the elements of
32 CAPITOLO 4. LIBRERIE SCIENTIFICHE

! Y . INCY must not be zero .


! [ in , out ] A
! A is REAL array , dimension ( LDA , N )
! Before entry , the leading m by n part
! of the array A must
! contain the matrix of coefficients .
! On exit , A is
! overwritten by the updated matrix .
! [ in ] LDA
! LDA is INTEGER
! On entry , LDA specifies the first dimension
! of A as declared
! in the calling ( sub ) program . LDA must be at least
! max ( 1 , m ).
!
!
real a (5 ,3) , x (10) , y (10) , alpha
integer m , n , incx , incy , i , j , lda
m = 2
n = 3
lda = 5
incx = 2
incy = 1
alpha = 0.5
do i = 1 , 10
x ( i ) = 1.0
y ( i ) = 1.0
end do
do i = 1 , m
do j = 1 , n
a (i , j ) = j
end do
end do
call sger (m , n , alpha , x , incx , y , incy , a , lda )
print * , ’ Matrix A : ’
do i = 1 , m
print * , ( a (i , j ) , j = 1 , n )
end do
end

anche in questo caso dall’header della routine possiamo capire la sintassi.


Le BLAS livello 3 sono librerie tramite la quali, date una matrice simmetrica A e due
matrici m × n B e C possiamo effettuare operazioni tipo C = αAB + βC o C = αBA + βC
4.1. BLAS 33

Listing 4.3: codice che utilizza la libreria sgemm di Blas

program matrixmult

! subroutine sgem (
! character TRANSA ,
! character TRANSB ,
! integer M,
! integer N,
! integer K,
! real ALPHA ,
! real , dimension ( lda ,*) A,
! integer LDA ,
! real , dimension ( ldb ,*) B,
! integer LDB ,
! real BETA ,
! real , dimension ( ldc ,*) C,
! integer LDC
!)

! SGEMM

! Purpose :
! SGEMM performs one of the matrix - matrix operations

! C := alpha * op ( A )* op ( B ) + beta *C ,

! where op ( X ) is one of

! op ( X ) = X or op ( X ) = X ** T ,

! alpha and beta are scalars ,


! and A , B and C are matrices ,
! with op ( A ) an m by k matrix ,
! op ( B ) a k by n matrix
! and C an m by n matrix .
! Parameters
! [ in ] TRANSA
! TRANSA is CHARACTER *1
! On entry , TRANSA specifies
! the form of op ( A ) to be used in
! the matrix multiplication as follows :
! ‘ No transpose ’ , ‘ Transpose ’ , ‘ Conjugate transpose ’ ( X , X T , XC )

! TRANSA = ’N ’ or ’n ’ , op ( A ) = A .
34 CAPITOLO 4. LIBRERIE SCIENTIFICHE

! TRANSA = ’T ’ or ’t ’ , op ( A ) = A ** T .

! TRANSA = ’C ’ or ’c ’ , op ( A ) = A ** T .
! [ in ] TRANSB
! TRANSB is CHARACTER *1
! On entry , TRANSB specifies the form of
! op ( B ) to be used in
! the matrix multiplication as follows :

! TRANSB = ’N ’ or ’n ’ , op ( B ) = B .

! TRANSB = ’T ’ or ’t ’ , op ( B ) = B ** T .

! TRANSB = ’C ’ or ’c ’ , op ( B ) = B ** T .
! [ in ] M
! M is INTEGER
! On entry , M specifies the number of rows
! of the matrix
! op ( A ) and of the matrix C . M must be at least
zero .
! [ in ] N
! N is INTEGER
! On entry , N specifies the number of columns
! of the matrix
! op ( B ) and the number of columns
! of the matrix C . N must be
! at least zero .
! [ in ] K
! K is INTEGER
! On entry , K specifies the number of
! columns of the matrix
! op ( A ) and the number of rows of the matrix op ( B ).
! K must be at least zero .
! [ in ] ALPHA
! ALPHA is REAL
! On entry , ALPHA specifies the scalar alpha .
! [ in ] A
! A is REAL array , dimension ( LDA , ka ) , where ka is
! k when TRANSA = ’N ’ or ’n ’ , and is m otherwise .
! Before entry with TRANSA = ’N ’ or ’n ’ , the leading
m by k
! part of the array A must contain the matrix A , other
! the leading k by m part of the array A must contain
4.1. BLAS 35

the
! matrix A .
! [ in ] LDA
! LDA is INTEGER
! On entry , LDA specifies the first dimension of A as declared
! in the calling ( sub ) program . When TRANSA = ’N ’ or ’n ’ then
! LDA must be at least max ( 1 , m ) , otherwise LDA must be at
! least max ( 1 , k ).
! [ in ] B
! B is REAL array , dimension ( LDB , kb ) , where kb is
! n when TRANSB = ’N ’ or ’n ’ , and is k otherwise .
! Before entry with TRANSB = ’N ’ or ’n ’ , the leading
k by n
! part of the array B must contain the matrix B , otherwise
! the leading n by k part of the array B must contain
the
! matrix B .
! [ in ] LDB
! LDB is INTEGER
! On entry , LDB specifies the first dimension of B as declared
! in the calling ( sub ) program . When TRANSB = ’N ’ or ’n ’ then
! LDB must be at least max ( 1 , k ) , otherwise LDB must be at
! least max ( 1 , n ).
! [ in ] BETA
! BETA is REAL
! On entry , BETA specifies the scalar beta . When
BETA is
! supplied as zero then C need not be set on input .
! [ in , out ] C
! C is REAL array , dimension ( LDC , N )
! Before entry , the leading m by n part of the array
C must
! contain the matrix C , except when beta is zero , in which
! case C need not be set on entry .
! On exit , the array C is overwritten by the m by n
matrix
! ( alpha * op ( A )* op ( B ) + beta * C ).
! [ in ] LDC
! LDC is INTEGER
! On entry , LDC specifies the first dimension of C as declared
! in the calling ( sub ) program . LDC must be at
least
! max ( 1 , m ).
36 CAPITOLO 4. LIBRERIE SCIENTIFICHE

program matrix
implicit none
integer , parameter :: m =4 , n =2 , k =3
double precision mac (m , n ) , mac2 (n , k ) , mac3 (m , k )
integer R , L

call FILLMATRIX (m ,n , mac )


call FILLMATRIX (n ,k , mac2 )
call DGEMM ( " N " ," N " ,m ,k ,n ,1. d0 , mac ,m , mac2 ,n ,0. d0 , mac3 , m )

WRITE (* ,*) ’ Matrix C : ’


DO R =1 , m
write (* ,*) ( mac3 (R , L ) , L =1 , k )
end do

END

SUBROUTINE FILLMATRIX (M ,N , MATRIX )


INTEGER M , N
DOUBLE PRECISION MATRIX (M , N )

do I =1 , M
do J =1 , N
MATRIX (I , J ) = I +2* J
end do
end do

WRITE (* ,*) ’ Matrix : ’


do I =1 , M
write (* ,*) ( MATRIX (I , J ) , J =1 , N )
end do

END SUBROUTINE
La compilazione di un codice che contiene una chiamata ad una routine BLAS può essere
effettuata come :
gfortran nome-codice.f90 -lblas -o nome-codice.x
4.2. LAPACK 37

4.2 Lapack
Lapack (Linear Algebra PACKage) è un insieme di librerie software usate per effettuare
calcoli scientifici ad alto livello, ( http://www.netlib.org/lapack/ )
Tali librerie sono state scritte in Fortran 77 e sono di dominio pubblico, anche se esistono
delle personalizzazioni di queste librerie a pagamento. Mediante queste librerie, è possibile
effettuare calcoli di notevole importanza, come il calcolo di autovalori ed autovettori di matrici,
risoluzione di sistemi lineari, fattorizzazioni di matrici, e molto altro ancora. Ad esempio,
esistono delle procedure interne, nascoste all’utente, in grado di trasformare la matrice iniziale
in una matrice tridiagonale, per poi calcolare effettivamente autovalori ed autovettori. Lapack
è un insieme di librerie che risolvono i più comuni problemi di calcolo matriciale. Lapack
puo‘ risolvere :
• Sistemi lineari di equazioni.

• Problemi di minimi quadrati.

• Calcolo degli autovalori ed autovettori.


In Lapack ci sono tre livelli di Routine:
• Driver routines: risolvono un problema completo (risolvono un sistema di equazioni
lineari, calcolo degli autovalori).

• Computational routines: eseguono un distinto nucleo "computazionale" (riduzione


matrice in triangolare superiore).

• Auxiliary routines: eseguono operazioni di basso livello (prodotto scalare per una
matrice, prodotto tra matrici, prodotto scalare).
I Driver e computational routines hanno una convenzione sui nomi e riportano un suffisso del
tipo:
X - YY - ZZZ 1

• X: la prima lettera (X), indica i tipi di dati coinvolti (S: real, D: double precision, C:
complex, Z: double complex).

• YY: le successive due lettere indicano il tipo di matrice che si vuole trattare (SY: sym-
metric, HE: Hermitiana, TR: triangolare, DI: diagonale, GE: generale, ST: simmetrica
tridiagonale,....etc.. )

• ZZZ: le ultime due lettere2 indicano il tipo di calcolo che si vuole effettuare sulla matrice:

– SV: soluzione di un sistema di equazioni lineari.


– EV: sistema agli autovalori matrice.
– TRS: fattorizzazione per la back-substitution
1
Nei casi standard l’ultima lettera è in realtà omessa.
2
Aggiungendo la terza lettera, si usano opzioni avanzate.
38 CAPITOLO 4. LIBRERIE SCIENTIFICHE

Quindi, per esempio la routine DGESV risolverà un sistema di equazioni lineari (SV), con la
matrice dei coefficienti associata senza una particolare struttura (GE, generale) e con le entrate
in doppia precisione (D). Mentre, la routine DSYEV risolverà un problema agli autovalori
(diagonalizzazione) (EV), per una matrice simmetrica (SY) in doppia precisione (D). La
routine ZHEEV diagonalizzerà (EV) una matrice complessa (Z) hermitiana (HE).
La compilazione di un codice che contiene una chiamata ad una subroutine Lapack può
essere effettuata come :
gfortran nome-codice.f90 -llapack -o nome-codice.x

Struttura della chiamata ad una libreria Lapack Di seguito riportiamo la sintassi di una
chiamata alla libreria Lapack standard, in particolare la SGESV (ovvero, la soluzione di un
sistema di equazioni lineari (SV) di una matrice generica (GE) in singola precisione (S)).
La chiamata alla libreria é a tutti gli effetti una chiamata ad una subroutine e la sintassi è
in genere contenuta nell’header della subroutine.
Nel caso in oggetto, riportiamo di seguito l’header preso direttamente dalla routine
SGESV.f90 contenuta nella libreria Lapack:
SUBROUTINE SGESV ( N , NRHS , A , LDA , IPIV , B , LDB , INFO )
*
* -- LAPACK driver routine ( version 3.1) --
* Univ . of Tennessee , Univ . of California Berkeley
* November 2006
*
* .. Scalar Arguments ..
INTEGER INFO , LDA , LDB , N , NRHS
* ..
* .. Array Arguments ..
INTEGER IPIV ( * )
REAL A ( LDA , * ) , B ( LDB , * )
* ..
*
* Purpose
* =======
*
* SGESV computes the solution to a real system of linear
* equations
* A * X = B,
* where A is an N - by - N matrix and X and B are
* N - by - NRHS matrices .
*
* The LU decomposition with partial pivoting and
* row interchanges is
* used to factor A as
* A = P * L * U,
* where P is a permutation matrix , L is unit lower triangular ,
4.2. LAPACK 39

* and U is
* upper triangular . The factored form of A is then used
* to solve the
* system of equations A * X = B .
*
* Arguments
* =========
*
* N ( input ) INTEGER
* The number of linear equations , i . e . ,
* the order of the
* matrix A . N >= 0.
*
* NRHS ( input ) INTEGER
* The number of right hand sides , i . e . , the number of
* columns of the matrix B . NRHS >= 0.
*
* A ( input / output ) REAL array , dimension ( LDA , N )
* On entry , the N - by - N coefficient matrix A .
* On exit , the factors L and U from the factorization
* A = P * L * U ; the unit diagonal elements of L
* are not stored .
*
* LDA ( input ) INTEGER
* The leading dimension of the array A . LDA >= max (1 , N ).
*
* IPIV ( output ) INTEGER array , dimension ( N )
* The pivot indices that define the permutation matrix P ;
* row i of the matrix was interchanged with row IPIV ( i ).
*
* B ( input / output ) REAL array , dimension ( LDB , NRHS )
* On entry , the N - by - NRHS matrix of right hand side matrix B .
* On exit , if INFO = 0 , the N - by - NRHS solution matrix X .
*
* LDB ( input ) INTEGER
* The leading dimension of the array B . LDB >= max (1 , N ).
*
* INFO ( output ) INTEGER
* = 0: successful exit
* < 0: if INFO = -i , the i - th argument had an illegal value
* > 0: if INFO = i , U (i , i ) is exactly zero . The factorization
* has been completed , but the factor U is exactly
* singular , so the solution could not be computed .
*
40 CAPITOLO 4. LIBRERIE SCIENTIFICHE

*==========================================================
Inoltre, riportiamo un possibile codice per la soluzione di un sistema di equazioni lineari
N × N mediante la chiamata alla routine SGESV.
4.2. LAPACK 41

Program LinearEquations

! risolve un sistema lineare A * x = b mediante LAPACK


! La matrice dei coefficienti A e b viene letta dal
! file ’ matrice . dat ’ , secondo il formato
! * * * * *****************************
! A (1 ,1) A (1 ,2) ...... A (1 , n )
! ...
! ...
! A (n ,1) A (n ,2) ...... A (n , n )
!
! b (1) b (2) ..... b(n)
! * * * * ******************************
Implicit none
! dichiarazioni in singola precisione
integer , parameter :: n =5 ! dimensione della matrice
Real A (n , n ) , b ( n ) ! matrice dei coeff . e termini noti
Real Ap (n , n ) , bp ( n ) ! matrici di appoggio

! variabili di appoggio per lapack


integer i , j , pivot ( n ) , ok

! lettura matrice A e b da file ( matrice . dat )


open (10 , file = ’ matrice . dat ’ , status = ’ old ’)
do i =1 , n
read (10 ,*) ( A (i , j ) , j =1 , n )
enddo
read (10 ,*)
read (10 ,*) ( b ( i ) , i =1 , n )

! Controllo della lettura ( mediante scrittua su schermo )


do i =1 , n
write (6 ,*) ( A (i , j ) , j =1 , n )
enddo

write (6 ,*)
write (6 ,*) ( b ( i ) , i =1 , n )

! Soluzione tramite routine SGESV di LAPACK

! Definizione di matrici e vettori di appoggio


! In modo da non sovrascrivere quelli originali

bp = b
42 CAPITOLO 4. LIBRERIE SCIENTIFICHE

Ap = A

! Chiamata alla routine LAPACK DGESV


call SGESV (n , 1 , A ,n , pivot , b , n , ok )

! I parametri che sono passati alla SGESV sono in ordine :

! n : ordine della matrice A


! 1: numero di vettori dei termini noti ( b )
! A : matrice dei coefficienti ( A )
! n : leading dimension of A
! pivot : vettore che conterra ’ i pivot
! b : vettore che , in entrata , contiene i termini noti ( b ) ,
! in uscita il vettore delle soluzioni
! n : la dimensione del vettore ( b )
! ok : variabile di controllo

! print del vettore soluzione


! Con controllo se tutto e ’ andato bene

if ( ok > 0 . or . ok < 0) then


write (6 ,*) ’ INFO = ’ , ok
stop ’ soluzione non trovata ’
else
write (6 ,*) " La soluzione del sistema e ’ "
write (6 ,*) ( b ( i ) , i =1 , n )
write (6 ,*)
endif
stop
end
4.3. DIAGONALIZZAZIONE DI UNA MATRICE 43

4.3 Diagonalizzazione di una matrice


Il problema agli autovalori di una matrice quadrata (diagonalizzazione) é il seguente:

Ax = λx
dove λ é l’autovalore del corrispondente autovettore x della matrice A sono determinati
dall’equazione secolare:

|A − λI| = 0
con I matrice indentica. Una matrice n × n ha n autovalori (degeneri e non).

4.3.1 Matrici Hermitiane


In molti problemi di fisica è frequente trovare matrici Hermitiane. Una matrice è Hermitiana
se vale la seguente relazione:

A† = A
Con A† = (AT )∗ , ovvero la matrice trasposta coniugata. Il problema agli autovalori di
una matrice Hermitiana gode di alcune proprietà:
• Gli autovalori sono reali
• Gli autovettori sono ortogonali
• Una matrice Hermitiana puó essere trasformata in una matrice diagonale (avente gli stessi
autovalori) mediante una trasformazione unitaria che contiene tutti i propri autovettori.
Inoltre il problema agli autovalori di una matrice n × n Hermitiana è equivalente a quello
per una matrice reale simmetrica 2n × 2n. Infatti, una matrice complessa può essere scritta
come A = B + iC, con B e C rispettivamente parte reale ed immaginaria della matrice A.
Se A è Hermitiana, vuol dire che B è simmetrica e C è reale anti-simmetrica:

Bij = Bji e Cij = −Cji


Anche gli autovettori possono essere decomposti nello stesso modo (x+iy), quindi il problema
agli autovalori diventa:

(B + iC)(x + iy) = λ(x + iy)


ovvero :
    
B −C x x
=λ (4.1)
C B y y
Questo è un problema agli autovalori per una matrice reale e simmetrica con gli stessi autovalori
della matrice originale (ma doppiamente degeneri). Quindi per diagonalizzare una matrice
Hermitiana, dovremmo risolvere un problema "reale e simmetrico". Il determinante di A può
essere scritto come prodotto degli autovalori, mentre la traccia come la loro sommatoria.
44 CAPITOLO 4. LIBRERIE SCIENTIFICHE

4.3.2 Librerie Lapack per la diagonalizzazione


Le librerie Lapack sono utilizzate per la diagonalizzazione (suffisso EV). Per esempio, l’header
della routine DSYEV (diagonalizzazione (EV), di una matrice simmetrica (SY), in doppia
precisione (D)).

Listing 4.4: routine Lapack dsyev


SUBROUTINE DSYEV ( JOBZ , UPLO , N , A , LDA , W , WORK , LWORK , INFO )
*
* -- LAPACK driver routine ( version 3.1) --
* Univ . of Tennessee , Univ . of California Berkeley and NAG Ltd ..
* November 2006
*
* .. Scalar Arguments ..
CHARACTER JOBZ , UPLO
INTEGER INFO , LDA , LWORK , N
* ..
* .. Array Arguments ..
DOUBLE PRECISION A ( LDA , * ) , W ( * ) , WORK ( * )
* ..
*
* Purpose
* =======
*
* DSYEV computes all eigenvalues and , optionally ,
* eigenvectors of a
* real symmetric matrix A .
*
* Arguments
* =========
*
* JOBZ ( input ) CHARACTER *1
* = ’N ’: Compute eigenvalues only ;
* = ’V ’: Compute eigenvalues and eigenvectors .
*
* UPLO ( input ) CHARACTER *1
* = ’U ’: Upper triangle of A is stored ;
* = ’L ’: Lower triangle of A is stored .
*
* N ( input ) INTEGER
* The order of the matrix A . N >= 0.
*
* A ( input / output ) DOUBLE PRECISION array ,
* dimension ( LDA , N )
* On entry , the symmetric matrix A . If UPLO = ’U ’ , the
4.3. DIAGONALIZZAZIONE DI UNA MATRICE 45

* leading N - by - N upper triangular part of A contains the


* upper triangular part of the matrix A . If UPLO = ’L ’ ,
* the leading N - by - N lower triangular part of A contains
* the lower triangular part of the matrix A .
* On exit , if JOBZ = ’V ’ , then if INFO = 0 ,
* A contains the
* orthonormal eigenvectors of the matrix A .
* If JOBZ = ’N ’ , then on exit the lower triangle
* ( if UPLO = ’L ’)
* or the upper triangle ( if UPLO = ’U ’) of A , including the
* diagonal , is destroyed .

* LDA ( input ) INTEGER


* The leading dimension of the array A . LDA >= max (1 , N ).
*
* W ( output ) DOUBLE PRECISION array , dimension ( N )
* If INFO = 0 , the eigenvalues in ascending order .
*
* WORK ( workspace / output ) DOUBLE PRECISION array ,
* dimension ( MAX (1 , LWORK ))
* On exit , if INFO = 0 ,
* WORK (1) returns the optimal LWORK .
*
* LWORK ( input ) INTEGER
* The length of the array WORK . LWORK >= max (1 ,3* N -1).
* For optimal efficiency , LWORK >= ( NB +2)* N ,
* where NB is the blocksize for
* DSYTRD returned by ILAENV .
*
* If LWORK = -1 , then a workspace query is assumed ;
* the routine
* only calculates the optimal size of the WORK array , returns
* this value as the first entry of the WORK array ,
* and no error
* message related to LWORK is issued by XERBLA .
*
* INFO ( output ) INTEGER
* = 0: successful exit
* < 0: if INFO = -i , the i - th argument had an illegal value
* > 0: if INFO = i , the algorithm failed to converge ; i
* off - diagonal elements of an intermediate tridiagonal
* form did not converge to zero .

* =============================================================
46 CAPITOLO 4. LIBRERIE SCIENTIFICHE

Esempio 4
Listing 4.5: codice di diagonalizzazione mediante Lapack
! -----------------------------------------------------------
! Example of matrix diagonalization
! using LAPACK routine dsyev . f and the !
! Fortran 90 interface diasym . f90 .
!
! -----------------------------------------------------------
! Input from file ’ mat . dat ’ ( matrix to be diagonalized ):
!
! line 1 : order of the symmetric matrix [ M ]
!
! lines 2 to n +1 : rows of the matrix
!
! -----------------------------------------------------------
! Output in file ’ dia . dat ’:
!
! - eigenvalues
!
! - eigenvectors ( diagonalizing matrix [ D ])
!
! - the original matrix [ M ] transformed by [ D ];
! [1/ D ][ M ][ D ]
! -----------------------------------------------------------

! - - - - - - - - - - - - - - -!
program diatest
! - - - - - - - - - - - - - - -!
implicit none

integer :: i ,n , j
real (8) , allocatable :: m0 (: ,:) , m1 (: ,:) &
m2 (: ,:) , eig (:)

open (10 , file = ’ mat . dat ’ , status = ’ old ’)


read (10 ,*) n
allocate ( m0 (n , n ))
allocate ( m1 (n , n ))
allocate ( m2 (n , n ))
allocate ( eig ( n ))

do i =1 , n
read (10 ,*) m0 (i ,:)
enddo
4.3. DIAGONALIZZAZIONE DI UNA MATRICE 47

m1 (: ,:)= m0 (: ,:)

call diasym ( m1 , eig , n )

open (10 , file = ’ dia . dat ’ , status = ’ replace ’)


write (6 ,*) ’ Eigenvalues : ’
do i =1 , n
write (6 ,*) i , eig ( i )
10 format ( I3 , ’ ’ , f14 .8)
enddo

write (10 ,*)

m2 = matmul ( transpose ( m1 ) , m0 )
m0 = matmul ( m2 , m1 )

write (10 ,*) ’ Transformed matrix ( check ): ’


do i =1 , n
write (10 ,30) m0 (: , i )
30 format (10 f14 .8)
enddo
write (10 ,*)

close (10)

deallocate ( m0 ); deallocate ( m1 )
deallocate ( m2 ); deallocate ( eig )

end program diatest


! - - - - - - - - - - - - - - - - - - -!

! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
! Calls the LAPACK diagonalization subroutine DSYEV
!
! input : a (n , n ) = real symmetric matrix to be diagonalized !
! n = size of a
!
! output : a (n , n ) = orthonormal eigenvectors of a
!
! eig ( n ) = eigenvalues of a in ascending order
!
48 CAPITOLO 4. LIBRERIE SCIENTIFICHE

! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
subroutine diasym (a , eig , n )
implicit none

integer n ,l , inf
real *8 a (n , n ) , eig ( n ) , work ( n *(3+ n /2))

l = n *(3+ n /2)
call dsyev ( ’V ’ , ’U ’ ,n ,a ,n , eig , work ,l , inf )

end subroutine diasym


! - - - - - - - - - - - - - - - - - - - - -!

Esercizio 9 Scrivere un codice che risolva un sistema di equazioni lineare


N ×N generico mediante chiamata a subroutine Lapack. Utilizzando le subroutine
SGESV, DSYSV.
(Hint: la dimensione della matrice, la matrice dei coefficienti e termini noti
devono essere letti da un file esterno)

4.3.3 Soluzione sistema lineare mediante diagonalizzazione


La diagonalizzazione porta naturalmente la matrice dei coefficienti di un sistema di equazioni
lineari nella forma diagonale, ovvero in una forma in cui la soluzione è immediata. Per fare
questo si effettua un cambio di base passando alla base degli autovettori della matrice.
Sfruttando le proprietà di tale cambio di base, possiamo elaborare un algoritmo per
la soluzione di un sistema di equazioni che (sfruttando l’uso delle librerie Lapack) risulta
particolarmente elegante.
Immaginiamo di avere un sistema di equazioni lineari :
Ax = y (4.2)
La relazione che determina il cambio di base è la seguente:

A = P DP −1 (4.3)
Dove la matrice A viene trasformata nella matrice diagonale D con gli autovalori sulla
diagonale, mediante la matrice di trasformazione P formata dagli autovettori di A.
Quindi il nostro problema originale, Eq.4.2, si trasforma secondo:
P DP −1 x = y (4.4)
Moltiplicando ambo i membri per P−1 , avremo DP−1 x = P −1 y.
Ridefinendo x0 = P −1 x e y0 = P −1 y, otteniamo il nuovo sistema di equazioni lineari,
Dx0 = y0 (4.5)
Quest’ultimo sistema risulta diagonale e facilmente risolvibile. Ottenuta la soluzione x0 ,
possiamo facilmente ottenere la soluzione x = P x0

Potrebbero piacerti anche