#include <stdio.h>
#include <math.h>
#define N 4
#define MAX_ITER 150
#define EPS 1e-7
void print_system(double A[N][N], double b[N]);
void jacobi_solver(double A[N][N], double b[N]);
void gauss_seidel_solver(double A[N][N], double b[N]);
void verify_solution(double A[N][N], double b[N], double x[N]);
int main() {
// Preprocessed diagonally dominant system matrices
double A[N][N] = {
{ 5.0, -1.0, -2.0, 0.0},
{ 0.0, 8.0, 1.0, 7.0},
{-2.0, -7.0, -4.0, 0.0},
{ 4.0, 0.0, -3.0, -25.0}
};
double b[N] = {-1.32, 14.41, 0.70, -0.03};
print_system(A, b);
printf("\n======================================================\n"); printf(" 1. JACOBI METHOD \n"); printf("======================================================\n"); jacobi_solver(A, b);
printf("\n======================================================\n"); printf(" 2. GAUSS-SEIDEL METHOD \n"); printf("======================================================\n"); gauss_seidel_solver(A, b);
return 0;
}
void print_system(double A[N][N], double b[N]) {
printf("Preprocessed Diagonally Dominant Linear System:\n"); for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
}
printf("] [x%d] = [ %6.2f ]\n", i
+ 1, b
[i
]); }
}
void jacobi_solver(double A[N][N], double b[N]) {
double x[N] = {0.0, 0.0, 0.0, 0.0}; // Initial guess x^(0)
double x_new[N];
int converged = 0;
printf("Iter\tResidual SS\tx1\t\tx2\t\tx3\t\tx4\n"); printf("------------------------------------------------------------------------\n");
for (int k = 1; k <= MAX_ITER; k++) {
for (int i = 0; i < N; i++) {
double sum = 0.0;
for (int j = 0; j < N; j++) {
if (j != i) {
sum += A[i][j] * x[j];
}
}
x_new[i] = (b[i] - sum) / A[i][i];
}
// Calculate Residual Sum of Squares
double rss = 0.0;
for (int i = 0; i < N; i++) {
rss
+= pow(x_new
[i
] - x
[i
], 2);}
// Display iteration row
printf("%d\t%.2e\t%.5f\t%.5f\t%.5f\t%.5f\n", k
, rss
, x_new
[0], x_new
[1], x_new
[2], x_new
[3]);
// Update values
for (int i = 0; i < N; i++) {
x[i] = x_new[i];
}
if (rss < EPS) {
printf("\n>> Converged successfully in %d iterations.\n", k
); converged = 1;
break;
}
}
if (!converged) {
printf("\nWarning: Did not reach convergence criteria.\n"); }
// --- Explicit Solution Display ---
printf("\n=== FINAL SOLUTION (JACOBI) ===\n"); for (int i = 0; i < N; i++) {
printf("x[%d] = %10.6f\n", i
+ 1, x
[i
]); }
verify_solution(A, b, x);
}
void gauss_seidel_solver(double A[N][N], double b[N]) {
double x[N] = {0.0, 0.0, 0.0, 0.0}; // Initial guess x^(0)
double x_old[N];
int converged = 0;
printf("Iter\tResidual SS\tx1\t\tx2\t\tx3\t\tx4\n"); printf("------------------------------------------------------------------------\n");
for (int k = 1; k <= MAX_ITER; k++) {
for (int i = 0; i < N; i++) {
x_old[i] = x[i];
}
for (int i = 0; i < N; i++) {
double sum = 0.0;
for (int j = 0; j < N; j++) {
if (j != i) {
sum += A[i][j] * x[j];
}
}
x[i] = (b[i] - sum) / A[i][i];
}
// Calculate Residual Sum of Squares
double rss = 0.0;
for (int i = 0; i < N; i++) {
rss
+= pow(x
[i
] - x_old
[i
], 2);}
// Display iteration row
printf("%d\t%.2e\t%.5f\t%.5f\t%.5f\t%.5f\n", k
, rss
, x
[0], x
[1], x
[2], x
[3]);
if (rss < EPS) {
printf("\n>> Converged successfully in %d iterations.\n", k
); converged = 1;
break;
}
}
if (!converged) {
printf("\nWarning: Did not reach convergence criteria.\n"); }
// --- Explicit Solution Display ---
printf("\n=== FINAL SOLUTION (GAUSS-SEIDEL) ===\n"); for (int i = 0; i < N; i++) {
printf("x[%d] = %10.6f\n", i
+ 1, x
[i
]); }
verify_solution(A, b, x);
}
void verify_solution(double A[N][N], double b[N], double x[N]) {
printf("\n--- In-Code Verification Check (Ax == b) ---\n"); for (int i = 0; i < N; i++) {
double lhs_calc = 0.0;
for (int j = 0; j < N; j++) {
lhs_calc += A[i][j] * x[j];
}
double error = lhs_calc - b[i];
printf("Row %d: Computed Ax = %10.5f | Target b = %10.5f | Delta Error = %e\n", i + 1, lhs_calc, b[i], error);
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIE4gNAojZGVmaW5lIE1BWF9JVEVSIDE1MAojZGVmaW5lIEVQUyAxZS03Cgp2b2lkIHByaW50X3N5c3RlbShkb3VibGUgQVtOXVtOXSwgZG91YmxlIGJbTl0pOwp2b2lkIGphY29iaV9zb2x2ZXIoZG91YmxlIEFbTl1bTl0sIGRvdWJsZSBiW05dKTsKdm9pZCBnYXVzc19zZWlkZWxfc29sdmVyKGRvdWJsZSBBW05dW05dLCBkb3VibGUgYltOXSk7CnZvaWQgdmVyaWZ5X3NvbHV0aW9uKGRvdWJsZSBBW05dW05dLCBkb3VibGUgYltOXSwgZG91YmxlIHhbTl0pOwoKaW50IG1haW4oKSB7Ci8vIFByZXByb2Nlc3NlZCBkaWFnb25hbGx5IGRvbWluYW50IHN5c3RlbSBtYXRyaWNlcwpkb3VibGUgQVtOXVtOXSA9IHsKeyA1LjAsIC0xLjAsIC0yLjAsIDAuMH0sCnsgMC4wLCA4LjAsIDEuMCwgNy4wfSwKey0yLjAsIC03LjAsIC00LjAsIDAuMH0sCnsgNC4wLCAwLjAsIC0zLjAsIC0yNS4wfQp9Owpkb3VibGUgYltOXSA9IHstMS4zMiwgMTQuNDEsIDAuNzAsIC0wLjAzfTsKCnByaW50X3N5c3RlbShBLCBiKTsKCnByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwpwcmludGYoIiAxLiBKQUNPQkkgTUVUSE9EIFxuIik7CnByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKamFjb2JpX3NvbHZlcihBLCBiKTsKCnByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwpwcmludGYoIiAyLiBHQVVTUy1TRUlERUwgTUVUSE9EIFxuIik7CnByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKZ2F1c3Nfc2VpZGVsX3NvbHZlcihBLCBiKTsKCnJldHVybiAwOwp9Cgp2b2lkIHByaW50X3N5c3RlbShkb3VibGUgQVtOXVtOXSwgZG91YmxlIGJbTl0pIHsKcHJpbnRmKCJQcmVwcm9jZXNzZWQgRGlhZ29uYWxseSBEb21pbmFudCBMaW5lYXIgU3lzdGVtOlxuIik7CmZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CnByaW50ZigiWyAiKTsKZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKcHJpbnRmKCIlNi4xZiAiLCBBW2ldW2pdKTsKfQpwcmludGYoIl0gW3glZF0gPSBbICU2LjJmIF1cbiIsIGkgKyAxLCBiW2ldKTsKfQp9Cgp2b2lkIGphY29iaV9zb2x2ZXIoZG91YmxlIEFbTl1bTl0sIGRvdWJsZSBiW05dKSB7CmRvdWJsZSB4W05dID0gezAuMCwgMC4wLCAwLjAsIDAuMH07IC8vIEluaXRpYWwgZ3Vlc3MgeF4oMCkKZG91YmxlIHhfbmV3W05dOwppbnQgY29udmVyZ2VkID0gMDsKCnByaW50ZigiSXRlclx0UmVzaWR1YWwgU1NcdHgxXHRcdHgyXHRcdHgzXHRcdHg0XG4iKTsKcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoKZm9yIChpbnQgayA9IDE7IGsgPD0gTUFYX0lURVI7IGsrKykgewpmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewpkb3VibGUgc3VtID0gMC4wOwpmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewppZiAoaiAhPSBpKSB7CnN1bSArPSBBW2ldW2pdICogeFtqXTsKfQp9CnhfbmV3W2ldID0gKGJbaV0gLSBzdW0pIC8gQVtpXVtpXTsKfQoKLy8gQ2FsY3VsYXRlIFJlc2lkdWFsIFN1bSBvZiBTcXVhcmVzCmRvdWJsZSByc3MgPSAwLjA7CmZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CnJzcyArPSBwb3coeF9uZXdbaV0gLSB4W2ldLCAyKTsKfQoKLy8gRGlzcGxheSBpdGVyYXRpb24gcm93CnByaW50ZigiJWRcdCUuMmVcdCUuNWZcdCUuNWZcdCUuNWZcdCUuNWZcbiIsIGssIHJzcywgeF9uZXdbMF0sIHhfbmV3WzFdLCB4X25ld1syXSwgeF9uZXdbM10pOwoKLy8gVXBkYXRlIHZhbHVlcwpmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewp4W2ldID0geF9uZXdbaV07Cn0KCmlmIChyc3MgPCBFUFMpIHsKcHJpbnRmKCJcbj4+IENvbnZlcmdlZCBzdWNjZXNzZnVsbHkgaW4gJWQgaXRlcmF0aW9ucy5cbiIsIGspOwpjb252ZXJnZWQgPSAxOwpicmVhazsKfQp9CgppZiAoIWNvbnZlcmdlZCkgewpwcmludGYoIlxuV2FybmluZzogRGlkIG5vdCByZWFjaCBjb252ZXJnZW5jZSBjcml0ZXJpYS5cbiIpOwp9CgovLyAtLS0gRXhwbGljaXQgU29sdXRpb24gRGlzcGxheSAtLS0KcHJpbnRmKCJcbj09PSBGSU5BTCBTT0xVVElPTiAoSkFDT0JJKSA9PT1cbiIpOwpmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewpwcmludGYoInhbJWRdID0gJTEwLjZmXG4iLCBpICsgMSwgeFtpXSk7Cn0KCnZlcmlmeV9zb2x1dGlvbihBLCBiLCB4KTsKfQoKdm9pZCBnYXVzc19zZWlkZWxfc29sdmVyKGRvdWJsZSBBW05dW05dLCBkb3VibGUgYltOXSkgewpkb3VibGUgeFtOXSA9IHswLjAsIDAuMCwgMC4wLCAwLjB9OyAvLyBJbml0aWFsIGd1ZXNzIHheKDApCmRvdWJsZSB4X29sZFtOXTsKaW50IGNvbnZlcmdlZCA9IDA7CgpwcmludGYoIkl0ZXJcdFJlc2lkdWFsIFNTXHR4MVx0XHR4Mlx0XHR4M1x0XHR4NFxuIik7CnByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCmZvciAoaW50IGsgPSAxOyBrIDw9IE1BWF9JVEVSOyBrKyspIHsKZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKeF9vbGRbaV0gPSB4W2ldOwp9Cgpmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewpkb3VibGUgc3VtID0gMC4wOwpmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewppZiAoaiAhPSBpKSB7CnN1bSArPSBBW2ldW2pdICogeFtqXTsKfQp9CnhbaV0gPSAoYltpXSAtIHN1bSkgLyBBW2ldW2ldOwp9CgovLyBDYWxjdWxhdGUgUmVzaWR1YWwgU3VtIG9mIFNxdWFyZXMKZG91YmxlIHJzcyA9IDAuMDsKZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKcnNzICs9IHBvdyh4W2ldIC0geF9vbGRbaV0sIDIpOwp9CgovLyBEaXNwbGF5IGl0ZXJhdGlvbiByb3cKcHJpbnRmKCIlZFx0JS4yZVx0JS41Zlx0JS41Zlx0JS41Zlx0JS41ZlxuIiwgaywgcnNzLCB4WzBdLCB4WzFdLCB4WzJdLCB4WzNdKTsKCmlmIChyc3MgPCBFUFMpIHsKcHJpbnRmKCJcbj4+IENvbnZlcmdlZCBzdWNjZXNzZnVsbHkgaW4gJWQgaXRlcmF0aW9ucy5cbiIsIGspOwpjb252ZXJnZWQgPSAxOwpicmVhazsKfQp9CgppZiAoIWNvbnZlcmdlZCkgewpwcmludGYoIlxuV2FybmluZzogRGlkIG5vdCByZWFjaCBjb252ZXJnZW5jZSBjcml0ZXJpYS5cbiIpOwp9CgovLyAtLS0gRXhwbGljaXQgU29sdXRpb24gRGlzcGxheSAtLS0KcHJpbnRmKCJcbj09PSBGSU5BTCBTT0xVVElPTiAoR0FVU1MtU0VJREVMKSA9PT1cbiIpOwpmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewpwcmludGYoInhbJWRdID0gJTEwLjZmXG4iLCBpICsgMSwgeFtpXSk7Cn0KCnZlcmlmeV9zb2x1dGlvbihBLCBiLCB4KTsKfQoKdm9pZCB2ZXJpZnlfc29sdXRpb24oZG91YmxlIEFbTl1bTl0sIGRvdWJsZSBiW05dLCBkb3VibGUgeFtOXSkgewpwcmludGYoIlxuLS0tIEluLUNvZGUgVmVyaWZpY2F0aW9uIENoZWNrIChBeCA9PSBiKSAtLS1cbiIpOwpmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewpkb3VibGUgbGhzX2NhbGMgPSAwLjA7CmZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7Cmxoc19jYWxjICs9IEFbaV1bal0gKiB4W2pdOwp9CmRvdWJsZSBlcnJvciA9IGxoc19jYWxjIC0gYltpXTsKcHJpbnRmKCJSb3cgJWQ6IENvbXB1dGVkIEF4ID0gJTEwLjVmIHwgVGFyZ2V0IGIgPSAlMTAuNWYgfCBEZWx0YSBFcnJvciA9ICVlXG4iLAppICsgMSwgbGhzX2NhbGMsIGJbaV0sIGVycm9yKTsKfQp9Cg==