#include #include #include double **inverse(double **matrix, int order) { double **inverse = calloc(order, sizeof(double *)); for (int i = 0; i < order; i++) { inverse[i] = calloc(2 * order, sizeof(double)); inverse[i][order + i] = 1; memcpy(inverse[i], matrix[i], order * sizeof(double)); } for (int i = 0; i < order; i++) { for (int j = 0; j < order; j++) { if (i == j) continue; double r = inverse[j][i] / inverse[i][i]; for (int k = 0; k < order * 2; k++) inverse[j][k] -= r * inverse[i][k]; } } for (int i = 0; i < order; i++) { for (int j = 0; j < order; j++) inverse[i][j + order] /= inverse[i][i]; } return inverse; } int main() { const int ORDER = 3; double **matrix = malloc(ORDER * sizeof(double *)); for (int i = 0; i < ORDER; i++) matrix[i] = malloc(ORDER * sizeof(double)); matrix[0][0] = 92, matrix[0][1] = 4.5, matrix[0][2] = 61; // 92x + 4.5y + 61z = 0 matrix[1][0] = -2, matrix[1][1] = 0, matrix[1][2] = 92387; // -2x + 92387z = 0 matrix[2][0] = -2, matrix[2][1] = 0, matrix[2][2] = -23; // -2x - 23z = 0 double **inv = inverse(matrix, ORDER); for (int i = 0; i < ORDER; i++) { for (int j = 0; j < ORDER; j++) printf("%lf ", inv[i][j + ORDER]); printf("\n"); free(inv[i]); free(matrix[i]); } free(inv); free(matrix); }