Rezolvarea sistemelor de ecuaţii liniare joacă un rol central în analiza numerică.

 Metode directe – algoritmi finiţi, erori de rotunjire – Gauss, Crout, Choleski,  Metode iterative – procese infinite, erori de trunchiere – Jacobi, Gauss-Seidel.

Carl Friedrich Gauß, latinizat Carolo Friderico Gauss, (n.30 aprilie 1777, Braunschweig - d. 23 februarie 1855, Göttingen) a fost un matematician, fizician și astronom german celebru pentru lucrările despre integralele multiple, magnetism și sistemul de unități care-i poartă numele

1.Metoda lui Gauss (pivotare parţială)
Ideea de bază – aducerea sistemului prin transformări elementare la o formă echivalentă cu matrice superior triunghiulară.  Transformarea sistemului – faza eliminării.  Rezolvarea sistemului cu matrice triunghiulară – faza substituţiei inverse.

1.1 Faza eliminării:
Pasul 1:  Eliminăm x1 din toate ecuaţiile sistemului, cu excepţia primei ecuaţii.  Împărţim prima linie la elementul pivot a11.  Scâdem prima ecuaţie înmulţitâ cu primul coeficient din celelalte ecuaţii:

Cu

Pasul 2: 1 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

 Eliminăm pe x2 din ultima ecuaţie.  Împărţim a doua ecuaţie la elementul pivot a(1)22 si o scădem înmulţită cu elementul a(1)32 din ecuaţia a treia.

Pasul 3:  Împărţim cea de a treia ecuaţie la elementul pivot a(2)33 :

1.2 Faza substituţiei inverse:

2.Implementarea algoritmului in pseudocod
real a[10][10],b[10],x[10]; intreg i,j,n,iv,t,k,l; real temp; inceput scrie "Dati numarul de ecuatii "; citeste n; scrie "Dati matricea A "<<endl; |pentru(i=1;i<=n;i++)

2 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

| |

|pentru(j=1;j<=n;j++) | citeste a[i][j];

scrie "Dati termenul liberi"; |pentru(i=1;i<=n;i++) | citeste >b[i]; |pentru(j=1;j<=n-1;j++) | iv=j; | t=1; | |cat timp((iv<=n) si (t==1)) | | daca (a[iv][j] == 0) atunci iv=iv+1; | | altfel t=0; | | |daca(t==1) atunci | | | scrie "Determinantul pricipal este nul "; | | | | |daca(j!=iv) atunci | | | |pentru(k=j;k<=n;k++) | | | |temp=a[j][k]; | | | |a[j][k]=a[iv][k]; | | | |a[iv][k]=temp; | | | | temp=b[j]; | | b[j]=b[iv]; | | b[iv]=temp; | pentru(l=j+1;l<=n;l++){ | pentru(k=j+1;k<=n;k++) | a[l][k]=a[l][k] - a[j][k] * a[l][j] div a[j][j]; | b[l]=b[l] - b[j] * a[l][j] div a[j][j]; | daca(a[n][n]==0) atunci | scrie "Deterninantul principal este nul"; x[n]=b[n] / a[n][n]; | pentru(i=n-1;i>=1;i--){ | temp = b[i]; | |pentru(j=i+1;j<=n;j++) temp = temp - a[i][j] * x[j]; | | x[i] = temp div a[i][i]; |pentru(i=1;i<=n;i++) | scrie x[i]; sfarsit;

3.Implementarea metodei in C
3.1 Codul sursă:
#include<stdio.h> #include<conio.h>

3 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

#include<stdlib.h> float a[10][10],b[10],x[10],temp; int i,j,n,iv,t,k,l; /*in functia procedurala void citire() se citesc matricea sistemului A si vectorul termenior liberi B. Matricea a este constituita din cei n coeficienti a celor n ecuatii. */ void citire(){ printf("Dati numarul de ecuatii");scanf("%d",&n); printf("Dati matricea A\n"); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ printf("a[%d][%d]=",i,j); scanf("%f",&a[i][j]);} printf("Dati cei %d termenii liberi:\n",n); for(i=1;i<=n;i++){ printf("b[%d]=",i); scanf("%f",&b[i]);}} /*in functia procedurala void gauss() se implementeaza algoritmul specific acestei metode. Prima data se verifica si se fac pivotari in cazul in care acest lucru se impune, apoi se calculeaza ceilalti termeni conform relatiilor de mai sus.in acest algoritm nu se fac inlocuiri cu 0 pe coloana pivotilor deoarece cu ajutorul unor restrictii din algoritm partea triunghiolara a matricvei de sub diagonala principala nu este accesata. Un alt lucru care iese in evidenta este ca la primul pas, acela in care impartim linia la elementul pivot, algorimul face in acelasi timp si inlocuirea cu metoda dreptunghiului, castigand din punct de vedere al eficientei*/ void gauss(){ for(j=1;j<=n-1;j++){ iv=j; t=1; while((iv<=n) && (t==1)) if(a[iv][j] == 0) iv=iv+1; else t=0; if(t==1){ printf("Determinantul pricipal este nul "); exit(0);} if(j!=iv){ for(k=j;k<=n;k++){ temp=a[j][k]; a[j][k]=a[iv][k]; a[iv][k]=temp;} temp=b[j]; b[j]=b[iv]; b[iv]=temp;} for(l=j+1;l<=n;l++){ for(k=j+1;k<=n;k++) a[l][k]=a[l][k] - a[j][k] * a[l][j] / a[j][j]; b[l]=b[l] - b[j] * a[l][j] / a[j][j];}} if(a[n][n]==0){ printf("Deterninantul principal este nul"); exit(0);}} /* in functia procedurala void rezultate() se calculeaza cele n solutii ale celor n ecuatii prin metoda specifica prezentata mai sus la “Faza substitutiei inverse”*/ void rezultate(){x[n]=b[n] / a[n][n];

4 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

for(i=n-1;i>=1;i--){ temp = b[i]; for(j=i+1;j<=n;j++) temp = temp - a[i][j] * x[j]; x[i] = temp / a[i][i];}} /*in functia afisare_rezultate() se afiseaza rezultatele celor n ecuatii*/ void afisare_rezultate(){ for(i=1;i<=n;i++) printf("x[%d]=%f\n",i,x[i]);} void main(void) {citire(); gauss(); rezultate(); afisare_rezultate(); getch();}

3.2 Compilarea şi executarea programului:

Am verificat algoritmul cu ajutorul acestul sistem:

5 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

3.3 Verificarea programului in cazul in care sistemul este compatibil sau nu: 3.3.1 Cazul in care sistemul este compatibil:

x = 1, y = 2, z = 3

6 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

3.3.2 cazul in care determinantul este nul: 1 1 1 1 10 1 1 -1 -2 -8 5 5 -1 -4 -4 1 1 3 4 28 5 5 -1 -4 -4 1 1 -1 -2 -8 1 1 1 1 10 1 1 3 4 28 1 1 -1/5 -4/5 -4/5 0 0 -4/5 -6/5 -36/5 0 0 6/5 9/5 54/5 0 0 16/5 24/5 144/5 Detrminantul sistemului este nul

7 Metoda eliminarii partiale a lui Gauss | [Nicu Liviu Alexandru]

Sign up to vote on this title
UsefulNot useful