Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
18.08.2022
Размер:
3.63 Кб
Скачать
#include <iostream>
#include "math.h"

using namespace std;

bool isSimmetrial(float** c, int n) {
	bool result = true;
	int i, j;

	for (i = 0; i < n; i++) {

		for (j = i + 1; j < n; j++) {
			if (c[i][j] != c[j][i]) {
				result = false;
				break;
			}
		}

		if (!result)
			break;
	}
	return result;
}

int wrachenie(float** c, int n, float** s, float p) {
	int result = 1, i, j, k, maxI, maxJ;
	float max, fi;
	float** m;
	m = new float* [n];

	for (i = 0; i < n; i++)
		m[i] = new float[n];

	float** temp;
	temp = new float* [n];
	for (i = 0; i < n; i++) 
		temp[i] = new float[n];

	float fault = 0.0;
	for (i = 0; i < n; i++)
		for (j = i + 1; j < n; j++)
			fault = fault + c[i][j] * c[i][j];

	fault = sqrt(2 * fault);
	while (fault > p) {
		max = 0.0;
		for (i = 0; i < n; i++) {

			for (j = i + 1; j < n; j++) {

				if (c[i][j] > 0 && c[i][j] > max) {
					max = c[i][j];
					maxI = i;
					maxJ = j;
				}
				else if (c[i][j] < 0 && -c[i][j] > max) {
					max = -c[i][j];
					maxI = i;
					maxJ = j;
				}
			}
		}

		for (i = 0; i < n; i++) {
			for (j = 0; j < n; j++)
				m[i][j] = 0;

			m[i][i] = 1;
		}
		if (c[maxI][maxI] == c[maxJ][maxJ]) {
			m[maxI][maxI] = m[maxJ][maxJ] = m[maxJ][maxI] = sqrt(2.0) / 2.0;
			m[maxI][maxJ] = -sqrt(2.0) / 2.0;
		}
		else {
			fi = 0.5 * atan((2.0 * c[maxI][maxJ]) / (c[maxI][maxI] - c[maxJ][maxJ]));
			m[maxI][maxI] = m[maxJ][maxJ] = cos(fi);
			m[maxI][maxJ] = -sin(fi);
			m[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] + m[k][i] * c[k][j];

		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				c[i][j] = 0.0;

		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				for (k = 0; k < n; k++) {
					c[i][j] = c[i][j] +
						temp[i][k] * m[k][j];
				}

		fault = 0.0;
		for (i = 0; i < n; i++)
			for (j = i + 1; j < n; j++)
				fault = fault + c[i][j] * c[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] + s[i][k] * m[k][j];

		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				s[i][j] = temp[i][j];

		result++;
	}
	return result;
}

int main() {
	setlocale(LC_ALL, "RUS");
	int i, j, size;
	float** c, ** s, p;
	cout << "Введите размерность матрицы: ";
	cin >> size;
	cout << "\nВведите элементы матрицы\n" << endl;
	c = new float* [size];
	s = new float* [size];

	for (i = 0; i < size; i++) {
		c[i] = new float[size];
		s[i] = new float[size];
	}

	for (i = 0; i < size; i++) {
		for (j = 0; j < size; j++)
			s[i][j] = 0;
		s[i][i] = 1;
	}

	for (i = 0; i < size; i++) {
		for (j = 0; j < size; j++) {
			cout << "Введите [" << i << "][" << j << "] элемент: ";
			cin >> c[i][j];
		}
		cout << endl;
	}

	cout << "Введите точность расчета: ";
	cin >> p;

	if (!isSimmetrial(c, size))
		cout << "Матрица не симметричная\n";
	else {
		int steps = wrachenie(c, size, s, p);
		cout << "Решение:\n";
		for (i = 0; i < size; i++) {
			cout << "Собственный вектор k " << i + 1 << ":\n";
			for (j = 0; j < size; j++)
				cout << s[j][i] << "\n";

		}
		cout << "Собственные значения:\n";
		for (i = 0; i < size; i++)
			cout << c[i][i] << "\n";

		cout << "Общее число шагов: " << steps << endl;
	}
	system("pause");
	return 0;
}
Соседние файлы в папке методы вычислений Поплавский