Решение СЛУ методом Крамера
Попытался написать программу, которая ищет решения СЛУ с помощью метода Крамера, но программа выводит неверное решение, попытался найти возможные ошибки, но все тщетно. Если есть более оптимальный код, то хотелось бы его увидеть.
#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;
}
double Sol(int n, double (*mat)[n], double f[n], int k) {
int i;
for(i = 0 ; i < n; i++)
mat[i][k] = f[i];
double theta = Det(n, mat);
return theta;
}
int main () {
int i, j, k, n;
puts("Add N");
scanf ("%d", &n);
double mat[n][n], f[n], a[n][n];
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
scanf ("%lf", &mat[i][j]);
a[i][j] = mat[i][j];
}
for(i = 0; i < n; i++)
scanf ("%lf", &f[i]);
assert(Det(n, mat) != 0); //Probably change mat
double det = Det(n, mat);
printf ("%lf\n", det);
for(k = 0; k < n; k++) {
double s = Sol(n, a, f, k)/det;
printf ("Solution: %lf\n", s);
}
}