Sunteți pe pagina 1din 12

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică


Departamentul Ingineria Software și Automatică

RAPORT
la lucrarea de laborator nr.2

Metode si modele de calcul

Tema: REZOLVAREA NUMERICĂ A SISTEMELOR DE ECUAŢII


LINIARE

A efectuat: Prepelita Valentin,CR-222

A verificat: Struna V.

Chişinău 2023
1. 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.

Determinarea daca matricea este pozitiv definita:


Codul programului:
Metoda Gaus
Metoda factorizarii Cholesky:
Codul Programului si rezultatele complilarii:
//Metoda Cholesky
#include <iostream>
#include <cmath>
using namespace std;

const int n = 4; // Numărul de variabile

void CholeskyDecomposition(double A[n][n], double L[n][n]) {


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

void ForwardSubstitution(double L[n][n], double b[n], double y[n]) {


for (int i = 0; i < n; i++) {
double sum = 0.0;
for (int j = 0; j < i; j++) {
sum += L[i][j] * y[j];
}
y[i] = (b[i] - sum) / L[i][i];
}
}

void BackwardSubstitution(double L[n][n], double y[n], double x[n]) {


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

int main() {
double A[n][n] = {{12.6,1.8,-0.5, 0.9},
{1.8,13.7,0.8, 0.7},
{-0.5,0.8,11.6,-0.8},
{0.9,0.7,-0.8,20.1}};
double b[n] = {12.3,-11.4,10.8,11.7};
double L[n][n] = {0};
double y[n] = {0};
double x[n] = {0};

CholeskyDecomposition(A, L);
ForwardSubstitution(L, b, y);
BackwardSubstitution(L, y, x);

cout << "Solutia sistemului este:" << endl;


for (int i = 0; i < n; i++) {
cout << "x[" << i + 1 << "] = " << x[i] << endl;
}

return 0;
}
Metoda Jacobi:

Codul programului si rezultatele compilarii:


//Metoda Jacobi
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
int n=4; // Dimensiunea matricei
//cout << "Introduceți dimensiunea matricei: ";
//cin >> n;

vector<vector<double>> A(n, vector<double>(n, 0));


vector<double> B(n);
vector<double> X(n, 0);
A={{12.6,1.8,-0.5, 0.9},
{1.8,13.7,0.8, 0.7},
{-0.5,0.8,11.6,-0.8},
{0.9,0.7,-0.8,20.1}};
B={12.3,-11.4,10.8,11.7};
/*cout << "Introduceți coeficienții matricei A și termenii liberi B:\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> A[i][j];
}
cin >> B[i];
}
*/
double epsilon = 1e-3; // Eroarea ε

int maxIter = 1000; // Numărul maxim de iterații

for (int iter = 0; iter < maxIter; iter++) {


vector<double> newX(n, 0);
for (int i = 0; i < n; i++) {
newX[i] = B[i];
for (int j = 0; j < n; j++) {
if (i != j) {
newX[i] -= A[i][j] * X[j];
}
}
newX[i] /= A[i][i];
}

double maxDiff = 0;
for (int i = 0; i < n; i++) {
maxDiff = max(maxDiff, abs(newX[i] - X[i]));
}

X = newX;

if (maxDiff < epsilon) {


break;
}
}

cout << "Soluția sistemului este:\n";


for (int i = 0; i < n; i++) {
cout << "X[" << i << "] = " << X[i] << endl;
}

return 0;
}
Metoda Gauss-Seidel:

Codul programului si rezultatele compilarii:


//Metoda Gauss-Seidel
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
int n=4; // Dimensiunea matricei
//cout << "Introduceți dimensiunea matricei: ";
//cin >> n;

vector<vector<double>> A(n, vector<double>(n, 0));


vector<double> B(n);
vector<double> X(n, 0);

/*cout << "Introduceți coeficienții matricei A și termenii liberi B:\n";


for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> A[i][j];
}
cin >> B[i];
}
*/
A={{12.6,1.8,-0.5, 0.9},
{1.8,13.7,0.8, 0.7},
{-0.5,0.8,11.6,-0.8},
{0.9,0.7,-0.8,20.1}};
B={12.3,-11.4,10.8,11.7};
double epsilon1 = 1e-3; // Eroarea ε1
double epsilon2 = 1e-5; // Eroarea ε2

int maxIter = 1000; // Numărul maxim de iterații

for (int iter = 0; iter < maxIter; iter++) {


vector<double> newX(n, 0);
for (int i = 0; i < n; i++) {
newX[i] = B[i];
for (int j = 0; j < n; j++) {
if (i != j) {
newX[i] -= A[i][j] * newX[j];
}
}
newX[i] /= A[i][i];
}

X = newX;

// Verificați eroarea ε1
/*double maxDiff1 = 0;
for (int i = 0; i < n; i++) {
maxDiff1 = max(maxDiff1, abs(newX[i] - X[i]));
}

if (maxDiff1 < epsilon1) {


cout << "Soluția cu ε = 10^-3 este:\n";
for (int i = 0; i < n; i++) {
cout << "X[" << i << "] = " << X[i] << endl;
}
break;
}
*/
// Verificați eroarea ε2
double maxDiff2 = 0;
for (int i = 0; i < n; i++) {
maxDiff2 = max(maxDiff2, abs(newX[i] - X[i]));
}
if (maxDiff2 < epsilon2) {
cout << "Soluția cu ε = 10^-5 este:\n";
for (int i = 0; i < n; i++) {
cout << "X[" << i << "] = " << X[i] << endl;
}
break;
}
}

return 0;
}

Functiile/metodele Metoda Metoda Metoda


Cholesky Jacobi Gauss-Seidel
x[1]=1.12962 X[0]=1.12959 X[0] = 0.97619
x[2]=-1.07585 X[1]=-1.07582 X[1] = 0.96037
x[3]= 1.09617 X[2]= 1.09615 X[2] =1.03934
x[4]=0.612605 X[3] = 0.6126 X[3]=0.613192

Concluzii
In urma acestei lucrari de laborator am aflat necunoscutele x1,x2,x3,x4 prin 3 metode
diferite,cele mai bune rezultate fiind dupa metodele Cholesky si Jacobi cu o exacticitate mai
mare decat Gauss-Seidel.
Am facut deprinderi de programare si compilare a acestor tipuri de ecuatii precun si
rezolvarea acestora.

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