Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoGiada Cattaneo Modificato 10 anni fa
1
Metodi iterativi su spazi di Krylov G. Puppo
2
Riassunto Metodo Ortomin Metodo del gradiente Metodo del gradiente coniugato Metodo GMRES Metodo GMRES con restart
3
Metodo Ortomin Questo metodo è definito dalla ricorsione:
4
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 X0 xold = b; normb=norm(b);
5
% Stima un tetto al numero massimo di iterazioni nmax=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; end nit=nmax; display('non converge')
6
Membrana elastica Il numero di iterazioni sale come N 2
7
Convezione-diffusione Ortomin converge anche per una matrice di convezione-diffusione, con numeri di Peclet maggiori di 1
8
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
9
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); end plot(v,stringa,'Markersize',5,'Markerfacecolor',colore)
10
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.
11
Metodo del gradiente Il metodo del gradiente è definito dalla seguente ricorsione:
12
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 eseguite if nargin < 3 tol = eps*100; end % Usa B come stima iniziale X0 xold = b; normb=norm(b);
13
% Stima un tetto al numero massimo di iterazioni nmax=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; end nit=nmax; display('non converge')
14
Membrana elastica Il metodo del gradiente converge per la matrice del Laplaciano
15
Convezione-diffusione La matrice di convezione-diffusione non è SPD: la convergenza del metodo del gradiente non è garantita
16
Metodo del gradiente coniugato Il metodo del gradiente coniugato è definito da:
17
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
18
% Usa b come stima iniziale X0 xold = b; normb=norm(b); % Stima un tetto al numero massimo di iterazioni nmax=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; end nit=nmax; display('non converge')
19
Membrana elastica Il metodo del gradiente coniugato converge per la matrice del Laplaciano, il numero di iterazioni cresce come N.
20
Convezione diffusione Il metodo del gradiente coniugato non converge per la matrice di convezione diffusione, nemmeno per numeri di Peclet piccoli.
21
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.
22
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.
23
function [q,h]=arnoldi(a,b,n) % crea N vettori ortogonali per lo spazio di Krilov generato % da A, con stima iniziale B r0=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
24
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 =
25
Esercizio Verificare che: AQ(:, 1:N) = Q*H e che Q è una matrice ortogonale, cioè: Q*Q' = I.
26
Metodo GMRES Questo metodo è basato sulla costruzione di una base ortogonale per lo spazio di Krilov generato dalla matrice A
27
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 X0 xold = b; normb=norm(b); % Stima un tetto al numero massimo di iterazioni nmax=length(b);
28
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........... end nit=nmax; display('non converge')
29
Membrana elastica Per il problema della membrana elastica, il metodo del gradiente coniugato e GMRES richiedono approssimativamente lo stesso numero di iterazioni
30
Convezione diffusione Per il problema di convezione, GMRES converge, anche per numeri di Peclet>1, mentre il gradiente coniugato diverge.
31
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
32
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 eseguite if nargin < 4 tol = eps*100; end % Usa B come stima iniziale X0 xold = b; normb=norm(b); % Stima un tetto al numero massimo di iterazioni nmax=length(b)^2;
33
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
34
% 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; end nit=nmax; display('non converge')
35
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
36
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.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.