Metodi iterativi su spazi di Krylov G. Puppo. Riassunto Metodo Ortomin Metodo del gradiente Metodo...

Preview:

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.

Recommended