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:
How to Change the Default Port in Spring Boot
How to Delay Code Execution in Java
Guide to Spring 5 WebFlux
Enum trong java
How to Store Duplicate Keys in a Map in Java?
Java Program to Implement Binary Heap
Java Program to Find the Number of Ways to Write a Number as the Sum of Numbers Smaller than Itself
Java Program to Implement Disjoint Sets
Java Program to Perform Sorting Using B-Tree
Chuyển đổi giữa các kiểu dữ liệu trong Java
Lớp lồng nhau trong java (Java inner class)
Java Program to Implement ArrayList API
Java Program to Implement Circular Singly Linked List
Map Interface trong java
Java – Create a File
Java Program to Perform integer Partition for a Specific Case
Lập trình đa luồng với Callable và Future trong Java
Base64 encoding và decoding trong Java 8
Handle EML file with JavaMail
Java Program to Implement Double Order Traversal of a Binary Tree
Reversing a Linked List in Java
Send an email with an attachment
Ignore Null Fields with Jackson
Spring Security with Maven
Introduction to PCollections
Spring Cloud AWS – RDS
Java Program to Implement First Fit Decreasing for 1-D Objects and M Bins
Using a Mutex Object in Java
Finding Max/Min of a List or Collection
Java Program to Find All Pairs Shortest Path
RestTemplate Post Request with JSON
Java Program to Represent Graph Using Adjacency Matrix