Sunteți pe pagina 1din 7

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică si Microelectronică


Departamentul Informatică și Ingineria Sistemelor

Lucrare de laborator №2
Tema: Rezolvarea numarică e sistemelor de ecuații liniare.

Efectuat: st.gr. IA-171 Bodorin Adrian


Verificat: Moraru Vasile

Chișinău 2018
Scopul lucrării:
1) Să se rezolve sistemul de ecuații liniare Ax=b, utilizând:
 Metoda eliminării Gauss;
 Metoda lui Cholesky (metoda rădăcinii pătrate);
 Metoda iterativă a lui Jacobi cu o eroare ε =10−5 ;
2) Să se determine numărul de iterații necesare pentru aproximarea soluției sistemului cu eroarea
dată ε. Să se compare rezultatele.
Sisteme de ecuații propuse spre rezolvare:

8 −2 3 5
A= (
−2 6 1 ,
3 1 5 ) ( )
b= −3
−2

Metoda eliminării Gauss:

5
8 −2 3 5
( |) (
−2 6 1 −3
3 1 5 −2( | )
=¿
1 −1/4 3 /8 5/8
−2 6 1 −3
3 3 1 5 |)
=¿
1 −1/4 3 /8 8
0 11/2 7/ 4 −7 =¿
0 7/4 31 /8 4
−31/8

5 5

( | )( | )( |
6/11 6 /11
1 −1/4 3 /8 8 1 −1/4 3 /8 8 1 0 5/11
¿> 0 1 7/22 −7 =¿ 0 1 7 /22 −7 =¿ 0 1 7 /22
0 7/4 31/8 22
−31/8
0 7 /4 31/8 22
−31/8
−7
0 0 73 /22 22
−73/22
1 0 5/11

)( | )(100 1
=¿ 0 1 7 /22 −7 =¿ 0 1 0 0
0 0 1 22
−1
0 0 1 −1 |)
Textul programului:
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

float A[3][3]={{8,-2,3},
{-2,6,1},
{3,1,5}},L[3][3]={0},Q[3][3],b[3]={5,-3,-
2},x[3],y[3],Q1[3],Qinf[3],d[3],xj[3];
int v=0;

void AfisareM1(float t[3][3])


{int i,j;
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%3.0f ",t[i][j]);
cout<<endl;}}

void AfisareM(float t[3][3])


{int i,j;
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%11.8f ",t[i][j]);
cout<<endl;}}

void AfisareV1(float t[3])


{int i;
for(i=0;i<3;i++)
printf("%3.0f ",t[i]);
cout<<endl;}

void AfisareV(float t[3])


{int i;
for(i=0;i<3;i++)
printf("%11.8f ",t[i]);
cout<<endl;}

void MatrL()
{int i,j,k;
float s;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{if(i==j)
{s=0;
for(k=0;k<j;k++) s+=L[j][k]*L[j][k];
L[i][j]=sqrt(A[i][j]-s);}
if(j<i)
{s=0;
for(k=0;k<j;k++) s+=L[i][k]*L[j][k];
L[i][j]=(A[i][j]-s)/L[j][j];}}}

void VectY()
{int i,j;
float s;
for(i=0;i<3;i++)
{s=0;
for(j=0;j<i;j++) s+=L[i][j]*y[j];
y[i]=(b[i]-s)/L[i][i];}}

void VectX()
{int i,j;
float s;
for(i=2;i>=0;i--)
{s=0;
for(j=i+1;j<3;j++) s+=L[j][i]*x[j];
x[i]=(y[i]-s)/L[i][i];}}

void MatrQ()
{int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i==j) Q[i][j]=0;
else Q[i][j]=-A[i][j]/A[i][i];}

float VectQinf()
{int i,j;
float m;
for(i=0;i<3;i++)
for(j=0;j<3;j++) Qinf[i]+=fabs(Q[i][j]);
m=Qinf[0];
for(i=0;i<3;i++)
if(Qinf[i]>m) m=Qinf[i];
return m;}

float VectQ1()
{int i,j;
float m;
for(j=0;j<3;j++)
for(i=0;i<3;i++) Q1[j]+=fabs(Q[i][j]);
m=Q1[0];
for(i=0;i<3;i++)
if(Q1[i]>m) m=Q1[i];
return m;}

void Vectd()
{int i;
for(i=0;i<3;i++)
d[i]=b[i]/A[i][i];}

float Vectxinf(float t1[3],float t2[3])


{float t3[3],m;
int i;
for(i=0;i<3;i++) t3[i]=fabs(t2[i]-t1[i]);
m=t3[0];
for(i=1;i<3;i++)
if(t3[i]>m) m=t3[i];
return m;}

void Jacobi(float t[3])


{int i,j;
float eps=0.00001,x1[3],x2[3],s;
for(i=0;i<3;i++) x1[i]=t[i];
if(VectQinf()<1 || VectQ1()<1)
{while(1)
{v++;
for(i=0;i<3;i++)
{s=0;
for(j=0;j<3;j++) s+=Q[i][j]*x1[j];
x2[i]=s+d[i];}
if(Vectxinf(x1,x2)<eps)
{for(i=0;i<3;i++) xj[i]=x1[i]; break;}
for(i=0;i<3;i++) x1[i]=x2[i];}}
else cout<<"Nu se indeplineste CSC!!!"<<endl;}

int main()
{cout<<"Datele introduse..."<<endl;
cout<<"Matricea A:"<<endl;
AfisareM1(A);
cout<<endl;
cout<<"Vectorul b:"<<endl;
AfisareV1(b);
cout<<endl;
cout<<"Rezultatele intermediare obtinute prin Metoda
Cholesky..."<<endl;
MatrL();
cout<<"Matricea L:"<<endl;
AfisareM(L);
cout<<endl;
VectY();
cout<<"Vectorul y:"<<endl;
AfisareV(y);
cout<<endl;
VectX();
cout<<endl<<"Rezultatele intermediare obtinute prin Metoda
iterativa Jacobi..."<<endl;
MatrQ();
cout<<"Matricea Q:"<<endl;
AfisareM(Q);
cout<<endl;
Vectd();
cout<<"Vectorul d:"<<endl;
AfisareV(d);
cout<<endl;
Jacobi(d);

cout<<endl<<"==============================================="<<endl
;
cout<<"|+++++| Met. Gauss|Met. Cholesky| Met. Jacobi |"<<endl;
cout<<"==============================================="<<endl;
printf("| x1 | 0 | %11.8f | %11.8f |\n",x[0],xj[0]);
printf("| x2 | 1 | %11.8f | %11.8f |\n",x[1],xj[1]);
printf("| x3 | 1 | %11.8f | %11.8f |\n",x[2],xj[2]);
cout<<"-----------------------------------------------"<<endl;
printf("|Iter.| 1 | 1 | %3i |\n",v);
cout<<"==============================================="<<endl;}
Afișarea rezultatelor:

Figura 1. Datele introduse.

Figura 2. Rezultate intermediare obținute prin metoda Cholesky.

Figura 3. Rezultate intermediare obținute prin metoda Jacobi.

Figura 4. Rezultatele finale.

Concluzii
În acestă lucrare de laborator am determinat rădăcina unui sistem de ecuații liniare. Pentru
determinarea acesteea am folosit metodele eliminării lui Gauss, metoda lui Cholesky și metoda
iterativă Jacobi.
Pentru început am calculat rădăcina prin metoda eliminării Gauss pentru că să aflăm rădăcina
exact. Apoi, am determinat rădăcina sistemului prin metodele lui Cholesky și Jacobi.
În urma efectuării acestei lucrări de laborator am observat că metoda lui Cholesky este mai
complicat de programat decât metoda Jacobi, însă metoda Jacobi face mai multe apelări de funcții
decât Cholesky.

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