Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7. // Multiplication A * x
  8. vector<double> Multiplication(vector<double> low, vector<double> main, vector<double> up, vector<double> x) {
  9.     vector<double> result(x.size());
  10.     for (int i = 0; i < x.size(); i++) {
  11.         result[i] = main[i] * x[i];
  12.         if (i != 0) {
  13.             result[i] += low[i] * x[i - 1];
  14.         }
  15.         if (i != x.size() - 1) {
  16.             result[i] += up[i] * x[i + 1];
  17.         }
  18.     }
  19.     return result;
  20. }
  21.  
  22. // Norm(lhs - rhs)
  23. double Norm(vector<double> lhs, vector<double> rhs) {
  24.     double ttl = 0;
  25.     for (int i = 0; i < rhs.size(); i++) {
  26.         ttl += (lhs[i] - rhs[i]) * (lhs[i] - rhs[i]);
  27.     }
  28.     return sqrt(ttl);
  29. }
  30.  
  31. // Matvec for tay: tay * A * x
  32. vector<double> Matvec(vector<double> low, vector<double> main, vector<double> up, vector<double> x, double tay) {
  33.     vector<double> result = Multiplication(low, main, up, x);
  34.     for (int i = 0; i < x.size(); i++) {
  35.         result[i] *= tay;
  36.     }
  37.     return result;
  38. }
  39.  
  40. vector<double> Matvec(vector<double> low, vector<double> main, vector<double> up, vector<double> x) {
  41.     vector<double> d_1(main.size()), null(main.size());
  42.     for (int i = 0; i < main.size(); i++) {
  43.         d_1[i] = 1 / main[i];
  44.     }
  45.     return Multiplication(null, d_1, null, Multiplication(low, main, up, x));
  46. }
  47.  
  48. // SI_Solver for MTI
  49. void SI_Solver(vector<double> low, vector<double> main, vector<double> up, vector<double> f, vector<double> res, double tay) {
  50.     // Norm (Ax - f)
  51.     vector<double> norm_vec;
  52.     double norm0 = Norm(Multiplication(low, main, up, res), f);
  53.     ofstream mti("MTI.txt"), mti_answ("MTI_answ.txt");
  54.     while (1) {
  55.         vector<double> v = Matvec(low, main, up, res, tay);
  56.         double norm = Norm(v, f);
  57.         if (norm / norm0 < 1e-4) {
  58.             break;
  59.         }
  60.         for (int i = 0; i < res.size(); i++) {
  61.             res[i] += f[i] - v[i];
  62.         }
  63.         mti << norm / norm0 << "\n";
  64.     }
  65.     for (int i = 0; i < res.size(); i++) {
  66.         mti_answ << res[i] << "\n";
  67.     }
  68. }
  69.  
  70. // SI_Solver for Jacobi
  71. void SI_Solver(vector<double> low, vector<double> main, vector<double> up, vector<double> f, vector<double> res) {
  72.     double norm0 = Norm(Multiplication(low, main, up, res), f);
  73.     ofstream jac("jacobi.txt"), jac_answ("jacobi_answ.txt");
  74.     while (1) {
  75.         vector<double> v = Matvec(low, main, up, res);
  76.         double norm = Norm(v, f);
  77.         jac << norm / norm0 << "\n";
  78.         if (norm / norm0 < 1e-4) {
  79.             break;
  80.         }
  81.         for (int i = 0; i < res.size(); i++) {
  82.             res[i] += f[i] - v[i];
  83.         }
  84.     }
  85.     for (int i = 0; i < res.size(); i++) {
  86.         jac_answ << res[i] << "\n";
  87.     }
  88.  
  89. }
  90.  
  91. int main()
  92. {
  93.     double tay = 0.1651512666112257;
  94.     vector<double> up(1000, -1);
  95.     vector<double> low(1000, -1);
  96.     vector<double> res(1000);
  97.     vector<double> main(1000, 2.01);
  98.     vector<double> f(1000), ft(1000), d_1f(1000);
  99.     main[0] = 12;
  100.     for (int i = 494; i < 505; i++) {
  101.         f[i] = 1;
  102.         ft[i] = tay;
  103.         d_1f[i] = 1 / main[i];
  104.     }
  105.  
  106.     // MTI
  107.     SI_Solver(low, main, up, ft, res, tay);
  108.  
  109.     //Jacobi
  110.     SI_Solver(low, main, up, d_1f, res);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement