55 lines
1.4 KiB
C
55 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
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);
|
|
}
|