Advertisement
dark-s0ul

lab3.cpp

Dec 26th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. void print_matrix(vector<vector<double>> matrix, int n, int m) {
  10.     int i, j;
  11.     for (i = 0; i < n; i++){
  12.         for (j = 0; j < m; j++){
  13.             printf("%8.2f", matrix [i][j]);
  14.         }
  15.         printf("\n");
  16.     }
  17.     return;
  18. }
  19.  
  20. void CompletePivoting(vector<vector<double>> matrix, int n, int m) {
  21.     printf("Complete pivoting method\n");
  22.     print_matrix(matrix, n, m);
  23.  
  24.     int p, q, line_new = 0;
  25.     double M[n], t[n][m], x[n];
  26.  
  27.     for (int k = 0; k < n - 1; k++){
  28.         double a = 0;
  29.         for (int i = 0; i < n; i++) {
  30.             for (int j = 0; j < m - 1; j++) {
  31.                 if (fabs(matrix[i][j]) > a) {
  32.                     a = fabs(matrix[i][j]);
  33.                     p = i;
  34.                     q = j;
  35.                 }
  36.             }
  37.         }
  38.  
  39.         for (int j = 0; j < m; j++) {
  40.             t[line_new][j] = matrix[p][j];
  41.         }
  42.         line_new++;
  43.  
  44.         for (int i = 0; i < n; i++) {
  45.             M[i] = -matrix[i][q] / a;
  46.         }
  47.  
  48.         for (int i = 0; i < n; i++) {
  49.             for (int j = 0; j < m; j++) {
  50.                 if (i != p) {
  51.                     matrix[i][j] += matrix[p][j] * M[i];
  52.                 }
  53.             }
  54.         }
  55.  
  56.         for (int j = 0; j < m; j++) {
  57.             matrix[p][j] = 0;
  58.         }
  59.  
  60.         for (int i = 0; i < n; i++) {
  61.             matrix[i][q] = 0;
  62.         }
  63.  
  64.     }
  65.    
  66.     for (int i = 0; i < n; i++) {
  67.         if (matrix[i][m - 1] != 0) {
  68.             p = i;
  69.         }
  70.     }
  71.  
  72.     for (int j = 0; j < m; j++) {
  73.         t[line_new][j] = matrix[p][j];
  74.     }
  75.  
  76.     for (int j = 0; j < m-1; j++) {
  77.         x[j] = 0;
  78.     }
  79.  
  80.     for (int i = n - 1; i >= 0; i--){
  81.         double R = t[i][m - 1];
  82.         for (int j = 0; j < m - 1; j++) {
  83.             if ((t[i][j] != 0) && (x[j] != 0)) {
  84.                 R -= t[i][j] * x[j];
  85.             }
  86.         }
  87.         for (int j = 0; j < m - 1; j++) {
  88.             if ((t[i][j] != 0) && (x[j] == 0)) {
  89.                 x[j] = R / t[i][j];
  90.             }
  91.         }
  92.     }
  93.  
  94.     for (int i = 0; i < n; i++) {
  95.         printf("x%i = %f\n", i, x[i]);
  96.     }
  97. }
  98.  
  99. double* SimpleIteration(vector<vector<double>> matrix, int n, int m, double eps) {
  100.     printf("Simple iteration method\n");
  101.     print_matrix(matrix, n, m);
  102.  
  103.     double x[n], x0[n];
  104.     for (int i = 0; i < n; i++) {
  105.         double a = 1.0 / matrix[i][i];
  106.         for (int j = 0; j < m; j++) {
  107.             matrix[i][j] = matrix[i][j] * a;
  108.         }
  109.     }
  110.  
  111.     double q = 0;
  112.     for (int i = 0; i < n; i++) {
  113.         double s = 0;
  114.         for (int j = 0; j < m - 1; j++) {
  115.             if (i != j) {
  116.                 s += fabs(matrix[i][j]);
  117.             }
  118.         }
  119.         if (s > q) q = s;
  120.     }
  121.  
  122.     for (int i = 0; i < n; i++) {
  123.         x0[i] = matrix[i][m-1];
  124.     }
  125.  
  126.     for (int i = 0; i < n; i++) {
  127.         x[i] = matrix[i][m-1];
  128.         for (int j = 0; j < m - 1; j++) {
  129.             if (i != j) {
  130.                 x[i] -= matrix[i][j] * x0[j];
  131.             }
  132.         }
  133.     }
  134.  
  135.     for (int i = 0; i < n; i++) {
  136.         x0[i] = x[i];
  137.     }
  138.  
  139.     int k = 2;
  140.     double m_norma_x = 0;
  141.     do{
  142.         for (int i = 0; i < n; i++) {
  143.             x[i] = matrix[i][m - 1];
  144.             for (int j = 0; j < m - 1; j++) {
  145.                 if (i != j) {
  146.                     x[i] -= matrix[i][j] * x0[j];
  147.                 }
  148.             }
  149.         }
  150.  
  151.         for (int i = 0; i < n; i++)
  152.             x0[i] = x[i] - x0[i];
  153.  
  154.         m_norma_x = fabs(x0[0]);
  155.         for (int i = 1; i < n; i++)
  156.             if (fabs(x0[i]) > m_norma_x)
  157.                 m_norma_x = fabs(x0[i]);
  158.  
  159.         for (int i = 0; i < n; i++) {
  160.             x0[i] = x[i];
  161.         }
  162.  
  163.         k++;
  164.     } while (m_norma_x > eps * ((1 - q) / q));
  165.  
  166.     for (int i = 0; i < n; i++) {
  167.         printf("x%i = %f\n", i, x[i]);
  168.     }
  169. }
  170.  
  171.  
  172. int main(){
  173.     const int m = 5, n = 4;
  174.    
  175.     vector<vector<double>> AB = {
  176.         {8, 4, 8, 20, 148},
  177.         {8, 27, 12, 6, 87},
  178.         {16, 13, 46, 16, 157},
  179.         {19, 10, 7, 17, 169}
  180.     };
  181.  
  182.     vector<vector<double>> T = {
  183.         {50, -23, 0, -6, 91},
  184.         {8, 27, 12, 6, 87},
  185.         {16, 13, 46, 16, 157},
  186.         {8, -19, 4, 34, 209}
  187.     };
  188.  
  189.     CompletePivoting(AB, n, m);
  190.     printf("\n");
  191.     SimpleIteration(T, n, m, 1e-5);
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement