Java Program to Implement Gauss Seidel Method

This is java program to find the solution to the linear equations of any number of variables. The class provides a simple implementation of the Gauss-Seidel method. If the matrix isn’t diagonally dominant the program tries to convert it(if possible) by rearranging the rows.

Here is the source code of the Java Program to Implement Gauss-Seidel Method. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

//This class provides a simple implementation of the GaussSeidel method for solving systems of linear equations.
//If the matrix isn't diagonally dominant the program tries to convert it(if possible) by rearranging the rows.
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Gauss_Seidel 
{
    public static final int MAX_ITERATIONS = 100;  
    private double[][] M;
    public Gauss_Seidel(double [][] matrix) { M = matrix; }
 
    public void print()
    {
        int n = M.length;
        for (int i = 0; i < n; i++) 
        {
            for (int j = 0; j < n + 1; j++)
                System.out.print(M[i][j] + " ");
            System.out.println();
        }
    }
 
    public boolean transformToDominant(int r, boolean[] V, int[] R)
    {
        int n = M.length;
        if (r == M.length) 
        {
            double[][] T = new double[n][n+1];
            for (int i = 0; i < R.length; i++) 
            {
                for (int j = 0; j < n + 1; j++)
                    T[i][j] = M[R[i]][j];
            }
 
            M = T;
 
            return true;
        }
 
        for (int i = 0; i < n; i++) 
        {
            if (V[i]) continue;
 
            double sum = 0;
 
            for (int j = 0; j < n; j++)
                sum += Math.abs(M[i][j]);
 
            if (2 * Math.abs(M[i][r]) > sum) 
            { // diagonally dominant?
                V[i] = true;
                R[r] = i;
 
                if (transformToDominant(r + 1, V, R))
                    return true;
 
                V[i] = false;
            }
        }
 
        return false;
    }
 
    public boolean makeDominant()
    {
        boolean[] visited = new boolean[M.length];
        int[] rows = new int[M.length];
 
        Arrays.fill(visited, false);
 
        return transformToDominant(0, visited, rows);
    }
 
    public void solve()
    {
        int iterations = 0;
        int n = M.length;
        double epsilon = 1e-15;
        double[] X = new double[n]; // Approximations
        double[] P = new double[n]; // Prev
        Arrays.fill(X, 0);
 
        while (true) 
        {
            for (int i = 0; i < n; i++) 
            {
                double sum = M[i][n]; // b_n
 
                for (int j = 0; j < n; j++)
                    if (j != i)
                        sum -= M[i][j] * X[j];
 
        // Update x_i to use in the next row calculation
                X[i] = 1/M[i][i] * sum;
            }
 
            System.out.print("X_" + iterations + " = {");
            for (int i = 0; i < n; i++)
                System.out.print(X[i] + " ");
            System.out.println("}");
 
            iterations++;
            if (iterations == 1) 
                continue;
 
            boolean stop = true;
            for (int i = 0; i < n && stop; i++)
                if (Math.abs(X[i] - P[i]) > epsilon)
                    stop = false;
 
            if (stop || iterations == MAX_ITERATIONS) break;
            P = (double[])X.clone();
        }
    }
 
    public static void main(String[] args) throws IOException
    {
        int n;
        double[][] M;
 
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter writer = new PrintWriter(System.out, true);
 
        System.out.println("Enter the number of variables in the equation:");
        n = Integer.parseInt(reader.readLine());
        M = new double[n][n+1];
        System.out.println("Enter the augmented matrix:");
 
        for (int i = 0; i < n; i++) 
        {
            StringTokenizer strtk = new StringTokenizer(reader.readLine());
 
            while (strtk.hasMoreTokens())
                for (int j = 0; j < n + 1 && strtk.hasMoreTokens(); j++)
                    M[i][j] = Integer.parseInt(strtk.nextToken());
        }
 
 
        Gauss_Seidel gausSeidel = new Gauss_Seidel(M);
 
        if (!gausSeidel.makeDominant()) 
        {
            writer.println("The system isn't diagonally dominant: " +
                     "The method cannot guarantee convergence.");
        }
 
        writer.println();
        gausSeidel.print();
        gausSeidel.solve();
    }
}

Output:

$ javac Gauss_Seidel.java
$ java Gauss_Seidel
Enter the number of variables in the equation:
2
Enter the augmented matrix:
1 2 3
6 5 4
 
6.0 5.0 4.0 
1.0 2.0 3.0 
X_0 = {0.6666666666666666 1.1666666666666667 }
X_1 = {-0.30555555555555564 1.652777777777778 }
X_2 = {-0.7106481481481481 1.855324074074074 }
X_3 = {-0.8794367283950617 1.9397183641975309 }
X_4 = {-0.9497653034979425 1.9748826517489713 }
X_5 = {-0.9790688764574759 1.9895344382287379 }
X_6 = {-0.9912786985239483 1.9956393492619742 }
X_7 = {-0.9963661243849785 1.9981830621924892 }
X_8 = {-0.9984858851604077 1.9992429425802039 }
X_9 = {-0.9993691188168363 1.999684559408418 }
X_10 = {-0.9997371328403484 1.999868566420174 }
X_11 = {-0.9998904720168117 1.9999452360084058 }
X_12 = {-0.999954363340338 1.999977181670169 }
X_13 = {-0.9999809847251406 1.9999904923625702 }
X_14 = {-0.9999920769688085 1.9999960384844042 }
X_15 = {-0.9999966987370034 1.9999983493685016 }
X_16 = {-0.9999986244737512 1.9999993122368755 }
X_17 = {-0.9999994268640631 1.9999997134320315 }
X_18 = {-0.9999997611933598 1.9999998805966799 }
X_19 = {-0.9999999004972331 1.9999999502486165 }
X_20 = {-0.9999999585405137 1.9999999792702567 }
X_21 = {-0.999999982725214 1.999999991362607 }
X_22 = {-0.9999999928021724 1.9999999964010862 }
X_23 = {-0.999999997000905 1.9999999985004524 }
X_24 = {-0.999999998750377 1.9999999993751885 }
X_25 = {-0.9999999994793237 1.9999999997396618 }
X_26 = {-0.9999999997830514 1.9999999998915257 }
X_27 = {-0.9999999999096048 1.9999999999548024 }
X_28 = {-0.9999999999623352 1.9999999999811675 }
X_29 = {-0.9999999999843061 1.999999999992153 }
X_30 = {-0.9999999999934606 1.9999999999967302 }
X_31 = {-0.9999999999972751 1.9999999999986375 }
X_32 = {-0.9999999999988646 1.9999999999994322 }
X_33 = {-0.9999999999995268 1.9999999999997633 }
X_34 = {-0.9999999999998028 1.9999999999999014 }
X_35 = {-0.9999999999999176 1.9999999999999587 }
X_36 = {-0.9999999999999656 1.9999999999999827 }
X_37 = {-0.9999999999999855 1.9999999999999927 }
X_38 = {-0.9999999999999938 1.999999999999997 }
X_39 = {-0.9999999999999973 1.9999999999999987 }
X_40 = {-0.9999999999999988 1.9999999999999993 }
X_41 = {-0.9999999999999993 1.9999999999999996 }

Related posts:

Spring Boot Change Context Path
Merging Streams in Java
Java Program to Implement Rolling Hash
A Guide to EnumMap
Java Program to Implement Branch and Bound Method to Perform a Combinatorial Search
Java Program to Generate Random Numbers Using Probability Distribution Function
Spring Data JPA and Null Parameters
Java Program to Implement Graph Coloring Algorithm
Giới thiệu Design Patterns
HttpAsyncClient Tutorial
Java Program to Apply Above-Below-on Test to Find the Position of a Point with respect to a Line
New in Spring Security OAuth2 – Verify Claims
Encode a String to UTF-8 in Java
Java Program to Decode a Message Encoded Using Playfair Cipher
Java Program to Convert a Decimal Number to Binary Number using Stacks
The “final” Keyword in Java
Hướng dẫn sử dụng Lớp FilePermission trong java
Một số tính năng mới về xử lý ngoại lệ trong Java 7
Java Program to Implement Circular Singly Linked List
A Guide to Spring Boot Admin
Spring RequestMapping
The Dining Philosophers Problem in Java
Converting Java Date to OffsetDateTime
JavaScript Forms: event and method submit
Java Program to Generate All Pairs of Subsets Whose Union Make the Set
Java Program to Find Hamiltonian Cycle in an UnWeighted Graph
Hướng dẫn sử dụng biểu thức chính quy (Regular Expression) trong Java
Java Deep Learning Essentials - Yusuke Sugomori
Comparing Arrays in Java
Java equals() and hashCode() Contracts
Java Program to Apply DFS to Perform the Topological Sorting of a Directed Acyclic Graph
Jackson – Unmarshall to Collection/Array