#include <stdio.h> #include <iostream> #include <math.h> #include <windows.h> using namespace std; // Функция для вывода значений коэффициентов и свободных членов void vmatrix(double **a, double *b, int n) { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) printf("%10.2f", a[i][j]); printf(" | %.2f\n", b[i]); } } void main() { SetConsoleOutputCP(1251); SetConsoleCP(1251); // Запрашиваем количество уравнений системы int n; cout<<"Введите количество уравнений системы: "; cin>>n; // Запрашиваем точность решения double z; cout<<"Введите точность: "; cin>>z; cout<<endl; // Матрица значений коэффициентов double **a = new double*[n]; // Вектор значений свободных членов double *b = new double[n]; // Матрица B double **bb = new double*[n]; // Вектор b (бета) double *vv = new double[n]; // Вектор решений системы уравнений double *x = new double[n]; for(int i = 0; i < n; i++) { a[i] = new double[n]; bb[i] = new double[n]; // Запрашиваем значения коэффициентов i-го уравнения cout<<"Уравнение #"<<(i + 1)<<endl; for(int j = 0; j < n; j++) { cout<<"Введите значение коэффициента #"<<(j + 1)<<": "; cin>>a[i][j]; } // Запрашиваем значение свободного члена i-го уравнения cout<<"Введите значение свободного члена: "; cin>>b[i]; cout<<endl; } // Выводим сформированную матрицу cout<<"Расширенная матрица исходной системы:"<<endl; vmatrix(a, b, n); // Приводим матрицу коэффициентов к виду x = B * x + b cout<<endl<<"Приводим матрицу к виду x = B * x + b"<<endl; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { // Значение элемента матрицы B получается делением соответствующего элемента // матрицы коэффициентов на диагональный элемент bb[i][j] = 0; if(i != j) { bb[i][j] = -a[i][j] / a[i][i]; } } // Значение элемента вектора b получается делением соответствующего свободного члена // на диагональный элемент матрицы коэффициентов vv[i] = b[i] / a[i][i]; } cout<<endl<<"Матрица B и столбец b (бета):"<<endl; vmatrix(bb, vv, n); // Задаем начальные приближения для решений системы for(int i = 0; i < n; i++) { x[i] = vv[i]; } // Начало итерационного процесса while(true) { // Находим следующие приближения для решений системы for(int i = 0; i < n; i++) { // Сохраняем текущее приближение решения b[i] = x[i]; // Вычисляем новое приближение double y = 0; for(int j = 0; j < n; j++) { y += bb[i][j] * x[j]; } x[i] = y + vv[i]; } // Проверка найденного приближения на точность int k = 0; // Проходим по всем найденным решениям for(int i = 0; i < n; i++) { // Если отклонение найденного решения от предыдущего не больше заданной точности if(fabs(b[i] - x[i]) <= z) { // Увеличиваем количество подходящих приближений k++; } } // Если подошли все приближения - решение найдено if(k == n) { break; } } // Выводим результат решения системы уравнений cout<<endl<<"Решение системы уравнений:"<<endl; for(int i = 0; i < n; i++) { printf("x%d = %.2f\n", i + 1, x[i]); } getchar(); } |