Skip to content

Instantly share code, notes, and snippets.

@senhorinha
Last active August 29, 2015 14:18
Show Gist options
  • Save senhorinha/4a7416a938a05d5b19c8 to your computer and use it in GitHub Desktop.
Save senhorinha/4a7416a938a05d5b19c8 to your computer and use it in GitHub Desktop.
Trabalho-1
package main;
import java.util.Arrays;
public class GaussSeidel {
public static void main(String[] args) {
int numeroDePassosMaximo = 10000;
double criterioDeParada = 1e-4;
double fatorDeRelaxacao = 1.98;
int iteracoesEmDouble = gaussSeidel(fatorDeRelaxacao, numeroDePassosMaximo, criterioDeParada);
int iteracoesEmFloat = gaussSeidel((float) fatorDeRelaxacao, numeroDePassosMaximo, (float) criterioDeParada);
System.out.printf("Iterações em double: %s\n", iteracoesEmDouble);
System.out.printf("Iterações em float: %s\n", iteracoesEmFloat);
}
private static int gaussSeidel(double fatorDeRelaxacao, int numeroDePassosMaximo, double criterioDeParada) {
int n = 100;
double[] xInicial = new double[100];
double[] x = new double[100];
double diferencia = 1;
int passo = 1;
while (passo < numeroDePassosMaximo && diferencia > criterioDeParada) {
int i = 0;
x[i] = (1 - fatorDeRelaxacao) * x[i] + fatorDeRelaxacao * (150 - x[i + 1]);
for (i = 1; i < n / 2; i++) {
x[i] = (1 - fatorDeRelaxacao) * x[i] + fatorDeRelaxacao * (100 - x[i - 1] - x[i + 1] - x[i + 50]) / 3;
}
for (i = n / 2; i < n - 1; i++) {
x[i] = (1 - fatorDeRelaxacao) * x[i] + fatorDeRelaxacao * (200 - x[i - 50] - x[i - 1] - x[i + 1]) / 3;
}
i = n - 1;
x[i] = (1 - fatorDeRelaxacao) * x[i - 1] + fatorDeRelaxacao * (300 - x[i - 1]);
passo++;
diferencia = calcularMaximaDiferencia(xInicial, x);
xInicial = Arrays.copyOf(x, x.length);
}
return passo;
}
private static int gaussSeidel(float fatorDeRelaxacao, int numeroDePassosMaximo, float criterioDeParada) {
int n = 100;
float[] xInicial = new float[100];
float[] x = new float[100];
float diferencia = 1;
int passo = 1;
while (passo < numeroDePassosMaximo && diferencia > criterioDeParada) {
int i = 0;
x[i] = (1 - fatorDeRelaxacao) * x[i] + fatorDeRelaxacao * (150 - x[i + 1]);
for (i = 1; i < n / 2; i++) {
x[i] = (1 - fatorDeRelaxacao) * x[i] + fatorDeRelaxacao * (100 - x[i - 1] - x[i + 1] - x[i + 50]) / 3;
}
for (i = n / 2; i < n - 1; i++) {
x[i] = (1 - fatorDeRelaxacao) * x[i] + fatorDeRelaxacao * (200 - x[i - 50] - x[i - 1] - x[i + 1]) / 3;
}
i = n - 1;
x[i] = (1 - fatorDeRelaxacao) * x[i - 1] + fatorDeRelaxacao * (300 - x[i - 1]);
passo++;
diferencia = calcularMaximaDiferencia(xInicial, x);
xInicial = Arrays.copyOf(x, x.length);
}
return passo;
}
private static double calcularMaximaDiferencia(double[] xInicial, double[] x) {
double max = 0;
double diferencia;
for (int i = 0; i < x.length; i++) {
diferencia = Math.abs(xInicial[i] - x[i]);
if (max < diferencia) {
max = diferencia;
}
}
return max;
}
private static float calcularMaximaDiferencia(float[] xInicial, float[] x) {
float max = 0;
float diferencia;
for (int i = 0; i < x.length; i++) {
diferencia = Math.abs(xInicial[i] - x[i]);
if (max < diferencia) {
max = diferencia;
}
}
return max;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment