Метод простой итерации решения СЛАУ (реализация на C++)

C++   29 января 2012  Автор статьи:  

На вход алгоритму подается матрица, задающая систему линейных уравнений, которую требуется разрешить, а также задается точность, которую необходимо обеспечить. На выходе алгоритм выдает найденное решение с 8-ью знаками точности. Все вычисления проводятся с типом данных long double для повышения точности.

#include
#include
#include

using namespace std;

int main()
{
// Считываем размер вводимой матрицы
int size;
cin >> size;

// Будем хранить матрицу в векторе, состоящем из
// векторов вещественных чисел
vector > matrix;

// Матрица будет иметь размер (size) x (size + 1),
// c учетом столбца свободных членов
matrix.resize (size);
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;
cin >> eps;

// Введем вектор значений неизвестных на предыдущей итерации,
// размер которого равен числу строк в матрице, т.е. size,
// причем согласно методу изначально заполняем его нулями
vector previousVariableValues (size, 0.0);

// Будем выполнять итерационный процесс до тех пор,
// пока не будет достигнута необходимая точность
while (true)
{
// Введем вектор значений неизвестных на текущем шаге
vector 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]); } return 0; }

  • Afff

    Спасибо!

  • Snoy

    да! спс форуму за это 🙂

  • XX50

    Заменить  error += abs на error += fabs

Научиться программировать

  • на Delphi

  • на Java

  • на C++