Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #include <cmath>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int CheckIfDiagonalMatricesAreSameTask9(double **oldMatrix, double **newMatrix, int dimension, double epsilon)
  7. {
  8.     int result = 1;
  9.     for (int row = 0; row < dimension; row++)
  10.     {
  11.         double diff = fabs(oldMatrix[row][row] - newMatrix[row][row]);
  12.         if (diff > epsilon)
  13.         {
  14.             result = 0;
  15.         }
  16.     }
  17.     return result;
  18. }
  19. int CheckIfLowerIsZeroTask9(double **matrix, int dimension, double epsilon)
  20. {
  21.     int result = 1;
  22.     for (int i = 0; i < dimension; i++)
  23.     {
  24.         for (int j = 0; j < i; j++)
  25.         {
  26.             double value = matrix[i][j];
  27.             if (value > epsilon)
  28.             {
  29.                 return 0;
  30.             }
  31.         }
  32.     }
  33.     return result;
  34. }
  35. double norma(double * wektor, int rozmiar) {
  36.     int i;
  37.     double A, suma = 0;
  38.  
  39.  
  40.     for (i = 0; i < rozmiar; i++) {
  41.         suma += wektor[i] * wektor[i];
  42.     }
  43.  
  44.  
  45.     return sqrt(suma);
  46. }
  47. void OdejmowanieSkalaraOdWektora(double * wektor, double R, int rozmiar, double * y) {
  48.     int i;
  49.  
  50.  
  51.     for (i = 0; i < rozmiar; i++) {
  52.         y[i] -= R * wektor[i];
  53.     }
  54.  
  55. }
  56.  
  57. void DzieleniePrzezSkalar(double * wektor, double R, int rozmiar, double * y) {
  58.     int i;
  59.  
  60.  
  61.  
  62.     for (i = 0; i < rozmiar; i++) {
  63.         y[i] = wektor[i] / R;
  64.     }
  65.  
  66. }
  67.  
  68. double dot_product(double * wektor, double * y, int rozmiar) {
  69.     int i;
  70.     double suma = 0;
  71.  
  72.  
  73.     for (i = 0; i < rozmiar; i++) {
  74.         suma += wektor[i] * y[i];
  75.     }
  76.  
  77.  
  78.     return suma;
  79. }
  80.  
  81. void MnozenieMacierzy(double **matrix1, double **matrix2, double **wynik, int n)
  82. {
  83.     for (int wiersz = 0; wiersz < n; wiersz++)
  84.     {
  85.         for (int kolumna = 0; kolumna < n; kolumna++)
  86.         {
  87.             double value = 0;
  88.             for (int i = 0; i < n; i++)
  89.             {
  90.                 value += matrix1[wiersz][i] * matrix2[i][kolumna];
  91.             }
  92.             wynik[wiersz][kolumna] = value;
  93.         }
  94.     }
  95. }
  96.  
  97. void WypelnianieZerami(double **matrix, int rozmiar)
  98. {
  99.     for (int i = 0; i < rozmiar; i++)
  100.     {
  101.         for (int j = 0; j < rozmiar; j++)
  102.         {
  103.             matrix[i][j] = 0;
  104.         }
  105.     }
  106. }
  107.  
  108. void MetodaGramaSchmidta(double ** A, double ** R, int n) {
  109.     int i, j;
  110.     double anorm, tol = 10e-7;
  111.  
  112.     for (i = 0; i < n; i++) {
  113.         R[i][i] = norma(A[i], n);
  114.  
  115.         if (R[i][i] > tol) {
  116.             DzieleniePrzezSkalar(A[i], R[i][i], n, A[i]);
  117.         }
  118.         else if (i == 0) {
  119.             A[i][0] = 1;
  120.             for (j = 1; j < n; j++) {
  121.                 A[i][j] = 0;
  122.             }
  123.         }
  124.         else {
  125.             for (j = 0; j < n; j++) {
  126.                 A[i][j] = -A[0][i] * A[0][j];
  127.             }
  128.             A[i][i] += 1;
  129.  
  130.             for (j = 1; j < i; j++) {
  131.                 OdejmowanieSkalaraOdWektora(A[j], A[j][i], n, A[i]);
  132.             }
  133.  
  134.             anorm = norma(A[i], n);
  135.             DzieleniePrzezSkalar(A[i], anorm, n, A[i]);
  136.         }
  137.  
  138.         for (j = i + 1; j < n; j++) {
  139.             R[j][i] = dot_product(A[i], A[j], n);
  140.             OdejmowanieSkalaraOdWektora(A[i], R[j][i], n, A[j]);
  141.         }
  142.     }
  143.  
  144.  
  145.     for (; i < n; i++) {
  146.         for (j = 0; j < n; j++) {
  147.             A[i][j] = -A[0][i] * A[0][j];
  148.         }
  149.         A[i][i] += 1;
  150.  
  151.         for (j = 1; j < i; j++) {
  152.             OdejmowanieSkalaraOdWektora(A[j], A[j][i], n, A[i]);
  153.         }
  154.  
  155.         anorm = norma(A[i], n);
  156.         DzieleniePrzezSkalar(A[i], anorm, n, A[i]);
  157.     }
  158.  
  159. }
  160.  
  161.  
  162. int main() {
  163.     int i, j, n;
  164.     double wektor;
  165.     int rozmiar = 3;
  166.     n = rozmiar;
  167.  
  168.     double ** A = new double*[n];
  169.     double ** Aold = new double*[n];
  170.     double ** R = new double*[n];
  171.     double ** Q = new double*[n];
  172.     double ** Qtransposed = new double*[n];
  173.     double ** wynik = new double*[n];
  174.     for (i = 0; i < n; i++) {
  175.         A[i] = new double[n];
  176.         Aold[i]= new double[n];
  177.         R[i] = new double[n];
  178.         Q[i] = new double[n];
  179.         Qtransposed[i] = new double[n];
  180.         wynik[i] = new double[n];
  181.     }
  182.     WypelnianieZerami(Q, n);
  183.     WypelnianieZerami(Qtransposed, n);
  184.     WypelnianieZerami(R, n);
  185.     WypelnianieZerami(wynik, n);
  186.  
  187.     //A[0][0] = 1;
  188.     //A[0][1] = 2;
  189.     //A[0][2] = 3;
  190.     //A[0][3] = 5;
  191.     //A[1][0] = 2;
  192.     //A[1][1] = 3;
  193.     //A[1][2] = 4;
  194.     //A[1][3] = 5;
  195.     //A[2][0] = 3;
  196.     //A[2][1] = 4;
  197.     //A[2][2] = 5;
  198.     //A[2][3] = 6;
  199.     //A[3][0] = 5;
  200.     //A[3][1] = 5;
  201.     //A[3][2] = 6;
  202.     //A[3][3] = 8;
  203.  
  204.     A[0][0] = 8;
  205.     A[0][1] = -2;
  206.     A[0][2] = -2;
  207.  
  208.     A[1][0] = -2;
  209.     A[1][1] = 4;
  210.     A[1][2] = -2;
  211.  
  212.     A[2][0] = -2;
  213.     A[2][1] = -2;
  214.     A[2][2] = 13;
  215.  
  216.  
  217.     cout << "A = " << endl;
  218.     for (i = 0; i < n; i++) {
  219.         for (j = 0; j < n; j++) {
  220.             cout << A[j][i] << "\t";
  221.         }
  222.         cout << endl;
  223.     }
  224.     cout << endl;
  225.     //////tu mam problem z tą pętlą jak ją zbudować
  226.     do{
  227.         cout << "A" << endl;
  228.         for (i = 0; i < n; i++) {
  229.             for (j = 0; j < n; j++) {
  230.                 cout << A[i][j] << "\t";
  231.             }
  232.             cout << endl;
  233.         }
  234.         cout << endl;
  235.         for (i = 0; i < n; i++) {
  236.             for (j = 0; j < n; j++) {
  237.                 Aold[i][j] = A[i][j];
  238.             }
  239.         }
  240.        
  241.         MetodaGramaSchmidta(A, R, n);
  242.  
  243.        
  244.         for (i = 0; i < n; i++) {
  245.             for (j = 0; j < n; j++) {
  246.                 Q[i][j] = A[i][j];
  247.             }
  248.         }
  249.         for (i = 0; i < n; i++) {
  250.             for (j = 0; j < n; j++) {
  251.                 Qtransposed[i][j] = A[j][i];
  252.             }
  253.         }
  254.         MnozenieMacierzy(A, R, Qtransposed, n);
  255.         MnozenieMacierzy(R, Qtransposed, A, n);    
  256.  
  257.     cout << "Q = " << endl;
  258.     for (i = 0; i < n; i++) {
  259.         for (j = 0; j < n; j++) {
  260.             cout << Qtransposed[i][j] << "\t";
  261.         }
  262.         cout << endl;
  263.     }
  264.     cout << endl;
  265.  
  266.  
  267.     cout << "R = " << endl;
  268.     for (i = 0; i < n; i++) {
  269.         for (j = 0; j < n; j++) {
  270.             cout << R[j][i] << "\t";
  271.         }
  272.         cout << endl;
  273.     }
  274.     cout << endl;
  275.  
  276.     cout << "RQ" << endl;
  277.     for (i = 0; i < n; i++) {
  278.         for (j = 0; j < n; j++) {
  279.             cout << A[i][j] << "\t";
  280.         }
  281.         cout << endl;
  282.     }
  283.     cout << endl;
  284.  
  285.     } while (!(CheckIfDiagonalMatricesAreSameTask9(Aold, A, n, DBL_EPSILON) == 1 &&
  286.             CheckIfLowerIsZeroTask9(A, n, DBL_EPSILON)));
  287.  
  288.  
  289.     cout << "Q = " << endl;
  290.     for (i = 0; i < n; i++) {
  291.         for (j = 0; j < n; j++) {
  292.             cout << Q[i][j] << "\t";
  293.         }
  294.         cout << endl;
  295.     }
  296.     cout << endl;
  297.  
  298.  
  299.     cout << "R = " << endl;
  300.     for (i = 0; i < n; i++) {
  301.         for (j = 0; j < n; j++) {
  302.             cout << R[j][i] << "\t";
  303.         }
  304.         cout << endl;
  305.     }
  306.     cout << endl;
  307.  
  308.     cout << "A =  QR" << endl;
  309.     for (i = 0; i < n; i++) {
  310.         for (j = 0; j < n; j++) {
  311.             cout << wynik[i][j] << "\t";
  312.         }
  313.         cout << endl;
  314.     }
  315.     cout << endl;
  316.     for (i = 0; i < n; i++) {
  317.         delete[] A[i];
  318.         delete[] R[i];
  319.         delete[] Q[i];
  320.         delete[] wynik[i];
  321.     }
  322.  
  323.     delete[] A;
  324.     delete[] R;
  325.     delete[] Q;
  326.     delete[] wynik;
  327.     //system("pause");
  328.     cin.get();
  329.     return 0;
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement