09-05-2024
Метод Якоби — метод простой итерации для решения системы линейных алгебраических уравнений.
Содержание |
Возьмём систему линейных уравнений:
, где
Или
Для того, чтобы построить итеративную процедуру метода Якоби, необходимо провести предварительное преобразование системы уравнений к итерационному виду . Оно может быть осуществлено по одному из следующих правил:
где в принятых обозначениях D означает матрицу, у которой на главной диагонали стоят соответствующие элементы матрицы A, а все остальные нули; тогда как матрицы U и L содержат верхнюю и нижнюю треугольные части A, на главной диагонали которых нули, — единичная матрица.
Тогда процедура нахождения решения имеет вид:
где счётчик итерации.
В отличие от метода Гаусса-Зейделя мы не можем заменять на в процессе итерационной процедуры, т.к. эти значения понадобятся для остальных вычислений. Это наиболее значимое различие между методом Якоби и методом Гаусса-Зейделя решения СЛАУ. Таким образом на каждой итерации придётся хранить оба вектора приближений: старый и новый.
Приведем достаточное условие сходимости метода.
Теорема. Пусть . Тогда при любом выборе начального приближения :
|
Условие окончания итерационного процесса при достижении точности в упрощённой форме имеет вид:
(Существует более точное условие окончания итерационного процесса, которое более сложно и требует дополнительных вычислений)
Ниже приведён алгоритм реализации на C++
#include <math.h> #define eps 0.001 //желаемая точность .......................... void Jacobi (int N, double **A, double *F, double *X) // N - размерность матрицы; A[N][N] - матрица коэффициентов, F[N] - столбец свободных членов, // X[N] - начальное приближение, ответ записывается также в X[N]; { 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; }
Для линейных молний характерно форма в виде, для линейных композиций наиболее актуальными являются.