Guest User

Untitled

a guest
Jul 16th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cfloat>
  5. #include <cmath>
  6.  
  7. double* allocateVector(int n)
  8. {  
  9.     double* temp = (double*) malloc (n * sizeof (double));
  10.     return temp;
  11. }
  12.  
  13. double** allocateMatrix(int l, int c)
  14. {
  15.     double** temp = (double**) malloc (l * sizeof (double *));
  16.     for (int i = 0; i < l; i++)
  17.         temp[i] = allocateVector(c);
  18.     return temp;
  19. }
  20.  
  21. void freeVector(double*& v)
  22. {
  23.     free(v);
  24.     v = NULL;
  25. }
  26.  
  27. void freeMatrix(double**& M, int l)
  28. {
  29.     for (int i = 0; i < l; i++)
  30.         freeVector(M[i]);
  31.     free(M);
  32.     M = NULL;
  33. }
  34.  
  35. void printMatrix (const char* msg, double** M, int l, int c)
  36. {  
  37.     printf("\n");
  38.    
  39.     int msglen = strlen(msg);
  40.     for (int i = 0 ; i < l; i++)
  41.     {
  42.         if (i == l/2)
  43.             printf(msg);
  44.         else
  45.             for (int k = 0; k < msglen; k++)
  46.                 printf (" ");
  47.         for (int j = 0; j < c; j++)
  48.             printf("%+.3f\t", M[i][j]);
  49.         printf("\n");
  50.     }
  51.     printf("\n");
  52. }
  53.  
  54. void printVector (const char* msg, double* A, int m)
  55. {  
  56.     printf("\n");
  57.    
  58.     int msglen = strlen(msg);
  59.     for (int i = 0 ; i < m; i++)
  60.     {
  61.         if (i == m/2)
  62.             printf(msg);
  63.         else
  64.             for (int k = 0; k < msglen; k++)
  65.                 printf (" ");
  66.         printf("%+.3f\n", A[i]);
  67.     }
  68.     printf("\n");
  69. }
  70.  
  71. // C = A - B
  72. void substractMatrix (int l, int c, double** C, double** A, double** B)
  73. {
  74.     for (int i = 0 ; i < l; i++)
  75.         for (int j = 0; j < c; j++)
  76.             C[i][j] = A[i][j] - B[i][j];
  77. }
  78.  
  79. void substractVector (double* C, double* A, double* B, int m)
  80. {
  81.     for (int i = 0 ; i < m; i++)
  82.             C[i] = A[i] - B[i];
  83. }
  84.  
  85. double matrix_norm_1 (double** M, int l, int c)
  86. {
  87.     double max = -DBL_MAX;
  88.     for (int j = 0; j < c; j++)
  89.     {
  90.         double sum = 0.0;
  91.         for (int i = 0; i < l; i++)
  92.             sum += abs (M[i][j]);
  93.         if (max < sum)
  94.             max = sum;
  95.     }
  96.     return max;
  97. }
  98.  
  99. double matrix_norm_inf (double** M, int l, int c)
  100. {
  101.     double max = -DBL_MAX;
  102.     for (int i = 0; i < l; i++)
  103.     {
  104.         double sum = 0.0;
  105.         for (int j = 0; j < c; j++)
  106.             sum += abs (M[i][j]);
  107.         if (max < sum)
  108.             max = sum;
  109.     }
  110.     return max;
  111. }
  112.  
  113. // A = B
  114. void vec_copy (double* A, double* B, int m)
  115. {
  116.     for (int i = 0; i < m; i++)
  117.         A[i] = B[i];
  118. }
  119.  
  120. double vec_norm_1 (double* A, int m)
  121. {
  122.     double sum = 0.0;
  123.     for (int i = 0; i < m; i++)
  124.         sum += abs(A[i]);
  125.     return sum;
  126. }
  127.  
  128. double vec_norm_inf (double* A, int m)
  129. {
  130.     double max = -DBL_MAX;
  131.     for (int i = 0; i < m; i++)
  132.         if (max < abs(A[i]))
  133.             max = abs(A[i]);
  134.     return max;
  135. }
  136.  
  137. int main()
  138. {
  139.     double eps = 1e-10;
  140.    
  141.     int m = 4;
  142.  
  143.     double** I = allocateMatrix(m,m);
  144.     double** A = allocateMatrix(m,m);
  145.     double** B = allocateMatrix(m,m);
  146.     double*  b = allocateVector(m);
  147.     double*  x_n = allocateVector(m);
  148.     double*  x_n1 = allocateVector(m);
  149.     double*  x_diff = allocateVector(m);
  150.  
  151.     //Initializare I
  152.     for (int i = 0; i < m; i++)
  153.         for (int j = 0; j < m; j++)
  154.             if (i == j)
  155.                 I[i][j] = 1;
  156.             else
  157.                 I[i][j] = 0;
  158.  
  159.     // Initializare A
  160.     A[0][0] =  0.9; A[0][1] =  0.1; A[0][2] =  0.2; A[0][3] =  0.3;
  161.     A[1][0] = -0.2; A[1][1] =  0.8; A[1][2] =  0.1; A[1][3] =  0.4;
  162.     A[2][0] =  0.1; A[2][1] = -0.3; A[2][2] =  0.7; A[2][3] = -0.1;
  163.     A[3][0] = -0.3; A[3][1] = -0.2; A[3][2] = -0.1; A[3][3] =  0.9;
  164.  
  165.     // Initializare b
  166.     b[0] = 3.6;     b[1] = 2.0;     b[2] = 2.4;     b[3] = 1.5;
  167.  
  168.     //Initializare x;
  169.     x_n [0] = x_n [1] = x_n [2] = x_n [3] = 0.0;
  170.     x_n1[0] = x_n1[1] = x_n1[2] = x_n1[3] = 0.0;
  171.  
  172.     // Initializare B
  173.     substractMatrix (m, m, B, I, A);
  174.    
  175.     printMatrix("B =  ",B, m, m);
  176.    
  177.     const bool use_1_norm = true;
  178.  
  179.     double q = 2.0;
  180.     if (use_1_norm)
  181.     {
  182.         q = matrix_norm_1(B, m, m);
  183.         printf("||B||1   = %f\n", q);
  184.     }
  185.     else
  186.     {
  187.         q = matrix_norm_inf(B, m, m);
  188.         printf("||B||inf = %f\n", q);
  189.     }
  190.  
  191.     bool cont = true;
  192.     double p = 0;
  193.  
  194.     if (q < 1.0)
  195.     {
  196.         printf("\nMetoda lui Jacobi se poate aplica\n");
  197.         do
  198.         {
  199.             // Copiem x-ul anterior
  200.             vec_copy(x_n, x_n1, m);
  201.            
  202.             // Calculam iteratia propriu-zisa
  203.             for (int i = 0; i < m; i++)
  204.             {
  205.                 double sum = 0.0;
  206.                 for (int j = 0; j < m; j++)
  207.                     sum += B[i][j] * x_n[j];
  208.                 x_n1[i] = sum + b[i];
  209.             }
  210.             cont = true;
  211.             substractVector(x_diff, x_n1, x_n, m);
  212.             if (use_1_norm)
  213.                 p = vec_norm_1 (x_diff, m);
  214.             else
  215.                 p = vec_norm_inf (x_diff, m);
  216.            
  217.         printf("Norma diferentei intre x(n+1) si x(n) este %.11f\n", p);
  218.         }
  219.         while (q/(1-q)*p > eps);
  220.     }
  221.    
  222.     printf("\nRezultat final:");
  223.     printVector("x =  ", x_n1, m);
  224.    
  225.     freeMatrix(I, m);
  226.     freeMatrix(A, m);
  227.     freeMatrix(B, m);
  228.     freeVector(b);
  229.     freeVector(x_n);
  230.     freeVector(x_n1);
  231.     freeVector(x_diff);
  232.  
  233.     system("pause");
  234.     return 0;
  235. }
Add Comment
Please, Sign In to add comment