Advertisement
Guest User

MSG

a guest
Oct 6th, 2015
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #include <iostream>
  2. #include "Matrix.h"
  3. using namespace std;
  4.  
  5. /*void Matrix_vector(Matrix *Matrix, Vector vector, Vector vector_out);
  6. void TransposeMatrix_vector(Matrix *Matrix, Vector vector, Vector vector_out);
  7. void InverseIL0_vector(Matrix *ILU0, Vector vector, Vector vector_out);
  8. void InverseTransposeIU0_vector(Matrix *ILU0, Vector vector, Vector vector_out);
  9. void InverseIU0_vector(Matrix *ILU0, Vector vector, Vector vector_out);
  10. void InverseTransposeIL0_vector(Matrix *ILU0, Vector vector, Vector vector_out);*/
  11.  
  12. void Matrix_vector(Matrix *Matrix, Vector vector, Vector vector_out)
  13. {
  14.     int i, j, j0,
  15.         N = Matrix->N,
  16.         *ig = Matrix->ig,
  17.         *jg = Matrix->jg;
  18.     double *di = Matrix->di,
  19.         *ggl = Matrix->ggl,
  20.         *ggu = Matrix->ggu;
  21.  
  22.     for (i = 0; i < N; i++)
  23.         vector_out[i] = di[i] * vector[i]; // += ? =
  24.  
  25.     for (i = 1; i < N; i++)
  26.         for (j0 = ig[i]; j0 < ig[i+1]; j0++)
  27.         {
  28.             j = jg[j0];
  29.             vector_out[i] += ggl[j0] * vector[j];
  30.             vector_out[j] += ggu[j0] * vector[i];
  31.         }
  32. }
  33.  
  34. void TransposeMatrix_vector(Matrix *Matrix, Vector vector, Vector vector_out)
  35. {
  36.     int i, j, j0,
  37.         N = Matrix->N,
  38.         *ig = Matrix->ig,
  39.         *jg = Matrix->jg;
  40.     double *di = Matrix->di,
  41.         *ggl = Matrix->ggl,
  42.         *ggu = Matrix->ggu;
  43.  
  44.     for (i = 0; i < N; i++)
  45.         vector_out[i] = di[i] * vector[i]; // += ? =
  46.  
  47.     for (i = 1; i < N; i++)
  48.         for (j0 = ig[i]; j0 < ig[i+1]; j0++)
  49.         {
  50.             j = jg[j0];
  51.             vector_out[i] += ggu[j0] * vector[j];
  52.             vector_out[j] += ggl[j0] * vector[i];
  53.         }
  54. }
  55.  
  56. void InverseIL0_vector(Matrix *ILU0, Vector vector, Vector vector_out)
  57. {
  58.     int i, j, j0,
  59.         N = ILU0->N,
  60.         *ig = ILU0->ig,
  61.         *jg = ILU0->jg;
  62.     double sum = 0,
  63.         *di = ILU0->di,
  64.         *ggl = ILU0->ggl;
  65.  
  66.     for (i = 0; i < N; i++)             //
  67.         vector_out[i] = vector[i];      //
  68.  
  69.     for (i = 0; i < N; i++)
  70.     {
  71.         for (j0 = ig[i]; j0 < ig[i+1]; j0++)
  72.         {
  73.             j = jg[j0];
  74.             vector_out[i] -= ggl[j0] * vector_out[j];
  75.         }
  76.         vector_out[i] /= di[i];
  77.     }
  78. }
  79.  
  80. void InverseTransposeIU0_vector(Matrix *ILU0, Vector vector, Vector vector_out)
  81. {
  82.     int i, j, j0,
  83.         N = ILU0->N,
  84.         *ig = ILU0->ig,
  85.         *jg = ILU0->jg;
  86.     double sum = 0,
  87.         *ggu = ILU0->ggu;
  88.  
  89.     for (i = 0; i < N; i++)             //
  90.         vector_out[i] = vector[i];      //
  91.  
  92.     for (i = 0; i < N; i++)
  93.         for (j0 = ig[i]; j0 < ig[i+1]; j0++)
  94.         {
  95.             j = jg[j0];
  96.             vector_out[i] -= ggu[j0] * vector_out[j];
  97.         }
  98. }
  99.  
  100. void InverseIU0_vector(Matrix *ILU0, Vector vector, Vector vector_out)
  101. {
  102.     int i, j, j0,
  103.         N = ILU0->N,
  104.         *ig = ILU0->ig,
  105.         *jg = ILU0->jg;
  106.     double sum = 0,
  107.         *ggu = ILU0->ggu;
  108.  
  109.     for (i = 0; i < N; i++)             //
  110.         vector_out[i] = vector[i];      //
  111.  
  112.     for (i = N-1; i >= 0; i--)
  113.         for (j0 = ig[i]; j0 < ig[i+1]; j0++)
  114.         {
  115.             j = jg[j0];
  116.             vector_out[j] -= ggu[j0] * vector_out[i];
  117.         }
  118. }
  119.  
  120. void InverseTransposeIL0_vector(Matrix *ILU0, Vector vector, Vector vector_out)
  121. {
  122.     int i, j, j0,
  123.         N = ILU0->N,
  124.         *ig = ILU0->ig,
  125.         *jg = ILU0->jg;
  126.     double sum = 0,
  127.         *di = ILU0->di,
  128.         *ggl = ILU0->ggl;
  129.  
  130.     for (i = 0; i < N; i++)             //
  131.         vector_out[i] = vector[i];      //
  132.  
  133.     for (i = N-1; i >= 0; i--)
  134.     {
  135.         vector_out[i] /= di[i];
  136.         for (j0 = ig[i]; j0 < ig[i+1]; j0++)
  137.         {
  138.             j = jg[j0];
  139.             vector_out[j] -= ggl[j0] * vector_out[i];
  140.         }
  141.     }
  142. }
  143.  
  144. double Norm(Vector v, int n)
  145. {
  146.     double norm = 0;
  147.     for (int i = 0; i < n; i++)
  148.         norm += v[i] * v[i];
  149.     return sqrt(norm);
  150. }
  151.  
  152. void Sum(Vector a, Vector b, int n, Vector v_out)
  153. {
  154.     for (int i = 0; i < n; i++)
  155.         v_out[i] = a[i] + b[i];
  156. }
  157.  
  158. void Diff(Vector a, Vector b, int n, Vector v_out)
  159. {
  160.     for (int i = 0; i < n; i++)
  161.         v_out[i] = a[i] - b[i];
  162. }
  163.  
  164. void MultToConst(Vector v, double c, int n, Vector v_out)
  165. {
  166.     for (int i = 0; i < n; i++)
  167.         v_out[i] = v[i] * c;
  168. }
  169.  
  170. double Scal(Vector a, Vector b, int n)
  171. {
  172.     double scal = 0;
  173.     for (int i = 0; i < n; i++)
  174.         scal += a[i] * b[i];
  175.     return scal;
  176. }
  177.  
  178.  
  179.  
  180. Vector MSG(Matrix *A, Vector f, Vector x0, double Eps, int MaxIter)
  181. {
  182.     int N = A->N;
  183.     double alpha, beta,
  184.         normF = Norm(f, N);
  185.     Vector x, p,
  186.         r = new double[N],
  187.         buf = new double[N];
  188.  
  189.     // x = x0;  r(0) = b - A*x(0);  p(0) = r(0)
  190.     x = (Vector)memcpy(new double[N], x0, N*sizeof(double));
  191.     Matrix_vector(A, x, buf);
  192.     Diff(f, buf, N, r);
  193.     p = (Vector)memcpy(new double[N], r, N*sizeof(double));
  194.  
  195.     for (int j = 0; j < MaxIter; j++)
  196.     {
  197.         Matrix_vector(A, p, buf);                   // alpha(k) = <r(k-1),r(k-1)> / <A*p(k-1), p(k-1)>
  198.         alpha = Scal(r, r, N) / Scal(buf, p, N);
  199.         MultToConst(p, alpha, N, buf);              // x(k) = x(k-1) + alpha(k)*p(k-1)
  200.         Sum(x, buf, N, x);
  201.         Matrix_vector(A, p, buf);                   // r(k) = r(k-1) - alpha(k)*A*p(k-1)
  202.         MultToConst(buf, alpha, N, buf);
  203.         Diff(r, buf, N, buf);
  204.         swap(r, buf);
  205.         if (Norm(r, N) / normF < Eps) break;        // ||r(k)|| / ||f|| < Eps ?
  206.         beta = Scal(r, r, N) / Scal(buf, buf, N);   // beta(k) = <r(k), r(k)> / <r(k-1), r(k-1)>
  207.         MultToConst(p, beta, N, buf);               // p(k) = r(k) + beta(k)*p(k-1)
  208.         Sum(r, buf, N, p);
  209.     }
  210.     return x;
  211. }
  212.  
  213. /*
  214.     for (int i = 0; i < N; i++)
  215.         cout << r[i] << " ";
  216.     return 0;
  217.     */
  218.  
  219. /*cout << "r = {";
  220.         for (int i = 0; i < N; i++)
  221.             cout << r[i] << ", ";
  222.         cout << endl;
  223.         cout << "p = {";
  224.         for (int i = 0; i < N; i++)
  225.             cout << p[i] << ", ";
  226.         cout << endl;
  227.         cout << "alpha = " << alpha << endl;
  228.         cout << "beta = " << beta << endl;*/
  229.  
  230.  
  231. int main()
  232. {
  233.     Matrix M;
  234.     M.ReadFromFile("N.txt", "ig.txt", "jg.txt", "di.txt", "ggl.txt", "ggu.txt");
  235.  
  236.     Vector f = new double[5];
  237.     Vector x0 = new double[5];
  238.     for (int i = 0; i < 5; i++)
  239.         x0[i] = 0;
  240.     f[0] = 9;
  241.     f[1] = 48;
  242.     f[2] = 20;
  243.     f[3] = 37;
  244.     f[4] = -9;
  245.     Vector v_out = new double[5];
  246.  
  247.     v_out = MSG(&M, f, x0, 0.001, 1000);
  248.  
  249.     //Matrix_vector(&M, f, v_out);                  // A * v
  250.     //TransposeMatrix_vector(&M, v, v_out);         // A^T * v
  251.     //InverseIL0_vector(&M, v, v_out);              // L^(-1) * v
  252.     //InverseTransposeIU0_vector(&M, v, v_out);     // U^(-T) * v
  253.     //InverseIU0_vector(&M, v, v_out);              // U^(-1) * v
  254.     //InverseTransposeIL0_vector(&M, v, v_out);     // L^(-T) * v
  255.  
  256.     for (int i = 0; i < 5; i++)
  257.         cout << v_out[i] << " ";
  258.  
  259.     getchar();
  260.     return 0;
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement