Advertisement
Guest User

Kek

a guest
Oct 17th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.62 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. typedef long double ld;
  11. const ld eps = 1e-9;
  12. struct Matrix {
  13.     int n;
  14.     vector<vector<ld> > A;
  15.     Matrix(int n) :n(n) {
  16.         A.assign(n, vector<ld>(n, 0));
  17.     }
  18.     Matrix(const vector<vector<ld> >& a) {
  19.         n = a.size();
  20.         A = a;
  21.     }
  22.     Matrix():n(0) {};
  23. };
  24. pair<Matrix, Matrix> LU_fract(const Matrix& A) {
  25.     int n = A.n;
  26.     vector<vector<ld> > L, U;
  27.     L.assign(n, vector<ld>(n, 0));
  28.     U.assign(n, vector<ld>(n, 0));
  29.     for (int i = 0; i < n; ++i) {
  30.         L[i][i] = 1;
  31.     }
  32.     for (int i = 0; i < n; i++)
  33.     {
  34.         U[0][i] = A.A[0][i];
  35.         L[i][0] = A.A[i][0] / U[0][0];
  36.     }
  37.     for (int i = 1; i < n; i++)
  38.     {
  39.         for (int j = 1; j < n; j++)
  40.         {
  41.             ld sum = 0;
  42.             if (i > j)
  43.             {
  44.                 for (int k = 0; k<i; ++k) {
  45.                     sum += (L[i][k] * U[k][j]);
  46.                 }
  47.                 L[i][j] = (A.A[i][j] - sum) / U[j][j];
  48.             }
  49.             else {
  50.                 for (int k = 0; k<j; ++k) {
  51.                     sum += (L[i][k] * U[k][j]);
  52.                 }
  53.                 U[i][j] = A.A[i][j] - sum;
  54.             }
  55.         }
  56.     }
  57.     return{ Matrix(L),Matrix(U) };
  58. }
  59. vector<ld> Kramer(const Matrix& Start, const vector<ld>& v) {
  60.     ld main_opr = 1;
  61.     pair<Matrix, Matrix> LU = LU_fract(Start);
  62.     int n = Start.n;
  63.     for (int i = 0; i < n; ++i) {
  64.         main_opr *= LU.second.A[i][i];
  65.     }
  66.     vector<ld> ans(n, 1);
  67.     for (int j = 0; j < n; ++j) {
  68.         Matrix A = Start;
  69.         for (int i = 0; i < n; ++i) {
  70.             A.A[i][j] = v[i];
  71.         }
  72.         pair<Matrix, Matrix> next = LU_fract(A);
  73.         for (int i = 0; i < n; ++i) {
  74.             ans[j] *= next.second.A[i][i];
  75.         }
  76.     }
  77.     for (int i = 0; i < n; ++i) {
  78.         ans[i] /= main_opr;
  79.     }
  80.     return ans;
  81. }
  82. vector<ld> Relaxation(const Matrix& A, const vector<ld>& b, const ld& par) {
  83.     vector<ld> cur = b;
  84.     int n = A.n;
  85.     ld checker = eps;
  86.     while (true) {
  87.         vector<ld> old = cur;
  88.         for (int i = 0;i < n; ++i) {
  89.             ld sum = 0;
  90.             for (int j = 0; j < n; ++j) {
  91.                 if (j == i) continue;
  92.                 sum -= (A.A[i][j] * cur[j]);
  93.             }
  94.             sum += b[i];
  95.             sum *= (par/A.A[i][i]);
  96.             cur[i] = sum+(1-par)*cur[i];
  97.         }
  98.         ld mx = abs(cur[0] - old[0]);
  99.         for (int i = 0; i < n; ++i) {
  100.             mx = max(abs(cur[i] - old[i]), mx);
  101.         }
  102.         if (mx < checker) break;
  103.     }
  104.     return cur;
  105. }
  106. vector<ld> Spinning(const Matrix& A, const vector<ld>& b) {
  107.     Matrix cur = A;
  108.     int n = A.n;
  109.     vector<ld> v = b;
  110.     for (int j = 0; j < n - 1; ++j) {
  111.         for (int i = j+1; i < n; ++i) {
  112.             ld denum = sqrt(cur.A[j][j] * cur.A[j][j] + cur.A[i][j] * cur.A[i][j]);
  113.             ld c = cur.A[j][j]/denum;
  114.             ld s = cur.A[i][j] / denum;
  115.             vector<ld> new_Aj(n,0);
  116.             vector<ld> new_Ai(n,0);
  117.             ld new_bj = c*v[j] + s*v[i];
  118.             ld new_bi = -s*v[j] + c*v[i];
  119.             for (int z = 0; z < n; ++z) {
  120.                 new_Aj[z] = c*cur.A[j][z]+s*cur.A[i][z];
  121.                 new_Ai[z] = -s*cur.A[j][z] + c*cur.A[i][z];
  122.             }
  123.             cur.A[i] = new_Ai;
  124.             cur.A[j] = new_Aj;
  125.             v[j] = new_bj;
  126.             v[i] = new_bi;
  127.         }
  128.     }
  129.     vector<ld> ans(n, 0);
  130.     for (int i = n - 1; i >= 0; --i) {
  131.         ld sum = v[i];
  132.         for (int k = i + 1; k < n; ++k) {
  133.             sum -= (cur.A[i][k] * ans[k]);
  134.         }
  135.         sum /= cur.A[i][i];
  136.         ans[i] = sum;
  137.     }
  138.     return ans;
  139. }
  140. vector<ld> Precised_Spinning(const Matrix& A, const vector<ld>& b) {
  141.     vector<ld> answ_x0 = Spinning(A, b);
  142.     int n = A.n;
  143.     while (true) {
  144.         vector<ld> e(n);
  145.         for (int i = 0; i < n; ++i) {
  146.             ld sum = 0;
  147.             for (int j = 0; j < n; ++j) {
  148.                 sum += (A.A[i][j] * answ_x0[j]);
  149.             }
  150.             e[i] = b[i] - sum;
  151.         }
  152.         ld prec = e[0];
  153.         for (int i = 0; i < n; ++i) {
  154.             prec = max(prec, abs(e[i]));
  155.         }
  156.         if (prec < eps) return answ_x0;
  157.         vector<ld> p = Spinning(A, e);
  158.         for (int i = 0; i < n; ++i) {
  159.             answ_x0[i] += p[i];
  160.         }
  161.     }
  162. }
  163. vector<ld> LU_eigenvalues(const Matrix& Start) {
  164.     Matrix A = Start;
  165.     int n = Start.n;
  166.     for (int t = 0; t < 1000; ++t) {
  167.         pair<Matrix, Matrix> LU = LU_fract(A);
  168.         Matrix next(n);
  169.         for (int i = 0; i < n; ++i) {
  170.             for (int j = 0; j < n; ++j) {
  171.                 ld sum = 0;
  172.                 for (int z = 0; z < n; ++z) {
  173.                     sum += (LU.second.A[i][z] * LU.first.A[z][j]);
  174.                 }
  175.                 next.A[i][j] = sum;
  176.             }
  177.         }
  178.         A = next;
  179.     }
  180.     vector<ld> ans(n);
  181.     for (int i = 0; i < n; ++i) {
  182.         ans[i] = A.A[i][i];
  183.     }
  184.     return ans;
  185. }
  186. vector<pair<ld, vector<ld> > > LU_pair_eigen(const Matrix& Start) {
  187.     vector<ld> Eigen = LU_eigenvalues(Start);
  188.     int n = Start.n;
  189.     vector<pair<ld, vector<ld> > > ans(n);
  190.     for (int i = 0; i < n; ++i) {
  191.         Matrix A = Start;
  192.         vector<ld> empty_b(n, 0);
  193.         for (int j = 0; j < n; ++j) {
  194.             A.A[j][j] -= Eigen[i];
  195.         }
  196.         vector<ld> now_e = Kramer(A, empty_b);
  197.         ans[i] = { Eigen[i],now_e };
  198.     }
  199.     return ans;
  200. }
  201. vector<ld> Variation(const Matrix& A, const vector<ld>& b) {
  202.     int n = A.n;
  203.     vector<ld> x = b;
  204.     vector<ld> e(n);
  205.     for (int i = 0; i < n; ++i) {
  206.         ld sum = 0;
  207.         for (int j = 0; j < n; ++j) {
  208.             sum += (A.A[i][j] * x[j]);
  209.         }
  210.         e[i] = b[i] - sum;
  211.     }
  212.     vector<ld> p = e;
  213.     while (true) {
  214.         ld mx = e[0];
  215.         for (int i = 0; i < n; ++i) {
  216.             mx = max(mx, abs(e[i]));
  217.         }
  218.         if (mx < eps) break;
  219.         vector<ld> q(n);
  220.         for (int i = 0; i < n; ++i) {
  221.             ld sum = 0;
  222.             for (int j = 0; j < n; ++j) {
  223.                 sum += (A.A[i][j] * p[j]);
  224.             }
  225.             q[i] = sum;
  226.         }
  227.         ld alpha = 0;
  228.         ld num = 0, denum = 0;
  229.         for (int i = 0;i<n;++i){
  230.             num += (e[i] * p[i]);
  231.             denum += (q[i] * p[i]);
  232.         }
  233.         alpha = num / denum;
  234.         vector<ld> new_x(n);
  235.         for (int i = 0; i < n; ++i) {
  236.             new_x[i] = x[i] + alpha*p[i];
  237.         }
  238.         vector<ld> new_e(n);
  239.         for (int i = 0; i < n; ++i) {
  240.             new_e[i] = e[i] - alpha*q[i];
  241.         }
  242.         ld beta = 0;
  243.         num = 0, denum = 0;
  244.         for (int i = 0; i < n; ++i) {
  245.             num += (new_e[i] * q[i]);
  246.             denum += (p[i] * q[i]);
  247.         }
  248.         beta = num / denum;
  249.         vector<ld> new_p(n);
  250.         for (int i = 0; i < n; ++i) {
  251.             new_p[i] = new_e[i] - beta*p[i];
  252.         }
  253.         p = new_p;
  254.         e = new_e;
  255.         x = new_x;
  256.     }
  257.     return x;
  258. }
  259.  
  260. int main()
  261. {
  262.     freopen("input.txt", "r", stdin);
  263.     freopen("output.txt", "w", stdout);
  264.     int n;
  265.     cin >> n;
  266.     Matrix A(n);
  267.     for (int i = 0; i < n; ++i) {
  268.         for (int j = 0; j < n; ++j) {
  269.             cin >> A.A[i][j];
  270.         }
  271.     }
  272.     vector<ld> v(n);
  273.     for (int i = 0; i < n; ++i) {
  274.         cin >> v[i];
  275.     }
  276.    // vector<ld> Relax_ans = Relaxation(A, v, 1.5).first;
  277.    // vector<ld> Kramer_ans = Kramer(A, v);
  278.     vector<ld> Spinning_ans = Spinning(A, v);
  279.    // vector<ld> Variation_ans = Variation(A, v);
  280.     cout.precision(10);    
  281.     //cout << "Relaxation method answer is : \n";
  282.     //for (int i = 0; i < n; ++i) {
  283.     //    cout << fixed << Relax_ans[i] << '\n';
  284.     //}
  285.     //cout << "\nKramer method answer is :\n";
  286.     //for (int i = 0; i < n; ++i) {
  287.     //    cout << fixed << Kramer_ans[i] << '\n';
  288.     //}
  289.     cout << "\nPrecised Spinning method answer is : \n";
  290.     for (int i = 0; i < n; ++i) {
  291.         cout << fixed << Spinning_ans[i] << '\n';
  292.     }
  293.     //cout << "\nVariation method answer is : \n";
  294.     //for (int i = 0; i < n; ++i) {
  295.     //    cout << fixed << Variation_ans[i] << '\n';
  296.     //}
  297.     int n1;
  298.     cin >> n1;
  299.     Matrix Test_Eigenvalues(n1);
  300.     for (int i = 0; i < n1; ++i) {
  301.         for (int j = 0; j < n1; ++j) {
  302.             cin >> Test_Eigenvalues.A[i][j];
  303.         }
  304.     }
  305.     vector<ld> eigen = LU_eigenvalues(Test_Eigenvalues);
  306.     cout << "\nEigenvalues : \n";
  307.     for (int i = 0; i < n1; ++i) {
  308.         cout << fixed << eigen[i];
  309.         cout << '\n';
  310.     }
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement