Advertisement
OMEGAHEAD_MonkoX

Untitled

Oct 23rd, 2022 (edited)
624
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.25 KB | None | 0 0
  1. void normalize_submatrix(double **data, size_t k, size_t n)
  2. {
  3.     for (size_t i = k; i < n; ++i)
  4.     {
  5.         double temp = data[i][k];
  6.         if (!(fabs(temp) < EPS))
  7.         {
  8.             for (size_t j = 0; j < n + 1; ++j)
  9.                 data[i][j] /= temp;
  10.             if (i != k)
  11.                 for (size_t j = 0; j < n + 1; ++j)
  12.                     data[i][j] -= data[k][j];
  13.         }
  14.     }
  15. }
  16.  
  17. double find_max_in_submatrix(double **data, size_t n, size_t k, size_t *index_i, size_t *index_j)
  18. {
  19.     double max = fabs(data[k][k]);
  20.     *index_i = k;
  21.     *index_j = k;
  22.     for (size_t i = k; i < n; ++i)
  23.         for (size_t j = k; j < n; ++j)
  24.             if (fabs(data[i][j]) - max > EPS)
  25.             {
  26.                 max = fabs(data[i][j]);
  27.                 *index_i = i;
  28.                 *index_j = j;
  29.             }
  30.    
  31.     return max;
  32. }
  33.  
  34. void swap_pointers(double **a, double **b)
  35. {
  36.     double *temp = *a;
  37.     *a = *b;
  38.     *b = temp;
  39. }
  40.  
  41. void swap_columns(double **data, size_t n, size_t k, size_t index, size_t *lead_columns)
  42. {
  43.     for (size_t i = 0; i < n; ++i)
  44.     {
  45.         double temp = data[i][k];
  46.         data[i][k] = data[i][index];
  47.         data[i][index] = temp;
  48.     }
  49.     size_t temp = lead_columns[k];
  50.     lead_columns[k] = lead_columns[index];
  51.     lead_columns[index] = temp;
  52. }
  53.  
  54. int gauss(double **data, double *answers, size_t n)
  55. {
  56.     double max;
  57.     size_t *lead_columns = malloc(n * sizeof(size_t));
  58.     if (!lead_columns)
  59.         return ERROR_MEMORY;
  60.     for (size_t i = 0; i < n; ++i)
  61.         lead_columns[i] = i;
  62.     for (size_t k = 0; k < n; ++k)
  63.     {
  64.         size_t index_i, index_j;
  65.         max = find_max_in_submatrix(data, n, k, &index_i, &index_j);
  66.         if (max < EPS)
  67.         {
  68.             free(lead_columns);
  69.             return ERROR_NOT_SOLVABLE;
  70.         }
  71.  
  72.         swap_columns(data, n, k, index_j, lead_columns);        
  73.         swap_pointers(data + k, data + index_i);
  74.         normalize_submatrix(data, k, n);
  75.     }
  76.  
  77.     for (size_t k = n; k > 0; --k)
  78.     {
  79.         answers[lead_columns[k - 1]] = data[k - 1][n];
  80.         for (size_t i = 0; i < k - 1; ++i)
  81.             data[i][n] -= data[i][k - 1] * answers[lead_columns[k - 1]];
  82.     }
  83.     free(lead_columns);
  84.  
  85.     return OK;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement