Progetto Matlab N°2
Calcolo Numerico – 6 CFU
Corso di Laurea in Ingegneria
delle Comunicazioni
31/05/2014
Procedimento
1. Scrivere una function che implementi il prodotto
matrice-vettore AX con A matrice
sparsa. Si memorizzi la matrice sparsa utilizzando
tre vettori:
Il vettore a contenente solo gli elementi non nulli della
matrice A;
Il vettore Icol contenente gli indici di colonna degli
elementi del vettore a;
Il vettore Irow contenente l’indice del vettore a dove
inizia una nuova riga della matrice A.
Matrice sparsa
Le matrici sparse sono una classe speciale di matrici con la caratteristica di contenere un significativo
numero di elementi nulli. . (Una matrice tridiagonale è un esempio di matrice sparsa).
Con Matlab è possibile manipolare matrici sparse, memorizzandole in forma compatta, ossia memorizzando
solo gli elementi non nulli insieme ai loro indici. Ciò consente di ridurre il tempo di calcolo eliminando
operazioni su elementi nulli.
L’istruzione B= sparse(A) dove A come input è una matrice sparsa, memorizzata completamente; e gli
output sono gli elementi non nulli della matrice con i loro rispettivi indici degli elementi.
ESEMPIO
» A=[0 0 0 5
0200
1300
0 0 4 0]
» B=sparse(A)
B=
(3,1) 1
(2,2) 2
(3,2) 3
(4,3) 4
(1,4) 5
L'istruzione
A=full(B)
esegue l'operazione contraria, ossia dati gli elementi non nulli e i rispettivi indici, crea la matrice sparsa con gli
elementi dati.
Vettore a
Vettore
contenente
solo gli
elementi non
nulli della
matrice A.
Per creare questo
vettore abbiamo
utilizzato la funzione
nonzeros.
Vettore Icol
Vettore contenente gli indici di colonna degli
elementi del vettore a.
Per creare il vettore Icol
abbiamo utilizzato la
funzione find che definisce il
vettore costituito dagli indici
di riga e colonna della
matrice A in cui essa non
assume valore nullo..
Vettore Irow
Vettore contenente l’indice
del vettore A dove inizia una
nuova riga della matrice A.
Per riordinare gli
elementi di un vettore
dal minimo al massimo si
usa la funzione sort . Nel
nostro caso vogliamo
conoscere anche le
posizioni degli elementi in
ordine di grandezza, la
sintassi `e
»[r_sorted,i_sorted]=
sort(r).
Il vettore i_sorted
fornisce gli indici degli
elementi di r in r_sorted.
Dopo aver iterato,
utilizziamo poi il
comando unique che
restituisce un vettore che
ha come componenti
tutti i valori distinti di
(r(i_sorted)).
Funzione MEMSPARSE
N.B.
Per poter ottenere i
risultati presi per
righe abbiamo
dovuto dare in
input la trasposta
della matrice A
poiché la funzione
find lavora per
colonne.
Prodotto matrice-vettore
Il primo passo da compiere per
realizzare questa function è stata
la creazione del vettore nullo b di
lunghezza uguale a quella di X.
Dopo aver impostato n1=1 abbiamo
iniziato a ciclare da 1 fino alla
lunghezza di Irow per poi imporre
alcune condizioni. Infatti se il nostro
contatore i fosse stato uguale alla
lunghezza di Irow, n2 sarebbe
stato uguale alla lunghezza di a,
poiché naturalmente saremo giunti
alla fine della matrice. Altrimenti
n2 sarebbe stato uguale a
Irow(i+1)-1 poiché in questo modo si
arriverebbe fino all’ultimo
elemento di una riga della matrice
A. visto che Icol ci dà gli indici di
colonna degli elementi del vettore
a sappiamo che Il nostro vettore
b(i) sarà dato dalla somma dei
prodotti tra gli a(n1:n2)e
X(Icol(n1:n2)). Subito dopo viene
posto l’ aumento di n1 nel caso in
cui i è minore della lunghezza di
Irow.
2. Utilizzare la function per implementare i metodi iterativi di Jacobi e
Gauss-Seidel
Metodo Di Jacobi
Il metodo di Jacobi è un metodo iterativo per la risoluzione di sistemi lineari, un metodo cioè che
calcola la soluzione di un sistema di equazioni lineari dopo un numero teoricamente infinito di
passi. Per calcolare tale risultato il metodo utilizza una successione che converge verso la
soluzione esatta del sistema lineare e ne calcola progressivamente i valori arrestandosi quando
la soluzione ottenuta è sufficientemente vicina a quella esatta.
Il metodo di Jacobi consiste nel decomporre la matrice A in:
A=L+D+U
con D matrice diagonale ottenuta dalla diagonale di A, L matrice triangolare inferiore e U
matrice triangolare superiore.
Si ha quindi:
D(xk+1)= -( L + U )xk+ b con k≥0
ossia:
xk+1= -D^(-1) ( L + U )xk+ D^(-1) b con k≥0
E’possibile esprimere questa formula in forma scalare:
La matrice di iterazione e il termine noto del metodo di Jacobi sono
quindi:
CJ= -D^(-1) ( L + U )
QJ= D^(-1) b
Metodo di Gauss-Seidel
Il metodo di Gauss-Seidel è un metodo iterativo, simile al metodo di Jacobi,
per la risoluzione di un sistema lineare, scritto nella forma matriciale
Ax=b.
Il metodo di Gauss-Seidel consiste nel decomporre la matrice A in:
A=L+D+U
con D matrice diagonale ottenuta dalla diagonale di A, L matrice
triangolare inferiore e U matrice triangolare superiore.
Si ha
(D + L)xk+1 = -Uxk+ b con k≥0
ossia:
xk+1 = -(D+L)^(-1) (U) xk + (D+L)^(-1)(b) con k≥0
E’possibile esprimere questa formula in forma scalare:
La matrice di iterazione ed il termine noto sono i seguenti:
CGS= -(D+L)^(-1) (U)
QGS= (D+L)^(-1)(b)
3. Risolvere il sistema lineare AX = B dove A è una matrice tridiagonale a
blocchi.
Per provare il risultato del nostro algoritmo, come esempio abbiamo utilizzato
una matrice A tridiagonale a blocchi di ordine 12 x 12:
Visto che i metodi
di Gauss-Seidel e
Jacobi sono dei
metodi iterativi, si
è dovuto scegliere
un vettore X0
iniziale per poi
cominciare ad
iterare.
Per comodità
abbiamo scelto
X0 come vettore
nullo.
4. Confrontare la velocità e l'occupazione di memoria dei metodi
implementati con quella del solutore di Matlab.
Confrontando tutti i metodi implementati con il solutore di
Matlab posso affermare ovviamente che la velocità di
quest’ultimo è maggiore.
1°-Solutore Matlab
2°-Gauss-Seidel
3°-Jacobi
Per quanto riguarda invece l’occupazione di memoria dei
metodi in confronto al solutore possiamo constatare che i nostri
metodi occupano meno memoria rispetto al calcolatore, poiché
abbiamo memorizzato la matrice A tramite la nostra funzione
memsparse.
Matlab
Metodi
5. Il sistema lineare dato è il sistema risultante dalla discretizzazione
dell'equazione di Poisson con il metodo alle differenze finite.
Il metodo delle differenze finite consiste nell'approssimare il valore della
derivata di una funzione f in un punto x (per il quale sarebbe necessario
conoscere tutti i valori della funzione (quindi infiniti) in un intorno di x), con
un'espressione che ne tenga in conto solo un numero finito (spesso molto
piccolo).
Si passa cioè dall'operazione di limite a quella di rapporto incrementale.
Ciò permette, ad esempio, di trasformare un'equazione alle derivate
parziale in un problema algebrico. In particolare se il problema di
partenza e lineare, si ottiene
un sistema lineare del tipo Ax = b, con A matrice sparsa, la cui sparsità
dipende dal numero di valori usati nell'approssimazione delle derivate.
Emanuele Pavone &
Andrea Batino
FINE