Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*вещественная симметрическая матрица
- Идея метода Якоби состоит в том, чтобы подходящими преобразованиями подобия от шага к шагу уменьшать норму внедиагональной части матрицы. Получающиеся при этом матрицы имеют тот же спектр,
- что и исходная матрица, но будут стремиться к диагональной матрице
- с собственными значениями на главной диагонали. Инструментом реализации этого плана выступают элементарные ортогональные матрицы вращений
- ------------чиста спиздил*/
- #include "stdio.h"
- #include <iostream>
- #include "math.h"
- #include<fstream>
- #include <iomanip>
- const double PI = 3.1415926536;
- bool sim(double(&m)[100][100], int num) {
- bool result = true;
- int i, j;
- for (i = 0; i < num; i++) {
- for (j = i + 1; j < num; j++) {
- if (m[i][j] != m[j][i]) {
- result = false;
- break;
- }
- }
- if (!result) { break; }
- }
- return result;
- }
- int rotation(double(&m)[100][100], int n, double(&v)[100][100], double e) {
- {
- int result = 1;
- int i, j, k;
- int maxI, maxJ;
- double max, fi;
- double** matpov;
- matpov = new double*[n];
- for (i = 0; i < n; i++) {
- matpov[i] = new double[n];
- }
- double** temp;
- temp = new double*[n];
- for (i = 0; i < n; i++) {
- temp[i] = new double[n];
- }
- double fault = 0.0;
- for (i = 0; i < n; i++) {
- for (j = i + 1; j < n; j++) {
- fault = fault + m[i][j] * m[i][j];
- }
- }
- fault = sqrt(2 * fault);
- while (fault > e) {
- max = 0.0;
- for (i = 0; i < n; i++) {
- for (j = i + 1; j < n; j++) {
- if (m[i][j] > 0 && m[i][j] > max) {
- max = m[i][j];
- maxI = i;
- maxJ = j;
- }
- else if (m[i][j] < 0 && -m[i][j] > max) {
- max = -m[i][j];
- maxI = i;
- maxJ = j;
- }
- }
- }
- for (i = 0; i < n; i++){
- for (j = 0; j < n; j++){
- matpov[i][j] = 0;
- }
- matpov[i][i] = 1;
- }
- if (m[maxI][maxI] == m[maxJ][maxJ]) {
- matpov[maxI][maxI] = matpov[maxJ][maxJ] =
- matpov[maxJ][maxI] = sqrt(2.0) / 2.0;
- matpov[maxI][maxJ] = -sqrt(2.0) / 2.0;
- }
- else {
- fi = 0.5 * atan((2.0 * m[maxI][maxJ]) /
- (m[maxI][maxI] - m[maxJ][maxJ]));
- matpov[maxI][maxI] = matpov[maxJ][maxJ] = cos(fi);
- matpov[maxI][maxJ] = -sin(fi);
- matpov[maxJ][maxI] = sin(fi);
- }
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- temp[i][j] = 0.0;
- }
- }
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- for (k = 0; k < n; k++) {
- temp[i][j] = temp[i][j] + matpov[k][i] * m[k][j];
- }
- }
- }
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- m[i][j] = 0.0;
- }
- }
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- for (k = 0; k < n; k++) {
- m[i][j] = m[i][j] +
- temp[i][k] * matpov[k][j];
- }
- }
- }
- fault = 0.0;
- for (i = 0; i < n; i++) {
- for (j = i + 1; j < n; j++) {
- fault = fault + m[i][j] * m[i][j];
- }
- }
- fault = sqrt(2 * fault);
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- temp[i][j] = 0.0;
- }
- }
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- for (k = 0; k < n; k++) {
- temp[i][j] = temp[i][j] + v[i][k] * matpov[k][j];
- }
- }
- }
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- v[i][j] = temp[i][j];
- }
- }
- result++;
- }
- return result;
- }
- }
- using namespace std;
- int main()
- {
- int size;
- double v[100][100], e;
- fstream f1;
- //Читаем матрицу с файла
- f1.open("input.txt", ios::in);
- f1 >> size;
- f1 >> e;
- double matrix[100][100] = { 0 };
- for (int i = 0; i < size; i++)
- for (int j = 0; j < size; j++)
- f1 >> matrix[i][j];
- f1.close();
- for (int i = 0; i < size; i++){
- for (int j = 0; j < size; j++){
- v[i][j] = 0;
- }
- v[i][i] = 1;
- }
- fstream f2;
- if (!f2)
- f2.open("output.txt", ios::out);
- else
- f2.open("output.txt", ios::app);
- if (!sim(matrix, size)) {
- f2 << "error!!!";
- f2 << endl;
- }
- else {
- f2 << endl;
- for (int i = 0; i < size; i++) {
- f2 << i + 1 << " : ";
- f2 << fixed << setprecision(8) << matrix[i][i];
- f2 << endl;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment