Metodi iterativi. Problema del fill-in Metodo di Jacobi Metodo di Gauss Seidel Studio della convergenza

Documenti analoghi
Metodi iterativi. Problema del fill-in Metodo di Jacobi Metodo di Gauss Seidel Metodo SOR Studio della convergenza

Complementi di Matematica e Calcolo Numerico A.A Laboratorio 6 Metodi iterativi per sistemi lineari

SISTEMI LINEARI. Metodi diretti. Calcolo numerico 07/08 p. 1/1

Metodi diretti: eliminazione gaussiana

Come fatto finora, presentiamo dapprima alcune utili comandi per manipolare matrici e per risolvere sistemi non lineari. c 1 r 2 r 3... r n.

Matrici. 3. Costruire le seguenti matrici, contarne gli elementi non nulli e visualizzarle con spy: . B 10x10 = ; D 7x7 =

Calcolo Numerico (CdS in Matematica) A.A. 2012/13

Fattorizzazione LU (lu)

Progetto Matlab N 2. Calcolo Numerico 6 CFU. Corso di Laurea in Ingegneria delle Comunicazioni 31/05/2014

Calcolo Numerico I - a.a Laboratorio 9 - Sistemi lineari

1. Si scriva una function Matlab che implementa il seguente metodo di punto fisso

Complementi di Matematica e Calcolo Numerico A.A

Algebra Lineare Metodi Iterativi

Sistemi lineari. Lucia Gastaldi. DICATAM - Sez. di Matematica,

Esercizi sulla rappresentazione compatta di matrici sparse

Metodi iterativi per la soluzione di sistemi lineari: Jacobi e Gauss-Seidel

Metodi iterativi SISTEMI LINEARI. Metodi Iterativi. Jacobi, Gauss-Seidel

Metodi iterativi per sistemi lineari

Equazioni differenziali con valori al bordo

Funzioni per la costruzione di matrici

Complementi di Matematica e Calcolo Numerico C.L. Chimica Industriale A.A

Calcolo Numerico con elementi di programmazione

Sistemi lineari. Lucia Gastaldi. DICATAM - Sez. di Matematica,

2. Risolvere con il metodo di eliminazione di Gauss con pivoting parziale il seguente sistema lineare:

Matrici e sistemi lineari

EQUAZIONI DIFFERENZIALI

Algebra lineare numerica in Matlab

Laboratorio di Analisi Numerica Lezione 6

Risoluzione di sistemi lineari sparsi e di grandi dimensioni

Complementi di Matematica e Calcolo Numerico A.A

Esercizio 1. Esercizio 2

MatLab - Testo pagina 1 di 5 101

Complementi di Matematica e Calcolo Numerico A.A

Complementi di Matematica e Calcolo Numerico A.A

Laboratorio di Analisi Numerica Lezione 6

Osservazione. Convergenza dei metodi di Gauss-Seidel e di Jacobi. Condizioni sufficienti per la convergenza. Definizione

Esercizi di autovalutazione - Matlab Metodi Numerici con Elementi di Programmazione A.A

Interpolazione polinomiale. Gabriella Puppo

Corso di Geometria BIAR, BSIR Esercizi 3: soluzioni

Metodi iterativi per sistemi lineari

Laboratorio di Calcolo Numerico Laboratorio 11: Metodi iterativi per la soluzione di sistemi lineari. 20 Maggio 2019

Sistemi II. Sistemi II. Elisabetta Colombo

ESERCIZI DI CALCOLO NUMERICO

Calcolo Numerico per Ingegneria. Corso estivo di Bressanone. Prof. L. Bergamaschi SOLUZIONE DELLA PROVA SCRITTA del

Calcolo Numerico - Prova Matlab 19 luglio 2013

Calcolo del precondizionatore K 1

Metodi iterativi per sistemi lineari

Cenni sui metodi iterativi per sistemi lineari. Analisi Numerica Prof. M. Lucia Sampoli a.a. 2014/2015

Laboratorio di Matematica Computazionale A.A Lab. 5

Metodi iterativi per sistemi lineari

Compito numero 2 - Compito intero

ISTITUTO DI ISTRUZIONE SUPERIORE A. EINSTEIN. CORSO AM08 Approfondimenti di matematica

Laboratorio di Calcolo Numerico - Corso di Laurea in Matematica Appello d esame del 18/09/2012

Esercitazione 4: Vettori e Matrici

METODI ITERATIVI DI JACOBI E GAUSS-SEIDEL

