Sunteți pe pagina 1din 6

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoarelor, Informatică și Microelectronică

Raport
La Lucrarea de laborator nr.2

Disciplina: Metode și modele de calcul

A îndeplinit st. gr. CR-182 Mardari Ion

A verificat pr. Universitar Istrati Daniela

Chișinău 2019
Scopul lucrării:
Să se rezolve sistemul de ecuaţii liniare Ax=b,utilizând
-metoda lui Cholesky(metoda rădăcinii pătrate).
-metoda iterativă a lui Jacobi cu o eroare e=0.001.
-metoda iterativă a lui Gauss-Seidel cu o eroare e=0,001 şi c=0,00001.

 Să se determine numărul de iteraţii necesare pentru aproximarea soluţiei


cu eroarea dată e.
 Să se compare rezultatele.

Să se inverseze matricea A cu ajutorul metodei Jordan-Gauss..Matricele iniţiale


A,respectiv b
A[N][N]= { 7, 2, -3,
2, 8, 1,
-3, 1, 9 };
b[N]={ 13,0,-21};
Programul in C++:
#include <iostream>

#include <stdio.h>

#include <math.h>

#include<stdlib.h> #define n 3 using namespace std;

float A[3][3]={ 7,2,-3,

2,8,1,

-3,1,9}; float B[3]={13,0,-21}; 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<k1;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<k1;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=n1;i>=0;i)

{t=0; for(j=n1;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 GaussSeidel 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
GaussSeidel"<<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);

}
Concluzie:
În această lucrare de laborator am studiat 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 cît mai apropiate.
1) Metoda lui Cholesky s-a dovedit a fi cea mai puţin eficientă fiindcă:are o realizare
mai complicată, numărul de operaţii proportional cu n 3 ,rezultatul a fost obţinut
cu o eroare de 10-3 .
2) Metoda lui Jacobi ar fi cea mai eficientă, dacă numărul de ecuaţii e de
ordinulzecilor, căci are o realizare relativ simplă, numărul de operaţii e
proporţional cu n2 , valorile obţinute fiind cele mai apropiate de rezultatul exact.
3) Metoda Gauss-Seidel în cazul de faţă(numarul de ecuaţii e mic), fapt care
reiesedin rezultatul mai puţin exact. Totuşi în cazul sistemelor mari această
metodă cere un număr de 2 ori mai mic de operaţii faţă de metoda Jacobi.

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