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
© Copyright 2024 Paperzz