You are on page 1of 7

Rezolvarea sistemelor de ecuaii liniare joac un rol central n analiza numeric.

Metode directe algoritmi finii, 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, Gttingen) a fost un matematician, fizician i astronom german celebru pentru lucrrile despre integralele multiple, magnetism i sistemul de uniti care-i poart numele

1.Metoda lui Gauss (pivotare parial)


Ideea de baz aducerea sistemului prin transformri elementare la o form echivalent cu matrice superior triunghiular. Transformarea sistemului faza eliminrii. Rezolvarea sistemului cu matrice triunghiular faza substituiei inverse.

1.1 Faza eliminrii:


Pasul 1: Eliminm x1 din toate ecuaiile sistemului, cu excepia primei ecuaii. mprim prima linie la elementul pivot a11. Scdem prima ecuaie nmulit cu primul coeficient din celelalte ecuaii:

Cu

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

Eliminm pe x2 din ultima ecuaie. mprim a doua ecuaie la elementul pivot a(1)22 si o scdem nmulit cu elementul a(1)32 din ecuaia a treia.

Pasul 3: mprim cea de a treia ecuaie la elementul pivot a(2)33 :

1.2 Faza substituiei 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]

You might also like