Sunteți pe pagina 1din 16

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică


Departamentul Inginerie Software și Automatică

RAPORT
Lucrarea de laborator nr. 2
Disciplina Metode Numerice

Tema: Rezolvarea numerica a sistemelor de


ecuatii liniare

A îndeplinit: st.gr. TI-174


Rotari Viorel
A verificat: conf. univ.
E. Tutunaru

Chișinău – 2018
Scopul lucrării:
1) Sa se resolve sistemul de ecuatii liniare A*X=B, utilizand: metoda Jordan-Gauss.
Sistemul propus:
2x+1y+1z=2
4x+1y-2z=1
6x+2y-1=4
Efectuarea lucrării
Explicarea programului:
1. Introducem numarul de necunoscute, numarul de ecuatii, apoi introducem matricea A
si matricea B.
2. Selectarea elementului pivot, elementul pivot se ia elementul de pe diagonala principal
(n=m), daca aceste element este egal cu 0, atunci se cauta un element din alta linie sau
coloana care nu a fost selectata precedent.
3. Se repete pasul dat de n ori.
4. Dupa al 3-lea pas afisam matricea obtinuta si afisam rezultatele.

Codul c++:

#include <iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

int n,m,i,j,k;

float A[100][100],B[100],C[100][100];

while (1)

//Citirea datelor.

cout<<"\n\nIntroduceti numarul de necunoscute: "; cin>> m;


cout<<"\nIntroduceti numarul de ecuatii: "; cin>> n;

cout<<"\nIntroduceti matricea A, cate o linie: ";

int z = 0;

for (i=0;i<n;i++)

cout<<"\n"<<noshowpos<<z+1<<") "; z++;

//if ( n == m ) cout<<"\n"<<i+1<<") ";

for(j=0;j<m;j++)

cin>>A[i][j];

cout<<"\n\nIntroducem termenii liberi in matricea B: \n";

for (i=0;i<n;i++)

cout<<"B["<<noshowpos<<i+1<<"]: "; cin >> B[i];

//Unim matricea A si B intr-una pentru ca sa putem lucra dupa Jordan-Gauss cu un


tabel.

for (i = 0; i < n; i ++)

for (j=0; j<m;j++)

C[i][j] = A[i][j];

//Adaugam coloana termenilor liber.

for(i=0;i<n;i++)

C[i][m] = B[i];
cout<<"\n\nMatricea extinsa: "<<endl;

//Afisam tabelul

for (i=0;i<n;i++)

cout<<endl;

for (j=0;j<m+1;j++)

cout<<setw(10)<<left<<C[i][j] ;

float pivot;

int linia, coloana;

int s;

int res, caz;

float c[100],l[100];

for (s=0;s<n;s++)

for (j=0;j<m;j++)

if ( C[i][i] == 0 ) caz = 0; else caz =1;

//Metoda Jordan-Gauss.

for (i=0;i<n;i++)

//Verificam daca pe diagonala principala nu sunt zerouri:

switch (caz)

{
case 1:

//Alegem elementul pivot.

pivot = C[i][i];

//Calculam tabelul.

// Variabila noua s ca sa nu inlocuim valoarea linie i in for (i=0...)

for (s=0;s<n;s++)

for (j=0;j<m+1;j++)

if (s != linia && j != coloana) C[s][j] = ( (C[s][j] * pivot) - ( C[linia][j] *


C[s][coloana] ) ) / ( pivot );

//Impartim linia pivot la el pivot.

for (s=linia;s<linia+1;s++)

for (j=0;j<m+1;j++)

C[i][j] = C[i][j]/pivot;

//Inlocuit coloana pivot cu 0;

for (j=coloana;j<coloana+1;j++)

for (s=0;s<n;s++) // Variabila noua s ca sa nu inlocuim valoarea linie i in for


(i=0...)

C[s][j] = 0;

C[linia][coloana] = 1; // El pivot a fost inlocuit cu 0 la pasul precedent...

break;
}

case 0:

//Facem tabelul c si l cu valori de -1 pentru a vedea daca linia sau coloana


