Sunteți pe pagina 1din 9

Bobea Dorin Adrian

Grupa 523B

Metode numerice

Tema 1
Sa se rezolve sistemul de ecuatii liniare prin metodele Jacobi si Gauss_Seidel. Sa se
realizeze un studiu comparativ care sa evidentieze viteza de convergenta catre solutia
sistemului in cele doua cazuri(se vor prezenta comparativ rezultatele obtinute dupa fiecare pas
si numerele de pasi care duc catre o solutie pentru aceleasi date initiale: eroare si solutie
aproximata).

10 x1 + x 2 + x3 + x 4 =13

{
−x1 +10 x 2+ x 3−x 4=9
2 x 1−x 2 +10 x 3 −x 4=10
x 1+ x2 −x3 +10 x 4=11

Tema se va incarca in format word si va contine:

-cele doua programe in care trebuie sa se regaseasca comentariile care descriu


algoritmul(in format text);

-printscreenuri cu programele si solutiile returnate in urma rularii acestora;

-studiul comparativ(poate fi un tabel in care sunt prezentate solutiile dupa


fiecare pas).

Metoda Gauss-Seidel:
Metoda Gauss-Seidel este o metodă ce derivată din metoda Jacobi. La
metoda Jacobi 𝑥1 (𝑘+1) se calculează în funcție de (𝑥2 … . 𝑥𝑛) (𝑘) , 𝑥2 (𝑘+1) în
funcție de (𝑥1 ∙ 𝑥3 ∙ … .∙ 𝑥𝑛 ) (𝑘) și în general : 𝑥𝑖 (𝑘+1) se calculează în funcție de
(𝑥1, 𝑥2, 𝑥3 … . , 𝑥𝑖−1, 𝑥𝑖+1, … . , 𝑥𝑛 ) (𝑘) Metoda Gauss-Seidel accelerează
procesul de convergență calculând 𝑥1 (𝑘+1) în funcție de (𝑥2, … . , 𝑥𝑛) (𝑘) , 𝑥2
(𝑘+1) în funcție de 𝑥1 (𝑘+1)𝑑𝑒𝑗𝑎 𝑐𝑎𝑙𝑐𝑢𝑙𝑎𝑡 𝑙𝑎 𝑝𝑎𝑠𝑢𝑙 𝑐𝑢𝑟𝑒𝑛𝑡 și (𝑥3 … . 𝑥𝑛) (𝑘) . La
modul general 𝑥𝑖 (𝑘+1) se calculează în funcție de (𝑥1, … . 𝑥𝑖−1) (𝑘+1) deja
calculate la pasul curent și (𝑥𝑖+1, … . 𝑥𝑛 ) (𝑘) . Relația generală este în acest caz:
În rest metoda este similară celei anterioare, oprirea procesului iterativ făcându-
se la fel, adică atunci când diferența dintre |𝑥 (𝑘+1)−𝑥 (𝑘) | < 𝜀, unde 𝜀 este
eroarea acceptată.
function f = Metoda_gauss_seidel

A = input('matricea atasata sistemului este= ');

B = input('matricea rezultatelor este= ');

eroare = input( 'Introduceti eroarea: ');

val_abs = 0;

[m n] = size(A);

if m == n,

i = 1;

for i = 1 : m % aici se verifica daca sistemul are solutii

conditie(i) = 0;

for j = 1 : m

conditie(i) = conditie(i) + abs(A(i, j) / A(i, i));

endfor

conditie(i) = conditie(i) - 1;

endfor

disp('vectorul urmator trebuie sa aiba toate elem <1')

disp(conditie);

validare = input('tastati tasta 1 daca se respecta conditia, iar pt nu


orice tasta');

if validare == 1

for s = 1 : m

x(s) = 0;

endfor

else

disp('conditia de convergenta nu este respectata')

endif

for k = 1 : 50 % aici se rezolva sistemul de ecuatii

for i = 1 : m

suma(i) = 0;
p = [1 : (i - 1) (i + 1) : m];

suma(i)=A(i, p)*(x(p))';

x(i) = (B(i) - suma(i)) / A(i, i)

end

if i > 1 % aici se numara cate iteratii au loc

d = x(i - 1);

val_abs = abs(x(i) - d);

end

if val_abs < eroare

L = k + 1;

break;

end

end

else

disp('atentie! matricea atasata trebuie sa fie patratica')

endif

disp('matricea A este: ');

disp(A);

disp('matricea B este: ');

disp(B);

disp('vectorul x este: ');

disp(x);

disp('Numarul de iteratii este: ');

disp(L);

endfunction
Rezultate
>> Metoda_gauss_seidel

matricea atasata sistemului este= [10 1 1 1 ; -1 10 1 -1 ; 2 -1 10 -1 ; 1 1 -1 10]

matricea rezultatelor este= [13 9 10 11]

Introduceti eroarea: 0.01

vectorul urmator trebuie sa aiba toate elem <1

0.3000 0.3000 0.4000 0.3000

tastati tasta 1 daca se respecta conditia, iar pt nu orice tasta1

x=

1.3000 0 0 0

x=

1.3000 1.0300 0 0

x=

1.3000 1.0300 0.8430 0

x=

1.3000 1.0300 0.8430 0.9513

x=

1.0176 1.0300 0.8430 0.9513

x=

1.0176 1.0126 0.8430 0.9513

x=

1.0176 1.0126 0.9929 0.9513

x=

1.0176 1.0126 0.9929 0.9963

x=

1.0176 1.0126 0.9929 0.9963


matricea A este:

10 1 1 1

-1 10 1 -1

2 -1 10 -1

1 1 -1 10

matricea B este:

13 9 10 11

vectorul x este:

1.0176 1.0126 0.9929 0.9963

Numarul de iteratii este:

Metoda Jacobi:
Metoda Jacobi este o metodă iterativă de calcul a soluțiilor de ecuații
liniare. Se împarte fiecare dintre liniile i ale sistemului de ecuații cu elementul de
pe diagonala principală 𝑎𝑖𝑖 a matricei atașate, cu i=1..n. Din fiecare ecuație i se
extrage necunoscuta de pe diagonala principală. Astfel termenul general este:
Alegand pentru pornirea calculului iterativ,
numită generic valoare

inițială, se vor calcula 𝑥1, 𝑥2, … . , 𝑥𝑛 la pasul (1) , notata general x(1) cu relațiile
generală 𝑥𝑖 (1). La modul general, cunoscând x la pasul k, se poate calcula x la
pasul k+1:

Condiția pentru convergență a lui x către soluție este:

(fără a fi suficient, se poate însă observa inițial, fără nici un calcul dacă pe
diagonala principală se găsesc elementele maxime în modul). Oprirea procesului
iterativ (dacă șirul converge către soluție) se va face atunci când diferența dintre
|𝑥(𝑘+1)−𝑥(𝑘)| < 𝜀, unde 𝜀 este eroarea acceptată.

Codul programului
function f=Metoda_jacobi

A=input('matricea atasata sistemului este= ');

B=input('matricea rezultatelor este= ');

eroare = input ( 'Introduceti eroarea: ');

[m n]=size(A);

if m==n,

i=1;
for i=1:m % aici se verifica daca sistemul are solutii

conditie(i)=0;

for j=1:m

conditie(i) =conditie(i)+abs(A(i,j)/A(i,i));

endfor

conditie(i)=conditie(i)-1;

endfor

disp ('vectorul urmator trebuie sa aiba toate elem <1')

disp (conditie);

validare=input('tastati tasta 1 daca se respecta conditia, iar pt nu orice tasta');

if validare==1,

for s=1:m

x(s)=0;

endfor

else

disp('conditia de convergenta nu este respectata')

endif

for k=1:50 % aici se rezolva sistemul de ecuatii

for i=1:m

suma(i)=0;

p=[1:(i-1) (i+1):m];

suma(i)=A(i,p)*(x(p))';

y(i)=(B(i)-suma(i)) / A(i,i);

endfor

if abs(y-x) <eroare % aici se numara cate iteratii au loc

L = k + 1;

break;

endif

x=y;

endfor
x

else

disp('atentie! matricea atasata trebuie sa fie patratica')

endif

disp('matricea A este: ');

disp(A);

disp('matricea B este: ');

disp(B);

disp('vectorul x este: ');

disp(x);

disp('Numarul de iteratii este: ');

disp(L);

endfunction

Rezultate:
>> Metoda_jacobi

matricea atasata sistemului este= [10 1 1 1 ; -1 10 1 -1 ; 2 -1 10 -1 ; 1 1 -1 10]


matricea rezultatelor este= [13 9 10 11]
Introduceti eroarea: 0.01
vectorul urmator trebuie sa aiba toate elem <1
0.3000 0.3000 0.4000 0.3000
tastati tasta 1 daca se respecta conditia, iar pt nu orice tasta1
x=

1.0040 1.0040 1.0020 0.9900


matricea A este:
10 1 1 1
-1 10 1 -1
2 -1 10 -1
1 1 -1 10
matricea B este:
13 9 10 11
vectorul x este:
1.0040 1.0040 1.0020 0.9900
Numarul de iteratii este:
5

Concluzie

Metoda Gauss-Seidel este mai rapida decat metoda Jacobi .Metoda Gauss-
Seidel a ajuns mai rapid la eroarea impusa numarul de iteriatii fiind doar 3 fata de
de metoda Jacobi care a avut de nevoie de 5 .

S-ar putea să vă placă și