Sunteți pe pagina 1din 2

#include<iostream>

#include<algorithm>
#include<cmath>
using namespace std;

int n;
double a[105][105], b[105], x[105], y[105];

int main(void) {
cin >> n;

// Citirea coeficienților matricei și a vectorului b


for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}

for (int i = 1; i <= n; i++) {


cin >> b[i];
}

double epsilon = 0.001;


double q = 0;

// Calculul valorii q conform algoritmului


for (int j = 1; j <= n; j++) {
double sum = 0;
for (int i = 1; i <= n; i++) {
if (i != j) {
sum += abs(a[i][j]);
}
}
q = max(q, sum / abs(a[j][j]));
}

if (q < 1) {
int m = 1;

// Inițializarea lui x cu 0
for (int i = 1; i <= n; i++) {
x[i] = 0;
}

// Implementarea algoritmului de relaxare


while (m <= 1000) {
double max_error = 0;

// Calculul lui y conform formulei din algoritm


for (int i = 1; i <= n; i++) {
double sum1 = 0;
for (int j = 1; j < i; j++) {
sum1 += a[i][j] * y[j];
}
double sum2 = 0;
for (int j = i + 1; j <= n; j++) {
sum2 += a[i][j] * x[j];
}
y[i] = (b[i] - sum1 - sum2) / a[i][i];
}

// Calculul erorii maxime


for (int i = 1; i <= n; i++) {
max_error = max(max_error, abs(x[i] - y[i]));
}

// Verificarea criteriului de oprire


if (max_error < epsilon) {
break;
}

// Actualizarea lui x
for (int i = 1; i <= n; i++) {
x[i] = y[i];
}

m++;
}

// Afișarea rezultatului
cout << "Numarul de iteratii efectuate: " << m << "\n";
cout << "Valorile lui x:\n";
for (int i = 1; i <= n; i++) {
cout << x[i] << "\n";
}
} else {
cout << "Nu este asigurată convergența algoritmului";
}

return 0;
}

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