Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Metode și modele de calcul 1
Lucrare de laborator nr. 3, 4
Varianta: 6
Chișinău 2023
Scopul lucrării
1. Să se rezolve sistemul de ecuații lineare Ax = b, utilizând:
( )( )
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ă
[ ]
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
[ ]
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
[ ]
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
1
Se scriu ecuațiile sistemului sub forma x i = a (bi−∑ aij x j )
(k +1) (k )
ii j≠ i
#include <iostream>
#include <vector>
#include <cmath>
// Afișează matricea
void afisareMatrice(const vector<vector<double>>& matrice) {
for (const auto& linie : matrice) {
for (double element : linie) {
cout << element << "\t";
}
cout << endl;
}
}
// 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;
}
}
// 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);
// Afișare soluții y
cout << "Soluțiile y sunt:" << endl;
for (int i = 0; i < n; ++i) {
cout << "y[" << i << "] = " << y[i] << endl;
}
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;
}
}
// 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];
}
x0 = x1;
++iteratii;
}
// 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];
}
x0 = x1;
++iteratii;
}
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}};
// 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;
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