pivot nu a fost repetata.

for (s=0;s<n;s++)

l[s] = -1; c[s] = -1;

//Alegem elementul pivot.

for (j=0;j<m;j++)

if ( C[i][j] != 0 )

for (s=0;s<n;s++)

if ( l[s] != i && c[s] != j )

pivot = C[i][j]; linia = i; coloana = j;

l[s] = linia; c[s] = coloana;

//Calculam tabelul.

// Variabila noua s ca sa nu inlocuim valoarea linie i in for (i=0...)


for (s=0;s<n;s++)

for (j=0;j<m+1;j++)

if (s != linia && j != coloana) C[s][j] = ( (C[s][j] * pivot) - ( C[linia][j] *


C[s][coloana] ) ) / ( pivot );

//Impartim linia pivot la el pivot.

for (s=linia;s<linia+1;s++)

for (j=0;j<m+1;j++)

C[i][j] = C[i][j]/pivot;

//Inlocuit coloana pivot cu 0;

for (j=coloana;j<coloana+1;j++)

for (s=0;s<n;s++) // Variabila noua s ca sa nu inlocuim valoarea linie i in for


(i=0...)

C[s][j] = 0;

C[linia][coloana] = 1; // El pivot a fost inlocuit cu 0 la pasul precedent...

break;

//Afisam tabelul.

cout<<"\nTabelul obitnut dupa aplicarea metodei Jordan-Gauss: ";

cout<<endl;
for (i=0;i<n;i++)

cout<<endl;

for (j=0;j<m+1;j++)

if (C[i][j] == -0) C[i][j] = 0;

cout<<setw(10)<<left<<C[i][j];

//Afisam Solutia generala.

int ver[100] = { 0 }, t, sol = 0;

t = 3; s = 0;

if ( m > n ) t = 1;

//Compatibil nedeterminat.

for (i=0;i<n;i++)

for (j=0;j<m+1;j++)

if ( C[i][j] != ver[j] ) { sol = 1; }

if ( sol == 0 ) { t = 1; break; }

sol = 0;

}
int ver1[100] = { 0 };

int sol1 = 0;

//Incompatibil.

for (i=0;i<n;i++)

for(j=0;j<m;j++)

if ( C[i][j] != ver1[j] ) { sol1 = 1; }

if ( sol1 == 0 && C[i][m] != 0 ) { t = 2; break; }

sol1 = 0;

switch (t)

case 1:

int x,k;

cout << endl << setprecision(2) << "\nSistemul este Compatibil Nedeterminat !
";

cout<<"\nSolutia Generala:";

for(int i = 0; i < n; i++)

for(j = 0; j < m; j++)


{

if(C[i][j] == 1 )

cout << endl << noshowpos <<"x" << j+1 << " = ";

for(x = j+1; x < m; x++)

if(C[i][x]) cout <<showpos << -C[i][x] <<"x" << noshowpos<<x+1 <<


" ";

if(C[i][m]) cout << showpos <<C[i][m];

break;

break;

case 2:

cout<<"\n\nSistemul este incompatibil ! ";

cout<<"\nSolutia: Multimea Vida.";

break;

case 3:

cout<<"\n\nSistemul este compatibil determinat ! ";


cout<<"\nSolutia Sistemului: ";

for (i=0;i<n;i++)

for(j=0;j<m;j++)

if ( C[i][j] != 0 ) { cout<<endl<<"x"<<j+1<<" = "<<C[i][m]; }

break;

cout<<"\n\nPentru continuare apasati 1, pentru iesire din program apasati 0: ";

cout<<"\nRaspuns: "; cin >>res;

switch(res)

case 0: exit (0);

return 0;

Rezultatul programului:
1. Caz compatibil determinat:

2.

3. Caz compatibil nedeterminat


incompatibil
Concluzie

In aceasta lucrare sau studiat diferite metode de rezolvare a sistemelor de ecuatii liniare
A*X=B. Am creat un program in limbajul de programare c++ cu ajutorul carui se poate de aflat
solutiile unu sistem, cu ajutorul metodei Jordan Gauss.