Esercitazione di Calcolo Numerico 1 27 Maggio Calcolare la fattorizzazione P A = LU della matrice A =

Esercitazione 6: Metodi iterativi per sistemi lineari.

Complementi di Matematica e Calcolo Numerico A.A

Sistemi lineari. 2x 1 + x 2 x 3 = 2 x 1 x 2 + x 3 = 1 x 1 + 3x 2 2x 3 = 0. x 1 x 2 x 3

Sistemi lineari. Lucia Gastaldi. 11 novembre Dipartimento di Matematica,

Esercizi di autovalutazione - Matlab Metodi Numerici con Elementi di Programmazione A.A

Introduzione al MATLAB c Parte 2

Equazioni non lineari. Gabriella Puppo

Quale delle seguenti rappresentazioni del numero reale è in virgola mobile normalizzata?

Corso di Matematica per la Chimica

Esercitazione di Calcolo Numerico 1 22 Aprile Determinare la fattorizzazione LU della matrice a 1 1 A = 3a 2 a 2a a a 2 A =

CALCOLO NUMERICO. Francesca Mazzia. Calcolo degli autovalori. Dipartimento Interuniversitario di Matematica. Università di Bari

Complementi di Matematica e Calcolo Numerico A.A Laboratorio 10

Corso di Calcolo Numerico

Motivazione: Come si fa? Matrici simmetriche. Fattorizzazioni di matrici speciali

Preparazione orale analisi numerica:

4. Algoritmi per la soluzione di sistemi lineari.

Esercitazione 1-I parte

Esame di Calcolo Numerico per Informatica Prof. S. De Marchi Padova, 2 settembre 2013

Sistemi lineari: metodi diretti II

Programma del corso di: Laboratorio di Programmazione e Calcolo Corso di laurea in Matematica a.a Proff. B. Paternoster, D.

Programmare con MATLAB c Parte 5 Cicli: for e while

Daniela Lera A.A

Laboratorio computazionale numerico Lezione 4

05. Determinare una base ortonormale per ognuno dei seguenti spazi vettoriali.

Laboratorio di Calcolo Numerico Laboratorio 11: Metodi diretti per la soluzione di sistemi lineari

Esercizi su algebra lineare, fattorizzazione LU e risoluzione di sistemi lineari

Laboratorio di Calcolo Numerico Laboratorio 12: Metodi iterativi per la soluzione di sistemi lineari

Sistemi lineari: metodi diretti II

Soluzione sistemi lineari

Laboratorio 2. Calcolo simbolico, limiti e derivate. Metodo di Newton.

Equazioni differenziali con valori al bordo

Vettori e Matrici. Corso di Calcolo Numerico. 24 Aprile 2018

Corso di Calcolo Numerico

Metodi iterativi per sistemi lineari

Equazioni e sistemi non lineari

Esercizio. fattorizzazione QR? Quale è più conveniente dal punto di vista computazionale

Transcript:

Metodi iterativi Problema del fill-in Metodo di Jacobi Metodo di Gauss Seidel Studio della convergenza

Problema del Fill-in Se calcoliamo la fattorizzazione LU di una matrice A sparsa, cioè con un numero elevato di elementi nulli, otteniamo che i fattori L ed U sono molto più pieni

Esempio Consideriamo per esempio la matrice: >> a=[4-1 0 0 1; -1 4-1 0 0; 0-1 4-1 0; 0 0-1 4-1; 1 0 0-1 4] a = 4-1 0 0 1-1 4-1 0 0 0-1 4-1 0 0 0-1 4-1 1 0 0-1 4 Questa matrice è tridiagonale, con solo 2 elementi diversi da 0 fuori della struttura tridiagonale

Calcolando la fattorizzazione LU otteniamo >> [l,u]=lu(a) l = 1.0000 0 0 0 0-0.2500 1.0000 0 0 0 0-0.2667 1.0000 0 0 0 0-0.2679 1.0000 0 0.2500 0.0667 0.0179-0.2632 1.0000 u = 4.0000-1.0000 0 0 1.0000 0 3.7500-1.0000 0 0.2500 0 0 3.7333-1.0000 0.0667 0 0 0 3.7321-0.9821 0 0 0 0 3.4737

Continuo lo studio del fill-in Per approfondire lo studio del fill in, devo creare matrici sparse più grandi e analizzarne la struttura. Servono due nuovi comandi Function SPDIAGS Function FULL Function SPY

