Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*поиск собственного значения λ1(|λ1|>|λn|) путем слежения за растяжением вектора х при множественном умножении А на х тогда в качестве приближенного λ1 можем взять отношение проекций Хк+1 и Хк на какое-нибудь направление Lk(в кач-ве такого направления берем Хк) */
- #include <iostream>
- #include <vector>
- #include <math.h>
- #include <iterator>
- #define kol 100
- using namespace std;
- double skal (vector<double>&x2,vector<double>&x1){
- double x = 0;
- for (unsigned int i = 0; i < x1.size (); ++i){
- x += x2[i] * x1[i];
- }
- return x;
- }
- vector<double> iter (vector<vector<double>>&a,vector<double>&x){ //умножение матрицы на столбец
- vector<double>y (x.size ());
- for (unsigned int i = 0; i < x.size (); ++i)
- for (unsigned int j = 0; j < x.size (); ++j)
- y[i] += a[i][j] * x[j];
- return y;
- }
- int main (){
- int n = 0;
- cin >> n;
- double x = 0;
- double y = 0;
- vector<vector<double>>a (n,vector<double> (n));
- cout<<"vvedite A"<<endl;
- for (int i = 0; i < n; ++i){
- for (int j = 0; j < n; ++j){
- cin >> a[i][j];
- }
- }
- vector<vector<double>> E (n,vector<double> (n)); //Элементарная матрица
- for (int i = 0; i < n; ++i)
- E[i][i] = 1;
- vector<double>x1 (n);
- for (int i = 0; i < n; ++i)
- x1[i] = 1;
- //vector<double>x2 = x1;
- double norm;
- for (int i = 0; i < kol; ++i){ //вычисление степени Ах
- x1 = iter (a,x1);
- norm=sqrt(skal(x1,x1);
- for (int j = 0; j<n;j++) // нормирование
- x1[j]/=norm;
- }
- x = skal (iter (a,x1),x1) / skal (x1,x1); //вычисление приближения к макс собств значению
- /* --------для нахождения второго собственного зн-я
- for (int i = 0; i < n; ++i)//сдвиг
- a[i][i] = a[i][i]-x;
- for (int i = 0; i < kol; ++i)
- x2 = iter (a,x2);
- y = skal (iter (a,x2),x2) / skal (x2,x2);
- y +=x;
- ---------------------------------------*/
- cout <</* "\n" << y << */ "\nМаксимальное собственное значение : " << x << endl;
- system("pause");
- return 0;
- }
Add Comment
Please, Sign In to add comment