58 lines
1.7 KiB
C++
58 lines
1.7 KiB
C++
// Problem 4: Jacobi and Gauss-Seidel methods
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <cmath>
|
|
#include <vector>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
|
|
const double TOL = 1e-6;
|
|
const int MAX_ITER = 100;
|
|
|
|
int main() {
|
|
// Rearranged system (weakly diagonally dominant):
|
|
// 7x1 - 3x2 + 4x3 = 6
|
|
// 2x1 + 5x2 + 3x3 = -5
|
|
// -3x1 + 2x2 + 6x3 = 2
|
|
|
|
double b[3] = {6, -5, 2};
|
|
|
|
// Jacobi
|
|
cout << "Jacobi Method:\n";
|
|
vector<double> x = {0, 0, 0};
|
|
for (int iter = 1; iter <= MAX_ITER; iter++) {
|
|
vector<double> x_old = x;
|
|
x[0] = (b[0] + 3*x_old[1] - 4*x_old[2]) / 7;
|
|
x[1] = (b[1] - 2*x_old[0] - 3*x_old[2]) / 5;
|
|
x[2] = (b[2] + 3*x_old[0] - 2*x_old[1]) / 6;
|
|
|
|
double maxDiff = max({fabs(x[0]-x_old[0]), fabs(x[1]-x_old[1]), fabs(x[2]-x_old[2])});
|
|
if (maxDiff < TOL) {
|
|
cout << "Converged in " << iter << " iterations\n";
|
|
break;
|
|
}
|
|
}
|
|
for (int i = 0; i < 3; i++)
|
|
cout << "x" << (i+1) << " = " << fixed << setprecision(6) << x[i] << "\n";
|
|
|
|
// Gauss-Seidel
|
|
cout << "\nGauss-Seidel Method:\n";
|
|
x = {0, 0, 0};
|
|
for (int iter = 1; iter <= MAX_ITER; iter++) {
|
|
vector<double> x_old = x;
|
|
x[0] = (b[0] + 3*x[1] - 4*x[2]) / 7;
|
|
x[1] = (b[1] - 2*x[0] - 3*x[2]) / 5;
|
|
x[2] = (b[2] + 3*x[0] - 2*x[1]) / 6;
|
|
|
|
double maxDiff = max({fabs(x[0]-x_old[0]), fabs(x[1]-x_old[1]), fabs(x[2]-x_old[2])});
|
|
if (maxDiff < TOL) {
|
|
cout << "Converged in " << iter << " iterations\n";
|
|
break;
|
|
}
|
|
}
|
|
for (int i = 0; i < 3; i++)
|
|
cout << "x" << (i+1) << " = " << fixed << setprecision(6) << x[i] << "\n";
|
|
|
|
return 0;
|
|
}
|