Documente Academic
Documente Profesional
Documente Cultură
Lucrare de laborator №2
Tema: Rezolvarea numarică e sistemelor de ecuații liniare.
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
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>
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 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];}
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:
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.