Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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
2
Capitolo 1
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
RIGA 1 RIGA 1
RIGA 2 RIGA 2
RIGA 3 RIGA 3
RIGA 4 RIGA 4
RIGA 5 RIGA 5
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
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:
• Limiti : Per ogni matrice, è necessario definire il limite inferiore e superiore degli indici.
Se non specificato, il limite inferiore viene assunto pari a 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: A = A∗
• matrice Hermitiana: A = A†
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
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
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.
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
1. passo 1: 1 f lop,
2. passo 2: 3 f lops,
3. passo 3: 5 f lops.
Se ui,i 6= 0 per i = 1, ...., n, la soluzione di questo sistema può essere ottenuta mediante il
metodo di back-substitution:
! Parametri di input
! 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
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).
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
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 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
(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
! leggere la matrice A ( n x n )
do i =1 , n
read (10 ,*)( A (i , j ) , j =1 , n )
enddo
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
n
X ∂fi
fi (x1 + ∆x1 , . . . , xn + ∆xn ) ' fi (x01 , . . . , x0n ) + ∆xj = 0, per i = 1, n
j=1
∂xj
Soluzione: x = (1, 1)
1.4. SISTEMI DI EQUAZIONI NON LINEARI: NEWTON-RAPHSON METHOD 15
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
xN = gN −1 xN −1 + hN −1
αN bN
gN −1 = − e hN −1 =
βN βN
γ1 b1
x1 = − x2 + (dal sistema di equazioni)
β1 β1
e, mediante l’ansatz
x2 = g1 x1 + h1 con g1 e h1 noti
xi+1 = gi xi + hi ; i = 1, ..., N − 1
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.
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
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 title " Interpolazione " font " Helvetica ,22 "
a1 = 14.733333
a2 = -13.072222
a3 =5.736111
a4 = -0.911111
a5 =0.047222
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
Spline
10
'dati.dat'
9
7
asse Y
3
1 2 3 4 5 6 7 8 9
asse X
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 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
• 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
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
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
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.
23
24 CAPITOLO 3. REGRESSIONI
∂ρ Pn
= 2(xi )(yi − (αxi + β)) = 0
∂α i=1
∂ρ P n
= 2(−1)(yi − (αxi + β)) = 0
∂β i=1
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 .
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
f ( x )= a + b * x
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).
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:
ρ = y T y − 2y T Ac + cT AT Ac.
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:
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à.
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.
! SDOT
! Purpose :
! SDOT forms the dot product of two vectors .
29
30 CAPITOLO 4. LIBRERIE SCIENTIFICHE
! 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
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 ,
! 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
END
do I =1 , M
do J =1 , N
MATRIX (I , J ) = I +2* J
end do
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.
• 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:
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
write (6 ,*)
write (6 ,*) ( b ( i ) , i =1 , n )
bp = b
42 CAPITOLO 4. LIBRERIE SCIENTIFICHE
Ap = A
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).
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:
* =============================================================
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 (:)
do i =1 , n
read (10 ,*) m0 (i ,:)
enddo
4.3. DIAGONALIZZAZIONE DI UNA MATRICE 47
m1 (: ,:)= m0 (: ,:)
m2 = matmul ( transpose ( m1 ) , m0 )
m0 = matmul ( m2 , m1 )
close (10)
deallocate ( m0 ); deallocate ( m1 )
deallocate ( m2 ); deallocate ( eig )
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
! 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 )
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