package top.actim.cc;
public class Gauss {
public static void main(String[] args) {
Marix mat = new Marix();
mat.mat = new double[][] { { 1, 2, -1, 3 }, { 1, -1, 5, 0 }, { 4, 1, -2, 2 } };
for (int i = 1; i < 3; i++) {
mat.chooseColMainEle(i);
mat.show();
System.out.println();
mat.cancleEle(i);
mat.show();
System.out.println();
}
double[] x = new double[4];
for (int i = 3; i > 0; i--) {
System.out.print("x" + i + " = ");
double son = mat.get(i, 4);
for (int j = 3; j > i; j--) {
son -= x[j] * mat.get(i, j);
}
x[i] = son / mat.get(i, i);
System.out.println(x[i]);
}
}
}
class Marix {
double[][] mat;
double set(int a, int b, double n) {
mat[a - 1][b - 1] = n;
return n;
}
double get(int a, int b) {
return mat[a - 1][b - 1];
}
double chooseColMainEle(int b) {
double max = -1;
int maxNo = b;
for (int i = b; i <= mat.length; i++) {
if (Math.abs(get(i, b)) > max) {
max = Math.abs(get(i, b));
maxNo = i;
}
}
double[] temp = mat[maxNo - 1];
mat[maxNo - 1] = mat[b - 1];
mat[b - 1] = temp;
return get(b, b);
}
void cancleEle(int a) {
double main = get(a, a);
for (int i = a + 1; i <= mat.length; i++) {
double ia = get(i, a);
ia = set(i, a, (ia / main));
for (int j = a + 1; j <= mat[0].length; j++) {
set(i, j, get(i, j) - get(a, j) * ia);
}
}
}
void show() {
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[0].length; j++) {
System.out.print(mat[i][j]);
System.out.print("\t");
}
System.out.println();
}
}
}