Advertisement
greannmhar

хуятрица

May 27th, 2024
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define MAX_SIZE 100
  6.  
  7. typedef double (*Matrix)[MAX_SIZE];
  8.  
  9. double norm(Matrix A, int n);
  10. double determinant(Matrix A, int n);
  11. double** inverse_matrix(Matrix A, int n);
  12.  
  13. double norm(Matrix A, int n) {
  14.     double max_norm = 0.0;
  15.     for (int i = 0; i < n; i++) {
  16.         for (int j = 0; j < n; j++) {
  17.             double abs_val = fabs(A[i][j]);
  18.             if (abs_val > max_norm) {
  19.                 max_norm = abs_val;
  20.             }
  21.         }
  22.     }
  23.     return max_norm;
  24. }
  25.  
  26. double** inverse_matrix(Matrix A, int n) {
  27.     double** adjoint = malloc(n * sizeof(double*));
  28.     for (int i = 0; i < n; i++) {
  29.         adjoint[i] = malloc(n * sizeof(double));
  30.     }
  31.     // Вычисление алгебраических дополнений
  32.     for (int i = 0; i < n; i++) {
  33.         for (int j = 0; j < n; j++) {
  34.             int sub_n = n - 1;
  35.             double (*sub_matrix)[sub_n] = malloc(sub_n * sizeof(double));
  36.             for (int k = 0; k < sub_n; k++) {
  37.                 for (int l = 0; l < sub_n; l++) {
  38.                     sub_matrix[k][l] = A[k < i ? k : k + 1][l < j ? l : l + 1];
  39.                 }
  40.             }
  41.  
  42.             double det_sub = determinant(sub_matrix, sub_n);
  43.             int sign = (i + j) % 2 == 0 ? 1 : -1;
  44.             adjoint[i][j] = sign * det_sub;
  45.  
  46.             free(sub_matrix);
  47.         }
  48.     }
  49.  
  50.     // Транспонирование матрицы алгебраических дополнений
  51.     double** A_inv = malloc(n * sizeof(double*));
  52.     for (int i = 0; i < n; i++) {
  53.         A_inv[i] = malloc(n * sizeof(double));
  54.     }
  55.  
  56.     for (int i = 0; i < n; i++) {
  57.         for (int j = 0; j < n; j++) {
  58.             A_inv[i][j] = adjoint[j][i];
  59.         }
  60.     }
  61.  
  62.     for (int i = 0; i < n; i++) {
  63.         free(adjoint[i]);
  64.     }
  65.     free(adjoint);
  66.  
  67.     return A_inv;
  68. }
  69.  
  70. double determinant(Matrix A, int n) {
  71.     double det = 0.0;
  72.     if (n == 1) {
  73.         det = A[0][0];
  74.     } else if (n == 2) {
  75.         det = A[0][0] * A[1][1] - A[0][1] * A[1][0];
  76.     } else {
  77.         for (int j = 0; j < n; j++) {
  78.             double (*sub_matrix)[n - 1] = malloc((n - 1) * sizeof(double));
  79.             for (int k = 1; k < n; k++) {
  80.                 for (int l = 0; l < n; l++) {
  81.                     sub_matrix[k - 1][l < j ? l : l + 1] = A[k][l];
  82.                 }
  83.             }
  84.  
  85.             det += (A[0][j] * (j % 2 == 0 ? 1 : -1) * determinant(sub_matrix, n - 1));
  86.             free(sub_matrix);
  87.         }
  88.     }
  89.     return det;
  90. }
  91.  
  92. int main() {
  93.     int n;
  94.     FILE *file = fopen("input.txt", "r");
  95.     if (file == NULL) {
  96.         printf("Error opening file.\n");
  97.         return -1;
  98.     }
  99.  
  100.     fscanf(file, "%d", &n);
  101.     double (*A)[n] = malloc(n * sizeof(double));
  102.     for (int i = 0; i < n; i++) {
  103.         for (int j = 0; j < n; j++) {
  104.             fscanf(file, "%lf", &A[i][j]);
  105.         }
  106.     }
  107.     fclose(file);
  108.  
  109.     double** A_inv = inverse_matrix(A, n);
  110.     double norm_n = norm((Matrix) A_inv, n);
  111.     printf("Норма невязки: %.2e\n", norm_n);
  112.  
  113.     for (int i = 0; i < n; i++) {
  114.         free(A[i]);
  115.     }
  116.     free(A);
  117.  
  118.     for (int i = 0; i < n; i++) {
  119.         free(A_inv[i]);
  120.     }
  121.     free(A_inv);
  122.  
  123.     return 0;
  124. }
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement