53 lines
1.3 KiB
Java
53 lines
1.3 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|
|
}
|