dark-s0ul

lab3.cpp

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