Sunteți pe pagina 1din 9

Universitatea Tehnică a Moldovei

Catedra Automatică şi Tehnologii Informaţionale

RAPORT
Disciplina: Metode numerice

Lucrare de laborator Nr. 2

Tema: Rezolvarea numerica a sistemelor de ecuaţii liniare.

A efectuat :

A verificat:
Chişinău

1. Scopul lucrarii:
Să se rezolve sistemul de ecuaţii liniare Ax=b, utilizînd:
a) metoda lui Ciolesky (metoda rădăcinii pătrate);
b) metoda iterativă a lui Jacobi cu o eroare ε=0,001.
2. Indicatii teoretice:
3. Sisteme de ecuaţii propuse spre rezolvare:
2.

3.

4. Rezultatele obţinute:
Primul sistem:

Al doilea sistem:
5.Concluzie: Efectuind aceasta lucrare am aplicat cunostintele despre modul de rezolvare a
ecuatiilor neliniare prin 2 metode. În această lucrare de laborator am rezolvat sistemul de ecuaţii
liniare Ax=b, utilizînd: metoda lui Ccholesky (metoda rădăcinii pătrate) şi metoda iterativă a lui
Jacobi cu o eroare ε=0,000001.
Am studiat mai bine şi mai detaliat aceste metode în cît am realizat un program de rezolvare care
lucrează cu succes.
Anexe
Listingul programului
//Rezolvarea numerica a sistemelor de ecuatii liniare
#include <iostream>
#include <math.h>
#include <conio.h>
#include <iomanip>
#include <stdlib.h>
using namespace std;
#define NMax 50
int Cholesky(float **A,float *B,float *X,int n);
int Jacobi(float **A,float *B,float *X,int n,float eps,int &m,int nMax);
void copy(float **A,float *B,int n,float **copyA,float *copyB);
int pos_def(float **A,int n);
int diag_dom(float **A,int n);

void main(void)
{
{int n;
inceput:
while(1)
{
cout <<"Ce doriti sa faceti:\n"
<<"1. Rezolvarea numerica a sistemelor de ecuatii liniare;\n"
<<"0. Iesire din program;\n";
cin>>n;
switch(n)
{
case 0: exit (1);
case 1:

float **A,*B,*X,**copyA,*copyB,**AInv,eps;
int i,j,n,err,m;

cout << "Introduceti dimensiunea matricii sistemului: "; cin >> n;


cout << "Introduceti elementele matricii:\n";
A=new float* [n];
for(i=0;i<n;i++) A[i]=new float [n];
B=new float [n];
X=new float [n];
copyA=new float* [n];
for(i=0;i<n;i++) copyA[i]=new float [n];
copyB=new float [n];
AInv=new float* [n];
for(i=0;i<n;i++) AInv[i]=new float [n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ cout << "A[" << i << ", " << j << "]= "; cin >> A[i][j]; }
cout << "\nIntroduceti matricea termenilor liberi:\n";
for(i=0;i<n;i++)
{ cout << "B[" << i << "]= "; cin >> B[i]; }
copy(A,B,n,copyA,copyB);
err=Cholesky(copyA,copyB,X,n);
if(err==-1) cout << "\nMetoda Cholesky nu poate fi folosita!";
else
{ cout << "\nSolutie pentru metoda Cholesky este:" << endl;
for(i=0;i<n;i++) cout << " " << X[i];
}
copy(A,B,n,copyA,copyB);
cout <<endl<< "\nIntroduceti eroarea de calcul in metoda Jacobi: "; cin >> eps;
err=Jacobi(copyA,copyB,X,n,eps,m,NMax);
if(err==-1) cout << "\nMetoda Jacobi nu poate fi folosita! \
Matricea nu este diagonal dominanta!";
else
{ cout << "\nSolutia pentru metoda Jacobi este:" << endl;
for(i=0;i<n;i++) cout << " " << X[i];
cout << "\nNumarul de iteratii: " << m;
}

for(i=0;i<n;i++) delete [] A[i];


delete [] A;
for(i=0;i<n;i++) delete [] copyA[i];
delete [] copyA;
for(i=0;i<n;i++) delete [] AInv[i];
delete [] AInv;
delete [] B;
delete [] copyB;
delete [] X;
getch();
break;
default: goto inceput;
}
}
}
}

void copy(float **A,float *B,int n,float **copyA,float *copyB)


{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) copyA[i][j]=A[i][j];
for(i=0;i<n;i++) copyB[i]=B[i];
}

int pos_def(float **A,int n)


{
int i,j,k=0,m=0;
for(i=0;i<n;i++)
{ if(A[i][i]<=0) return 0;
for(j=0;j<n;j++)
{ if(A[i][j]!=A[j][i]) return 0;
if(fabs(A[k][m])<fabs(A[i][j]))
{ k=i; m=j; }
}
}
if(k!=m) return 0;
return 1;
}

int Cholesky(float **A,float *B,float *X,int n)


{
if(!pos_def(A,n)) return -1; //nu converge
float **L,*y,s=0;
int i,j,k;
L=new float* [n];
for(i=0;i<n;i++) L[i]=new float [n];
y=new float [n];
for(k=0;k<n;k++)
for(i=0;i<n;i++)
{ if(i<k) L[i][k]=0;
else if(i==k)
{ s=0;
for(j=0;j<k;j++) s+=L[k][j]*L[k][j];
L[k][k]=sqrt(A[k][k]-s);
}
else
{ s=0;
for(j=0;j<k;j++) s+=L[i][j]*L[k][j];
L[i][k]=(A[i][k]-s)/L[k][k];
}
} //calc L
for(i=0;i<n;i++)
{ s=0;
for(k=0;k<i;k++) s+=L[i][k]*y[k];
y[i]=(B[i]-s)/L[i][i];
} //calc y
for(i=n-1;i>=0;i--)
{ s=0;
for(k=i+1;k<n;k++) s+=L[k][i]*X[k];
X[i]=(y[i]-s)/L[i][i];
}
for(i=0;i<n;i++) delete [] L[i];
delete [] L;
delete [] y;
return 0;
}

int diag_dom(float **A,int n)


{
int i,j;
float s;
for(i=0;i<n;i++)
{ if(A[i][i]==0) return 0; //det(A)=0
s=0;
for(j=0;j<n;j++) if(j!=i) s+=fabs(A[i][j]);
if(fabs(A[i][i])<=s) return 0; //nu este diag dom
}
return 1;
}

int Jacobi(float **A,float *B,float *X,int n,float eps,int &m,int nMax)


{
if(!diag_dom(A,n)) return -1;
int i,j,k;
float *X1,s,max=0,x1;
for(i=0;i<n;i++)
{ for(j=0;j<n;j++) if(j!=i) A[i][j]=-A[i][j]/A[i][i];
X[i]=(B[i]=B[i]/A[i][i]);
A[i][i]=0;
}
for(i=0;i<n;i++)
{ s=0;
for(j=0;j<n;j++) s+=fabs(A[i][j]);
if(max<s) max=s;
}
if(max>=1) return -1; //nu converge
X1=new float[n];
m=0;
do
{ for(i=0;i<n;i++)
{ s=0;
for(j=0;j<n;j++) if(j!=i) s+=A[i][j]*X[j];
X1[i]=B[i]+s;
s=fabs(X1[i]-X[i]);
if(i==0) max=s;
if(max<s) max=s;
}
m++;
for(i=0;i<n;i++) X[i]=X1[i];
} while(max>=eps && m<=nMax);
delete [] X1;
return 0;
}

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