- Метод Якоби
-
Метод Якоби — метод простой итерации для решения системы линейных алгебраических уравнений.
Содержание
Постановка задачи
Возьмём систему линейных уравнений:
, где
Или
Описание метода
Для того, чтобы построить итеративную процедуру метода Якоби, необходимо провести предварительное преобразование системы уравнений
к итерационному виду
. Оно может быть осуществлено по одному из следующих правил:
где в принятых обозначениях D означает матрицу, у которой на главной диагонали стоят соответствующие элементы матрицы A, а все остальные нули; тогда как матрицы U и L содержат верхнюю и нижнюю треугольные части A, на главной диагонали которых нули,
— единичная матрица.
Тогда процедура нахождения решения имеет вид:
Или в виде поэлементной формулы:
где
счётчик итерации.
В отличие от метода Гаусса-Зейделя мы не можем заменять
на
в процессе итерационной процедуры, т.к. эти значения понадобятся для остальных вычислений. Это наиболее значимое различие между методом Якоби и методом Гаусса-Зейделя решения СЛАУ. Таким образом на каждой итерации придётся хранить оба вектора приближений: старый и новый.
Условие сходимости
Приведем достаточное условие сходимости метода.
Теорема.
Пусть. Тогда при любом выборе начального приближения
:
- метод сходится;
- скорость сходимости метода равна скорости сходимости геометрической прогрессии со знаменателем
;
- верна оценка погрешности:
.
Условие остановки
Условие окончания итерационного процесса при достижении точности
в упрощённой форме имеет вид:
(Существует более точное условие окончания итерационного процесса, которое более сложно и требует дополнительных вычислений)
Алгоритм
Ниже приведён алгоритм реализации на C++
#include <math.h> const double eps = 0.001; ///< желаемая точность .......................... /// N - размерность матрицы; A[N][N] - матрица коэффициентов, F[N] - столбец свободных членов, /// X[N] - начальное приближение, ответ записывается также в X[N]; void Jacobi (int N, double **A, double *F, double *X) { double * TempX = new double[N]; double norm; // норма, определяемая как наибольшая разность компонент столбца иксов соседних итераций. do { for (int i = 0; i < N; i++) { TempX[i] =- F[i]; for (int g = 0; g < N; g++) { if (i != g) TempX[i] += A[i][g] * X[g]; } TempX[i] /= -A[i][i]; } norm = fabs(X[0] - TempX[0]); for (int h = 0; h < N; h++) { if (fabs(X[h] - TempX[h]) > norm) norm = fabs(X[h] - TempX[h]); X[h] = TempX[h]; } } while (norm > eps); delete[] TempX; }
См. также
Для улучшения этой статьи по математике желательно?: - Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
Категория:- Методы решения СЛАУ
-
Wikimedia Foundation. 2010.