#include "stdafx.h"
#include "iostream"
#include "vector"
#include "cmath"
#include "locale.h"
using namespace std;
int main()
{
// Считываем размер вводимой матрицы
setlocale(LC_ALL, "rus");
int size;
cout << "Введите размер вводимой матрицы: ";
cin >> size;
cout << endl;
// Будем хранить матрицу в векторе, состоящем из
// векторов вещественных чисел
vector <vector <long double> > matrix;
// Матрица будет иметь размер (size) x (size + 1),
// c учетом столбца свободных членов
matrix.resize (size);
cout << "Введите элементы матрицы " << size << "x" << size+1 <<":" <<endl;
for (int i = 0; i < size; i++)
matrix[i].resize (size + 1);
for (int j = 0; j < size + 1; j++)
cin >> matrix[i][j];
}
// Считываем необходимую точность решения
long double eps;
cout << "Введите точность решения: ";
cin >> eps;
// Введем вектор значений неизвестных на предыдущей итерации,
// размер которого равен числу строк в матрице, т.е. size,
// причем согласно методу изначально заполняем его нулями
vector <long double> previousVariableValues (size, 0.0);
// Будем выполнять итерационный процесс до тех пор,
// пока не будет достигнута необходимая точность
while (true)
// Введем вектор значений неизвестных на текущем шаге
vector <long double> currentVariableValues (size);
// Посчитаем значения неизвестных на текущей итерации
// в соответствии с теоретическими формулами
// Инициализируем i-ую неизвестную значением
// свободного члена i-ой строки матрицы
currentVariableValues[i] = matrix[i][size];
// Вычитаем сумму по всем отличным от i-ой неизвестным
for (int j = 0; j < size; j++)
if (i != j)
currentVariableValues[i] -= matrix[i][j] * previousVariableValues[j];
// Делим на коэффициент при i-ой неизвестной
currentVariableValues[i] /= matrix[i][i];
// Посчитаем текущую погрешность относительно предыдущей итерации
long double error = 0.0;
error += abs (currentVariableValues[i] - previousVariableValues[i]);
// Если необходимая точность достигнута, то завершаем процесс
if (error < eps)
break;
// Переходим к следующей итерации, так
// что текущие значения неизвестных
// становятся значениями на предыдущей итерации
previousVariableValues = currentVariableValues;
// Выводим найденные значения неизвестных с 8 знаками точности
printf ("%.8llf ", previousVariableValues[i]);
system("pause");
return 0;
Объяснение:
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "cmath"
#include "locale.h"
using namespace std;
int main()
{
// Считываем размер вводимой матрицы
setlocale(LC_ALL, "rus");
int size;
cout << "Введите размер вводимой матрицы: ";
cin >> size;
cout << endl;
// Будем хранить матрицу в векторе, состоящем из
// векторов вещественных чисел
vector <vector <long double> > matrix;
// Матрица будет иметь размер (size) x (size + 1),
// c учетом столбца свободных членов
matrix.resize (size);
cout << "Введите элементы матрицы " << size << "x" << size+1 <<":" <<endl;
for (int i = 0; i < size; i++)
{
matrix[i].resize (size + 1);
for (int j = 0; j < size + 1; j++)
{
cin >> matrix[i][j];
}
}
// Считываем необходимую точность решения
long double eps;
cout << endl;
cout << "Введите точность решения: ";
cin >> eps;
// Введем вектор значений неизвестных на предыдущей итерации,
// размер которого равен числу строк в матрице, т.е. size,
// причем согласно методу изначально заполняем его нулями
vector <long double> previousVariableValues (size, 0.0);
// Будем выполнять итерационный процесс до тех пор,
// пока не будет достигнута необходимая точность
while (true)
{
// Введем вектор значений неизвестных на текущем шаге
vector <long double> currentVariableValues (size);
// Посчитаем значения неизвестных на текущей итерации
// в соответствии с теоретическими формулами
for (int i = 0; i < size; i++)
{
// Инициализируем i-ую неизвестную значением
// свободного члена i-ой строки матрицы
currentVariableValues[i] = matrix[i][size];
// Вычитаем сумму по всем отличным от i-ой неизвестным
for (int j = 0; j < size; j++)
{
if (i != j)
{
currentVariableValues[i] -= matrix[i][j] * previousVariableValues[j];
}
}
// Делим на коэффициент при i-ой неизвестной
currentVariableValues[i] /= matrix[i][i];
}
// Посчитаем текущую погрешность относительно предыдущей итерации
long double error = 0.0;
for (int i = 0; i < size; i++)
{
error += abs (currentVariableValues[i] - previousVariableValues[i]);
}
// Если необходимая точность достигнута, то завершаем процесс
if (error < eps)
{
break;
}
// Переходим к следующей итерации, так
// что текущие значения неизвестных
// становятся значениями на предыдущей итерации
previousVariableValues = currentVariableValues;
}
// Выводим найденные значения неизвестных с 8 знаками точности
for (int i = 0; i < size; i++)
{
printf ("%.8llf ", previousVariableValues[i]);
}
cout << endl;
system("pause");
return 0;
}
Объяснение: