Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include<time.h>
  5. #include<cmath>
  6.  
  7. using namespace std;
  8. //////////////////////////////////////////////////////////////////////////
  9.  
  10.     class Matrix{
  11.  
  12.     public:
  13.         int m;
  14.         int n;
  15.         vector<vector<double> > vvi;
  16.         Matrix() {}
  17.         Matrix(int m, int n) {
  18.             this->m = m;
  19.             this->n = n;
  20.             vvi.resize(m);
  21.             for (int i = 0; i < m; i++) {
  22.                 vvi[i].resize(n);
  23.             }
  24.         }
  25.         void getPrint() {
  26.             for (int i = 0; i < this->m; i++)
  27.             {
  28.                 cout << "| ";
  29.                 for (int j = 0; j < this->n; j++)
  30.                     cout << "" << this->vvi[i][j] << " ";
  31.                 cout << "|";
  32.                 //cout << "" << endl;
  33.                 cout << "" << endl;
  34.             }
  35.             cout << endl;
  36.         }
  37.         void setValue() {
  38.             for (int i = 0; i < this->m; i++)
  39.                 for (int j = 0; j < this->n; j++)
  40.                     cin >> this->vvi[i][j];
  41.            
  42.         }
  43.         void fillMatrix() {
  44.             for (int i = 0; i < this->m; i++)
  45.                 for (int j = 0; j < this->n; j++)
  46.                     this->vvi[i][j] = rand() % 2;
  47.  
  48.         }
  49.  
  50.     };
  51.     Matrix E(Matrix& a) {
  52.         Matrix e(a.m,a.m);
  53.         for (int i = 0; i < e.m; i++)
  54.             for (int j = 0; j < e.n; j++)
  55.                 e.vvi[i][j]=0;
  56.         for (int i = 0; i < e.m; i++)
  57.             e.vvi[i][i] = 1;
  58.         return e;
  59.     }
  60.  
  61.     Matrix E(int m) {
  62.         Matrix e(m, m);
  63.         for (int i = 0; i < m; i++)
  64.             for (int j = 0; j < m; j++)
  65.                 e.vvi[i][j] = 0;
  66.         for (int i = 0; i < m; i++)
  67.             e.vvi[i][i] = 1;
  68.         return e;
  69.     }
  70.     template <typename T>
  71.     Matrix Sum(T& a, T& b) {
  72.         if ((a.n != b.n) or (a.m != b.m))
  73.         {
  74.         }   //cout << "Некорректное выражение!" << endl;
  75.         else
  76.         {
  77.             int n = a.n;
  78.             int m = a.m;
  79.             Matrix c(m, n);
  80.             for (int i = 0; i < m; i++)
  81.             {
  82.                 for (int j = 0; j < n; j++)
  83.                     c.vvi[i][j] = a.vvi[i][j] + b.vvi[i][j];
  84.             }
  85.             return c;
  86.         }
  87.     }
  88.     template <typename T>
  89.     Matrix Mult(T& a, T& b) {
  90.         int m = a.m;
  91.         int n = b.n;
  92.         int f = b.m;
  93.         Matrix c(m, n);
  94.         for (int i = 0; i < m; i++) {
  95.             for (int j = 0; j < n; j++)
  96.             {
  97.                 c.vvi[i][j] = 0;
  98.                 for (int k = 0; k < f; k++)
  99.                     c.vvi[i][j] += a.vvi[i][k] * b.vvi[k][j];
  100.             }
  101.         }
  102.         return c;
  103.     }
  104.  
  105.     Matrix Transp(Matrix& a) {
  106.         Matrix c(a.n, a.m);
  107.         for (int i = 0; i < a.m; i++)
  108.             for (int j = 0; j < a.n; j++)
  109.                 c.vvi[j][i] = a.vvi[i][j];
  110.         return c;
  111.     }
  112.  
  113.    
  114.  
  115.     Matrix GetMatr(Matrix& a, int i, int j) {
  116.         int ki, kj, di, dj;
  117.         Matrix p(a.m - 1, a.n - 1);
  118.         di = 0;
  119.         for (ki = 0; ki < a.m - 1; ki++) { // проверка индекса строки
  120.             if (ki == i) di = 1;
  121.             dj = 0;
  122.             for (kj = 0; kj < a.m - 1; kj++) { // проверка индекса столбца
  123.                 if (kj == j) dj = 1;
  124.                 p.vvi[ki][kj] = a.vvi[ki + di][kj + dj];
  125.             }
  126.         }
  127.         return p;
  128.     }
  129.  
  130.      
  131.  
  132.     Matrix operator * (Matrix a, Matrix b) {
  133.         int m = a.m;
  134.         int n = b.n;
  135.         int f = b.m;
  136.         Matrix c(m, n);
  137.         for (int i = 0; i < m; i++) {
  138.             for (int j = 0; j < n; j++)
  139.             {
  140.                 c.vvi[i][j] = 0;
  141.                 for (int k = 0; k < f; k++)
  142.                     c.vvi[i][j] += a.vvi[i][k] * b.vvi[k][j];
  143.             }
  144.         }
  145.         return c;
  146.     }
  147.  
  148.    
  149.  
  150.     double det(Matrix a) {
  151.         int i, j, k, n;
  152.         double d;
  153.         Matrix p(a.m, a.n);
  154.         j = 0; d = 0;
  155.         k = 1; //(-1) в степени i
  156.         n = a.m - 1;
  157.         if (a.m < 1) cout << "Определитель вычислить невозможно!";
  158.         if (a.m == 1) {
  159.             d = a.vvi[0][0];
  160.             return d;
  161.         }
  162.         if (a.m == 2) {
  163.             d = a.vvi[0][0] * a.vvi[1][1] - (a.vvi[1][0] * a.vvi[0][1]);
  164.             return d;
  165.         }
  166.         if (a.m > 2) {
  167.             for (i = 0; i < a.m; i++) {
  168.                 p = GetMatr(a, i, 0);
  169.                 //cout << a.vvi[i][j] << endl;
  170.                 if (a.vvi[i][0] == 0) continue;
  171.                 if(a.vvi[i][0] != 0) d += k * a.vvi[i][0] * det(p);
  172.                 k = -k;
  173.             }
  174.         }
  175.         return d;
  176.     }
  177.  
  178.     ////////////////////////////////////////////////////////////////////////////
  179.  
  180.     class Vector :public Matrix {
  181.     public:
  182.         Vector(int m) {
  183.             this->m = m;
  184.             this->n = 1;
  185.             vvi.resize(m);
  186.             for (int i = 0; i < m; i++) {
  187.                 vvi[i].resize(n);
  188.             }
  189.         }
  190.     };
  191.     Matrix transV(Vector a) {
  192.         Matrix x(a.m, 1);
  193.         for (int i = 0; i < x.m; i++)
  194.             x.vvi[i][0] = a.vvi[i][0];
  195.         return x;
  196.     }
  197.     Vector transM(Matrix a) {
  198.         Vector x(a.m);
  199.         for (int i = 0; i < x.m; i++)
  200.             x.vvi[i][0] = a.vvi[i][0];
  201.         return x;
  202.     }
  203.     template <typename T>
  204.     T operator + (T a, T b) {
  205.         int n = a.n;
  206.         int m = a.m;
  207.         for (int i = 0; i < m; i++)
  208.         {
  209.             for (int j = 0; j < n; j++)
  210.                 a.vvi[i][j] += b.vvi[i][j];
  211.         }
  212.         return a;
  213.  
  214.     }
  215.     template <typename T>
  216.     T operator - (T a, T b) {
  217.         int n = a.n;
  218.         int m = a.m;
  219.         for (int i = 0; i < m; i++)
  220.         {
  221.             for (int j = 0; j < n; j++)
  222.             a.vvi[i][j] -= b.vvi[i][j];
  223.             }
  224.             return a;
  225.         }
  226.  
  227.     template <typename T>
  228.     T operator * (double a, T x) {
  229.         for (int i = 0; i < x.m; i++)
  230.             for (int j = 0; j < x.n; j++)
  231.                 x.vvi[i][j] = x.vvi[i][j] * a;
  232.         return x;
  233.  
  234.     }
  235.     Vector operator * (Matrix a, Vector b) {
  236.         Matrix f = a * transV(b);
  237.         Vector x = transM(f);
  238.         return x;
  239.     }
  240.  
  241.  
  242.     Vector getVector(Matrix& a, int n) {
  243.         Vector z(a.m);
  244.         for (int i = 0; i < a.m; i++) {
  245.             z.vvi[i][0] = a.vvi[i][n];
  246.             //cout << "Типа скопировали " << z.vvi[i][0] << endl;
  247.         }
  248.         //getPrint(z);
  249.         return z;
  250.     }
  251.  
  252.     double dotProduct(Vector a, Vector b) {// Скалярное произведение
  253.         double d = 0;
  254.         for (int i = 0; i < a.m; i++)
  255.             d += a.vvi[i][0] * b.vvi[i][0];
  256.         return d;
  257.     }
  258.    
  259.     Matrix addVector(Matrix& a, Vector& b) {
  260.         a.n = a.n + 1;
  261.         for (int i = 0; i < a.m; i++)
  262.             a.vvi[i].push_back(b.vvi[i][0]);
  263.         return a;
  264.     }
  265.  
  266.     void setColumns(Matrix& a, Vector& b, int k) {
  267.         for (int i = 0; i < a.m; i++)
  268.             a.vvi[i][k] = b.vvi[i][0];
  269.  
  270.     }
  271.     ////////////////////////////////////////////////////////////////////////////
  272.     //Метод Гаусса
  273.  
  274.     Matrix makeDiag(Matrix& a) {
  275.         int i, j, m = 0, n = 0;
  276.         double k;
  277.         double c;
  278.  
  279.         for (int n = 0; n < a.n; n++)
  280.         {
  281.             if ((m < a.m) and (a.n > n)) {
  282.                 k = a.vvi[m][n];
  283.                 if (k == 0) goto end1;
  284.                 for (i = 0; i < a.n; i++)
  285.                     a.vvi[m][i] = a.vvi[m][i] / k;//поделили на элемент и получили единицу
  286.                 for (i = 0; i < a.m; i++)//вычитаем строчку из строчек
  287.                     if (i != m)
  288.                     {
  289.                         c = a.vvi[i][n];
  290.                         for (j = 0; j < a.n; j++)
  291.                             a.vvi[i][j] = a.vvi[i][j] - c * a.vvi[m][j];
  292.                     }
  293.             end1:
  294.                 m++;
  295.                 //getPrint(a);
  296.             }
  297.         }
  298.         for (i = 0; i < a.m; i++)
  299.             for (j = 0; j < a.n; j++)
  300.                 if (a.vvi[i][j] == -0)
  301.                     a.vvi[i][j] = 0;
  302.         return a;
  303.  
  304.     }//
  305.  
  306.     Matrix Invert(Matrix& a) {
  307.         Matrix b(a.m, 2 * a.n);
  308.         for (int i = 0; i < a.m; i++)
  309.             for (int j = 0; j < a.n; j++)
  310.                 b.vvi[i][j] = a.vvi[i][j];
  311.         for (int i = 0; i < a.m; i++)
  312.             b.vvi[i][i + a.n] = 1;
  313.         b = makeDiag(b);
  314.         Matrix c(a.m, a.n);
  315.         for (int i = 0; i < a.m; i++)
  316.             for (int j = 0; j < a.n; j++)
  317.                 c.vvi[i][j] = b.vvi[i][j + a.n];
  318.         return c;
  319.     }
  320.     template <typename T>
  321.     bool operator == (T a, T b) {
  322.         int k = 1;
  323.         for (int i = 0; i < a.m; i++)
  324.             for (int j = 0; j < a.n; j++)
  325.                 if (a.vvi[i][j] != b.vvi[i][j])
  326.                     k = 0;
  327.         if ((a.m != b.m) or (a.n != b.n))
  328.             k = 0;
  329.         return k;
  330.     }
  331.     template <typename T>
  332.     bool operator != (T a, T b) {
  333.         int k = 1;
  334.         for (int i = 0; i < a.m; i++)
  335.             for (int j = 0; j < a.n; j++)
  336.                 if (a.vvi[i][j] == b.vvi[i][j])
  337.                     k = 0;
  338.         return k;
  339.     }
  340.     bool isOrth(Matrix& a) {
  341.         Matrix b = Transp(a);
  342.         if (((a * b) == E(a)) == 1 )
  343.             return true;
  344.         else
  345.             return false;
  346.     }
  347.  
  348.     Vector solveGauss(Matrix& a, Vector& f) {
  349.         a = addVector(a, f);
  350.         a = makeDiag(a);
  351.         Vector x = getVector(a, a.n - 1);
  352.         cout << "Solution:" << endl;
  353.         return x;
  354.     }
  355.  
  356.     bool isSymetric(Matrix& a) {
  357.         int k = 1;
  358.         for (int i = 0; i < a.m - 1; i++)
  359.             for (int j = 1; j < a.n; j++)
  360.                 if (a.vvi[i][j] != a.vvi[j][i])
  361.                     k = 0;
  362.         if (a.m != a.n)
  363.             k = 0;
  364.         return k;
  365.     }
  366.  
  367.     bool isPosDetermined(Matrix& a) {// Реализация критерия Сильвестра
  368.         int k = 1;
  369.         for (int i = 0; i < a.m; i++)
  370.         {
  371.             Matrix tmp(i + 1, i + 1);
  372.             for (int k = 0; k < i + 1; k++)
  373.                 for (int q = 0; q < i + 1; q++)
  374.                     tmp.vvi[k][q] = a.vvi[k][q];
  375.             if ((det(tmp) > 0) == 0)
  376.                 k = 0;
  377.            
  378.  
  379.         }
  380.         return k;
  381.     }
  382.  
  383.     ////////////////////////////////////////////////////////////////////////////
  384.     //Правило Крамера
  385.     Vector solveCramer(Matrix& a, Vector& b) {
  386.         Vector res(a.m);
  387.         Vector r(a.m);
  388.         double Delta = det(a);
  389.         if (Delta != 0)
  390.             for (int i = 0; i < a.n; i++)
  391.             {
  392.                 r = getVector(a, i);
  393.                 setColumns(a, b, i);
  394.                 //cout << "a" << endl;
  395.                 double delta = det(a);
  396.                 cout << "delta" << delta << endl;
  397.                 res.vvi[i][0] = delta / Delta;
  398.                 for (int j = 0; j < a.m; j++)
  399.                     a.vvi[j][i] = r.vvi[j][0];
  400.                 //cout << res.vvi[i][0] << endl;
  401.             }
  402.         cout << "Solution is" << endl;
  403.         return res;
  404.  
  405.     }
  406.     ////////////////////////////////////////////////////////////////////////////
  407.     // Метод сопряженных градиентов
  408.     Vector solveCG(Matrix a, Vector b) {
  409.        
  410.             Vector x(a.m);
  411.             int i = 0;
  412.             double alpha = 0;
  413.             double betha = 0;
  414.             for (int i = 0; i < x.m; i++)
  415.                 x.vvi[i][0] = 2;
  416.             Vector r = b - a * x;
  417.             Vector tmp(r.m);
  418.             Vector z = r;
  419.             while (i<100){
  420.                  //начало i-ой итерации
  421.                        
  422.             alpha = dotProduct(r, r) / dotProduct(a*z, z);
  423.             x = x + alpha * z;
  424.             tmp = r;
  425.             r = r - alpha * (a*z);
  426.             betha = alpha = dotProduct(r, r) / dotProduct(tmp, tmp);
  427.             z = r + betha * z;
  428.             i++;
  429.             x.getPrint();
  430.             }
  431.             for (int j = 0; j < x.m; j++)
  432.                 if (abs(x.vvi[j][0]) < 0.001)// с точностью до 8 знака
  433.                     x.vvi[j][0] = 0;
  434.             return x;
  435.        
  436.     }
  437.  
  438.  
  439.     ////////////////////////////////////////////////////////////////////////////
  440.  
  441.     int main()
  442.     {
  443.         unsigned int start_time = clock();
  444.         setlocale(LC_ALL, "ru");
  445.         Matrix A(3, 3);
  446.         A.setValue();
  447.         Vector b(A.m);
  448.         b.setValue();
  449.         Vector x = solveCG(A, b);
  450.         x.getPrint();
  451.         unsigned int end_time = clock(); // конечное время
  452.         unsigned int search_time = end_time - start_time;
  453.         system("pause");
  454.         return 0;
  455.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement