Você está na página 1de 5

package excecao;

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 Excecao {


public static void main (String [] args){
/* int Dx= 33;
int Dy = 33;
int Dz= 33;
double Porosidade= 0.23;
int Dt= 10; // "Dias"
double ct= 3E-5;
double Bo = 1.22;
double viscosidade = 0.287;
double Kx= 2.33;
double Ky= Kx;
double Kz= 2.3;

double D = -((Dx*Dy*Dz*ct*Porosidade)/(Dt*Bo));
double Tx =(Kx)/(Dx*viscosidade*Bo);
double Ty =(Ky)/(Dy*viscosidade*Bo);
double Tz =(Kz)/(Dz*viscosidade*Bo);
*/
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:");


M = new double[n][n+1];
n = Integer.parseInt(reader.readLine());
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 }

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();
}
}

Você também pode gostar