Advertisement
dark-s0ul

Untitled

Dec 24th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <cmath>
  7. #include <iomanip>
  8.  
  9. void print(double matrix[4][5]) {
  10.     for (int i = 0; i < 4; i++) {
  11.         for (int j = 0; j < 5; j++) {
  12.            cout << setw(5) << matrix[i][j];
  13.         }
  14.         cout << endl;
  15.     }
  16. }
  17.  
  18. void CompletePivoting(double a[4][5]) {
  19.     cout << "Complete pivoting method" << endl;
  20.     print(a);
  21.  
  22.     int cl[4];
  23.     vector<vector<double>> t(4), matrix(4);
  24.     for (int i = 0; i < 4; i++) {
  25.         matrix[i].resize(5);
  26.         for (int j = 0; j < 5; j++) {
  27.             matrix[i][j] = a[i][j];
  28.         }
  29.     }
  30.  
  31.     for (int k = 0; k < 3; k++) {
  32.         int p = 0, q = 0;
  33.  
  34.         double a = matrix[0][0];
  35.         for (int i = 0; i < 4 - k; i++) {
  36.             for (int j = 0; j < 4 - k; j++) {
  37.                 if (fabs(matrix[i][j]) > fabs(a)) {
  38.                     a = matrix[i][j];
  39.                     p = i;
  40.                     q = j;
  41.                 }
  42.             }
  43.         }
  44.  
  45.         for (int i = 0; i < 4 - k; i++) {
  46.             if (i != p) {
  47.                 double m = -matrix[i][q] / a;
  48.                 for (int j = 0; j < 5 - k; j++) {
  49.                     matrix[i][j] += matrix[p][j] * m;
  50.                 }
  51.             }
  52.         }
  53.  
  54.         cl[3 - k] = q;
  55.         t[3 - k] = matrix[p];
  56.  
  57.         matrix.erase(matrix.begin() + p);
  58.  
  59.         for (int i = 0; i < 3 - k; i++) {
  60.             matrix[i].erase(matrix[i].begin() + q);
  61.         }
  62.     }
  63.  
  64.     cl[0] = 0;
  65.     t[0] = matrix[0];
  66.  
  67.     double x[4];
  68.     for (int i = 0; i < 4; i++) {
  69.         double s = 0;
  70.         for (int j = 0, index = 0; j < t[i].size() - 1; j++) {
  71.             if (j == cl[i]) continue;
  72.             s += x[index++] * t[i][j];
  73.         }
  74.         x[i] = (t[i][t[i].size() - 1] - s) / t[i][cl[i]];
  75.     }
  76.  
  77.     int counter[4] {0};
  78.     double X[4] {0};
  79.     for (int i = 0; i < 4; i++) {
  80.         X[(counter[cl[i]] += cl[i] + 1) - 1] = x[i];
  81.     }
  82.  
  83.     for (int i = 0; i < 4; i++) {
  84.         cout << "x" << (i + 1) << " = " << X[i] << endl;
  85.     }
  86.  
  87.  
  88. }
  89.  
  90. void SimpleIteration(double matrix[4][5]) {
  91.     cout << endl << "Simple iteration method" << endl;
  92.     print(matrix);
  93.  
  94.     double q = 0, result[4], x0[4];
  95.  
  96.     for (int i = 0; i < 4; i++) {
  97.         double a = matrix[i][i];
  98.         matrix[i][4] /= a;
  99.         for (int j = 0; j < 4; j++) {
  100.             if (j != i) {
  101.                 matrix[i][j] /= a * -1;
  102.             } else {
  103.                 matrix[i][j] = 0;
  104.             }
  105.         }
  106.     }
  107.     for (int i = 0; i < 4; i++) {
  108.         double a = 0;
  109.         for (int j = 0; j < 4; j++) {
  110.             a += abs(matrix[i][j]);
  111.         }
  112.         if (q < a) {
  113.             q = a;
  114.         }
  115.     }
  116.     for (int i = 0; i < 4; i++) {
  117.         x0[i] = matrix[i][4];
  118.     }
  119.  
  120.     printf("|   x1   |   x2   |   x3   |   x4   |\n");
  121.    
  122.     while (true) {
  123.         printf("|");
  124.         for (int i = 0; i < 4; i++) {
  125.             result[i] = matrix[i][4];
  126.             for (int j = 0; j < 4; j++) {
  127.                 result[i] += matrix[i][j] * x0[j];
  128.             }
  129.             printf("%7.3f |", result[i]);
  130.         }
  131.         printf("\n");
  132.         double a = abs(result[0] - x0[0]);
  133.         for (int i = 1; i < 4; i++) {
  134.             double t = abs(result[i] - x0[i]);
  135.             if (t > a) a = t;
  136.         }
  137.  
  138.         if (a <= abs((1 - q) * 1e-2 / q)) break;
  139.  
  140.         for (int i = 0; i < 4; i++) {
  141.             x0[i] = result[i];
  142.         }
  143.     }
  144. }
  145.  
  146. int main() {
  147.     double AB[4][5] = {
  148.         {  3, 19, 11,  8, 149 },
  149.         {  9, 31,  3, 18, 257 },
  150.         { 11,  7, 32, 13, 143 },
  151.         { 12, 19, 12,  5, 144 }
  152.     };
  153.    
  154.     CompletePivoting(AB);
  155.  
  156.     double matrix[4][5] = {
  157.         {  9,   0,  1, -3,  -5 }, //[3] - [0]
  158.         {  3,  19, 11,  8, 149 }, //[0]
  159.         { -1, -12, 20,  8,  -1 }, //[3] * -1 + [2]
  160.         {  5,   0, 12, 18, 107 }  //[1] + [2] - [3] - [0]
  161.     };
  162.  
  163.     SimpleIteration(matrix);
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement