Advertisement
dark-s0ul

lab3.cpp

Dec 26th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. void complete_pivoting(vector<vector<double>> matrix) {
  2.     cout << "Complete pivoting method" << endl << matrix << endl;
  3.  
  4.     const int matrix_size = matrix.size();
  5.     const int matrix_size_minus_one = matrix_size - 1;
  6.  
  7.     int columns[matrix_size];
  8.     vector<vector<double>> modified(matrix_size);
  9.  
  10.     for (int k = 0; k < matrix_size_minus_one; k++) {
  11.         const int matrix_size_minus_k = matrix_size - k;
  12.         const int matrix_size_minus_k_minus_one = matrix_size_minus_k - 1;
  13.         const int matrix_size_minus_k_plus_one = matrix_size_minus_k + 1;
  14.         const int current_matrix_size = matrix.size();
  15.  
  16.         int p = 0, q = 0;
  17.  
  18.         double a = matrix[0][0];
  19.         for (int i = 0; i < current_matrix_size; i++) {
  20.             for (int j = 0; j < current_matrix_size; j++) {
  21.                 if (fabs(matrix[i][j]) > fabs(a)) {
  22.                     a = matrix[i][j];
  23.                     p = i;
  24.                     q = j;
  25.                 }
  26.             }
  27.         }
  28.         double one_div_a = 1.0 / a;
  29.         for (int i = 0; i < matrix_size_minus_k; i++) {
  30.             if (i == p) continue;
  31.  
  32.             double matrix_size = -matrix[i][q] * one_div_a;
  33.             for (int j = 0; j < matrix_size_minus_k_plus_one; j++) {
  34.                 matrix[i][j] += matrix[p][j] * matrix_size;
  35.             }
  36.         }
  37.  
  38.         columns[matrix_size_minus_k_minus_one] = q;
  39.         modified[matrix_size_minus_k_minus_one] = matrix[p];
  40.        
  41.         matrix.erase(matrix.begin() + p);
  42.  
  43.         for (int i = 0; i < matrix.size(); i++) {
  44.             matrix[i].erase(matrix[i].begin() + q);
  45.         }
  46.     }
  47.  
  48.     columns[0] = 0;
  49.     modified[0] = matrix[0];
  50.    
  51.     int counter[4] {0}, cols[4];
  52.     for (int i = modified.size() - 1; i >= 0; i--) {
  53.         cols[i] = counter[columns[i]]++ + columns[i];
  54.     }
  55.  
  56.     double x[matrix_size];
  57.     for (int i = 0; i < matrix_size; i++) {
  58.         double s = 0;
  59.         for (int j = 0, index = 0; j < modified[i].size() - 1; j++, index++) {
  60.             if (j == columns[i]) continue;
  61.             s += x[cols[index]] * modified[i][j];
  62.         }
  63.         x[cols[i]] = (modified[i][modified[i].size() - 1] - s) / modified[i][columns[i]];
  64.     }
  65.  
  66.     for (int i = 0; i < 4; i++) {
  67.         cout << "x" << (i + 1) << " = " << x[i]<< endl;
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement