Sunteți pe pagina 1din 10

LABORATOARE 3,4,5

I. Rezolvarea numerică a sistemelor de ecuaţii liniare prin metode directe


(Cramer si Gauss)
II. Norme pentru vectori şi matrice.
III. Rezolvarea numerică a sistemelor de ecuaţii liniare prin metode iterative
(Jacobi si Gauss-Seidel)
-----------------------------------------------------------------------------------------------------------
I. Rezolvarea numerică a sistemelor de ecuaţii liniare prin metode directe
(Cramer si Gauss)

1. Metoda lui Cramer

Ex1. Sa se gaseasca folosind metoda lui Cramer solutia exacta a sistemului de ecuatii
11x1  x2  x3  x4  2 x5  3x6  x7  1
 x  9 x  2 x  x  x  x  x  4
 1 2 3 4 5 6 7

 x1  2 x2  10 x3  2 x4  x5  x6  2 x7  1

liniare: 2 x1  3x2  x3  16 x4  2 x5  2 x6  2 x7  2
 x  x  2 x  x  8 x  x  x  3
 1 2 3 4 5 6 7

2 x1  2 x2  x3  x4  x5  13x6  x7  2

 x1  x2  x3  2 x4  2 x5  3x6  12 x7  1

Functia Matlab:
function x=cramer(A,b)
[m,n]=size(A);
x=zeros(n,1);
if det(A)==0
display('Determinantul sistemului este 0');
else
for i=1:n
D=[A(:,1:i-1) b A(:,i+1:n)];
x(i)=det(D)/det(A);
end
end
end

Pasi de rezolvare:
1. Se introduc in linia de comanda matricea A si vectorul termenilor liberi
b:
>> A=[11 -1 1 -1 2 -3 1;
1 -9 2 1 -1 1 -1;
1 -2 10 -2 1 1 2;
-2 3 1 -16 -2 2 -2;
-1 1 2 -1 8 -1 -1;
2 -2 1 1 1 13 1;
-1 -1 -1 -2 2 3 12];

>> b=[1;-4;-1;2;3;-2;1];
2. Se apeleaza functia cramer.m:
>> x=cramer(A,b)
x =

0.0223
0.3560
-0.0906
-0.1301
0.3326
-0.1157
0.0591
3. Verificare:
>> A*x

ans =

1.0000
-4.0000
-1.0000
2.0000
3.0000
-2.0000
1.0000
OBSERVATIE: Solutia exacta va fi continuta de vectorul x

2.Metoda eliminarii a lui Gauss

Ex2. Sa se gaseasca folosind metoda eliminarii a lui Gauss solutia exacta a sistemului de
2 x1  x2  x3  2 x4  x5  3
 x  2 x  x  x  2 x  1
 1 2 3 4 5

ecuatii liniare:  x1  2 x2  2 x3  x4  2 x5  2 .
3x  x  2 x  2 x  x  3
 1 2 3 4 5

 x1  x2  x3  3x4  2 x5  2

function x=eliminare_gauss(A,b)
[m,n]=size(A);
VB=1;
i=1 ;
while i<n && VB==1
j=i;
while j<=n && A(j,i)==0
j=j+1;
end
if j>n
VB=0;
else
c=A(i,:);
A(i,:)=A(j,:);
A(j,:)=c;
end

for j=i+1:n
val=A(j,i);
A(j,:)=A(i,i)*A(j,:)-A(i,:)*val;
b(j)=b(j)*A(i,i)-b(i)*val;
end
i=i+1;

end
if A(n,n)==0
error('Nu avem sol unica');
else
x=zeros(n,1);
x(n)=b(n)/A(n,n);
for i=(n-1):-1:1
S=0;
for j=i+1:n
S=S+A(i,j)*x(j);
end
x(i)=(b(i)-S)/A(i,i);
end

end

Pasi de rezolvare:
1. Se introduc in linia de comanda matricea A si vectorul termenilor liberi
b:
>>A=[2 1 1 2 1; 1 2 1 -1 2; 1 -2 2 1 2; 3 1 2 2 1; 1 1 1 3 2];
>> b=[-3;-1;-2;3;2];
2. Se apeleaza functia eliminare_gauss.m:
>> x=eliminare_gauss(A,b)

x =

-10.8261
5.5217
16.8261
2.1304
-7.9565
3. Verificare (sol exacta folosind cramer)
>> x=cramer(A,b)

x =

-10.8261
5.5217
16.8261
2.1304
-7.9565
II. Norme pentru vectori şi matrice

Norme pentru matrice A  M n ,n ( R ) Norme pentru vectori x  Rn  M n,1 (R)


