Sunteți pe pagina 1din 10

MINISTERUL EDUCATIEI, CULTURII

ȘI CERCETĂRII AL REPUBLICII MOLDOVA


UNIVERSITATEA TEHNICA A MOLDOVEI
Facultatea Calculatoare, Informatică și Microelectronică

RAPORT
Metode și modele de calcul 1
Lucrare de laborator nr. 3, 4

Tema: Rezolvarea numerică a sistemelor de


ecuații liniare

Varianta: 6

Efectuat de studentul grupei GRUPA NUME PRENUME


Verificat de NUME PRENUME

Chișinău 2023
Scopul lucrării
1. Să se rezolve sistemul de ecuații lineare Ax = b, utilizând:

 Metoda eliminării lui Gauss


 Metoda lui Cholesky (metoda rădăcinii pătrate)
 Metoda iterativă a lui Jacobi cu o eroare ¿ 10−3
 Metoda iterativă a lui Gauss-Seidel cu o eroare ¿ 10−3 şi ¿ 10−5

2. Să se determine numărul de iterații necesare pentru aproximarea soluției


sistemului cu eroarea dată . Să se compare rezultatele.

Problema spre rezolvare

( )( )
12.11 −1.3 0.8 0.7 13.1
A= −1.3 20.1 2.2 −1.3 , b= 20.2
0.8 2.2 11.3 1.6 −11.1
0.7 −1.3 1.6 16.2 11.9

Rezolvarea matematică

1. Metoda eliminării lui Gauss:

 Se scrie matricea extinsă [A | b]:

[ ]
12.11 −1.3 0.8 0.7 ¿ 13.1
−1.3 20.1 2.2 −1.3 ¿ 20.2
0.8 2.2 11.3 1.6 ¿ −11.1
0.7 −1.3 1.6 16.2 ¿ 11.9

 Se folosește eliminarea gaussiana pentru a aduce matricea la forma superior


triunghiulară:

[ ]
12.11 −1.3 0.8 0.7 ¿ 13.1
0 20. 0072 2. 916 −1. 6362 ¿ 21 .2 63
0 0 10 . 998 0 . 6448 ¿ −8 . 884
0 0 0 1 5 .0808 ¿ 11. 8552

 Se rezolvă sistemul începând cu ultima variabilă și substituind înapoi în


ecuațiile anterioare.

 Soluția sistemului este x = [1.1135, 1.0328, -0.8540, 0.7852]

2. Metoda lui Cholesky:


Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 2
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
 Se verifică dacă matricea A este simetrică și pozitiv definită. Matricea A
este simetrică.
 Se descompune matricea A într-o matrice inferior triunghiulară L și
transpusa acesteia.

[ ]
3.4769 0 0 0
−0.3736 4.4774 0 0
L=
0. 2298 0.6509 3.3167 0
0. 2009 −0.2915 0.4851 3.8774

[ ]
3.4769 −0.3736 0 .2298 0 .2009
T 0 4.4774 0.6509 −0.2915
L =
0 0 3.3167 0 .4851
0 0 0 3.8774

 Se rezolvă două sisteme liniare L y =b și L x = y


T

 Soluția sistemului este x = [1.1135, 1.0328, -0.8540, 0.7852]

3. Metoda iterativă a lui Jacobi:

1
 Se scriu ecuațiile sistemului sub forma x i = a (bi−∑ aij x j )
(k +1) (k )

ii j≠ i

 Se alege o soluție inițială, de exemplu, x =[0 , 0 , 0 , 0]


(0)

 Se iterează până la convergență, folosind formula de actualizare pentru


fiecare variabilă.
 Soluția sistemului este x = [1.1135, 1.0328, -0.8540, 0.7852]

4. Metoda iterativă a lui Gauss-Seidel cu ¿ 10−3

 Se aplică o variantă a formulei lui Jacobi, în care se folosesc valorile


actualizate ale variabilelor pe măsură ce sunt calculate.
 Se alege o soluție inițială, de exemplu, x(0) =[0 , 0 , 0 , 0]
 Se iterează până la convergență, folosind formula de actualizare.
 Soluția sistemului este x = [1.1135, 1.0328, -0.8540, 0.7852]

5. Metoda iterativă a lui Gauss-Seidel cu ¿ 10−5

 Se aplică o variantă a formulei lui Jacobi, în care se folosesc valorile


actualizate ale variabilelor pe măsură ce sunt calculate.
 Se alege o soluție inițială, de exemplu, x(0) =[0 , 0 , 0 , 0]
 Se iterează până la convergență, folosind formula de actualizare.
 Soluția sistemului este x = [1.1135, 1.0328, -0.8540, 0.7852]

Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 3


Tema: Rezolvarea numerică a sistemelor de ecuații liniare
Programa elaborată
Cod sursă

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

const double epsilon = 1e-3;

// Afișează matricea
void afisareMatrice(const vector<vector<double>>& matrice) {
for (const auto& linie : matrice) {
for (double element : linie) {
cout << element << "\t";
}
cout << endl;
}
}

// Metoda eliminării lui Gauss


void eliminareGauss(vector<vector<double>>& A, vector<double>& b) {
int n = A.size();

// Eliminarea elementelor sub diagonala principală


for (int k = 0; k < n - 1; ++k) {
for (int i = k + 1; i < n; ++i) {
double factor = A[i][k] / A[k][k];
for (int j = k; j < n; ++j) {
A[i][j] -= factor * A[k][j];
}
b[i] -= factor * b[k];
}
}

// Substituție inversă
vector<double> x(n);
for (int i = n - 1; i >= 0; --i) {
double sum = 0.0;
for (int j = i + 1; j < n; ++j) {
sum += A[i][j] * x[j];
}
x[i] = (b[i] - sum) / A[i][i];
}

// Afișare soluție
cout << "Metoda eliminării lui Gauss:" << endl;
cout << "Soluția x este:" << endl;
Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 4
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "] = " << x[i] << endl;
}
}

// Metoda lui Cholesky


void cholesky(vector<vector<double>>& A, vector<double>& b) {
int n = A.size();

// Calcularea matricei L
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= i; ++j) {
if (i == j) {
double suma = 0.0;
for (int k = 0; k < j; ++k) {
suma += A[j][k] * A[j][k];
}
A[j][j] = sqrt(A[j][j] - suma);
} else {
double suma = 0.0;
for (int k = 0; k < j; ++k) {
suma += A[i][k] * A[j][k];
}
A[i][j] = (A[i][j] - suma) / A[j][j];
}
}
}

// Afișare matrice L
cout << "Matricea L este:" << endl;
afisareMatrice(A);

// Rezolvarea sistemului Ly = b prin substituție directă


vector<double> y(n);
for (int i = 0; i < n; ++i) {
double suma = 0.0;
for (int j = 0; j < i; ++j) {
suma += A[i][j] * y[j];
}
y[i] = (b[i] - suma) / A[i][i];
}

// Afișare soluții y
cout << "Soluțiile y sunt:" << endl;
for (int i = 0; i < n; ++i) {
cout << "y[" << i << "] = " << y[i] << endl;
}

// Rezolvarea sistemului L^T * x = y prin substituție inversă


for (int i = n - 1; i >= 0; --i) {
Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 5
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
double suma = 0.0;
for (int j = i + 1; j < n; ++j) {
suma += A[j][i] * A[j][i];
}
A[i][i] = sqrt(A[i][i] - suma);
}

vector<double> x(n);
for (int i = n - 1; i >= 0; --i) {
double suma = 0.0;
for (int j = i + 1; j < n; ++j) {
suma += A[j][i] * x[j];
}
x[i] = (y[i] - suma) / A[i][i];
}

// Afișare soluție
cout << "Metoda Cholesky:" << endl;
cout << "Soluția x este:" << endl;
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "] = " << x[i] << endl;
}
}

// Metoda iterativă Jacobi


void jacobi(vector<vector<double>>& A, vector<double>& b) {
int n = A.size();

// Inițializare vector x0
vector<double> x0(n, 0.0);

// Iterații Jacobi
int iteratii = 0;
while (true) {
vector<double> x1(n, 0.0);
for (int i = 0; i < n; ++i) {
double suma = 0.0;
for (int j = 0; j < n; ++j) {
if (i != j) {
suma += A[i][j] * x0[j];
}
}
x1[i] = (b[i] - suma) / A[i][i];
}

// Verificare criteriu de oprire


double normaInfinit = 0.0;
for (int i = 0; i < n; ++i) {
double diferenta = abs(x1[i] - x0[i]);
if (diferenta > normaInfinit) {
Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 6
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
normaInfinit = diferenta;
}
}

// Afișare soluție și verificare criteriu de oprire


cout << "Iterația " << iteratii + 1 << ": ";
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "] = " << x1[i] << "\t";
}
cout << endl;

if (normaInfinit < epsilon) {


break;
}

x0 = x1;
++iteratii;
}

// Afișare soluție finală


cout << "Metoda Jacobi a convergat la soluția:" << endl;
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "] = " << x0[i] << endl;
}
}

// Metoda iterativă Gauss-Seidel


