Добавил:
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;
}
Соседние файлы в папке методы вычислений Поплавский