Advertisement
VladimirKostovsky

QR ver 2 ЧМ 1 лаба

Oct 15th, 2023
741
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. const double PI = 3.1415926536;
  6.  
  7. bool isSimmetrial(double ** coefficients, int numberOfEquation) {
  8.   bool result = true;
  9.   int i, j;
  10.   for (i = 0; i < numberOfEquation; i++) {
  11.     for (j = i + 1; j < numberOfEquation; j++) {
  12.       if (coefficients[i][j] != coefficients[j][i]) {
  13.         result = false;
  14.         break;
  15.       }
  16.     }
  17.     if (!result) {
  18.       break;
  19.     }
  20.   }
  21.   return result;
  22. }
  23. int wrachenie(double ** coefficients, int numberOfEquation,
  24.   double ** solution, double precision) {
  25.   int result = 1;
  26.   int i, j, k;
  27.   int maxI, maxJ;
  28.   double max, fi;
  29.   double ** matricaPoworota;
  30.   matricaPoworota = new double * [numberOfEquation];
  31.   for (i = 0; i < numberOfEquation; i++) {
  32.     matricaPoworota[i] = new double[numberOfEquation];
  33.   }
  34.   double ** temp;
  35.   temp = new double * [numberOfEquation];
  36.   for (i = 0; i < numberOfEquation; i++) {
  37.     temp[i] = new double[numberOfEquation];
  38.   }
  39.   double fault = 0.0;
  40.   for (i = 0; i < numberOfEquation; i++) {
  41.     for (j = i + 1; j < numberOfEquation; j++) {
  42.       fault = fault + coefficients[i][j] * coefficients[i][j];
  43.     }
  44.   }
  45.   fault = sqrt(2 * fault);
  46.   while (fault > precision) {
  47.     max = 0.0;
  48.     for (i = 0; i < numberOfEquation; i++) {
  49.       for (j = i + 1; j < numberOfEquation; j++) {
  50.         if (coefficients[i][j] > 0 && coefficients[i][j] > max) {
  51.           max = coefficients[i][j];
  52.           maxI = i;
  53.           maxJ = j;
  54.         } else if (coefficients[i][j] < 0 && -coefficients[i][j] > max) {
  55.           max = -coefficients[i][j];
  56.           maxI = i;
  57.           maxJ = j;
  58.         }
  59.       }
  60.     }
  61.     for (i = 0; i < numberOfEquation; i++) {
  62.       for (j = 0; j < numberOfEquation; j++) {
  63.         matricaPoworota[i][j] = 0;
  64.       }
  65.       matricaPoworota[i][i] = 1;
  66.     }
  67.     if (coefficients[maxI][maxI] == coefficients[maxJ][maxJ]) {
  68.       matricaPoworota[maxI][maxI] = matricaPoworota[maxJ][maxJ] =
  69.         matricaPoworota[maxJ][maxI] = sqrt(2.0) / 2.0;
  70.       matricaPoworota[maxI][maxJ] = -sqrt(2.0) / 2.0;
  71.     } else {
  72.       fi = 0.5 * atan((2.0 * coefficients[maxI][maxJ]) /
  73.         (coefficients[maxI][maxI] - coefficients[maxJ][maxJ]));
  74.       matricaPoworota[maxI][maxI] = matricaPoworota[maxJ][maxJ] = cos(fi);
  75.       matricaPoworota[maxI][maxJ] = -sin(fi);
  76.       matricaPoworota[maxJ][maxI] = sin(fi);
  77.     }
  78.     for (i = 0; i < numberOfEquation; i++) {
  79.       for (j = 0; j < numberOfEquation; j++) {
  80.         temp[i][j] = 0.0;
  81.       }
  82.     }
  83.     for (i = 0; i < numberOfEquation; i++) {
  84.       for (j = 0; j < numberOfEquation; j++) {
  85.         for (k = 0; k < numberOfEquation; k++) {
  86.           temp[i][j] = temp[i][j] + matricaPoworota[k][i] * coefficients[k][j];
  87.         }
  88.       }
  89.     }
  90.     for (i = 0; i < numberOfEquation; i++) {
  91.       for (j = 0; j < numberOfEquation; j++) {
  92.         coefficients[i][j] = 0.0;
  93.       }
  94.     }
  95.     for (i = 0; i < numberOfEquation; i++) {
  96.       for (j = 0; j < numberOfEquation; j++) {
  97.         for (k = 0; k < numberOfEquation; k++) {
  98.           coefficients[i][j] = coefficients[i][j] +
  99.             temp[i][k] * matricaPoworota[k][j];
  100.         }
  101.       }
  102.     }
  103.     fault = 0.0;
  104.     for (i = 0; i < numberOfEquation; i++) {
  105.       for (j = i + 1; j < numberOfEquation; j++) {
  106.         fault = fault + coefficients[i][j] * coefficients[i][j];
  107.       }
  108.     }
  109.     fault = sqrt(2 * fault);
  110.     for (i = 0; i < numberOfEquation; i++) {
  111.       for (j = 0; j < numberOfEquation; j++) {
  112.         temp[i][j] = 0.0;
  113.       }
  114.     }
  115.     for (i = 0; i < numberOfEquation; i++) {
  116.       for (j = 0; j < numberOfEquation; j++) {
  117.         for (k = 0; k < numberOfEquation; k++) {
  118.           temp[i][j] = temp[i][j] + solution[i][k] * matricaPoworota[k][j];
  119.         }
  120.       }
  121.     }
  122.     for (i = 0; i < numberOfEquation; i++) {
  123.       for (j = 0; j < numberOfEquation; j++) {
  124.         solution[i][j] = temp[i][j];
  125.       }
  126.     }
  127.     result++;
  128.   }
  129.   return result;
  130. }
  131.  
  132. using namespace std;
  133.  
  134. int main() {
  135.   setlocale(LC_ALL, "rus");
  136.   int i, j;
  137.   int size = 21; // N
  138.   double ** coefficients, ** solution, precision;
  139.   coefficients = new double * [size];
  140.   solution = new double * [size];
  141.   for (i = 0; i < size; i++) {
  142.     coefficients[i] = new double[size];
  143.     solution[i] = new double[size];
  144.   }
  145.   for (i = 0; i < size; i++) {
  146.     for (j = 0; j < size; j++) {
  147.       solution[i][j] = 0;
  148.     }
  149.     solution[i][i] = 1;
  150.   }
  151.   for (int i = 0; i < size; i++) {
  152.     for (int j = 0; j < size; j++) {
  153.       if (i == j) {
  154.         coefficients[i][j] = 100;
  155.       } else {
  156.         coefficients[i][j] = 1 + i - j;
  157.       }
  158.     }
  159.   }
  160.  
  161.   cout << endl;
  162.  
  163.   for (int i = 0; i < size; i++) {
  164.     for (int j = 0; j < size; j++) {
  165.       cout << coefficients[i][j] << " ";
  166.  
  167.     }
  168.     cout << endl;
  169.   }
  170.  
  171.   cout << endl;
  172.  
  173.   cout << "Введите точность расчета: ";
  174.   cin >> precision;
  175.   if (!isSimmetrial(coefficients, size)) {
  176.     cout << "Матрица не симметричная";
  177.   } else {
  178.     int steps = wrachenie(coefficients, size, solution, precision);
  179.     cout << "Reshenie:\n";
  180.     for (i = 0; i < size; i++) {
  181.       cout << "Собственный вектор k " <<
  182.         i + 1 << ":\n";
  183.       for (j = 0; j < size; j++) {
  184.         cout << solution[j][i] << // полагаю это Х
  185.           "\n";
  186.       }
  187.     }
  188.     cout << "Собственные значения:\n";
  189.     for (i = 0; i < size; i++) {
  190.       cout << coefficients[i][i] <<
  191.         "\n";
  192.     }
  193.     cout << "Общее число шагов: " <<
  194.       steps;
  195.   }
  196.   cout << "\nPress \"Enter\" to continue..." <<
  197.     endl;
  198.  
  199.   return 0;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement