MaPV

VP_7_Vrasheniya_Yakobi_sobstv

Jan 15th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. /*вещественная симметрическая матрица
  2. Идея метода Якоби состоит в том, чтобы подходящими преобразованиями подобия от шага к шагу уменьшать норму внедиагональной части матрицы. Получающиеся при этом матрицы имеют тот же спектр,
  3. что и исходная матрица, но будут стремиться к диагональной матрице
  4. с собственными значениями на главной диагонали. Инструментом реализации этого плана выступают элементарные ортогональные матрицы вращений
  5. ------------чиста спиздил*/
  6.  
  7. #include "stdio.h"
  8. #include <iostream>
  9. #include "math.h"
  10. #include<fstream>
  11. #include <iomanip>
  12. const double PI = 3.1415926536;
  13.  
  14. bool sim(double(&m)[100][100], int num) {
  15.     bool result = true;
  16.     int i, j;
  17.     for (i = 0; i < num; i++) {
  18.         for (j = i + 1; j < num; j++) {
  19.             if (m[i][j] != m[j][i]) {
  20.                 result = false;
  21.                 break;
  22.             }
  23.         }
  24.         if (!result) { break; }
  25.     }
  26.     return result;
  27. }
  28. int rotation(double(&m)[100][100], int n, double(&v)[100][100], double e) {
  29.         {
  30.             int result = 1;
  31.             int i, j, k;
  32.             int maxI, maxJ;
  33.             double max, fi;
  34.             double** matpov;
  35.             matpov = new double*[n];
  36.             for (i = 0; i < n; i++) {
  37.                 matpov[i] = new double[n];
  38.             }
  39.             double** temp;
  40.             temp = new double*[n];
  41.             for (i = 0; i < n; i++) {
  42.                 temp[i] = new double[n];
  43.             }
  44.             double fault = 0.0;
  45.             for (i = 0; i < n; i++) {
  46.                 for (j = i + 1; j < n; j++) {
  47.                     fault = fault + m[i][j] * m[i][j];
  48.                 }
  49.             }
  50.             fault = sqrt(2 * fault);
  51.             while (fault > e) {
  52.                 max = 0.0;
  53.                 for (i = 0; i < n; i++) {
  54.                     for (j = i + 1; j < n; j++) {
  55.                         if (m[i][j] > 0 && m[i][j] > max) {
  56.                             max = m[i][j];
  57.                             maxI = i;
  58.                             maxJ = j;
  59.                         }
  60.                         else if (m[i][j] < 0 && -m[i][j] > max) {
  61.                             max = -m[i][j];
  62.                             maxI = i;
  63.                             maxJ = j;
  64.                         }
  65.                     }
  66.                 }
  67.                 for (i = 0; i < n; i++){
  68.                     for (j = 0; j < n; j++){
  69.                         matpov[i][j] = 0;
  70.                     }
  71.                     matpov[i][i] = 1;
  72.                 }
  73.                 if (m[maxI][maxI] == m[maxJ][maxJ]) {
  74.                     matpov[maxI][maxI] = matpov[maxJ][maxJ] =
  75.                         matpov[maxJ][maxI] = sqrt(2.0) / 2.0;
  76.                     matpov[maxI][maxJ] = -sqrt(2.0) / 2.0;
  77.                 }
  78.                 else {
  79.                     fi = 0.5 * atan((2.0 * m[maxI][maxJ]) /
  80.                         (m[maxI][maxI] - m[maxJ][maxJ]));
  81.                     matpov[maxI][maxI] = matpov[maxJ][maxJ] = cos(fi);
  82.                     matpov[maxI][maxJ] = -sin(fi);
  83.                     matpov[maxJ][maxI] = sin(fi);
  84.                 }
  85.                 for (i = 0; i < n; i++) {
  86.                     for (j = 0; j < n; j++) {
  87.                         temp[i][j] = 0.0;
  88.                     }
  89.                 }
  90.                 for (i = 0; i < n; i++) {
  91.                     for (j = 0; j < n; j++) {
  92.                         for (k = 0; k < n; k++) {
  93.                             temp[i][j] = temp[i][j] + matpov[k][i] * m[k][j];
  94.                         }
  95.                     }
  96.                 }
  97.                 for (i = 0; i < n; i++) {
  98.                     for (j = 0; j < n; j++) {
  99.                         m[i][j] = 0.0;
  100.                     }
  101.                 }
  102.                 for (i = 0; i < n; i++) {
  103.                     for (j = 0; j < n; j++) {
  104.                         for (k = 0; k < n; k++) {
  105.                             m[i][j] = m[i][j] +
  106.                                 temp[i][k] * matpov[k][j];
  107.                         }
  108.                     }
  109.                 }
  110.                 fault = 0.0;
  111.                 for (i = 0; i < n; i++) {
  112.                     for (j = i + 1; j < n; j++) {
  113.                         fault = fault + m[i][j] * m[i][j];
  114.                     }
  115.                 }
  116.                 fault = sqrt(2 * fault);
  117.                 for (i = 0; i < n; i++) {
  118.                     for (j = 0; j < n; j++) {
  119.                         temp[i][j] = 0.0;
  120.                     }
  121.                 }
  122.                 for (i = 0; i < n; i++) {
  123.                     for (j = 0; j < n; j++) {
  124.                         for (k = 0; k < n; k++) {
  125.                             temp[i][j] = temp[i][j] + v[i][k] * matpov[k][j];
  126.                         }
  127.                     }
  128.                 }
  129.                 for (i = 0; i < n; i++) {
  130.                     for (j = 0; j < n; j++) {
  131.                         v[i][j] = temp[i][j];
  132.                     }
  133.                 }
  134.                 result++;
  135.             }
  136.             return result;
  137.         }
  138. }
  139. using namespace std;
  140.  
  141. int main()
  142. {
  143.     int size;
  144.     double v[100][100], e;
  145.     fstream f1;
  146.     //Читаем матрицу с файла
  147.     f1.open("input.txt", ios::in);
  148.     f1 >> size;
  149.     f1 >> e;
  150.     double matrix[100][100] = { 0 };
  151.     for (int i = 0; i < size; i++)
  152.         for (int j = 0; j < size; j++)
  153.             f1 >> matrix[i][j];
  154.     f1.close();
  155.     for (int i = 0; i < size; i++){
  156.         for (int j = 0; j < size; j++){
  157.             v[i][j] = 0;
  158.         }
  159.         v[i][i] = 1;
  160.     }
  161.     fstream f2;
  162.     if (!f2)
  163.         f2.open("output.txt", ios::out);
  164.     else
  165.         f2.open("output.txt", ios::app);
  166.     if (!sim(matrix, size)) {
  167.         f2 << "error!!!";
  168.         f2 << endl;
  169.     }
  170.     else {
  171.         f2 << endl;
  172.         for (int i = 0; i < size; i++) {
  173.             f2 << i + 1 << " : ";
  174.             f2 << fixed << setprecision(8) << matrix[i][i];
  175.             f2 << endl;
  176.         }
  177.     }
  178.     return 0;
  179. }
Add Comment
Please, Sign In to add comment