Sunteți pe pagina 1din 12

Universitatea Tehnic a Moldovei

Facultatea ?IM

Raport
Metode Numerice
Lucrare de laborator nr 2

A elaborat st. gr.FI-141: Eladii Vadim


A verificat: V. Moraru

Chiinu 2015
Scopul lucrarii:
1.Sa se rezolve sistemul de ecuatii liniare Ax=b,utilizind:
Metoda lui Cholesky;
Metoda iterativa a lui Jacobi cu eroare =10-3;
Metoda iterativa a lui Gauss-Seidel cu eroare =10-5;
2.Sa se determine numarul necesar de iteratii pentru aproximarea solutiei
sistemului cu eroarea data . Sa se compare rezultatele.
3.Sa se implementeze metodele date intr-un limbaj de programare.
Varianta 1:

A=

9 3 1
3 6 1
1 1 4

b=

()
4
7
5

1)Rezolvarea sistemului de ecuatii liniare Ax=b prin metoda lui Cholesky:


9 x 13 x 2 +x3 =8
3 x 1 +6 x 2x3 =7
x 1x 2+ 4 x 3=5
a)Descompunem sistemul Ax=b in doua sisteme triunghiulare:
LTy=b; Lx=y; ,unde LT, L-sunt matrici:
b)Deci pentru aflarea solutiei sistelemului trebuie sa calculam
elementele matricei LT conform formulelor:
l 11= a 11= 9=3

l 12 =

a12
=1
a11

l 13 =

a13
1 1
= =
a 11 9 3

l 22 = a22l 212= 5

l 23=

a23l 13 l 12 2
=
l 11
9

( )( )

1
2
311
l 33 = a33l l = 4

=
3
9
81
2
13

2
23

c)Determinam componentele vectorului y:


b 4
y 1= 1 =
l 11 3

y 2=

b2l 12 y1 17
=
l 22
3 5

y 3=

b3l13 y 1l 23 y 2
=2.03
l 33

d) Acum putem determina solutiile:


y 2.03
x 3= 3 =
=1,03
l 33 1.96

x 2=

y 2 l 23 x 3
=1.02
l 22

x 1=

y 1 l12 x2 l 13 x 3
=0
l 11

Deci,solutia sistemului este vectorul x=(1,1,0);


2. Rezolvarea sistemului de ecuatii liniare prin metoda iterativa a lui
Jacobi cu eroarea =10-3 :
a) Descompunem sistemul Ax=b in :

4 3
1
x 1= + x 2 x 3
9 9
9
9 x 13 x 2+ x 3=8
7 3
1
+ x+ x
3 x 1+ 6 x 2x 3=7 x 2=
6 6 1 6 3
x 1x 2+ 4 x 3=5
5 1
1
x 3 = x 1+ x 2
4 4
4

3
9

4
9
(0)
7
x =d=
6
5
4

( ) ()
0

Q= 3
6
1
4

0
1
4

1
9
1
6
0

b)Verificam conditia de convergenta:


3

i=1

|q1 j|=|q 11|+|q12|+|q 13|=0+ 39 19 = 29 <1


j=1

i=2

|q2 j|=|q 21|+|q22|+|q23|= 36 +0+ 16 = 46 < 1


j=1

i=3

1
+ =0<1
|q3 j|=|q 31|+|q32|+|q33|= 1
4 4
j=1

c)Vom rezolva sistemul utilizind in calitate de solutia initiala vectorul


x(0) :

3
1 (k) 4
x (k1 +1)= x (k)
2 x3 +
9
9
9
3 (k) 1 (k) 7
(k+1)
x 2 = x1 + x 3
6
6
6
(k+1) 1 (k) 1 (k ) 5
x3 =
x + x +
4 1 4 2 4

Prima iteratie
3 (0) 1 (0) 4 1
x(1)
1 = x2 x3 + =
9
9
9 12
3 (0) 1 (0) 7 43
x(1)
x =
2 = x1 +
6
6 3 6 54
(1)

x3 =

1 (0) 1 (0) 5 61
x + x + =
4 1 4 2 4 72

Verificam daca solutiile obtinute sunt acceptabile pentru eroarea stabilita:

x (i1) x(i0)=max {| x(11)x (10 )| ,|x (21)x (20 )|,|x (31 )x (30 )|}=max { 0,36 ; 0,37 ; 0,402 }

0,402>
Deoarece 0, 402 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat:
Iteratia a doua
3
1 (1) 4
(2)
(1)
x 1 = x2 x 3 + =0,085
9
9
9
3 (1) 1 (1) 7
x(2)
x + x =0,9838
2 =
6 1 6 3 6
x(2)
3 =