n
Norma infinit : A   max  | a ij | Norma infinit x 
 max | x j |
1i  1 j  n
j 1

n n
Norma 1 : A 1  max  | a ij | Norma 1 : x 1  | x j |
1 j 
i 1 j 1

n n

 x
2 2
Norma Frobenius : A F
 aij Norma euclidiana (norma 2) : x 2
 i
i , j 1 i 1

1
 n
p

p
Norma p : x  xi 
p  
 i 1 
Ex. Să se implementeze in Matlab aceste norme, calculandu-se pentru vectorii si matricile
urmatoare:
 1 ... 1 2 ... 2 
 
 
 1 ... 1 2 ... 2 
 
x  (1 2 ... n), A    pentru n=100;
n n

 1 ... 1 3 ... 3


 
 
 1 ... 1 3 ... 3
 n n 

function x=norm_1(A)
[m,n]=size(A);
b=zeros(n,1);
for j=1:n
for i=1:m
b(j)=b(j)+abs(A(i,j));
end
end
x=max(b);
end

function norm=norm_F(A)
[m,n]=size(A);
norm=0;
for i=1:n
for j=1:m
norm=norm+A(i,j)^2;
end
end
norm=sqrt(norm);
end

function x=norm_inf(A)
[m,n]=size(A);
b=zeros(m,1);
for i=1:m
for j=1:n
b(i)=b(i)+abs(A(i,j));
end
end
x=max(b);
end

function norm=norm_p(y,p)
n=length(y);
norm=0;
for i=1:n
norm=norm+abs(y(i))^p;
end
norm=norm^(1/p);
end
Pasi de rezolvare (idee):
1. Se introduce vectorul x si matricea A in linia de comanda
>>n=100;
>>x=zeros(n,1);
>> for i=1:n
x(i)=i;
end
>> A=[ones(n) 2*ones(n);-ones(n) -3*ones(n)];
2. Se aplica corespunzator functiile mai sus definite
III. Rezolvarea numerică a sistemelor de ecuaţii liniare prin metode iterative
(Jacobi si Gauss-Seidel)

1. Metoda lui Jacobi

Ex1. Sa se gaseasca folosind metoda lui Jacobi solutia numerica a sistemului de ecuatii
11x1  x2  x3  x4  2 x5  3x6  x7  1
 x  9 x  2 x  x  x  x  x  4
 1 2 3 4 5 6 7

 x1  2 x2  10 x3  2 x4  x5  x6  2 x7  1

liniare: 2 x1  3x2  x3  16 x4  2 x5  2 x6  2 x7  2 (folosind 15 iteratii) comparandu-se
 x  x  2 x  x  8 x  x  x  3
 1 2 3 4 5 6 7

2 x1  2 x2  x3  x4  x5  13x6  x7  2

 x1  x2  x3  2 x4  2 x5  3x6  12 x7  1
rezultatul cu solutia exacta.

Metoda lui Jacobi s-a implementat in Matlab in functia de mai jos:

function x1=jacobi(A,b,n_iter)

fid=fopen('Jacobi.txt','w');
fprintf(fid,'Iteratia Solutia \n');
[m,n]=size(A);

k=1;
while k<=n && A(k,k)~=0
k=k+1;
end
if k<n
error('Metoda Jacobi nu se poate aplica, element zero pe diagonala');
else
D=zeros(n);
D1=D;
for i=1:n
D(i,i)=A(i,i);
D1(i,i)=1/A(i,i);
end
E=D-A;

if norm_inf(D1*E)>=1
error('metoda lui Jacobi nu se poate aplica, matricea nu e tare diagonal dominanata')
else

x0=zeros(n,1);
for i=1:n_iter
x1=D1*E*x0+D1*b;
fprintf(fid,'%5.0f ',i);
for k=1:n
fprintf(fid,'%10.7f',x1(k));
end
fprintf(fid,'\n');
x0=x1;
end

end

end
if det(A)~=0
fprintf(fid,'Solutia exacta \n');
y=linsolve(A,b);
for k=1:n
fprintf(fid,'%10.7f',y(k));
end
else
fprintf(fid,'Determinantul sistemului este 0 sau aproape 0');
end
fclose(fid);
end

Pasi de rezolvare:
1. Se introduc in linia de comanda matricea A si vectorul termenilor liberi
b:
>> A=[11 -1 1 -1 2 -3 1;
1 -9 2 1 -1 1 -1;
1 -2 10 -2 1 1 2;
-2 3 1 -16 -2 2 -2;
-1 1 2 -1 8 -1 -1;
2 -2 1 1 1 13 1;
-1 -1 -1 -2 2 3 12];

>> b=[1;-4;-1;2;3;-2;1];
2. Se apeleaza functia jacobi.m:
>> jacobi(A,b,15)

OBSERVATIE: Solutia numerica se va gasi in fisierul jacobi.txt

Iteratia Solutia
1 0.0909091 0.4444444-0.1000000-0.1250000 0.3750000-0.1538462 0.0833333
2 0.0113248 0.3504144-0.0839841-0.1358027 0.3313690-0.1174048 0.0747410
3 0.0189911 0.3537821-0.0945548-0.1314013 0.3313015-0.1160111 0.0579688
4 0.0225755 0.3547999-0.0905457-0.1301096 0.3331094-0.1149025 0.0584039
5 0.0223551 0.3561065-0.0908210-0.1302580 0.3327824-0.1158776 0.0587583
6 0.0222467 0.3558930-0.0905079-0.1301280 0.3325641-0.1156122 0.0590994
7 0.0222917 0.3559808-0.0905867-0.1301171 0.3325911-0.1156719 0.0590903
8 0.0222875 0.3559609-0.0905664-0.1301209 0.3325982-0.1156615 0.0591071
9 0.0222835 0.3559630-0.0905758-0.1301245 0.3325980-0.1156670 0.0591023
10 0.0222832 0.3559600-0.0905742-0.1301243 0.3325979-0.1156647 0.0591022
11 0.0222834 0.3559606-0.0905749-0.1301244 0.3325981-0.1156652 0.0591016
12 0.0222834 0.3559605-0.0905747-0.1301244 0.3325981-0.1156651 0.0591017
13 0.0222834 0.3559605-0.0905748-0.1301244 0.3325981-0.1156651 0.0591016
14 0.0222834 0.3559605-0.0905747-0.1301244 0.3325981-0.1156651 0.0591016
15 0.0222834 0.3559605-0.0905747-0.1301244 0.3325981-0.1156651 0.0591016
Solutia exacta
0.0222834 0.3559605-0.0905747-0.1301244 0.3325981-0.1156651 0.059101
2. Metoda lui Gauss-Seidel

Ex2. Sa se gaseasca folosind metoda lui Jacobi solutia numerica a sistemului de ecuatii
2 x1  x2  x3  x4  x5  x6 1
x  2x  x  x  x  x 2
 1 2 3 4 5 6

 x1  x2  2 x3  x4  x5  x6 2
liniare:  (folosind 15 iteratii) comparandu-se rezultatul cu
 x1  x2  x3  2 x4  x5  x6 3
 x1  x2  x3  x4  2 x5  x6 3

 x1  x2  x3  x4  x5  2 x6 2
solutia exacta.

Metoda lui Gauss Seidel s-a implementat in Matlab in functia de mai jos:

function x1=gauss_seidel(A,b,n_iter)
fid=fopen('Gauss_Seidel.txt','w');
fprintf(fid,'Iteratia Solutia \n');
[m,n]=size(A);
kk=1;
while kk<=n && A(kk,kk)~=0
kk=kk+1;
end
if kk<n
error('Metoda Gauss Seidel nu se poate aplica, element zero pe diagonala');
else
x0=zeros(n,1);
x1=x0;
for k=1:n_iter
fprintf(fid,'iteratia %2.0f ',k);
x1(1)=b(1)/A(1,1);
for j=2:n
x1(1)=x1(1)-A(1,j)*x0(j)/A(1,1);
end
for i=2:n-1
x1(i)=b(i)/A(i,i);
for j=1:(i-1)
x1(i)=x1(i)-A(i,j)*x1(j)/A(i,i);
end
for j=(i+1):n
x1(i)=x1(i)-A(i,j)*x0(j)/A(i,i);
end
end
x1(n)=b(n)/A(n,n);
for j=1:n-1
x1(n)=x1(n)-A(n,j)*x1(j)/A(n,n);
end
for i=1:n
fprintf(fid,'%10.7f',x1(i));
end
fprintf(fid,'\n');
x0=x1;
end

end
if det(A)~=0
fprintf(fid,'Solutia exacta \n');
y=linsolve(A,b);
for k=1:n
fprintf(fid,'%10.7f',y(k));
end
else
fprintf(fid,'Determinantul sistemului este 0 sau aproape 0');
end
fclose(fid);
end

Pasi de rezolvare:
1. Se introduc in linia de comanda matricea A si vectorul termenilor liberi
b:
>>A=[2 1 1 1 1 1;1 2 1 1 1 1;1 1 2 1 1 1;1 1 1 2 1 1; 1 1 1 1 2 1; 1 1 1 1 1
2];
>> b=[1;2;2; 3; 3;2]
2. Se apeleaza functia gauss_seidel.m:
>> gauss_seidel(A,b,15)

