Sunteți pe pagina 1din 8

Metode numerice

Tema: Rezolvarea numeric a sistemelor de


ecuaii liniare

Scopul lucrrii:
1) S se rezolve sistemul de ecuaii liniare Ax = b, utiliznd:

metoda eliminrii Gauss;


metoda lui Cholesky (metoda rdcinii ptrate);
metoda iterativ a lui Jacobi cu o eroare = 10-3;
metoda iterativ a lui Gauss-Seidelcu o eroare = 10-3 i = 10-5;
2) S se determine numrul de iteraii necesare pentru aproximarea soluiei sistemului
cu o eroare dat . S se compare rezultatele.
3) S se inverseze matricea A cu ajutorul metodei Jordan-Gauss.
V-5

Consideraii teoretice:
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.

Metodelele Jacobi i Gauss-Seidel

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.

Listingul programului:
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <iostream.h>
#define N 4
void gauss( int r );
void cholesky( int r );
void jacobi( int r );
void gaussseidel( int r );
void invers( void );
void Rez( void );
void curate( int p, int x, int y, char s[65] )
{
gotoxy( x, y + p );
textbackground( 0 );
textcolor( 6 );
cputs( s );
}
void init(int x, int y,char menu[7][65])
{
int i,p=1;
clrscr();
textcolor(5);
highvideo();
gotoxy(20,2);
lowvideo();
gotoxy(20,6);
gotoxy(20,4);
gotoxy(x,y+p);
textbackground(0);
textcolor(6);
for(i=0;i<7;i++)
{ cputs(menu[i]);gotoxy(x,y+p+i+1);}
}
float A[N][N]= {11.3, -1.2, 0.7, 0.5,
-1.2, 12.2, 1.0, -0.9,
0.7, 1.0, 9.9, 0.8,
0.5, -0.9, 0.8, 8.4
},
B[N]={5.8,-6.4,7.2,-5.6};
void main(void)
{
int p=1,x=20,y=7,i;
char c,menu[7][65]=

{
"Metoda Gauss
",
"Metoda lui Choleski
",
"Metoda lui Jacobi
",
"Metode Gauss-Seidel
",
"Inversarea matricei
",
"Rezultatul final
",
"Iesire
",
};
_setcursortype(3);
init (x,y,menu);
while(1)
{ gotoxy(x,y+p);
textbackground(0);
textcolor(7);
cputs(menu[p-1]);
do{ if((c=getch())==13)
{switch(p)
{case 1:gauss(1);init(x,y,menu);break;
case 2:cholesky(1);init(x,y,menu);break;
case 3:jacobi(1);init(x,y,menu);break;
case
4:gaussseidel(1);init(x,y,menu);break;
case 5:invers();init(x,y,menu);break;
case 6:Rez();init(x,y,menu);break;
default:{exit(0);}
}
break;
}
else if(c==0)
{c=getch();
if(c==80)
{curate(p,x,y,menu[p-1]);
if(p<7)p++;
else p=1;
break;
}
else if (c==72)
{ curate(p,x,y,menu[p-1]);
if(p==1)p=7;
else p--;
break;
}
}
}
while(1);}}
void gauss (int r)
{
int i,j, max,l;
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];
}

