vadimk772336

Untitled

Apr 19th, 2020
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <cmath>
  4. #include <stdlib.h>
  5. #include <fstream>
  6. using namespace std;
  7.  
  8. //Нормирует вектор y с длиной N
  9. void normalize(double* y, int N)
  10. {
  11.     double norm, result = 0;
  12.     for (int i = 0; i < N; i++)
  13.         result += y[i] * y[i];
  14.     norm = sqrt(result);
  15.  
  16.     for (i = 0; i < N; i++)
  17.         y[i] = y[i] / norm;
  18. }
  19.  
  20. //Степенной метод нахождения макс собств числа
  21. double Power_iteration(double** A, int N)
  22. {
  23.     int i, j, k = 0;
  24.     double norm, lambda = 1, result;
  25.  
  26.     double* x = new double[N];
  27.     double* y = new double[N];
  28.     for (i = 0; i < N; i++) {
  29.         x[i] = 1; //ненулевое начальное значение
  30.         y[i] = 0;
  31.     }
  32.  
  33.     int flag = 1;
  34.     k = 0 while (flag > 0 && k < 10)
  35.     {
  36.         flag = 0;
  37.         //Строим новое приближение собств вектора у: y = A*x
  38.         for (i = 0; i < N; i++) {
  39.             for (j = 0; j < N; j++)
  40.                 y[i] += A[i][j] * x[j];
  41.         }
  42.  
  43.         //Проверка на погрешность Ax - x*lambda = 0
  44.         for (i = 0; i < N; i++)
  45.             if (abs(y[i] - lambda * x[i]) > error) //Хотя бы одна компонента > eror то продолжаем искать
  46.                 flag = 1;
  47.  
  48.         normalize(y, N); //нормируем найденный вектор
  49.  
  50.         //Строим новое приблежение макс. собств числа на основе x и y: lambda = <x,y>/norma
  51.         for (i = 0; i < N; i++)
  52.             result += x[i] * y[i];
  53.         lambda = normalize(result, N);
  54.  
  55.         //Перезаписываем у и зануляем (на след итерации будет снова заполнять у)
  56.         for (i = 0; i < N; i++) {
  57.             x[i] = y[i];
  58.             y[i] = 0;
  59.         }
  60.  
  61.         k++; //Кол-во итераций, ограничим их, чтобы не ушло в бесконечность если не работает алгоритм
  62.     }
  63. }
  64.  
  65. int main()
  66. {
  67.     setlocale(LC_ALL, "RUS");
  68.  
  69.     int i, j;
  70.     int N = 3;
  71.     double deviation = 1e-5;
  72.  
  73.  
  74.     double* B = new double[N];
  75.     double* x = new double[N];
  76.     double** A;
  77.     A = new double*[N];
  78.     for (i = 0; i < N; i++) {
  79.         A[i] = new double[N];
  80.         x[i] = 1; //Первое приближение
  81.     }
  82.  
  83.     A[2][0] = 3;
  84.     A[2][1] = 6;
  85.     A[2][2] = 4;
  86.     A[0][0] = 0;
  87.     A[0][1] = 5;
  88.     A[0][2] = 7;
  89.     A[1][0] = 0;
  90.     A[1][1] = 0;
  91.     A[1][2] = 2;
  92.     B[2] = 5;
  93.     B[0] = 2;
  94.     B[1] = 3;
  95.  
  96.  
  97.     //Вывод
  98.     for (i = 0; i < N; i++) {
  99.         for (j = 0; j < N; j++)
  100.             cout << A[i][j] << "\t";
  101.         cout << " = " << B[i];
  102.         cout << "; x[" << i << "] = " << x[i] << endl;
  103.     }
  104.  
  105.     cout << endl;
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment