SHARE
TWEET

Untitled

a guest May 21st, 2019 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <math.h>
  5. #include <string>
  6. #include <map>
  7. #include <ctime>
  8. #include <iomanip>
  9.  
  10. using namespace std;
  11. using ll = long long;
  12.  
  13. double sum1 = 0;
  14.  
  15. void mult(vector<vector<double>> a, vector<vector<double>> b, vector<vector<double>> &result, int n)
  16. {
  17.     for (int i = 0; i < n; i++)
  18.     {
  19.         for (int j = 0; j < n; j++)
  20.         {
  21.             result[i][j] = 0;
  22.             for (int k = 0; k < n; k++)
  23.             {
  24.                 result[i][j] += a[i][k] * b[k][j];
  25.             }
  26.         }
  27.     }
  28. }
  29. void trans(vector<vector<double>> a, vector<vector<double>> &b, int n)
  30. {
  31.     for (int i = 0; i < n; i++)
  32.     {
  33.         for (int j = 0; j < n; j++)
  34.         {
  35.             b[i][j] = a[j][i];
  36.         }
  37.     }
  38. }
  39. int symmetric(vector<vector<double>> A, int n)
  40. {
  41.     for (int i = 0; i < n; i++) {
  42.         for (int j = i + 1; j < n; j++)
  43.         {
  44.             if (A[i][j] != A[j][i])
  45.             {
  46.                 return 0;
  47.             }
  48.         }
  49.     }
  50.     return 1;
  51. }
  52. double fail(vector<vector<double>> A, int n)
  53. {
  54.     double fault = 0.0;
  55.     for (int i = 0; i < n; i++)
  56.     {
  57.         for (int j = i + 1; j < n; j++)
  58.         {
  59.             fault += A[i][j] * A[i][j];
  60.         }
  61.     }
  62.     fault = sqrt(2 * fault);
  63.     return fault;
  64. }
  65. void print(vector<vector<double>> matr)
  66. {
  67.     for (int i = 0; i < matr.size(); i++)
  68.     {
  69.         for (int j = 0; j < matr[i].size(); j++)
  70.         {
  71.             cout << setw(3) << matr[i][j];
  72.         }
  73.         cout << '\n';
  74.     }
  75. }
  76. int rotate(vector<vector<double>> &A, int n, vector<vector<double>> &ans, double &precision)
  77. {
  78.     int result = 1;
  79.     int i, j, k;
  80.     int I, J;
  81.     vector <vector<double>> RM(n);
  82.     vector <vector<double>> buff(n);
  83.     vector <vector<double>> RMT(n);
  84.     double max, a;
  85.     for (i = 0; i < n; i++)
  86.     {
  87.         RMT[i].resize(n);
  88.         RM[i].resize(n);
  89.         buff[i].resize(n);
  90.         RMT[i][i] = RM[i][i] = 1;
  91.     }
  92.     double fault = fail(A, n);
  93.     while (fault > precision)
  94.     {
  95.         for (int i = 0; i < n; i++)
  96.         {
  97.             for (int j = 0; j < n; j++)
  98.             {
  99.                 RMT[i][j] = RM[i][j] = 0;
  100.             }
  101.             RMT[i][i] = RM[i][i] = 1;
  102.         }
  103.         max = 0.0;
  104.         for (i = 0; i < n; i++)
  105.         {
  106.             for (j = i + 1; j < n; j++)
  107.             {
  108.                 if (abs(A[i][j]) > max)
  109.                 {
  110.                     max = abs(A[i][j]);
  111.                     I = i;
  112.                     J = j;
  113.                 }
  114.             }
  115.         }
  116.         if (A[I][I] == A[J][J])
  117.         {
  118.             RM[I][I] = RM[J][J] = RM[J][I] = sqrt(2.0) / 2.0;
  119.             RM[I][J] = -sqrt(2.0) / 2.0;
  120.         }
  121.         else
  122.         {
  123.             a = 0.5 * atan((2.0 * A[I][J]) / (A[I][I] - A[J][J]));
  124.             RM[I][I] = RM[J][J] = cos(a);
  125.             RM[I][J] = -sin(a);
  126.             RM[J][I] = sin(a);
  127.         }
  128.         trans(RM, RMT, n);
  129.         mult(RMT, A, buff, n);
  130.         mult(buff, RM, A, n);
  131.         fault = fail(A, n);
  132.         mult(ans, RM, buff, n);
  133.         ans = buff;
  134.         result++;
  135.     }
  136.     for (int i = 0; i < n; i++)
  137.     {
  138.         sum1 += A[i][i];
  139.     }
  140.     return result;
  141. }
  142.  
  143. int main()
  144. {
  145.     //ifstream cin("input.txt");
  146.     int l = 6;
  147.     setlocale(LC_ALL, "rus");
  148.     vector <int> num;
  149.     vector <int> pre;
  150.         //ifstream cin("input.txt");
  151.         int i, j;
  152.         int n;
  153.         double precision;
  154.         cout << "Введите размерность матрицы:\n";
  155.         cin >> n;
  156.         num.push_back(n);
  157.         cout << "Введите элементы матрицы: \n";
  158.         vector <vector<double>> A(n);
  159.         vector <vector<double>> ans(n);
  160.         int sum2 = 0;
  161.         for (int i = 0; i < n; i++)
  162.         {
  163.             A[i].resize(n);
  164.         }
  165.         srand(time(0));
  166.         for (i = 0; i < n; i++)
  167.         {
  168.             ans[i].resize(n);
  169.             for (int j = 0; j < n; j++)
  170.             {
  171.                 A[i][j] = rand() * 1.0 / RAND_MAX - 0.5;
  172.                 A[j][i] = A[i][j];
  173.             }
  174.             sum2 += A[i][i];
  175.             ans[i][i] = 1;
  176.         }
  177.         print(A);
  178.         if (!symmetric(A, n))
  179.         {
  180.             cout << "Матрица не симметричная\n";
  181.         }
  182.         else
  183.         {
  184.             //cout << "Введите точность: ";
  185.             //cin >> precision;
  186.             precision = 0.01;
  187.             int cnt = rotate(A, n, ans, precision);
  188.             for (i = 0; i < n; i++)
  189.             {
  190.                 cout << "Собственный вектор " << i + 1 << ":\n";
  191.                 for (j = 0; j < n; j++) {
  192.                     cout << ans[j][i] << "\n";
  193.                 }
  194.             }
  195.             cout << "Собственные значения:\n";
  196.             for (i = 0; i < n; i++) {
  197.                 cout << A[i][i] << "\n";
  198.             }
  199.             cout << "Общее число шагов: " << cnt;
  200.             cout << '\n' << "Сумма диагональных элементов = " << sum2 << '\n' << "Сумма собственных значений = " << sum1 << '\n';
  201.             sum2 = sum1 = 0;
  202.             pre.push_back(cnt);
  203.         }
  204.     cout << "Таблица зависимости количества итераций от размера матрица при фиксированной точности = 0.001\n";
  205.     for (int i = 0; i < num.size(); i++)
  206.     {
  207.         cout << setw(6) << num[i];
  208.     }
  209.     cout << '\n';
  210.     for (int i = 0; i < pre.size(); i++)
  211.     {
  212.         cout << setw(6) << pre[i];
  213.     }
  214.     cout << '\n' << '\n' << '\n';
  215.     system("pause");
  216.     return 0;
  217. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top