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

C++   30 января 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++) { // При j < i можем использовать уже посчитанные // на этой итерации значения неизвестных if (j < i) { currentVariableValues[i] -= matrix[i][j] * currentVariableValues[j]; } // При j > i используем значения с прошлой итерации
if (j > i)
{
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; }

  • Спасибо

  • Оно точно работает, все время 0.00000000 выдает?

  • Оно точно работает, все время 0.00000000 выдает?

  • Можно пример решения?

  • XX50

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

  • XX50

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

  • Александра

    Здравствуйте а можно пример решения?

  • Александра

    Здравствуйте а можно пример решения?

  • Супер КОТЭ

    Программа не работает, висит в бесконечном цикле.

    • У вас маленький eps попробуйте его увеличить.

      • Влад

        Почему матрица не заполняется рандомно?

  • Влад

    Почему матрица нельзя заполнить матрицу рандомно?

  • Влад Марков

    Не могу заполнить матрицу случайными числами

  • Влад Марков

    Как сделат случайный ввод матрицы

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

  • на Delphi

  • на Java

  • на C++