dark-s0ul

lab3.cpp

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