• Non ci sono risultati.

Analisi Numerica I Sistemi lineari: metodi iterativi

N/A
N/A
Protected

Academic year: 2021

Condividi "Analisi Numerica I Sistemi lineari: metodi iterativi"

Copied!
13
0
0

Testo completo

(1)

Analisi Numerica I

Sistemi lineari: metodi iterativi

Ana Alonso

ana.alonso@unitn.it

8 novembre 2019

(2)

Metodi iterativi classici

Ax = b A = P − N Px = Nx + b x(0)assegnato For k ≥ 0

Px(k+1) = Nx(k)+ b B = P−1N si dice matrice d’iterazione del metodo.

I Jacobi: P=diag(diag(A))

I Gauss-Seidel: P=tril(A)

(3)

Test d’arresto

I Bassato sull’incremento:

kx(k+1)− x(k)k <  STOP.

x − x(k)= x − x(k+1)+ x(k+1)− x(k)= B(x − x(k)) + x(k+1)− x(k). kx − x(k)k ≤ kBk kx − x(k)k + kx(k+1)− x(k)k. Se kBk < 1 allora kx − x(k)k ≤1−kBk1 kx(k+1)− x(k)k.

I Bassato sul residuo:

kb − Ax(k)k < kbk STOP.

r(k)= b − Ax(k)= A(x − x(k)) kx − x(k)k ≤ kA−1k kr(k)k. Siccome kbk ≤ kAk kxk allora kxk1 kAkkbk quindi kx−xkxk(k)k≤ kAkkA−1kkrkbk(k)k

(4)

Il metodo di Jacobi

Ax = b Dx = b + (D − A)x for i = 1 : n

xi(k+1)= a1

i ,i



bi−Pi −1

j =1ai ,jxj(k)−Pn

j =i +1ai ,jxj(k)

function [x,nit]=jacobi(A,b,x0,toll,nmax) P=diag(A);

N=diag(P)-A;

for nit=1:nmax;

x=(N*x0+b)./P;

if norm(x-x0) < toll, return, end x0=x;

end

Il test d’arresto usa l’incremento.

(5)

Esercizio

Scrivere una funzione di Matlab che implementi il metodo iterativo di Gauss-Seidel per l’approssimazione della soluzione di un sistema lineare A x = b.

for i = 1 : n xi(k+1) = a1

i ,i



bi −Pi −1

j =1ai ,jxj(k+1)−Pn

j =i +1ai ,jxj(k)

 Usare iltest d’arresto basato sul residuo.

function [x,nit]=GS(A,b) nmax=100; toll=1.e-8; toll=toll*norm(b); x=b;

n=length(b); for nit=1:nmax;

for i=1:n

x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x(i+1:n))/A(i,i); end

if norm(b-A*x) < toll, return, end end

(6)

Esercizio

Scrivere una funzione di Matlab che implementi il metodo iterativo di Gauss-Seidel per l’approssimazione della soluzione di un sistema lineare A x = b.

for i = 1 : n xi(k+1) = a1

i ,i



bi −Pi −1

j =1ai ,jxj(k+1)−Pn

j =i +1ai ,jxj(k)

 Usare iltest d’arresto basato sul residuo.

function [x,nit]=GS(A,b) nmax=100; toll=1.e-8;

toll=toll*norm(b);

x=b;

n=length(b);

for nit=1:nmax;

for i=1:n

x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x(i+1:n))/A(i,i);

end

if norm(b-A*x) < toll, return, end end

(7)

Esercizio

Data la matrice

9 14 −3

14 24 −6

−3 −6 5

I Verificare che `e simmetrica definita positiva.

I Verificare che il metodo di Jacobi non converge.

I Verificare che il metodo di Richardson

x(k+1)= x(k)+ αP−1(b − Ax(k)) con P = D e α = 0.85 converge.

(8)

Matrici sparse

Si dice che una matrice `e sparsa se ha “tanti” coefficienti uguali a zero. (Una matrice tridiagonale `e un esempio di matrice sparsa.) Se una matrice `e sparsa `e conveniente memorizare solo dove si trovano gli elementi non nulli e il loro valore.

I Il comando sparse memoriza una matrice in questo modo.

I Il comando nnz restituisce il numero di elementi non nulli di una matrice.

I Il comando spy “disegna” la struttura di una matrice.

I metodi diretti “riempiono” le matrici sparse

(9)

Esempi di matrici sparse

I Le matrici tridiagonali.

I Il comando spdiags ci permette di creare matrici a banda in formato sparse.

I Le matrici risultanti del metodo degli elementi finiti.

I Il file matrix.mat contiene una di queste matrici.

I In questo esempio la matrice `e simmetrica definita positiva.

(10)

Il metodo del gradiente coniugato

Ax = b con A simmetrica definita positiva.

x(0)assegnato

r(0) = b − Ax(0), d(0) = r(0) for k ≥ 0

αk = (r(k), d(k)) (Ad(k), d(k)) x(k+1)= x(k)+ αkd(k) r(k+1)= b − Ax(k+1) βk = −(Ar(k+1), d(k))

(Ad(k), d(k)) d(k+1)= r(k+1)+ βkd(k)

(11)

Esercizio

Scrivere una funzione di Matlab che implementi il metodo del gradiente coniugato. (Usare il test d’arresto basato sul residuo.)

function [x,k]=gradcon(A,b,toll,nmax,x) toll=toll*norm(b);

r=b-A*x;

if norm(r) < toll, k=0; return, end d=r;

for k=1:nmax

alpha=(d’*r)/(d’*A*d); x=x+alpha*d;

r=b-A*x;

if norm(r) < toll, return, end beta=-(d’*A*r)/(d’*A*d); d=r+beta*d;

end

(12)

Esercizio

Scrivere una funzione di Matlab che implementi il metodo del gradiente coniugato. (Usare il test d’arresto basato sul residuo.) function [x,k]=gradcon(A,b,toll,nmax,x)

toll=toll*norm(b);

r=b-A*x;

if norm(r) < toll, k=0; return, end d=r;

for k=1:nmax

alpha=(d’*r)/(d’*A*d);

x=x+alpha*d;

r=b-A*x;

if norm(r) < toll, return, end beta=-(d’*A*r)/(d’*A*d);

d=r+beta*d;

end

(13)

Esempio

>> load matrix

>> spy(A)

>> b=A*ones(3447,1);

>> [x,M]=gaussNP(A,b);

>> spy(M)

>> AA=sparse(A);

>> [x,M]=gaussNP(AA,b);

>> x=A\b;

>> [x,k]=gradcon(AA,b,1.e-8,500,b);

Riferimenti

Documenti correlati

1.1) SOLUZIONE NUMERICA DI SISTEMI LINEARI: richiami su norme di vettore e matrice; metodi iterativi per sistemi lineari: Jacobi e Gauss-Seidel, estensione a splitting con matrice

I Scrivere una funzione di Matlab che implemeti il metodo della sostituzione all’indietro.

Si rimane un po’ sorpresi dal fatto che per w = 1.350 il numero di iterazioni fosse inferiore di quello fornito dal valore ottimale teorico w ∗ = 1.333.. Il fatto `e che questo

2 Risparmio di cpu-time nel calcolo di prodotti

Per ogni elemento della matrice trasposta calcolarne il complemento algebrico, considerando il complemento algebrico come elemento otteniamo una nuova matrice, chiamiamola A'

Dato che gli autovalori non sono distinti, al fine di stabilire se la matrice A è diagonalizzabile bisogna fare ricorso alla Condizione NECESSARIA E SUFFICIENTE.. Deve,

Corso di Laurea in Ingegneria Elettrica, Elettronica ed

Correzione prova intermedia di Matematica Applicata 14 novembre 2011. Compito numero