SHARE
TWEET

Untitled

a guest Dec 8th, 2019 73 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  main.cpp
  3. //  KR_PO_VMA
  4. //
  5. //  Created by Berkovich Pavel on 12/8/19.
  6. //  Copyright © 2019 Berkovich Pavel. All rights reserved.
  7. //
  8.  
  9.  
  10.  
  11. #include <iostream>
  12. #include<time.h>
  13. #include <cmath>
  14. #include <iomanip>
  15. #include <float.h>
  16.  
  17. using namespace std;
  18. const int size =3;
  19. const double eps = pow(10, -3);
  20. int iteration = 1;
  21. int m,l;
  22. double fi(0);
  23.  
  24.  
  25.  
  26.  
  27. double** Build_U_matrix(){
  28.     double ** matrix=new double *[size];
  29.     for (int i = 0; i< size; ++i)
  30.         matrix[i] = new double[size]{0};
  31.     for(int i = 0; i<size;++i){
  32.         matrix[i][i]=1;
  33.     }
  34.     matrix[l][l] = cos(fi);
  35.     matrix[m][m] = cos(fi);
  36.     matrix[m][l] = sin(fi);
  37.     matrix[l][m] = -sin(fi);
  38.     return matrix;
  39. }
  40.  
  41. void Max_ne_diag (double**matrix){
  42.     double max = DBL_MIN;
  43.     for(int i=0;i<size;++i){
  44.         for (int j=0; j<size; ++j) {
  45.             if (abs(max)<abs(matrix[i][j]) && (i<j)){
  46.                 max =abs( matrix[i][j]);
  47.                 l = i;
  48.                 m=j;
  49.             }
  50.         }
  51.     }
  52. }
  53.  
  54. void counting_fi (double**matrix){
  55.     fi = 0.5*atan((2*matrix[l][m])/(matrix[l][l] - matrix[m][m]));
  56. }
  57.  
  58.  
  59. double scalar(double* V1,double* V2,int n)
  60. {
  61.     double rez(0);
  62.     for(int i = 0; i<size;++i)
  63.         rez+= V1[i]*V2[i];
  64.     return rez;
  65. }
  66.  
  67. void Print_Vector (double *arr){
  68.     for (int i = 0; i < size; ++i){
  69.         cout<<setw(7);
  70.         printf("%.15f \n",arr[i]);
  71.     }
  72.     cout<<endl;
  73. }
  74.  
  75. void Print_Matrix (double** arr){
  76.     for (int i=0;i<size;++i){
  77.         for(int j=0;j<size;j++){
  78.             printf("%15.5f ",arr[i][j]);
  79.         }
  80.     cout<<endl;
  81.     }
  82.     cout<<endl;
  83. }
  84.  
  85. void Norm_prisvaivanie (double** arr1,double** arr2){
  86.     for (int i=0;i<size;++i){
  87.         for(int j=0;j<size;j++){
  88.             arr1[i][j] = arr2[i][j];
  89.         }
  90.     }
  91. }
  92.  
  93. void Norm_prisvaivanie (double* arr1,double* arr2){
  94.     for (int i=0;i<size;++i){
  95.             arr1[i] = arr2[i];
  96.         }
  97.     }
  98.  
  99. void Transpouse_matrix (double **arr){
  100.     for(int i = 0; i < size; ++i){
  101.             for(int j = i; j < size; ++j){
  102.                 swap(arr[i][j] , arr[j][i]);
  103.             }
  104.         }
  105. }
  106.  
  107. void matrix_multiplication(double **arr1, double **arr2, double ** answer){
  108.     for (int i=0; i<size; ++i){
  109.         for(int j=0;j<size;++j){
  110.             for(int k = 0; k < size; ++k){
  111.                  answer[i][j] += arr1[i][k] * arr2[k][j];
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117. double * matrix_multiplication(double **arr1, double *arr2){
  118.     double *buff_vector = new double[size] {0};
  119.     for (int i=0; i<size; ++i){
  120.         for(int j=0;j<size;++j){
  121.             buff_vector[i]+=arr1[i][j]*arr2[j];
  122.         }
  123.     }
  124. return buff_vector;
  125. }
  126.  
  127.  
  128. double first_Norm(double*x){
  129.     double max = DBL_MIN;
  130.            for(int i =1;i<size;++i){
  131.                (abs(x[i])> abs(max))?(max = x[i]):(max=max);
  132.            }
  133.            return abs(max) ;
  134.        }
  135.  
  136. double mark_for_Test_1(double** matrix){
  137.     double summ(0);
  138.     for(int i=0;i<size;++i){
  139.         for (int j=0; j<size; ++j) {
  140.             if (i ==j )
  141.                 continue;
  142.             summ +=pow(matrix[i][j],2);
  143.         }
  144.     }
  145.     return summ;
  146. }
  147.  
  148. int mark_for_aprior(double** matrix){
  149.     double summ(0),p(0);
  150.     int answ(0);
  151.     summ =mark_for_Test_1(matrix);
  152.     p = 1.0 - 2.0/(size*(size-1));
  153.     answ = log(eps/summ)/log(p)+1;
  154.     return answ;
  155. }
  156.  
  157.  
  158. void Normirovka (double* arr1,double k){
  159. for (int i=0;i<size;++i){
  160.         arr1[i] /=k;
  161.     }
  162. }
  163.  
  164. void Obnulenie(double** matrix){
  165.     for(int i = 0;i<size;++i)
  166.         for(int j = 0;j<size;++j)
  167.             matrix[i][j]=0;
  168. }
  169.  
  170. void Task_1(double** arr){
  171.     iteration=0;
  172.     double ** buf2=new double *[size];
  173.     for (int i = 0; i< size; ++i)
  174.         buf2[i] = new double[size]{0};
  175.     double ** buf=new double *[size];
  176.     for (int i = 0; i< size; ++i)
  177.         buf[i] = new double[size]{0};
  178.     while (mark_for_Test_1(arr)>eps){
  179.         iteration++;
  180.         Max_ne_diag(arr);
  181.         counting_fi(arr);
  182.         Norm_prisvaivanie(buf2, Build_U_matrix());
  183.         cout<<"U matrix:"<<endl;
  184.         Print_Matrix(buf2);
  185.         Transpouse_matrix(buf2);
  186.         Obnulenie(buf);
  187.         matrix_multiplication(buf2, arr, buf);
  188.         Obnulenie(arr);
  189.         matrix_multiplication(buf,Build_U_matrix(), arr);
  190.         cout<<"Next matrix:"<<endl;
  191.         Print_Matrix(arr);
  192.     }
  193. }
  194.  void print_all_I_need (double *buff_pred,double * buff){
  195.      cout<<"Наши значения y(k),y(k+1):"<<endl;
  196.      Print_Vector(buff_pred);
  197.      cout<<"~~~~~~~~~~"<<endl;
  198.      Print_Vector(buff);
  199.      
  200.  }
  201.  
  202.  
  203. double Task_2_1_and_2(double **arr,double* y){
  204.     iteration = 1;
  205.     double lamd(0),pred_lambd(0);
  206.     double * buff_pred = y;
  207.     double * buff =matrix_multiplication(arr, y);
  208.     print_all_I_need(buff_pred,buff);
  209.     lamd =  scalar(buff, buff_pred, size)/scalar(buff_pred, buff_pred, size);
  210.     cout<<lamd<<endl;
  211.    
  212.     while (abs(lamd-pred_lambd)>eps) {
  213.         iteration ++;
  214.         pred_lambd = lamd;
  215.         double k = first_Norm(buff);
  216.         Normirovka(buff, k);
  217.         Norm_prisvaivanie(buff_pred, buff);
  218.         buff = matrix_multiplication(arr, buff);
  219.         lamd =  scalar(buff, buff_pred, size) / scalar(buff_pred, buff_pred, size) ;
  220.         cout<<lamd<<endl;
  221.     }
  222.     return lamd;
  223. }
  224.  
  225.  
  226. void print_all_I_need (double * buff_ppred,double * buff_pred,double * buff){
  227.     cout<<"Наши значения y(k-1),y(k),y(k+1):"<<endl;
  228.     Print_Vector(buff_ppred);
  229.     cout<<"~~~~~~~~~~"<<endl;
  230.     Print_Vector(buff_pred);
  231.     cout<<"~~~~~~~~~~"<<endl;
  232.     Print_Vector(buff);
  233. }
  234.  
  235. double Task_2_3(double **arr,double* y){
  236.      iteration = 1;
  237.     double lamd(0), pred_lambd(0);
  238.     double * buff_ppred = y;
  239.     double * buff =matrix_multiplication(arr, y);
  240.     double * buff_pred =new double[size];
  241.     Norm_prisvaivanie(buff_pred, buff);
  242.     buff =matrix_multiplication(arr, buff_pred);
  243.     print_all_I_need(buff_ppred,buff_pred,buff);
  244.     lamd =  sqrt(scalar(buff, buff_pred, size)/scalar(buff_pred, buff_ppred, size));
  245.     cout<<lamd<<endl;
  246.        while (abs(lamd-pred_lambd)>eps) {
  247.            iteration ++;
  248.            pred_lambd = lamd;
  249.            //double k = first_Norm(buff);
  250.            //Normirovka(buff, k);
  251.            //Norm_prisvaivanie(buff_pred, buff);
  252.            buff_ppred = buff_pred;
  253.            buff_pred = buff;
  254.            buff = matrix_multiplication(arr, buff);
  255.            print_all_I_need(buff_ppred,buff_pred,buff);
  256.            lamd =  sqrt(scalar(buff, buff_pred, size)/scalar(buff_pred, buff_ppred, size));
  257.            cout<<lamd<<endl;
  258.        }
  259.        return lamd;
  260. }
  261.  
  262.  
  263. int main() {
  264.     srand(time(NULL));
  265.     double ** matrix=new double *[size];
  266.     for (int i = 0; i< size; ++i)
  267.          matrix[i] = new double[size];
  268.     //Generate_matrix_2_0(matrix);
  269.     //Getting_the_right_matrix(matrix);
  270.     for (int i = 0; i< size; ++i)
  271.         for (int j =0;j<size;++j){
  272.             cin>>matrix[i][j];
  273.         }
  274.     cout<<"Матрица c которой будем работать:"<<endl;
  275.     Print_Matrix(matrix);
  276.     //Start
  277.     double ** buf=new double *[size];
  278.     for (int i = 0; i< size; ++i)
  279.         buf[i] = new double[size]{0};
  280.     Norm_prisvaivanie(buf, matrix);
  281.     Task_1(buf);
  282.     cout<<"Количество итераций для вычисления = "<<iteration<<"."<<endl;
  283.     //Task_2
  284.     double * y = new double [size]{0};
  285.     y[0] = 1;
  286.     int choise;
  287.     cout<<"У вас случай 1 и 2 или случай 3:"<<endl;
  288.     cin>>choise;
  289.     switch (choise) {
  290.         case 1:
  291.         {
  292.             double p = Task_2_1_and_2(matrix, y);
  293.             printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  294.             break;
  295.         }
  296.         case 2:
  297.         {
  298.             double p = Task_2_1_and_2(matrix, y);
  299.             printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  300.             break;
  301.            
  302.         }
  303.         case 3:
  304.         {
  305.             double p = Task_2_3(matrix, y);
  306.             printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  307.             break;
  308.         }
  309.         default:
  310.             break;
  311.     }
  312. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top