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.
Chişinău 2013

Transformarea sistemului dat într-un sistem de formă triunghiulară. * metoda iterativă a lui Jacobi cu o eroare de 10 3 . încît A=LLT.7   5 .3 3. În această metodă se presupune că matricea A este o matrice simetrică şi pozitiv definită.2 1.4  7 . 3)Sa se inverseze matricea A cu ajutorul metodei Jordan-Gauss.1      1. Matricea L se alege astfel.5       0. 6 13 .4 1.2  .7 A=  0.2 0. Teorie: Metoda eliminării a lui Gauss constă în a aduce sistemul iniţial la un sistem echivalent avînd matricea coeficienţilor superior triunghiulară.9 16.2   8 .4 4.8  10.7  0. unde L e o matrice superior triunghiulară.5  0.2   5 .3 0. 2)Sa se determine numarul de iteratii necesare pentru aproximarea solutiei sistemului cu eroarea data. 2.5   4 .1. * metoda lui Cholesky(metoda radacinii patrate). * metoda iterativă Gauss-Siedel cu o eroare 10 3 si 10 5 .2   0. 1     3.9 0.1  1.utilizind: * metoda eliminarii Gauss. b=    0.6  1 .4    1. se realizează cu ajutorul următoarelor 3 operaţii de bază : 1) rearanjarea ecuaţiilor (schimbarea a 2 ecuaţii între ele) .2  A=  .4   0.4 5 .3       0.4  0. Metoda lui Cholesky de rezolvare a sistemelor de ecuaţii liniare algebrice se mai numeşte metoda rădăcinii pătrate şi constă în descompunerea sistemului Ax=b în două sisiteme triunghiulare : LTy=b. iar LT matricea transpusă ei. Scopul lucrarii: 1)Să se rezolve sistemul de ecuatii liniare Ax=b. 3) scăderea unei ecuaţii din alta şi înlocuirea celei de-a doua cu rezultatul scăderii.Sa se compare rezultatele.8 12.2   6. b=  0.6   7 . Sistemele de ecuaţii propuse:  3.8  0.2    0. 2) înmulţirea unei ecuaţii cu o constantă (diferită de zero) . Lx=y. 4  0 . Elementele lij ale matricei inferior triunghiulare L pot fi calculate în felul următor : Se determină prima coloană a matricei L .7 0.2 0.1     5. fără ca să se modifice soluţia sistemului.

αnn) Avem: S-1=diag(1/α11. potrivită pentu iteraţie.2. (3)unde Q=S-1T. Aceasta modificare a metodei lui Jacobi se numeşte metoda lui Gauss-Seidel. Procesul iterativ (5) este definit prin : xi(k +1)= xi(k+1). desfacerea matricei A trebuie să satisfacă condiţiile : a) Sistemul (5) are o soluţie unică x(k+1) şi se rezolvă uşor.Ea poate fi diagonală sau triunghiulară.L11=√α11 . xi-1(k+1). De aceea matricea S se alege de o formă simplă şi este ireversabilă.. Astfel obţinem o metodă de rezolvare a sistemului liniar (1) numită metoda lui Jacobi. x2(k+1). În metoda lui Jacobi e necesar de a păstra în memoria calculatorului toate componentele vectorului x(k) atît timp cît se calculează vectorul x(k+1).n. i =1. Atunci în calitate de matrice S se poate lua matricea diagonală ataşată matricei A: S=diag(α11. Putem modifica metoda lui Jacobi astfel încît la pasul (k+1) să folosim în calculul componentei xi(k+1).2.. lik=(αik -∑lijlkj)/lkk .n. d=S-1b. Atunci sistemul Ax=b (1) e echivalent cu sistemul Sx=Qx+d.∑αij∙xj(k)). i=1.….…. li1= αi1/li1 . După ce s-au obţinut primele (k-1) coloane ale matricei L se calculează coloana k : Lkk=√akk -∑l2kj . (5) (0) n unde x .2. i=2. Prin urmare putem construi şirul {x(k)}utilizînd relaţia recurentă: Sx(k+1)=Tx(k)+b.. (4) sau x(k+1) =Qx(k)+d. (2) sau x=Qx+d. valorile deja calculate la aceasi pas: x1(k+1).…. Seidel Metodelele Jacobi şi Gauss- Metodele iterative se constuiesc utilizînd desfacerea matricei A definită prin A=S-T. i=k+1.….n . b) Şirul {x(k) }k=1 converge către soluţia exactă x* oricare ar fi x(0). Rezultatele obtinute: . Presupunem că elementele diagonale aii≠0.. i=1.…n.2. iar şirul iterativ devine: xi(k+1)= 1/αii(bi-∑αij∙xj(k).n.….1/αnn) În acest caz sistemul (2) devine : xi=1/αii(bi-∑αij∙xj(k)). k=0.…n Metode iterative de rezolvare a sistemelor de ecuaţii lineare.1. e o aproximaţie iniţială a soluţiei x*. ….2. i=1. α22. ce aparţine R .3.1/α22. Pentru a reduce sistemul (1) la o formă (3) sau (4)..