Function SPDIAGS Il comando A=spdiags(B,d,m,n) crea una matrice A m per n, con diagonali uguali alle colonne di B, disposte nella posizione indicate dal vettore d: Esempio: >> n=10; >> e=ones(n,1); >> b=[e, -e, 6*e, -e, 2*e]; >> d=[-n/2-1 0 1 n/2]; >> a=spdiags(b,d,n,n); Crea una matrice 10X10, con 5 diagonali non nulle

Function FULL La matrice creata da SPDIAGS è memorizzata considerando solo gli elementi diversi da zero, in modo da conservarne la struttura sparsa. Per avere la matrice completa, devo espanderla con FULL.

>> n=10; >> e=ones(n,1); >> b=[e, -e, 6*e, -e, 2*e]; >> d=[-n/2-1 0 1 n/2]; >> a=spdiags(b,d,n,n); >> full(a) ans = 6-1 0 0 0 2 0 0 0 0-1 6-1 0 0 0 2 0 0 0 0-1 6-1 0 0 0 2 0 0 0 0-1 6-1 0 0 0 2 0 0 0 0-1 6-1 0 0 0 2 1 0 0 0-1 6-1 0 0 0 0 1 0 0 0-1 6-1 0 0 0 0 1 0 0 0-1 6-1 0 0 0 0 1 0 0 0-1 6-1 0 0 0 0 1 0 0 0-1 6

Function SPY La function spy(a) permette di visualizzare la sparsità di una matrice. Il comando SPY(A) genera un grafico, nel quale sono evidenziati con un punto solo gli elementi di A che sono diversi da zero. Esempio. Studiamo la sparsità della fattorizzazione LU della matrice A. Per far questo, applichiamo SPY sia ad A che alla fattorizzazione LU, per N=10 e per N=100. Per visualizzare sia L che U nella figura che segue, la function SPY è stata applicata alla matrice L+U.

Risultati ottenuti con il programma fill_in.m

Listato dello script fill_in.m % Questo programma studia il fill-in della fattorizzazione LU % di una matrice sparsa A k=0; for n=[10, 100] e=ones(n,1); b=[e, -e, 6*e, -e, 2*e]; d=[-n/2-1 0 1 n/2]; a=spdiags(b,d,n,n); full(a); k=k+1; subplot(2,2,k) spy(a) title('matrice A') k=k+1; [l,u]=lu(a); subplot(2,2,k) spy(l+u) title('fattorizzazione LU')

Commenti I risultati precedenti dimostrano che la fattorizzazione LU di una matrice sparsa genera un gran numero di elementi diversi da zero. Il numero degli elementi diversi da zero inoltre cresce velocemente all aumentare delle dimensioni della matrice. Quindi, se risolvo un sistema lineare sparso usando la fattorizzazione LU devo: - calcolare un elevato numero di elementi; - memorizzare tutti gli elementi calcolati. Per questo tipo di sistemi, è conveniente usare i metodi iterativi

Metodi iterativi Per applicare un metodo iterativo ad una matrice sparsa, devo evitare di memorizzare tutta la matrice, altrimenti perdo tutti i possibili vantaggi del metodo iterativo. Infatti, se ho abbastanza memoria per memorizzare A, ho anche abbastanza memoria per memorizzare la fattorizzazione LU. Inoltre, ogni iterazione richiede il prodotto A*x, e diventa quindi molto costosa se non sfrutto la sparsità di A.

Per applicare un metodo iterativo, quindi, devo sfruttare la struttura del sistema lineare che devo risolvere. Questo implica che non è possibile scrivere una function che applichi un metodo iterativo ad un problema generale. Devo invece scrivere il metodo iterativo per una classe particolare di sistemi lineari. Tuttavia, iniziamo ad applicare i metodi di Jacobi e di Gauss Seidel a matrici A generali. Le functions che otterremo ora non sfrutteranno la struttura di A e quindi non saranno efficienti

Metodo di Jacobi Scriviamo una function che applichi il metodo di Jacobi ad un generico sistema A*x=b. La function richiesta deve: - dare in output il vettore soluzione e il numero delle iterazioni che sono state eseguite; - avere in input la matrice A ed il termine noto B; - contenere un opportuno test di arresto.

Listato per il metodo di Jacobi (function jacobi.m) function [xnew,nit]=jacobi(a,b) % JACOBI(A,b) calcola la soluzione XNEW ottenuta con il metodo di % Jacobi e il numero NIT di iterazioni necessarie % per il sistema lineare A*XNEW=b % Sintassi: [XNEW,NIT]=JACOBI(A,b) % Attenzione: Applicazione naive del metodo di Jacobi, che non % sfrutta la sparsita' di A. [n,m]=size(a); if m ~= n display('a non e` quadrata') return m=length(b); if m ~= n display( b non e` compatibile') return continua...

Calcolo della nuova stima: % Come vettore iniziale usa b: x=b ; kmax=n^2; for k=1:kmax for i=1:n sum=b(i); for j=1:n if j~=i sum=sum-a(i,j)*x(j); xnew(i)=sum/a(i,i); continua...

Test di arresto: % Test di arresto: res = norm(a*xnew' -b); diff = norm(x-xnew); if res <= eps*norm(b) diff<=eps*norm(x) nit=k; return else x=xnew; nit=kmax;

Risolvo, usando il metodo di Jacobi, il sistema lineare A*x=b, dove A è la stessa matrice 10X10 costruita dalla function SPARSA(N) e b è il vettore ONES(10,1): function a=sparsa(n) % Genera la matrice sparsa n*n a diagonale dominante % usata come esempio in questo capitolo e=ones(n,1); % per avere una matrice a diagonale dominante, diag>=5 diag=6; b=[e, -e, diag*e, -e, 2*e]; d=[-n/2, -1, 0, 1, n/2]; a=spdiags(b,d,n,n);

Per applicare il metodo di Jacobi, devo dare i seguenti comandi: >> n=10; >> a=sparsa(n); >> afull=full(a); >> b=ones(n,1); >> [x,nit]=jacobi(afull,b); Ottengo: >> x x = Columns 1 through 8 0.1197 0.1393 0.1440 0.1503 0.1692 0.2106 0.2140 0.2126 Columns 9 through 10 0.2059 0.1728 >> nit nit = 54

Metodo di Gauss Seidel Scriviamo una function che applichi il metodo di Gauss Seidel ad un generico sistema A*x=b. La function richiesta deve: - dare in output il vettore soluzione e il numero delle iterazioni che sono state eseguite; - avere in input la matrice A ed il termine noto b; - contenere un opportuno test di arresto.

Listato per il metodo di Gauss Seidel (function gs.m) function [x,nit]=gs(a,b) % GS(A,b) calcola la soluzione XNEW ottenuta con il metodo di % Gauss Seidel e il numero NIT di iterazioni necessarie % per il sistema lineare A*XNEW=b % Sintassi: [XNEW,NIT]=GS(A,b) % Attenzione: Applicazione naive del metodo di Gauss Seidel, che non % sfrutta la sparsita' di A. [n,m]=size(a); if m ~= n display('a non e` quadrata') return m=length(b); if m ~= n display( b non e` compatibile') return

Calcolo della nuova stima: % Come vettore iniziale usa b: x=b'; kmax=n^2; for k=1:kmax xold=x; %immagazzina il vecchio vettore X for i=1:n sum=b(i); for j=1:n if j~=i sum=sum-a(i,j)*x(j); x(i)=sum/a(i,i); %Riscrive su X

Test di arresto: % Test di arresto: res = norm(a*x' -b); diff = norm(x-xold); if res <= eps*norm(b) diff<=eps*norm(x) nit=k; return nit=kmax;

Per applicare il metodo di Gauss-Seidel, devo dare i seguenti comandi: >> n=10; >> a=sparsa(n); >> afull=full(a); >> b=ones(n,1); >> [x,nit]=gs(afull,b); Ottengo: >> x x = Columns 1 through 8 0.1197 0.1393 0.1440 0.1503 0.1692 0.2106 0.2140 0.2126 Columns 9 through 10 0.2059 0.1728 >> nit nit = 30

Ottengo circa lo stesso vettore soluzione, X, ma il numero di iterazioni è molto più basso (circa la metà). Si può dimostrare infatti che per matrici a diagonale dominante, convergono sia il metodo di Jacobi che il metodo di Gauss Seidel. Il metodo di Gauss Seidel in questo caso richiede circa la metà delle iterazioni effettuate dal metodo di Jacobi.

Metodo di Jacobi efficiente Per sfruttare le caratteristiche di un metodo iterativo, devo calcolare il prodotto A*X senza immagazzinare la matrice A e sfruttando la sparsità di A. Scrivere una routine che applichi il metodo di Jacobi alla matrice pentadiagonale che stiamo studiando in questo capitolo. In particolare dobbiamo cambiare il calcolo di A*X, teno conto solo dei contributi diversi da zero.

Ottengo la function jac_a.m function [xnew,nit]=jac_a(b) % Questa function applica il metodo di Jacobi alla % matrice sparsa costruita dalla function SPARSA n=length(b); x=b'; kmax=n^2; diag=6; N.B. Questa function può essere applicata soltanto alla matrice SPARSA(N), quindi in input non ho bisogno di passare la matrice dei coefficienti, ma solo il vettore b

Calcolo della nuova stima for k=1:kmax % la prima riga contiene gli elementi delle diagonali % 0 1 e n/2 xnew(1) = (b(1) -(-x(2)+2*x(n/2+1)) )/diag; % le righe da 2 a n/2 contengono gli elementi delle % diagonali -1, 0, 1, n/2 for i=2:n/2 xnew(i)=(b(i) -(-x(i-1)-x(i+1)+2*x(n/2+i)) )/diag; % le righe da n/2+1 a n-1 contengono gli elementi delle % diagonali -n/2, -1, 0, 1 for i=n/2+1:n-1 xnew(i)=(b(i) -(x(i-n/2)-x(i-1)-x(i+1)) )/diag; % la riga n contiene gli elementi delle diagonali % -n/2, -1, 0 xnew(n) = (b(n) -(x(n/2)-x(n-1)) )/diag;

Test di arresto: % Test di arresto: diff = norm(x-xnew); if diff<=eps*norm(x) nit=k; return else x=xnew; nit=kmax;

Per calcolare la soluzione del sistema A*x=b, dove A ha la struttura particolare di SPARSA(N), devo fornire soltanto b: la routine legge le dimensioni del sistema dal vettore b, cioè devo dare i comandi: >> b=ones(10,1); >> [x,nit]=jac_a(b) x = Columns 1 through 8 0.1197 0.1393 0.1440 0.1503 0.1692 0.2106 0.2140 0.2126 Columns 9 through 10 0.2059 0.1728 nit = 54 Esercizio 1: scrivere una function simile per il metodo di Gauss- Seidel.

Esercizio 2. Confrontare l efficienza delle due functions jacobi(a,b) e jac_a(b), osservando il tempo di esecuzione per N=10 e per N=100 nei due casi

Convergenza dei metodi iterativi Sappiamo che un metodo iterativo converge se e solo se il raggio spettrale della matrice di iterazione è minore di 1. Quindi un metodo per stabilire la convergenza di un metodo iterativo è il seguente: - Calcolo la matrice di iterazione. - Calcolo gli autovalori della matrice di iterazione. - Pro l autovalore di modulo massimo e ne studio il modulo

Calcolo degli autovalori di una matrice Per calcolare gli autovalori di una matrice, Matlab dispone della function EIG: x=eig(a) crea un vettore x che contiene una stima degli autovalori di a.

Esempio: >> a=[1 2 3; 4 5 6; 7 8 9]; >> x=eig(a) x = 16.1168-1.1168-0.0000 Verifico che gli autovalori trovati sono una stima degli autovalori esatti, calcolando il determinante di A - l*eye(3): >> for i=1:3 res(i)=det(a-x(i)*eye(3)); >> res res = 1.0e-011 * 0.1848 0.0002-0.0018

Convergenza del metodo di Jacobi La matrice di iterazione per il metodo di Jacobi è B = D -1 *(A-D), dove D contiene gli elementi sulla diagonale di A Costruisco un programma che calcoli il raggio spettrale della matrice di iterazione B per il metodo di Jacobi.

Function RHO=CONV_JAC(A) function rho=conv_jac(a) % Calcola il raggio spettrale RHO per la matrice di iterazione % del metodo di Jacobi applicato alla matrice A % Sintassi RHO=CONV_JAC(A) [n,m]=size(a); if m ~= n display('a non e'' quadrata') return for i=1:n d(i,i)=a(i,i); b=inv(d)*(a-d); x=eig(b); rho=max( abs(x));

Convergenza del metodo di Gauss-Seidel La matrice di iterazione per il metodo di Gauss-Seidel è B = E -1 *(A-E), dove E è formata dagli elementi della parte triangolare inferiore di A Costruisco un programma che calcoli il raggio spettrale della matrice di iterazione B per il metodo di Gauss-Seidel.

Function CONV_GS(A) function rho=conv_gs(a) % Calcola il raggio spettrale RHO per la matrice di iterazione % del metodo di Jacobi applicato alla matrice A % Sintassi RHO=CONV_JAC(A) [n,m]=size(a); if m ~= n display('a non e` quadrata') return for i=1:n for j=1:i d(i,j)=a(i,j); b=inv(d)*(a-d); x=eig(b); rho=max( abs(x));