Ocena użytkownikóww: ***** / 6
Nadesłany przez Tomasz Lubiński, 13 marca 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
GS.java:
// Metoda Gaussa-Seidela
// www.algorytm.org
// (c) 2006 Tomasz Lubinski
public class GS {
private static double A[][];
private static double L[][];
private static double D[][];
private static double U[][];
private static double b[];
private static double x[];
/**
* @param args
*/
public static void main(String[] args) {
int n, iter;
int i, j, k;
// Get n
System.out.println("Metoda Gaussa-Seidela");
System.out.println("Rozwiazywanie ukladu n-rownan z n-niewiadomymi Ax=b");
System.out.println("Podaj n");
n = Console.readInt("");
if (n < 1) {
System.out.println("Nieprawidlowa warosc parametru n");
return;
}
A = new double[n][n];
L = new double[n][n];
D = new double[n][n];
U = new double[n][n];
b = new double[n];
x = new double[n];
// Get values of A
for (i=0; i<n; i++)
for (j=0; j<n; j++) {
System.out.println("A["+(i+1)+"]["+(j+1)+"] = ");
A[i][j] = Console.readDouble("");
if ((i == j) && (A[i][j] == 0)) {
System.out.println("Wartosci na przekatnej musza byc rozne od 0");
return;
}
}
// Get values of b
for (i=0; i<n; i++) {
System.out.println("b["+(i+1)+"] = ");
b[i] = Console.readDouble("");
}
// Divide A into L + D + U
for (i=0; i<n; i++)
for (j=0; j<n; j++) {
if (i < j) {
U[i][j] = A[i][j];
}
else if (i > j) {
L[i][j] = A[i][j];
}
else {
D[i][j] = A[i][j];
}
}
// Calculate D^-1
for (i=0; i<n; i++)
D[i][i] = 1/D[i][i];
// Calculate D^-1 * b
for (i=0; i<n; i++)
b[i] *= D[i][i];
//Calculate D^-1 * L
for (i=0; i<n; i++)
for (j=0; j<i; j++)
L[i][j] *= D[i][i];
//Calculate D^-1 * U
for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
U[i][j] *= D[i][i];
//Initialize x
for (i=0; i<n; i++)
x[i] = 0;
System.out.println("Ile iteracji algorytmu wykonac?");
iter = Console.readInt("");
for (k=0; k<iter; k++)
for (i=0; i<n; i++) {
x[i] = b[i]; // x = D^-1*b -
for (j=0; j<i; j++)
x[i] -= L[i][j]*x[j]; // D^-1*L * x -
for (j=i+1; j<n; j++)
x[i] -= U[i][j]*x[j]; // D^-1*U * x
}
System.out.println("Wynik");
for (i=0; i<n; i++)
System.out.println("x["+(i+1)+"] = " + x[i]);
return;
}
}