Lesnic

AGLA 2

Mar 13th, 2020
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. class Matrix
  8. {
  9. private:
  10.     int size;
  11.     double** matrix, ** inverse;
  12.  
  13. public:
  14.     Matrix(int size) {
  15.         (*this).size = size;
  16.         matrix = new double* [size];
  17.         inverse = new double* [size];
  18.         for (int i = 0; i < size; i++) {
  19.             matrix[i] = new double[size];
  20.             inverse[i] = new double[size];
  21.         }
  22.  
  23.         for (int i = 0; i < size; i++)
  24.             for (int j = 0; j < size; j++)
  25.                 inverse[i][j] = (i == j) ? inverse[i][j] = 1 : inverse[i][j] = 0;
  26.     }
  27.  
  28.     double getElement(int i, int j) { return matrix[i][j]; }
  29.     int getSize() { return size; }
  30.  
  31.     void permutation(int r1, int r2) {
  32.         double* temp = *(matrix + r1);
  33.         *(matrix + r1) = *(matrix + r2);
  34.         *(matrix + r2) = temp;
  35.  
  36.         temp = *(inverse + r1);
  37.         *(inverse + r1) = *(inverse + r2);
  38.         *(inverse + r2) = temp;
  39.     }
  40.  
  41.     void elimination(int upperLine, int bottomLine) {
  42.         double constant = matrix[bottomLine][upperLine] / matrix[upperLine][upperLine];
  43.  
  44.         if (matrix[bottomLine][upperLine] != 0) {
  45.  
  46.             for (int j = 0; j < size; j++) {
  47.                 matrix[bottomLine][j] -= matrix[upperLine][j] * constant;
  48.                 inverse[bottomLine][j] -= inverse[upperLine][j] * constant;
  49.             }
  50.         }
  51.     }
  52.  
  53.     void inverseMatrix() {
  54.         for (int i = 0; i < size; i++) {
  55.             for (int j = 0; j < size; j++) {
  56.                 cout << fixed << setprecision(2) << inverse[i][j];
  57.                 if (j != size - 1)
  58.                     cout << " ";
  59.             }
  60.             cout << endl;
  61.         }
  62.     }
  63.  
  64.     void normalization() {
  65.         for (int i = 0; i < size; i++) {
  66.             double constant = matrix[i][i];
  67.             for (int j = 0; j < size; j++) {
  68.                 matrix[i][j] /= constant;
  69.                 inverse[i][j] /= constant;
  70.             }
  71.         }
  72.     }
  73.  
  74.     friend istream& operator>>(istream& cin, Matrix base) {
  75.         for (int i = 0; i < base.size; i++)
  76.             for (int j = 0; j < base.size; j++)
  77.                 cin >> base.matrix[i][j];
  78.         return cin;
  79.     }
  80.     friend ostream& operator<<(ostream& cout, Matrix base) {
  81.         for (int i = 0; i < base.size; i++) {
  82.             for (int j = 0; j < 2 * base.size; j++) {
  83.                 if (j < base.size) {
  84.                     if (base.matrix[i][j] < 0.005 && base.matrix[i][j] > -0.005)
  85.                         cout << "0.00";
  86.                     else
  87.                         cout << fixed << setprecision(2) << base.matrix[i][j];
  88.                 }
  89.                 else {
  90.                     if (base.inverse[i][j - base.size] < 0.005 && base.inverse[i][j - base.size] > -0.005)
  91.                         cout << "0.00";
  92.                     else
  93.                         cout << fixed << setprecision(2) << base.inverse[i][j - base.size];
  94.                 }
  95.  
  96.                 if (j != 2 * base.size - 1)
  97.                     cout << " ";
  98.             }
  99.             cout << endl;
  100.         }
  101.         return cout;
  102.     }
  103. };
  104.  
  105. void output(int& step, const Matrix& base, bool permutation) {
  106.     cout << "step #" << step << ": ";
  107.     if (permutation)
  108.         cout << "permutation";
  109.     else {
  110.         cout << "elimination";
  111.         ++step;
  112.     }
  113.     cout << endl << base;
  114. }
  115.  
  116. void calculusFirst(Matrix& base, int line, int& step) {
  117.     int maxLine = line;
  118.     for (int i = line + 1; i < base.getSize(); i++) {
  119.         if (abs(base.getElement(i, line)) > abs(base.getElement(maxLine, line)))
  120.             maxLine = i;
  121.     }
  122.    
  123.     if (maxLine != line) {
  124.         base.permutation(line, maxLine);
  125.         output(step, base, true);
  126.     }
  127.  
  128.     for (int i = line + 1; i < base.getSize(); i++) {
  129.         base.elimination(line, i);
  130.         output(step, base, false);
  131.     }
  132. }
  133.  
  134. void calculusSecond(Matrix& base, int line, int& step) {
  135.  
  136.     for (int i = line - 1; i >= 0; i--) {
  137.         base.elimination(line, i);
  138.         output(step, base, false);
  139.     }
  140. }
  141.  
  142. int main()
  143. {
  144.     int n, step = 1;
  145.     cin >> n;
  146.     Matrix base(n);
  147.     cin >> base;
  148.     cout << "step #0: Augmented Matrix\n" << base;
  149.  
  150.     cout << "Direct way:\n";
  151.     for (int i = 0; i < n; i++)
  152.         calculusFirst(base, i, step);
  153.  
  154.     cout << "Way back:\n";
  155.     for (int i = n - 1; i > 0; i--)
  156.         calculusSecond(base, i, step);
  157.    
  158.     base.normalization();
  159.     cout << "Diagonal normalization:" << endl << base;
  160.     cout << "result:" << endl;
  161.     base.inverseMatrix();
  162.    
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment