Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <math.h>
- #include <cmath>
- #include <stdlib.h>
- #include <fstream>
- using namespace std;
- //Нормирует вектор y с длиной N
- void normalize(double* y, int N)
- {
- double norm, result = 0;
- for (int i = 0; i < N; i++)
- result += y[i] * y[i];
- norm = sqrt(result);
- for (i = 0; i < N; i++)
- y[i] = y[i] / norm;
- }
- //Степенной метод нахождения макс собств числа
- double Power_iteration(double** A, int N)
- {
- int i, j, k = 0;
- double norm, lambda = 1, result;
- double* x = new double[N];
- double* y = new double[N];
- for (i = 0; i < N; i++) {
- x[i] = 1; //ненулевое начальное значение
- y[i] = 0;
- }
- int flag = 1;
- k = 0 while (flag > 0 && k < 10)
- {
- flag = 0;
- //Строим новое приближение собств вектора у: y = A*x
- for (i = 0; i < N; i++) {
- for (j = 0; j < N; j++)
- y[i] += A[i][j] * x[j];
- }
- //Проверка на погрешность Ax - x*lambda = 0
- for (i = 0; i < N; i++)
- if (abs(y[i] - lambda * x[i]) > error) //Хотя бы одна компонента > eror то продолжаем искать
- flag = 1;
- normalize(y, N); //нормируем найденный вектор
- //Строим новое приблежение макс. собств числа на основе x и y: lambda = <x,y>/norma
- for (i = 0; i < N; i++)
- result += x[i] * y[i];
- lambda = normalize(result, N);
- //Перезаписываем у и зануляем (на след итерации будет снова заполнять у)
- for (i = 0; i < N; i++) {
- x[i] = y[i];
- y[i] = 0;
- }
- k++; //Кол-во итераций, ограничим их, чтобы не ушло в бесконечность если не работает алгоритм
- }
- }
- int main()
- {
- setlocale(LC_ALL, "RUS");
- int i, j;
- int N = 3;
- double deviation = 1e-5;
- double* B = new double[N];
- double* x = new double[N];
- double** A;
- A = new double*[N];
- for (i = 0; i < N; i++) {
- A[i] = new double[N];
- x[i] = 1; //Первое приближение
- }
- A[2][0] = 3;
- A[2][1] = 6;
- A[2][2] = 4;
- A[0][0] = 0;
- A[0][1] = 5;
- A[0][2] = 7;
- A[1][0] = 0;
- A[1][1] = 0;
- A[1][2] = 2;
- B[2] = 5;
- B[0] = 2;
- B[1] = 3;
- //Вывод
- for (i = 0; i < N; i++) {
- for (j = 0; j < N; j++)
- cout << A[i][j] << "\t";
- cout << " = " << B[i];
- cout << "; x[" << i << "] = " << x[i] << endl;
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment