Sunteți pe pagina 1din 11

Universitatea Tehnic a Moldovei

Catedra: Informatica aplicat

RAPORT
La lucrarea de laborator Nr.2

Disciplina Metode Numerice

Tema: Rezolvarea numeric a sistemelor de ecuatii liniare

A efectuat:

st. gr. SI-122


Fanari V.

A verificat

asist. univ.
Nebelciuc V.
Chiinu 2013

1. Scopul lucrarii:
1)S se rezolve sistemul de ecuatii liniare Ax=b,utilizind:
* metoda eliminarii Gauss;
* metoda lui Cholesky(metoda radacinii patrate);
* metoda iterativ a lui Jacobi cu o eroare de 10 3 ;
* metoda iterativ Gauss-Siedel cu o eroare 10 3 si 10 5 ;
2)Sa se determine numarul de iteratii necesare pentru aproximarea solutiei sistemului cu eroarea
data.Sa se compare rezultatele.
3)Sa se inverseze matricea A cu ajutorul metodei Jordan-Gauss.
2. Sistemele de ecuaii propuse:
3.4

0.7
A=
0.2

0.2

0.2
5 .1


5.2 0.3
0.5
4 .2
; b=

0.3 3.8 0.4


5 .3

0.5 0.4 4.7


5 .4
0.7

0.2

0.2
6.1 1.9 0.4
7 .1

1.4
1.9 16.2 1.8
10.2
A=
; b=
0.4
1.8 12.7 0.6
7 .5

0.2

8 .6
1
.
4

0
.
6
13
.
1

3. Teorie:
Metoda eliminrii a lui Gauss const n a aduce sistemul iniial la un sistem echivalent avnd
matricea coeficienilor superior triunghiular. Transformarea sistemului dat ntr-un sistem de
form triunghiular, fr ca s se modifice soluia sistemului, se realizeaz cu ajutorul
urmtoarelor 3 operaii de baz :
1) rearanjarea ecuaiilor (schimbarea a 2 ecuaii ntre ele) ;
2) nmulirea unei ecuaii cu o constant (diferit de zero) ;
3) scderea unei ecuaii din alta i nlocuirea celei de-a doua cu rezultatul scderii.
Metoda lui Cholesky de rezolvare a sistemelor de ecuaii liniare algebrice se mai numete
metoda rdcinii ptrate i const n descompunerea sistemului Ax=b n dou sisiteme
triunghiulare :
LTy=b, Lx=y.
unde L e o matrice superior triunghiular, iar LT matricea transpus ei.
n aceast metod se presupune c matricea A este o matrice simetric i pozitiv definit.
Matricea L se alege astfel, nct A=LLT. Elementele lij ale matricei inferior triunghiulare L pot fi
calculate n felul urmtor :
Se determin prima coloan a matricei L

L11=11 ,

li1= i1/li1 , i=2,3,,n ;

Dup ce s-au obinut primele (k-1) coloane ale matricei L se calculeaz coloana k :
Lkk=akk -l2kj ,
lik=(ik -lijlkj)/lkk , i=k+1,n
Metode iterative de rezolvare a sistemelor de ecuaii lineare.
Seidel

Metodelele Jacobi i Gauss-

Metodele iterative se constuiesc utiliznd desfacerea matricei A definit prin A=S-T. Atunci
sistemul Ax=b (1) e echivalent cu sistemul Sx=Qx+d, (2) sau x=Qx+d, (3)unde Q=S-1T, d=S-1b. Prin
urmare putem construi irul {x(k)}utiliznd relaia recurent:
Sx(k+1)=Tx(k)+b, k=0,1,2... (4) sau x(k+1) =Qx(k)+d. (5)
(0)
n
unde x , ce aparine R , e o aproximaie iniial a soluiei x*.
Pentru a reduce sistemul (1) la o form (3) sau (4), potrivit pentu iteraie,
desfacerea matricei A trebuie s satisfac condiiile :
a) Sistemul (5) are o soluie unic x(k+1) i se rezolv uor. De aceea matricea S se alege de o
form simpl i este ireversabil.Ea poate fi diagonal sau triunghiular.
b) irul {x(k) }k=1 converge ctre soluia exact x* oricare ar fi x(0).
Presupunem c elementele diagonale aii0, i=1,2,...n. Atunci n calitate de matrice S se
poate lua matricea diagonal ataat matricei A:
S=diag(11, 22, ,nn)
Avem:
S-1=diag(1/11,1/22,,1/nn)
n acest caz sistemul (2) devine :
xi=1/ii(bi-ijxj(k)),

i=1,2,,n.

Procesul iterativ (5) este definit prin :

xi(k +1)= xi(k+1), i=1,2,n.

Astfel obinem o metod de rezolvare a sistemului liniar (1) numit metoda lui Jacobi.
n metoda lui Jacobi e necesar de a pstra n memoria calculatorului toate componentele
vectorului x(k) att timp ct se calculeaz vectorul x(k+1). Putem modifica metoda lui Jacobi astfel
nct la pasul (k+1) s folosim n calculul componentei xi(k+1), valorile deja calculate la aceasi pas:
x1(k+1), x2(k+1),, xi-1(k+1).
Aceasta modificare a metodei lui Jacobi se numete metoda lui Gauss-Seidel, iar irul iterativ
devine: xi(k+1)= 1/ii(bi-ijxj(k)- ijxj(k)),
i =1,2,,n.

Rezultatele obtinute:

Fig1. Matricea nr.1

Fig2. Matricea nr.2

Concluzie:
Efectuand aceasta lucrarea de laborator am acumulat cunostinte pentru rezolvarea numerica a
sistemelor de ecuatii liniare. La rezolvarea lor am aplicat mai multe metode, cum ar fi: metoda
eliminrii Gauss, metoda lui Cholesky, metoda interativ a lui Jacobi, metoda iterativ a lui GaussSeidel. Analizand aceste metode in parte, observam ca rezultatele obtinute putin difera de la o
metoda la alta, insa aceasta este cauzata si de erorile comise in timpul executiei acestor metode.

Anexa:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define N 4
float A[4][4]={ 6.1,-1.9,0.4,0.2,
-1.9,16.2,1.8,1.4,
0.4,1.8,12.7,-0.6,
0.2,1.4,-0.6,13.1 };
float B[4]={7.1,10.2,-7.5,8.6};
void gauss ()
{ int i,j, max,l,k1=0;
float t,x[N],a[N][N],b[N];
for(i=0;i<N;i++)
{b[i]=B[i];
for(j=0;j<N;j++)
a[i][j]=A[i][j];}
l=0;
while(l<N)
{for(i=l+1;i<N;i++)
{t=a[i][l]/a[l][l];
for(j=l;j<N;j++)
a[i][j]-=t*a[l][j];
b[i]-=t*b[l]; }
l++; k1++; }
for (i=N-1;i>=0;i--)
{t=0;
for(j=N-1;j>i;j--)
t+=a[i][j]*x[j];
t=b[i]-t;
x[i]=t/a[i][i];
}
printf("Metoda Gauss:\n");
for(i=0;i<N;i++) printf("%7.3f ",x[i]);
printf ("\nNr. de iteratii: %d\n", k1);
}
//
void cholesky()
{ int i,j,k,k1=0;
float t,x[N],l[N][N],y[N];
l[0][0]=sqrt(A[0][0]);
//cout << "l[1][1]=" << l[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]; }
printf("Metoda Cholesky:\n");
for(i=0;i<N;i++)printf("%7.3f ",x[i]);
printf ("\nNr. de iteratii: %d\n", k1);
}
//
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);
printf("Metoda Jacobi:\n");
for(i=0;i<N;i++)
printf("%7.3f ",x[i]);
printf ("\nNr. de iteratii: %d \n",k1);
}
//
void gaussseidel()
{ 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.001);
printf("Metoda Gauss Seidel cu eroarea 0.001:\n");
for(i=0;i<N;i++)
printf("%7.3f ",x[i]);
printf ("\nNr. de iteratii: %d\n", k1);
printf("\n");
k1=0;
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);
printf("Metoda Gauss Seidel cu eroarea 0.00001:\n");
for(i=0;i<N;i++)
printf("%7.5f ",x[i]);
printf ("\nNr. de iteratii: %d\n", k1);
}
//
void invers()
{int i,j,m,k=0;
float a[N][2*N],a1[N][2*N],I[N][N],v;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a1[i][j]=a[i][j]=A[i][j];
for(i=0;i<N;i++)
for(j=N;j<2*N;j++)
if(j-N==i) a1[i][j]=a[i][j]=1;
else a1[i][j]=a[i][j]=0;
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
{a1[i][j]=a[i][j]/a[i][i];
a1[i][j+N]=a[i][j+N]/a[i][i];
}
for(j=0;j<N;j++)
for(m=0;m<N;m++)
if(j!=i)
{
a1[j][m]=a[j][m]-a[j][i]*a[i][m]/a[i][i];
a1[j][m+N]=a[j][m+N]-a[j][i]*a[i][m+N]/a[i][i];
}
for(k=0;k<N;k++)
for(j=0;j<2*N;j++)
a[k][j]=a1[k][j];
}
puts("\nMatricea initiala:");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%4.1f ",A[i][j]);
puts(" ");
}
puts("\nMatricea inversata:");
for(i=0;i<N;i++)
{for(j=0;j<2*N;j++)
printf("%5.2f ",a[i][j]);
puts(" ");

}
}
//
int main()
{int i;
do
{system("cls");
cout<<"1.Gauss"<<endl;
cout<<"2.Cholesky"<<endl;
cout<<"3.Jacobi"<<endl;
cout<<"4.Gauss-Seidel"<<endl;
cout<<"5.Jordan-Gauss"<<endl;
cout<<"6.Tot se afiseaza"<<endl;
cout<<"7.Exit"<<endl;
cin>>i;
switch (i)
{
case 1 :{system("cls");gauss ();getch();break;}
case 2 :{system("cls");cholesky();getch();break;}
case 3 :{system("cls");jacobi();getch();break;}
case 4 :{system("cls");gaussseidel();getch();break;}
case 5 :{system("cls");invers();getch();break;}
case 6 :{system("cls");
gauss (); printf("\n");
cholesky(); printf("\n");
jacobi(); printf("\n");
gaussseidel(); printf("\n");
invers(); printf("\n");
getch();break;}
};
}
while(i!=7);
}

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