Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <math.h>
- #include <string>
- #include <map>
- #include <ctime>
- #include <iomanip>
- using namespace std;
- using ll = long long;
- double sum1 = 0;
- void mult(vector<vector<double>> a, vector<vector<double>> b, vector<vector<double>> &result, int n)
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- result[i][j] = 0;
- for (int k = 0; k < n; k++)
- {
- result[i][j] += a[i][k] * b[k][j];
- }
- }
- }
- }
- void trans(vector<vector<double>> a, vector<vector<double>> &b, int n)
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- b[i][j] = a[j][i];
- }
- }
- }
- int symmetric(vector<vector<double>> A, int n)
- {
- for (int i = 0; i < n; i++) {
- for (int j = i + 1; j < n; j++)
- {
- if (A[i][j] != A[j][i])
- {
- return 0;
- }
- }
- }
- return 1;
- }
- double fail(vector<vector<double>> A, int n)
- {
- double fault = 0.0;
- for (int i = 0; i < n; i++)
- {
- for (int j = i + 1; j < n; j++)
- {
- fault += A[i][j] * A[i][j];
- }
- }
- fault = sqrt(2 * fault);
- return fault;
- }
- void print(vector<vector<double>> matr)
- {
- for (int i = 0; i < matr.size(); i++)
- {
- for (int j = 0; j < matr[i].size(); j++)
- {
- cout << setw(3) << matr[i][j];
- }
- cout << '\n';
- }
- }
- int rotate(vector<vector<double>> &A, int n, vector<vector<double>> &ans, double &precision)
- {
- int result = 1;
- int i, j, k;
- int I, J;
- vector <vector<double>> RM(n);
- vector <vector<double>> buff(n);
- vector <vector<double>> RMT(n);
- double max, a;
- for (i = 0; i < n; i++)
- {
- RMT[i].resize(n);
- RM[i].resize(n);
- buff[i].resize(n);
- RMT[i][i] = RM[i][i] = 1;
- }
- double fault = fail(A, n);
- while (fault > precision)
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- RMT[i][j] = RM[i][j] = 0;
- }
- RMT[i][i] = RM[i][i] = 1;
- }
- max = 0.0;
- for (i = 0; i < n; i++)
- {
- for (j = i + 1; j < n; j++)
- {
- if (abs(A[i][j]) > max)
- {
- max = abs(A[i][j]);
- I = i;
- J = j;
- }
- }
- }
- if (A[I][I] == A[J][J])
- {
- RM[I][I] = RM[J][J] = RM[J][I] = sqrt(2.0) / 2.0;
- RM[I][J] = -sqrt(2.0) / 2.0;
- }
- else
- {
- a = 0.5 * atan((2.0 * A[I][J]) / (A[I][I] - A[J][J]));
- RM[I][I] = RM[J][J] = cos(a);
- RM[I][J] = -sin(a);
- RM[J][I] = sin(a);
- }
- trans(RM, RMT, n);
- mult(RMT, A, buff, n);
- mult(buff, RM, A, n);
- fault = fail(A, n);
- mult(ans, RM, buff, n);
- ans = buff;
- result++;
- }
- for (int i = 0; i < n; i++)
- {
- sum1 += A[i][i];
- }
- return result;
- }
- int main()
- {
- //ifstream cin("input.txt");
- int l = 6;
- setlocale(LC_ALL, "rus");
- vector <int> num;
- vector <int> pre;
- //ifstream cin("input.txt");
- int i, j;
- int n;
- double precision;
- cout << "Введите размерность матрицы:\n";
- cin >> n;
- num.push_back(n);
- cout << "Введите элементы матрицы: \n";
- vector <vector<double>> A(n);
- vector <vector<double>> ans(n);
- int sum2 = 0;
- for (int i = 0; i < n; i++)
- {
- A[i].resize(n);
- }
- srand(time(0));
- for (i = 0; i < n; i++)
- {
- ans[i].resize(n);
- for (int j = 0; j < n; j++)
- {
- A[i][j] = rand() * 1.0 / RAND_MAX - 0.5;
- A[j][i] = A[i][j];
- }
- sum2 += A[i][i];
- ans[i][i] = 1;
- }
- print(A);
- if (!symmetric(A, n))
- {
- cout << "Матрица не симметричная\n";
- }
- else
- {
- //cout << "Введите точность: ";
- //cin >> precision;
- precision = 0.01;
- int cnt = rotate(A, n, ans, precision);
- for (i = 0; i < n; i++)
- {
- cout << "Собственный вектор " << i + 1 << ":\n";
- for (j = 0; j < n; j++) {
- cout << ans[j][i] << "\n";
- }
- }
- cout << "Собственные значения:\n";
- for (i = 0; i < n; i++) {
- cout << A[i][i] << "\n";
- }
- cout << "Общее число шагов: " << cnt;
- cout << '\n' << "Сумма диагональных элементов = " << sum2 << '\n' << "Сумма собственных значений = " << sum1 << '\n';
- sum2 = sum1 = 0;
- pre.push_back(cnt);
- }
- cout << "Таблица зависимости количества итераций от размера матрица при фиксированной точности = 0.001\n";
- for (int i = 0; i < num.size(); i++)
- {
- cout << setw(6) << num[i];
- }
- cout << '\n';
- for (int i = 0; i < pre.size(); i++)
- {
- cout << setw(6) << pre[i];
- }
- cout << '\n' << '\n' << '\n';
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement