programming-examples/java/Data_Structures/Gauss.java

53 lines
1.3 KiB
Java
Raw Normal View History

2019-11-15 12:59:38 +01:00
public class Gauss {
public static double[] gauss(double[][] a, double[] b) {
int n = a.length;
for (int row = 0; row < n; row++) {
int best = row;
for (int i = row + 1; i < n; i++)
if (Math.abs(a[best][row]) < Math.abs(a[i][row]))
best = i;
double[] tt = a[row];
a[row] = a[best];
a[best] = tt;
double t = b[row];
b[row] = b[best];
b[best] = t;
for (int i = row + 1; i < n; i++)
a[row][i] /= a[row][row];
b[row] /= a[row][row];
// a[row][row] = 1;
for (int i = 0; i < n; i++) {
double x = a[i][row];
if (i != row && x != 0) {
// row + 1 instead of row is an optimization
for (int j = row + 1; j < n; j++)
a[i][j] -= a[row][j] * x;
b[i] -= b[row] * x;
}
}
}
return b;
}
// Usage example
public static void main(String[] args) {
double[][] a = { { 4, 2, -1 }, { 2, 4, 3 }, { -1, 3, 5 } };
double[] b = { 1, 0, 0 };
double[][] a1 = a.clone();
for (int i = 0; i < a.length; i++)
a1[i] = a[i].clone();
double[] b1 = b.clone();
double[] x = gauss(a, b);
for (int i = 0; i < a.length; i++) {
double y = 0;
for (int j = 0; j < a[i].length; j++)
y += a1[i][j] * x[j];
if (Math.abs(b1[i] - y) > 1e-9) {
System.err.println("error");
return;
}
}
}
}