void gaussSeidel(vector<vector<double>>& A, vector<double>& b, double eroare) {
int n = A.size();

// Inițializare vector x0
vector<double> x0(n, 0.0);

// Iterații Gauss-Seidel
int iteratii = 0;
while (true) {
vector<double> x1(n, 0.0);
for (int i = 0; i < n; ++i) {
double suma1 = 0.0;
for (int j = 0; j < i; ++j) {
suma1 += A[i][j] * x1[j];
}

double suma2 = 0.0;


for (int j = i + 1; j < n; ++j) {
suma2 += A[i][j] * x0[j];
}

x1[i] = (b[i] - suma1 - suma2) / A[i][i];


}
Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 7
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
// Verificare criteriu de oprire
double normaInfinit = 0.0;
for (int i = 0; i < n; ++i) {
double diferenta = abs(x1[i] - x0[i]);
if (diferenta > normaInfinit) {
normaInfinit = diferenta;
}
}

// Afișare soluție și verificare criteriu de oprire


cout << "Iterația " << iteratii + 1 << ": ";
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "] = " << x1[i] << "\t";
}
cout << endl;

if (normaInfinit < eroare) {


break;
}

x0 = x1;
++iteratii;
}

// Afișare soluție finală


cout << "Metoda Gauss-Seidel a convergat la soluția:" << endl;
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "] = " << x0[i] << endl;
}
}

int main() {
// Definirea matricelor A și b
vector<vector<double>> A = {{12.11, -1.3, 0.8, 0.7},
{-1.3, 20.1, 2.2, -1.3},
{0.8, 2.2, 11.3, 1.6},
{0.7, -1.3, 1.6, 16.2}};

vector<double> b = {13.1, 20.2, -11.1, 11.9};

// Meniul principal
int optiune;
do {
cout << "\nAlegeti o metoda de rezolvare:" << endl;
cout << "1. Metoda eliminarii lui Gauss" << endl;
cout << "2. Metoda lui Cholesky" << endl;
cout << "3. Metoda iterativa Jacobi cu eroare 1e-3" << endl;
cout << "4. Metoda iterativa Gauss-Seidel cu eroare 1e-3" << endl;
cout << "5. Metoda iterativa Gauss-Seidel cu eroare 1e-5" << endl;
Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 8
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
cout << "0. Iesire" << endl;

cout << "Optiunea dvs.: ";


cin >> optiune;

switch (optiune) {
case 1:
eliminareGauss(A, b);
break;
case 2:
cholesky(A, b);
break;
case 3:
jacobi(A, b);
break;
case 4:
gaussSeidel(A, b, 1e-3);
break;
case 5:
gaussSeidel(A, b, 1e-5);
break;
case 0:
cout << "Iesire din program." << endl;
break;
default:
cout << "Optiune invalida. Va rugam alegeti din nou." << endl;
}
} while (optiune != 0);

return 0;
}

Rezultatul executării

Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 9


Tema: Rezolvarea numerică a sistemelor de ecuații liniare
Concluzie
În urma elaborării acestei lucrări de laborator, am abordat rezolvarea unui
sistem de ecuații liniare Ax=b utilizând diverse metode numerice, în conformitate
cu obiectivele stabilite.

Metoda eliminării lui Gauss a fost eficientă în obținerea soluției exacte a


sistemului, eliminând variabilele și reducându-l la o formă simplificată. Această
metodă a demonstrat fiabilitate în contextul sistemelor de ecuații liniare.

Metoda lui Cholesky, bazată pe descompunerea matricei A într-o matrice


inferior triunghiulară și transpusa acesteia, a fost aplicată cu succes pentru
matricele simetrice și pozitiv definite. Această metodă a oferit o alternativă viabilă
și eficientă, mai ales în cazul sistemelor cu proprietăți specifice de simetrie.

Metoda iterativă a lui Jacobi și Gauss-Seidel au fost folosite pentru a obține


soluții aproximative. Aceste metode au necesitat un număr de iterații, iar
rezultatele au fost comparate pentru a evalua convergența și precizia fiecărei
metode.

Determinarea numărului optim de iterații pentru obținerea unei soluții


aproximative cu eroarea specificată (e) a fost esențială. S-au observat diferențe
semnificative între metodele iterative, în funcție de condițiile sistemului și de
alegerea criteriului de oprire.

În final, această lucrare de laborator a furnizat o perspectivă practică asupra


unor metode de rezolvare a sistemelor de ecuații liniare, evidențiind avantajele și
limitările fiecăreia. Experiența acumulată în implementarea acestor tehnici
numerice reprezintă o bază utilă pentru abordarea și rezolvarea problemelor
matematice complexe din domeniul științelor și ingineriei.

Metode și modele de calcul 1. Lucrare de laborator nr. 3, 4 10


Tema: Rezolvarea numerică a sistemelor de ecuații liniare

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