1 (1) 1 (1) 5
x + x + =1.0302
4 1 4 2 4

Verificam daca solutiile obtinute sunt acceptabile pentru eroarea stabilita:

x (i2 )x(i1)=max {| x(12)x (11 )|,|x (22 )x (21)|,|x (32)x (31 )|}=max { 0,002 ; 0,187 ; 0,183 }
0,187>

Deoarece 0, 187

>,solutia n-a fost determinata si deci procesul iterativ

trebuie continuat:
Iteratia a treia
3 (2) 1 (2 ) 4
x(3)
x x + =0,0017
1 =
9 2 9 3 9
3 (2) 1 (2) 7
x(3)
x + x =1,037
2 =
6 1 6 3 6
x(3)
3 =

1 (2) 1 (2) 5
x + x + =0,9828
4 1 4 2 4

Verificam daca solutiile obtinute sunt acceptabile pentru eroarea stabilita:


x (i3 )x(i2)=max {| x(13)x (12 )|,|x (23 )x (22 )|,|x (33 )x (32)|}=max { 0,083; 0,053 ; 0,047 }
0,083>
Deoarece 0, 083 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat: ect...
Solutia aproximativa este

x=( 0; 1 ;1) ;

3. Rezolvarea sistemului de ecuatii liniare prin metoda iterativa GaussSeidel cu eroarea =10-5 :

3
1 (k) 4
x (k1 +1)= x (k)
2 x3 +
9
9
9
3
1
7
x (k+1)
= x(k)
+ x (k)
2
6 1 6 3 6
(k+1) 1 (k) 1 (k ) 5
x3 =
x + x +
4 1 4 2 4

Prima iteratie
3 (0) 1 (0) 4 1
x(1)
1 = x2 x3 + =
9
9
9 12
3 (1) 1 (0) 7
x(1)
x =
2 = x1 +
0.917
6
6 3 6
x(1)
3 =

1 (1) 1 (1) 5
x + x + =1,0302
4 1 4 2 4

Verificam daca solutiile obtinute sunt acceptabile pentru eroarea stabilita:

x (i1) x(i0)=max {| x(11)x (10 )| ,|x (21)x (20 )|,|x (31 )x (30 )|}=max { 0,36 ; 0,248 ; 0,2198 }
0,36>
Deoarece 0, 36 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat:
Iteratia a doua
3 (1) 1 (1) 4
(2)
x 1 = x2 x 3 + =0.065
9
9
9
3 (2) 1 (1) 7
x(2)
x + x =0.962
2 =
6 1 6 3 6
x(2)
3 =

1 (2) 1 (2) 5
x + x + =0.9933
4 1 4 2 4

Verificam daca solutiile obtinute sunt acceptabile pentru eroarea stabilita:

x (i2 )x(i1)=max {| x(12)x (11 )|,|x (22 )x (21)|,|x (32)x (31 )|}=max { 0,018 ; 0,166 ; 0,036 }

0,166>
Deoarece 0, 166 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat:
Iteratia a treia
3
1 (2 ) 4
x(3)
x(2)
1 =
2 x 3 + =0.014
9
9
9
3 (3) 1 (2) 7
(3)
x 2 = x1 + x 3 =0.997
6
6
6
(3)

x3 =

1 (3) 1 (3) 5
x + x + =0.9975
4 1 4 2 4

Verificam daca solutiile obtinute sunt acceptabile pentru eroarea stabilita:


x (i3 )x(i2)=max {| x(13)x (12 )|,|x (23 )x (22 )|,|x (33 )x (32)|}=max { 0,075; 0,035 ; 0,042 }
0,075>
Deoarece 0, 075 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat: ect...
Solutia aproximativa este

(5)

x =(1 ;1 ; 0) ;

Programul implementat in limbajul C++:


#include <iostream>
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
#define n 3
using namespace std;
float A[3][3]={ 9,-3,1,-3,6,-1,1,-1,4};
float B[3]={4,-7,5};
void cholesky()
{ int i,j,k,k1=0;
float t,x[n],l[n][n],y[n];
l[0][0]=sqrt(A[0][0]);
for(i=1;i<n;i++)
{l[i][0]=A[i][0]/l[0][0]; }
for(k=1;k<n;k++)

{t=0;
for(j=0;j<k-1;j++)
t+=l[k][j]*l[k][j];
l[k][k]=sqrt(A[k][k]-t);
for(i=k+1;i<n;i++)
{t=0;
for(j=0;j<k-1;j++)
t+=l[i][j]*l[k][j];
l[i][k]=(A[i][k]-t)/l[k][k];}k1++;}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{l[i][j]=l[j][i]; }
for(i=0;i<n;i++)
{t=0;
for(j=0;j<i;j++)
t+=l[i][j]*y[j];
t=B[i]-t;
y[i]=t/l[i][i]; }
for(i=n-1;i>=0;i--)
{t=0;
for(j=n-1;j>i;j--)
t+=l[i][j]*x[j];
t=y[i]-t;
x[i]=t/l[i][i]; }
cout<<"==Metoda lui Cholesky"<<endl<<endl;
for(i=0;i<n;i++)
printf("%7.3f ",x[i]);
cout<<endl<<endl;
}
void jacobi()
{int i,j,m,k1=0;
float v,x[n],q[n][n],d[n],s[n][n],t[n][n],x1[n],er;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{if(i==j)
{s[i][j]=1/A[i][j];

t[i][j]=0;}
else
{s[i][j]=0;
t[i][j]=A[i][j];}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{v=0;
for(m=0;m<n;m++)
v+=s[i][m]*t[m][j];
q[i][j]=-v; }
for(i=0;i<n;i++)
{v=0;
for(m=0;m<n;m++)
v+=s[i][m]*B[m];
d[i]=v; }
for(i=0;i<n;i++)
x[i]=d[i];
do {k1++;
for(i=0;i<n;i++)
x1[i]=x[i];
for(i=0;i<n;i++)
{v=0;
for(m=0;m<n;m++)
v+=x1[m]*q[i][m];
x[i]=v+d[i];}
er=fabs(x1[0]-x[0]);
for(m=0;m<n;m++)
if(er<fabs(x1[m]-x[m]))
er=fabs(x1[m]-x[m]); }
while(er>0.001);
cout<<"==Metoda lui Jacobi cu eroarea 0.001"<<endl<<endl;
for(i=0;i<n;i++)
printf("%7.3f ",x[i]);
cout<<endl;
cout<<"\n==Numarul de iteratii:"<<k1<<endl<<endl;

}
void gauss_seidel()
{ int i,j,m,k1=0,k;
float v,x[n],q[n][n],d[n],s[n][n],t[n][n],x1[n],er;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ if(i==j)
{s[i][j]=1/A[i][j];
t[i][j]=0;
}else
{ s[i][j]=0;
t[i][j]=A[i][j];}
};
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{

v=0;
for(m=0;m<n;m++)
v+=s[i][m]*t[m][j];
q[i][j]=-v;

}
for(i=0;i<n;i++)
{ v=0;
for(m=0;m<n;m++)
v+=s[i][m]*B[m];
d[i]=v;
}
for(i=0;i<n;i++)
x[i]=d[i];
do{k1++;
for(i=0;i<n;i++)
x1[i]=x[i];
for(i=0;i<n;i++)
{v=0;
for(m=0;m<n;m++)
v+=x[m]*q[i][m];

x[i]=v+d[i];}
er=fabs(x1[0]-x[0]);
for(m=1;m<n;m++)
if(er<fabs(x1[m]-x[m]))er=fabs(x1[m]-x[m]);}
while(er>0.00001);
cout<<"==Metoda a lui Gauss-Seidel cu eroarea 0.00001"<<endl<<endl;
for(i=0;i<n;i++)
printf("%7.5f ",x[i]);
cout<<endl;
cout<<"\n==Nrumarul de iteratii:"<< k1<<endl<<endl;
}
int main()
{int p;
do {

cout<<"1.Metoda lui Cholesky "<<endl;


cout<<"2.Metoda iterativa a lui Jacobi"<<endl;
cout<<"3.Metoda iterativa a lui Gauss-Seidel"<<endl;
cout<<"4.Exit"<<endl;
cin>>p;
switch (p)
{

case 1 :{cholesky ();break;}


case 2 :{jacobi();break;}
case 3 :{gauss_seidel();break;}
default:break; };

}
while(p!=4);
}
Rezultatele obtinute:

Concluzie: Dupa realizarea lucrarii de laborator numarul 2 am invatat 3


metode de rezolvare a sistemelor de ecuatii liniare: metoda lui Cholesky,metoda
iterativa a lui Jacobi si metoda iterativa a lui Gauss-Seidel . Implementindule

intr-un program am observat numarul de iteratii necesare pentru obtinerea


unor solutii cit mai apropiate