Обратная матрица
Программа работает не во всех случаях, например: если убрать условие assert(Det(n, a) != 0), то в случае матрицы 2 * 2, 1 строка: (3 -1), 2 строка: (2 3) программа работает верно, но если оставить условие assert(Det(n, a) != 0), то программа работает неверно. Хотелось бы разобраться в чем заключается ошибка.
#include <stdio.h>
#include <assert.h>
double Det(int n, double(*mat)[n]) {
int i, j, k;
double det = 1, a;
for(k = 0 ; k < n; k++) {
if (mat[k][k] == 0)
for(j = k+1; j < n; j++) {
if(mat[j][k] != 0) {
for(i = k; i < n; i++) {
a = mat[k][i];
mat[k][i] = mat[j][i];
mat[j][i] = a;
}
det = -det;
break;
}
}
if(mat[k][k] == 0) {
det = 0;
break;
}
for(i = k + 1; i < n; i++) {
a = mat[i][k] / mat[k][k];
for(j = k; j < n; j++)
mat[i][j] = mat[i][j] - mat[k][j] * a;
}
}
if(det != 0) {
if(mat[n-1][n-1] == 0) {
det = 0;
}
else {
for(i = 0 ; i < n ;i++) {
det *= mat[i][i];
}
}
}
return det;
}
int main () {
int n, i, j, k;
scanf("%d", &n);
double a[n][n], e[n][n], x[n][n], t;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
scanf("%lf", &a[i][j]);
}
}
assert(Det(n, a) != 0);
for(i = 0; i < n; i++) {
e[i][i] = 1;
for(j = 0; j < n; j++) {
if(j != i)
e[i][j] = 0;
}
}
for(k = 0; k < n; k++) {
for(i = k+1; i < n; i++) {
t = a[i][k] / a[k][k];
a[i][k] = 0;
for(j = k+1; j < n; j++) {
a[i][j] = a[i][j] - t*a[k][j];
}
for(j = 0; j < n; j++) {
e[i][j] = e[i][j] - t*e[k][j];
}
}
}
for(j = 0; j < n; j++) {
for(i = n - 1; i > -1; i--){
x[i][j] = e[i][j];
for(k = i+1; k < n; k++) {
x[i][j] = x[i][j] - a[i][k] * x[k][j];
}
x[i][j] = x[i][j] / a[i][i];
}
}
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
printf ("%.3lf ", x[i][j]);
}
puts("\n");
}
}