textbackground(0);
clrscr();
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++;
}
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];
}
textcolor(4);
gotoxy(1,1);
cputs("Metoda lui Gauss");
textcolor(2);
gotoxy(25,1);
cputs("Solutiile sunt:");
gotoxy(10,3);
for(i=0;i<N;i++)
cprintf(" x%d ",i);
textcolor(9);
gotoxy(10,4);
highvideo();
for(i=0;i<N;i++)
cprintf("%7.3f ",x[i]);
for(i=0;i<N;i++)
{t=0;
for(j=0;j<N;j++)
t+=A[i][j]*x[j];
}
if(r)getch();
}
void cholesky(int r)
{
int i,j,k;
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<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];
}
}
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];
}
if(r)
{k=0;textbackground(0);clrscr();}
else k=5;
textcolor(4);
gotoxy(1,1+k);
cputs("Metoda lui Cholesky");
textcolor(2);
gotoxy(25,1+k);
cputs("Solutiile ecuatiei sunt: ");
gotoxy(10,3+k);
for(i=0;i<N;i++)
cprintf(" x%d ",i);
textcolor(9);
gotoxy(10,4+k);
highvideo();
for(i=0;i<N;i++)
cprintf("%6.3f ",x[i]);
for(i=0;i<N;i++)
{t=0;
for(j=0;j<N;j++)
t+=A[i][j]*x[j];
}
if(r)getch();
}
void jacobi(int r)
{int i,j,m,k1=0,k=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);
if(r!=0)
{
k=0;
textbackground(0);
clrscr();
}else k=10;
textcolor(4);
gotoxy(1,1+k);
cputs("Metoda lui Jacobi");
textcolor(2);
gotoxy(25,1+k);
cputs("Solutiile ecuatiei sunt: ");
gotoxy(10,3+k);
for(i=0;i<N;i++)
cprintf(" x%d ",i);
textcolor(9);
gotoxy(10,4+k);
highvideo();
for(i=0;i<N;i++)
cprintf("%6.3f ",x[i]);
for(i=0;i<N;i++)

{v=0;
for(j=0;j<N;j++)
v+=A[i][j]*x[j];
textcolor(4);
gotoxy(10,5+k);
cprintf("Numarul de iteratii %d.Eroarea
0.001",k1);
}
if(r)getch();
}
void gaussseidel(int r)
{
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);
if(r)
{
k=0;
textbackground(0);
clrscr();
}else k=15;
textcolor(4);
gotoxy(1,1+k);
cputs("Metoda lui Gaussseidel");
textcolor(2);
gotoxy(25,1+k);
cputs("Solutiile ecuatiei sunt: ");
gotoxy(10,3+k);
for(i=0;i<N;i++)
cprintf(" x%d ",i);
textcolor(9);
gotoxy(10,4+k);
highvideo();
for(i=0;i<N;i++)
cprintf("%6.3f ",x[i]);
for(i=0;i<N;i++)
{
v=0;
for(j=0;j<N;j++)
v+=A[i][j]*x[j];
}
textcolor(4);
gotoxy(10,5+k);
cprintf("Numarul de iteratii %d.Eroarea
0.001",k1);
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);
textcolor(2);

gotoxy(10,7+k);
for(i=0;i<N;i++)
cprintf(" x%d ",i);
textcolor(9);
gotoxy(10,8+k);
highvideo();
for(i=0;i<N;i++)
cprintf("%6.5f ",x[i]);
for(i=0;i<N;i++)
{
v=0;
for(j=0;j<N;j++)
v+=A[i][j]*x[j];
}
textcolor(4);
gotoxy(10,9+k);
cprintf("Numarul de iteratii %d.Eroarea
0.00001",k1);
getch();
}
void Rez(void)
{
gauss(0);
cholesky(0);
jacobi(0);
gaussseidel(0);
}
void invers(void)
{
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];

}
textbackground(0);
clrscr();
textcolor(9);
cputs("Metoda lui Jord-Gauss de inversare a
matricei:\n ");
gotoxy(2,2);
cputs("Matricea A:");
gotoxy(1,3);
textcolor(2);
highvideo();
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cprintf(" %4.4f",A[i][j]);
puts(" ");
}
textcolor(9);
gotoxy(2,7);
cputs("Matricea inversata:");
gotoxy(1,8);
textcolor(9);
highvideo();
for(i=0;i<N;i++)
{
for(j=0;j<2*N;j++)
cprintf("%9.4f ",a[i][j]);
puts(" ");
}
getch();
}

Datale la intrare:
Maticea A =

11.3 1.2
1.2 12.2
0.7
1.0
0.5 0.9

0.7 0.5
1.0 0.9
9.9 0.8
0.8 8.4

B=

5.8
6.4
7.2
5.6

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