Advertisement
VladimirKostovsky

QR ЧМ 1 лаба

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