 
        
        
          Добавил:
          
          
        
        
    
            SSU_CSIT
            
            
            
            
            
            Опубликованный материал нарушает ваши авторские права? Сообщите нам.
          
          Вуз:
          Предмет:
          Файл:методы вычислений Поплавский / Source
.cpp#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;
}
          Соседние файлы в папке методы вычислений Поплавский
          
      
    
    
    
          