Last active
August 29, 2015 14:18
-
-
Save senhorinha/4a7416a938a05d5b19c8 to your computer and use it in GitHub Desktop.
Trabalho-1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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