MaPV

VP_6_stepennoy

Jan 15th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. /*поиск собственного значения λ1(|λ1|>|λn|) путем слежения за растяжением вектора х при множественном умножении А на х тогда в качестве приближенного λ1 можем взять отношение проекций Хк+1 и Хк на какое-нибудь направление Lk(в кач-ве такого направления берем Хк) */
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <math.h>
  6. #include <iterator>
  7.  
  8. #define kol 100
  9. using namespace std;
  10.  
  11. double skal (vector<double>&x2,vector<double>&x1){
  12.     double x = 0;
  13.     for (unsigned int i = 0; i < x1.size (); ++i){
  14.         x += x2[i] * x1[i];
  15.     }
  16.     return x;
  17. }
  18.  
  19. vector<double> iter (vector<vector<double>>&a,vector<double>&x){ //умножение матрицы на столбец
  20.     vector<double>y (x.size ());
  21.     for (unsigned int i = 0; i < x.size (); ++i)
  22.         for (unsigned int j = 0; j < x.size (); ++j)
  23.             y[i] += a[i][j] * x[j];
  24.     return y;
  25. }
  26.  
  27. int main (){
  28.     int n = 0;
  29.     cin >> n;  
  30.     double x = 0;
  31.     double y = 0;
  32.     vector<vector<double>>a (n,vector<double> (n));
  33.     cout<<"vvedite A"<<endl;
  34.     for (int i = 0; i < n; ++i){
  35.         for (int j = 0; j < n; ++j){
  36.             cin >> a[i][j];
  37.         }
  38.     }
  39.     vector<vector<double>> E (n,vector<double> (n)); //Элементарная матрица
  40.     for (int i = 0; i < n; ++i)
  41.     E[i][i] = 1;
  42.     vector<double>x1 (n);
  43.     for (int i = 0; i < n; ++i)
  44.         x1[i] = 1;
  45.     //vector<double>x2 = x1;
  46. double norm;
  47.     for (int i = 0; i < kol; ++i){ //вычисление степени Ах
  48.         x1 = iter (a,x1);
  49.         norm=sqrt(skal(x1,x1);
  50.            for (int j = 0; j<n;j++) // нормирование
  51. x1[j]/=norm;
  52. }
  53.     x = skal (iter (a,x1),x1) / skal (x1,x1); //вычисление приближения к макс собств значению
  54.     /* --------для нахождения второго собственного зн-я
  55.     for (int i = 0; i < n; ++i)//сдвиг
  56.         a[i][i] = a[i][i]-x;
  57.     for (int i = 0; i < kol; ++i)
  58.         x2 = iter (a,x2);
  59.    
  60.     y = skal (iter (a,x2),x2) / skal (x2,x2);
  61.     y +=x;
  62.     ---------------------------------------*/
  63.     cout <</* "\n" << y << */ "\nМаксимальное собственное значение : " << x << endl;
  64.     system("pause");
  65.     return 0;
  66. }
Add Comment
Please, Sign In to add comment