Matricea nr.2 . Matricea nr.Fig1.1 Fig2.

cum ar fi: metoda eliminării Gauss.Concluzie: Efectuand aceasta lucrarea de laborator am acumulat cunostinte pentru rezolvarea numerica a sistemelor de ecuatii liniare. 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. La rezolvarea lor am aplicat mai multe metode. metoda interativă a lui Jacobi. Analizand aceste metode in parte. metoda iterativă a lui GaussSeidel. metoda lui Cholesky.

0.j--) t+=a[i][j]*x[j].k1=0.2. k1).4.i++) printf("%7.1.i<N. for(j=0.b[N]. void gauss () { int i.1. for(i=0.} l=0.j++) a[i][j]=A[i][j].1.h> #include <conio.7.9.l.x[N].1 }. for(i=0. de iteratii: %d\n". } for (i=N-1.12.4.10.i++) {b[i]=B[i]. } . 0.8.1.j.i--) {t=0. k1++. for(j=l.x[i]). for(j=N-1.h> #include <math. } printf("Metoda Gauss:\n").8.5.0. b[i]-=t*b[l].13.y[N].2.1.1. t=b[i]-t.i<N. } // void cholesky() { int i.-0.3f ". for(i=1.4. printf ("\nNr.j<N.16.j>i.i<N. float t.j++) a[i][j]-=t*a[l][j]. -1. float B[4]={7. while(l<N) {for(i=l+1.i++) {t=a[i][l]/a[l][l]. float t.h> #define N 4 float A[4][4]={ 6.i<N.k.0.8. } l++.6.h> #include <stdio.j<N.k1=0.2.l[N][N].4.-7.9.2.6}. x[i]=t/a[i][i].a[N][N].6. l[0][0]=sqrt(A[0][0]). max. //cout << "l[1][1]=" << l[0][0].-1.i++) {l[i][0]=A[i][0]/l[0][0].Anexa: #include <iostream.-0.j.i>=0.x[N].

j<i.j<N. for(j=0. l[k][k]=sqrt(A[k][k]-t).i<N. t=B[i]-t. for(j=0.er.t[N][N].m++) .i++) for(j=0.i++) for(j=i+1. } for(i=N-1.k1=0. y[i]=t/l[i][i]. t[i][j]=A[i][j]. t=y[i]-t. for(i=0.for(k=1.i++) {t=0.q[N][N].j. for(j=0. k1).k<N.x1[N]. } else {s[i][j]=0. for(m=0.} } for(i=0.s[N][N].j>i. for(j=N-1.j<k-1. for(i=k+1.} for(i=0.i++) {t=0.m<N. } for(i=0. de iteratii: %d\n".j<N.i<N.j<k-1. } // void jacobi() {int i. l[i][k]=(A[i][k]-t)/l[k][k].i<N.i--) {t=0.x[N].d[N].3f ".m.j++) {if(i==j) {s[i][j]=1/A[i][j]. float v.j++) t+=l[k][j]*l[k][j]. t[i][j]=0.i<N. for(i=0. printf ("\nNr.j++) {v=0.j++) {l[i][j]=l[j][i].i<N.j<N.}k1++.j++) t+=l[i][j]*l[k][j].i>=0.i<N.j++) t+=l[i][j]*y[j].x[i]). x[i]=t/l[i][i].k++) {t=0. } printf("Metoda Cholesky:\n").j--) t+=l[i][j]*x[j].i++)printf("%7.i++) for(j=0.

for(m=0.m<N.q[N][N].i<N.t[N][N]. do {k1++.i<N.x[i]). for(m=0.m++) v+=s[i][m]*B[m]. } for(i=0. q[i][j]=-v.er. } while(er>0.m++) if(er<fabs(x1[m]-x[m])) er=fabs(x1[m]-x[m]).j++) { v=0.i++) printf("%7.s[N][N].i<N.i<N.d[N]. }else { s[i][j]=0.001).j<N. printf ("\nNr.i++) x1[i]=x[i].} }.k.i<N.i++) for(j=0. de iteratii: %d \n".x[N]. t[i][j]=A[i][j]. for(i=0.m<N. for(i=0.} er=fabs(x1[0]-x[0]). for(i=0. t[i][j]=0.j.i++) {v=0. } // void gaussseidel() { int i.k1=0.j<N. for(i=0. x[i]=v+d[i].i++) for(j=0.k1).m.v+=s[i][m]*t[m][j]. for(m=0.i<N.3f ". d[i]=v.j++) { if(i==j) { s[i][j]=1/A[i][j].m<N. .i<N. printf("Metoda Jacobi:\n"). float v.x1[N].i++) x[i]=d[i]. } for(i=0.m++) v+=x1[m]*q[i][m].i++) {v=0. for(i=0.

for(m=0. for(m=0.m<N. do {k1++.i++) { v=0.i++) x1[i]=x[i]. d[i]=v.m++) if(er<fabs(x1[m]-x[m])) er=fabs(x1[m]-x[m]).001). do { k1++.} er=fabs(x1[0]-x[0]). for(i=0.i<N. for(i=0.m++) v+=x[m]*q[i][m]. } while(er>0.i++) x[i]=d[i]. for(i=0. x[i]=v+d[i].m++) v+=s[i][m]*B[m].m<N.3f ".001:\n").m<N. k1).m<N.i++) x[i]=d[i]. for(m=1. printf("Metoda Gauss Seidel cu eroarea 0.m<N. x[i]=v+d[i].i<N.i++) x1[i]=x[i].i<N. } for(i=0.i<N. de iteratii: %d\n".i<N. k1=0. for(i=0. for(i=0.i<N.} er=fabs(x1[0]-x[0]).i++) {v=0.i++) { v=0. for(m=0.m++) v+=x[m]*q[i][m].m++) v+=s[i][m]*t[m][j]. for(i=0. printf("\n").i++) printf("%7.i<N.for(m=0. . printf ("\nNr. } for(i=0.x[i]).i<N. q[i][j]=-v.

a[i][j]).j++) for(m=0.m.j<2*N.i++) {for(j=0.j<2*N. puts(" ").I[N][N]. } // void invers() {int i. for(i=0. for(i=0.i<N.k=0.i++) for(j=N.i<N.m<N.for(m=1.00001).x[i]).j<N. a1[i][j+N]=a[i][j+N]/a[i][i].i<N.i++) printf("%7. printf ("\nNr.i++) {for(j=0. for(i=0.m++) if(j!=i) { a1[j][m]=a[j][m]-a[j][i]*a[i][m]/a[i][i].m++) if(er<fabs(x1[m]-x[m]))er=fabs(x1[m]-x[m]).k++) for(j=0. for(i=0.m<N.j++) a1[i][j]=a[i][j]=A[i][j]. a1[j][m+N]=a[j][m+N]-a[j][i]*a[i][m+N]/a[i][i].k<N.00001:\n"). for(i=0. } for(j=0.2f ".i++) {for(j=0. } puts("\nMatricea initiala:"). . } for(k=0.j<N. k1).j.} while(er>0.i++) for(j=0.j++) printf("%5.j<N.a1[N][2*N]. puts(" "). de iteratii: %d\n". printf("Metoda Gauss Seidel cu eroarea 0.j++) a[k][j]=a1[k][j].j<N.j++) {a1[i][j]=a[i][j]/a[i][i]. float a[N][2*N]. for(i=0.i<N.5f ".v.A[i][j]). } puts("\nMatricea inversata:").1f ".j<2*N.j++) printf("%4. else a1[i][j]=a[i][j]=0.i<N.j++) if(j-N==i) a1[i][j]=a[i][j]=1.i<N.

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

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer: Get 4 months of Scribd and The New York Times for just $1.87 per week!

Master Your Semester with a Special Offer from Scribd & The New York Times