OBSERVATIE: Solutia numerica se va gasi in fisierul Gauss_Seidel.txt


Iteratia Solutia
iteratia 1 0.5000000 0.7500000 0.3750000 0.6875000 0.3437500-0.3281250
iteratia 2 -0.4140625 0.6679688 0.5214844 1.1044922 0.7241211-0.3020020
iteratia 3 -0.8580322 0.4049683 0.4632263 1.2838593 1.0039902-0.1490059
iteratia 4 -1.0035191 0.2007246 0.3319755 1.3079174 1.1559538 0.0034739
iteratia 5 -1.0000226 0.1003510 0.2161632 1.2620403 1.2089970 0.1062355
iteratia 6 -0.9468935 0.0767287 0.1464460 1.2042431 1.2066201 0.1564278
iteratia 7 -0.8952329 0.0907479 0.1185970 1.1614201 1.1840201 0.1702239
iteratia 8 -0.8625045 0.1141217 0.1163593 1.1388897 1.1614549 0.1658394
iteratia 9 -0.8483325 0.1328946 0.1246270 1.1317583 1.1466066 0.1562230
iteratia 10 -0.8460548 0.1434199 0.1340234 1.1328909 1.1397488 0.1479859
iteratia 11 -0.8490344 0.1471927 0.1406081 1.1367495 1.1382491 0.1431175
iteratia 12 -0.8529585 0.1471171 0.1438626 1.1403061 1.1392776 0.1411975
iteratia 13 -0.8558805 0.1456183 0.1447405 1.1425233 1.1409004 0.1410490
iteratia 14 -0.8574157 0.1441013 0.1444209 1.1434721 1.1421862 0.1416176
iteratia 15 -0.8578991 0.1431011 0.1437610 1.1436165 1.1429014 0.1422595
Solutia exacta
-0.8571429 0.1428571 0.1428571 1.1428571 1.1428571 0.1428571

Varianta Gauss Seidel cu oprire dupa un numar maxim de iteratii (max_iter) si o conditie de convergenta

function x1=gauss_seidel_mod(A,b,maxiter,eps)
fid=fopen('Gauss_Seidel_mod.txt','w');
fprintf(fid,'Iteratia Solutia \n');
[m,n]=size(A);
kk=1;
while kk<=n && A(kk,kk)~=0
kk=kk+1;
end
if kk<n
error('Metoda Gauss Seidel nu se poate aplica, element zero pe diagonala');
else
x0=zeros(n,1);
x1=x0;
k=1;
fprintf(fid,'iteratia %2.0f ',k);
x1(1)=b(1)/A(1,1);
for j=2:n
x1(1)=x1(1)-A(1,j)*x0(j)/A(1,1);
end
for i=2:n-1
x1(i)=b(i)/A(i,i);
for j=1:(i-1)
x1(i)=x1(i)-A(i,j)*x1(j)/A(i,i);
end
for j=(i+1):n
x1(i)=x1(i)-A(i,j)*x0(j)/A(i,i);
end
end
x1(n)=b(n)/A(n,n);
for j=1:n-1
x1(n)=x1(n)-A(n,j)*x1(j)/A(n,n);
end
for i=1:n
fprintf(fid,'%10.7f',x1(i));
end
fprintf(fid,'\n');
while norm_inf(x1-x0)>eps && k<maxiter
k=k+1;
x0=x1;
fprintf(fid,'iteratia %2.0f ',k);
x1(1)=b(1)/A(1,1);
for j=2:n
x1(1)=x1(1)-A(1,j)*x0(j)/A(1,1);
end
for i=2:n-1
x1(i)=b(i)/A(i,i);
for j=1:(i-1)
x1(i)=x1(i)-A(i,j)*x1(j)/A(i,i);
end
for j=(i+1):n
x1(i)=x1(i)-A(i,j)*x0(j)/A(i,i);
end
end
x1(n)=b(n)/A(n,n);
for j=1:n-1
x1(n)=x1(n)-A(n,j)*x1(j)/A(n,n);
end
for i=1:n
fprintf(fid,'%10.7f',x1(i));
end
fprintf(fid,'\n');
end

end
if det(A)~=0
fprintf(fid,'Solutia exacta \n');
y=linsolve(A,b);
for k=1:n
fprintf(fid,'%10.7f',y(k));
end
else
fprintf(fid,'Determinantul sistemului este 0 sau aproape 0');
end
fclose(fid);
end

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