Advertisement
dark-s0ul

lab3 oksana

Dec 10th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.34 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <cmath>
  7.  
  8. void PrintMatrix(vector<vector<double>> matrix) {
  9.     for (int i = 0; i < matrix.size(); i++) {
  10.         for (int j = 0; j < matrix[i].size(); j++) {
  11.             printf("%12f", matrix[i][j]);
  12.         }
  13.         cout << endl;
  14.     }
  15.     cout << endl;
  16. }
  17.  
  18. void DeleteRow(vector<vector<double>> &matrix, int line) {
  19.     if (line >= matrix.size()) return;
  20.     matrix.erase(matrix.begin() + line);
  21. }
  22.  
  23. void DeleteColumn(vector<vector<double>> &matrix, int column) {
  24.     if (column >= matrix[0].size()) return;
  25.     for (int i = 0; i < matrix.size(); i++) {
  26.         matrix[i].erase(matrix[i].begin() + column);
  27.     }
  28. }
  29.  
  30. void ChooseMainElement(vector<vector<double>> matrix) {
  31.     cout << "Choose primary element method" << endl;
  32.     PrintMatrix(matrix);
  33.  
  34.     vector<vector<double>> matrix1;
  35.     vector<int> pos;
  36.  
  37.     int N = matrix.size();
  38.     int M = matrix[0].size();
  39.    
  40.     for (int k = 0; k < M - 2; k++) {
  41.         int p = 0, q = 0;
  42.  
  43.         double a = matrix[0][0];
  44.         for (int i = 0; i < N - k; i++) {
  45.             for (int j = 0; j < M - k - 1; j++) {
  46.                 if (fabs(matrix[i][j]) > fabs(a)) {
  47.                     a = matrix[i][j];
  48.                     p = i;
  49.                     q = j;
  50.                 }
  51.             }
  52.         }
  53.  
  54.         vector<double> m;
  55.         for (int i = 0; i < (N - k); i++) {
  56.             m.push_back(-matrix[i][q] / a);
  57.         }
  58.  
  59.  
  60.         for (int i = 0; i < N - k; i++) {
  61.             if (i == p) continue;
  62.  
  63.             for (int j = 0; j < M - k; j++) {
  64.                 matrix[i][j] += matrix[p][j] * m[i];
  65.             }
  66.         }
  67.         pos.insert(pos.begin(), q);
  68.         matrix1.insert(matrix1.begin(), matrix[p]);
  69.  
  70.         DeleteRow(matrix, p);
  71.         DeleteColumn(matrix, q);
  72.     }
  73.  
  74.     pos.insert(pos.begin(), 0);
  75.     matrix1.insert(matrix1.begin(), matrix[0]);
  76.  
  77.     vector<double> X;
  78.     for (int i = 0; i < matrix1.size(); i++) {
  79.         double s = 0;
  80.         for (int j = 0, index = 0; j < matrix1[i].size() - 1; j++) {
  81.             if (j == pos[i]) continue;
  82.             s += X[index++] * matrix1[i][j];
  83.         }
  84.         X.push_back((matrix1[i][matrix1[i].size() - 1] - s) / matrix1[i][pos[i]]);
  85.     }
  86.  
  87.  
  88.  
  89.     printf("%f\t%f\t%f\t%f\n", X[0], X[1], X[3], X[2]);
  90. }
  91.  
  92. void SimpleIteration(vector<vector<double>> matrix) {
  93.     cout << endl << "Simple iteration method" << endl;
  94.     PrintMatrix(matrix);
  95.  
  96.     int N = matrix.size();
  97.     int M = matrix[0].size();
  98.  
  99.     double q = 0, result[N], x0[N];
  100.  
  101.     for (int i = 0; i < N; i++) {
  102.         double a = matrix[i][i];
  103.         matrix[i][M - 1] /= a;
  104.         for (int j = 0; j < N; j++) {
  105.             if (j != i) {
  106.                 matrix[i][j] /= a * -1;
  107.             } else {
  108.                 matrix[i][j] = 0;
  109.             }
  110.         }
  111.     }
  112.     for (int i = 0; i < N; i++) {
  113.         double a = 0;
  114.         for (int j = 0; j < N; j++) {
  115.             a += abs(matrix[i][j]);
  116.         }
  117.         if (q < a) {
  118.             q = a;
  119.         }
  120.     }
  121.     for (int i = 0; i < N; i++) {
  122.         x0[i] = matrix[i][M - 1];
  123.     }
  124.  
  125.     printf("-------------------------------------\n");
  126.     printf("|%7s |%7s |%7s |%7s |\n", "x1", "x2", "x3", "x4");
  127.     printf("-------------------------------------\n");
  128.    
  129.     float t = abs((1 - q) * 1e-2 / q);
  130.     while (true) {
  131.         printf("|");
  132.         for (int i = 0; i < N; i++) {
  133.             result[i] = matrix[i][M - 1];
  134.             for (int j = 0; j < N; j++) {
  135.                 result[i] += matrix[i][j] * x0[j];
  136.             }
  137.             printf("%7.3f |", result[i]);
  138.         }
  139.         printf("\n-------------------------------------\n");
  140.         double a = abs(result[0] - x0[0]);
  141.         for (int i = 1; i < N; i++) {
  142.             if (abs(result[i] - x0[i]) > a) {
  143.                 a = abs(result[i] - x0[i]);
  144.             }
  145.         }
  146.  
  147.         if (a <= t) break;
  148.  
  149.         for (int i = 0; i < N; i++) {
  150.             x0[i] = result[i];
  151.         }
  152.     }
  153. }
  154.  
  155. vector<double> operator-(const vector<double> &l, const vector<double> &r) {
  156.     vector<double> result(l.size());
  157.     for (int i = 0; i < l.size(); i++) {
  158.         result[i] = l[i] - r[i];
  159.     }
  160.     return result;
  161. }
  162.  
  163. vector<double> operator+(const vector<double> &l, const vector<double> &r) {
  164.     vector<double> result(l.size());
  165.     for (int i = 0; i < l.size(); i++) {
  166.         result[i] = l[i] + r[i];
  167.     }
  168.     return result;
  169. }
  170.  
  171. vector<double> operator*(const vector<double> &l, const double &r) {
  172.     vector<double> result(l.size());
  173.     for (int i = 0; i < l.size(); i++) {
  174.         result[i] = l[i] * r;
  175.     }
  176.     return result;
  177. }
  178.  
  179. int main() {
  180.     vector<vector<double>> AB = {
  181.         {  3, 19, 11,  8, 149 },
  182.         {  9, 31,  3, 18, 257 },
  183.         { 11,  7, 32, 13, 143 },
  184.         { 12, 19, 12,  5, 144 }
  185.     };
  186.     ChooseMainElement(AB);
  187.  
  188.     vector<vector<double>> matrix = {
  189.         AB[3] - AB[0],
  190.         AB[0],
  191.         AB[3] * -1 + AB[2],
  192.         AB[1] + AB[2] - AB[3] - AB[0]
  193.     };
  194.     /*vector<vector<double>> matrix = {
  195.         {  9,   0,  1, -3,  -5 }, //[3] - [0]
  196.         {  3,  19, 11,  8, 149 }, //[0]
  197.         { -1, -12, 20,  8,  -1 }, //[3] * -1 + [2]
  198.         {  5,   0, 11, 18, 107 }  //[1] + [2] - [3] - [0] (мало бути 12 а не 11)
  199.     };*/
  200.  
  201.     SimpleIteration(matrix);
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement