Upload
giada-cattaneo
View
283
Download
3
Embed Size (px)
Citation preview
Metodi iterativi su spazi di Krylov
G. Puppo
Riassunto
• Metodo Ortomin
• Metodo del gradiente
• Metodo del gradiente coniugato
• Metodo GMRES
• Metodo GMRES con restart
Metodo Ortomin
Questo metodo è definito dalla ricorsione:
Il metodo Ortomin si basa sulla minimizzazione del residuo lungo la direzione Ar
k
function [xnew,residuo,nit]=ortomin(a,b,tol)% X=ORTOMIN(A,B,TOL): Calcola la soluzione X del sistema% A*X=B, usando il metodo iterativo Ortomin% con tolleranza TOL sul test di arresto% se TOL viene omessa, sceglie TOL=100*eps% [X,RESIDUO,NIT]=ORTOMIN(A,B,TOL) Calcola la soluzione % X del sistema% A*X=B, il residuo e il numero NIT di iterazioni eseguite
if nargin < 3 tol = eps*100;end% Usa B come stima iniziale X0xold = b; normb=norm(b);
% Stima un tetto al numero massimo di iterazioninmax=length(b)^2; for n = 1:nmax res = b-a*xold; ares=a*res; alpha = (res'*ares) / (ares'*ares); xnew = xold + alpha*res; % Test di arresto res=norm(res); residuo(n)=res; if res <= tol*normb nit=n; return else xold = xnew; endendnit=nmax; display('non converge')
Membrana elastica
Il numero di iterazioni sale come N 2
Convezione-diffusione
Ortomin converge anche per una matrice di convezione-diffusione, con numeri di Peclet maggiori di 1
Ortomin converge per il problema di convezione diffusione, perchè le 4 matrici dell'esempio precedente hanno un campo di valori che non contiene lo zero
Per calcolare il campo di valori di una matrice ho usato questa function:
function valori(a,n,colore)% Calcola il campo di valori di A usando N vettori di norma 1% e disegna il grafico[m1,m2]=size(a);stringa=strcat(colore,'o');for k=1:n x1=rand(m2,1); x2=rand(m2,1); x=x1+i*x2; x=x/norm(x); v(k)=x'*(a*x);endplot(v,stringa,'Markersize',5,'Markerfacecolor',colore)
Esercizi
Calcolare la velocità di convergenza per Ortomin, tenendo fisso il numero di Peclet, e variando N: N=10, 20, 40, 80.
Calcolare il campo di valori della matrice della membrana elastica, per N=10, 20, 40, 80.
Metodo del gradiente
Il metodo del gradiente è definito dalla seguente ricorsione:
Il metodo del gradiente si basa sulla minimizzazione dell'errore in norma A lungo la direzione Ar
k. Converge per matrici
simmetriche e definite positive
function [xnew,residuo,nit]=gradiente(a,b,tol)% X=GRADIENTE(A,B,TOL): Calcola la soluzione X del sistema% A*X=B, usando il metodo iterativo del gradiente% con tolleranza TOL sul test di arresto% se TOL viene omessa, sceglie TOL=100*eps% [X,RESIDUO,NIT]=GRADIENTE(A,B,TOL) Calcola % la soluzione X del sistema% A*X=B, il residuo e il numero NIT di iterazioni eseguiteif nargin < 3 tol = eps*100;end% Usa B come stima iniziale X0xold = b; normb=norm(b);
% Stima un tetto al numero massimo di iterazioninmax=length(b)^4; for n = 1:nmax res = b-a*xold; ares=a*res; alpha = (res'*res) / (res'*ares); xnew = xold + alpha*res; % Test di arresto res=norm(res); residuo(n)=res; if res <= tol*normb nit=n; return else xold = xnew; endendnit=nmax; display('non converge')
Membrana elastica
Il metodo del gradiente converge per la matrice del Laplaciano
Convezione-diffusione
La matrice di convezione-diffusione non è SPD: la convergenza del metodo del gradiente non è garantita
Metodo del gradiente coniugato
Il metodo del gradiente coniugato è definito da:
Il metodo del gradiente coniugato si basa sulla minimizzazione dell'errore in norma A lungo la direzione Ap
k. Converge per
matrici simmetriche e definite positive
function [xnew,residuo,nit]=grad_con(a,b,tol)% X=GRAD_CON(A,B,TOL): Calcola la soluzione X del sistema% A*X=B, usando il metodo iterativo del gradiente coniugato% con tolleranza TOL sul test di arresto% se TOL viene omessa, sceglie TOL=100*eps% [X,RESIDUO,NIT]=GRAD_CON(A,B,TOL) Calcola la % soluzione X del sistema% A*X=B, il residuo e il numero NIT di iterazioni eseguite
if nargin < 3 tol = eps*100;end
% Usa b come stima iniziale X0xold = b; normb=norm(b);% Stima un tetto al numero massimo di iterazioninmax=length(b)^2; rk = b-a*xold; norm_rk=norm(rk); pk=rk;for n = 1:nmax apk=a*pk; alpha = norm_rk^2 / (pk'*apk); xnew = xold + alpha*pk; rk=rk-alpha*apk; % Test di arresto res=norm(rk); % Norma del nuovo residuo ....... bk=res^2 / norm_rk^2; pk=rk+bk*pk; norm_rk=res;endnit=nmax; display('non converge')
Membrana elastica
Il metodo del gradiente coniugato converge per la matrice del Laplaciano, il numero di iterazioni cresce come N.
Convezione diffusione
Il metodo del gradiente coniugato non converge per la matrice di convezione diffusione, nemmeno per numeri di Peclet piccoli.
Esercizi
Confrontare i tempi di calcolo per il metodo del gradiente coniugato e del gradiente per il problema della membrana elastica, per N=10, 20, 40 , 80.
Applicare il metodo del gradiente coniugato al problema della trave elastica e stimare l'andamento del numero di iterazioni rispetto ad N.
Algoritmo di Arnoldi
Il metodo di Arnoldi serve a costruire una base ortogonale per lo spazio di Krilov generato dalla matrice A, a partire da un vettore r
0.
function [q,h]=arnoldi(a,b,n)% crea N vettori ortogonali per lo spazio di Krilov generato % da A, con stima iniziale Br0=b-a*b; p=r0/norm(r0);% Inizializza la costruzione della matrice ortogonale Q:q(:,1)=p;for k=1:n qtilde=a*q(:,k); for j=1:k h(j,k)=qtilde'*q(:,j); qtilde=qtilde-h(j,k)*q(:,j); end h(k+1,k)=norm(qtilde); q(:,k+1)=1/h(k+1,k)*qtilde;end
Questo algoritmo crea una matrice ortogonale Q con N+1 colonne e con lo stesso numero di righe di A e una matrice H (N+1) per N di Hessenberg. Applico la function arnoldi.m alla matrice del Laplaciano, con N punti interni per lato:
H =
Esercizio
Verificare che: AQ(:, 1:N) = Q*H e che Q è una matrice ortogonale, cioè: Q*Q' = I.
Metodo GMRES
Questo metodo è basato sulla costruzione di una base ortogonale per lo spazio di Krilov generato dalla matrice A
function [xnew,residuo,nit]=gmres_full(a,b,tol)% X=GMRES_FULL(A,B,TOL): Calcola la soluzione X del sistema% A*X=B, usando il metodo iterativo GMRES% con tolleranza TOL sul test di arresto% se TOL viene omessa, sceglie TOL=100*eps% [X,RESIDUO,NIT]=GMRES_FULL(A,B,TOL) Calcola % la soluzione X del sistema% A*X=B, il residuo e il numero NIT di iterazioni eseguite
if nargin < 3 tol = eps*100;end% Usa B come stima iniziale X0xold = b; normb=norm(b);% Stima un tetto al numero massimo di iterazioninmax=length(b);
r0 = b-a*xold; norm_rk=norm(r0); q(:,1)=r0/norm_rk;for k = 1:nmax qtilde=a*q(:,k); for j=1:k h(j,k)=qtilde'*q(:,j); qtilde=qtilde-h(j,k)*q(:,j); end h(k+1,k)=norm(qtilde); q(:,k+1)=1/h(k+1,k)*qtilde; % Trova la soluzione ai minimi quadrati di Hy=q'*r0 yk=h\(q'*r0); y=q(:,1:k)*yk; xnew = b + y; rk=b-a*xnew; % Test di arresto ........... endnit=nmax; display('non converge')
Membrana elastica
Per il problema della membrana elastica, il metodo del gradiente coniugato e GMRES richiedono approssimativamente lo stesso numero di iterazioni
Convezione diffusione
Per il problema di convezione, GMRES converge, anche per numeri di Peclet>1, mentre il gradiente coniugato diverge.
GMRES con restart
Le iterazioni del metodo GMRES diventano più lente ad ogni iterazione, perchè ogni volta aumentano le dimensioni della matrice Q e di conseguenza aumentano le dimensioni del sistema ai minimi quadrati da risolvere ad ogni iterazione.
Nel metodo GMRES con restart, si applica il metodo GMRES per un numero fisso js di iterazioni, con js piccolo. Terminate le js iterazioni, si ri-inizializza il metodo, usando come valore iniziale il residuo appena calcolato
function [xnew,residuo,nit]=gmres_restart(a,b,js,tol)% X=GMRES_RESTART(A,B,JS,TOL): Calcola la soluzione X del sistema% A*X=B, usando il metodo iterativo GMRES con restart ogni % JS iterazioni e con tolleranza TOL sul test di arresto% se TOL viene omessa, sceglie TOL=100*eps% [X,RESIDUO,NIT]=GMRES_RESTART(A,B,JS,TOL) Calcola la soluzione X del sistema% A*X=B, il residuo e il numero NIT di iterazioni eseguiteif nargin < 4 tol = eps*100;end% Usa B come stima iniziale X0xold = b; normb=norm(b);% Stima un tetto al numero massimo di iterazioninmax=length(b)^2;
r0 = b-a*xold; norm_rk=norm(r0); q(:,1)=r0/norm_rk;for k = 1:nmax for jk=1:js qtilde=a*q(:,jk); for j=1:jk h(j,jk)=qtilde'*q(:,j); qtilde=qtilde-h(j,jk)*q(:,j); end h(jk+1,jk)=norm(qtilde); q(:,jk+1)=1/h(jk+1,jk)*qtilde; % Trova la soluzione ai minimi quadrati di Hy=q'*r0 yk=h\(q'*r0); y=q(:,1:jk)*yk; xnew = xold + y; end
% Prepara i valori di ingresso per il restart xold=xnew; rk=b-a*xnew; r0=rk; clear q h, q(:,1)=r0/norm_rk; % Test di arresto res=norm(rk); % Norma del nuovo residuo residuo(k)=res; diff = norm(xnew-xold); if res <= tol*normb %| diff<=tol*norm(xold) nit=k; return else xold = xnew; endendnit=nmax; display('non converge')
Convezione-diffusione
In questo test, N=40 e Peclet =2.Come si vede il metodo GMRES con restart dopo 2 iterazioni ha una velocità di convergenza comparabile con full GMRES
Esercizi
Calcolare i tempi di CPU per GMRES con restart per diversi valori di js e paragonare con full GMRES.
Paragonare i tempi di calcolo sul problema della membrana elastica per il metodo del gradiente coniugato e GMRES con restart, per valori piccoli di js.