Меню
Главная
Случайная статья
Настройки
|
Метод Гаусса — Зейделя (метод Зейделя, процесс Либмана, метод последовательных замещений) — является классическим итерационным методом решения системы линейных уравнений.
Назван в честь Зейделя и Гаусса.
Содержание
Постановка задачи
Возьмём систему:
, где
Или
И покажем, как её можно решить с использованием метода Гаусса-Зейделя.
Метод
Чтобы пояснить суть метода, перепишем задачу в виде
Здесь в -м уравнении мы перенесли в правую часть все члены, содержащие , для . Эта запись может быть представлена как
где в принятых обозначениях означает матрицу, у которой на главной диагонали стоят соответствующие элементы матрицы , а все остальные нули; тогда как матрицы и содержат верхнюю и нижнюю треугольные части , на главной диагонали которых нули.
Итерационный процесс в методе Гаусса — Зейделя строится по формуле
после выбора соответствующего начального приближения .
Метод Гаусса — Зейделя можно рассматривать как модификацию метода Якоби. Основная идея модификации состоит в том, что новые значения используются здесь сразу же по мере получения, в то время как в методе Якоби они не используются до следующей итерации:
где
Таким образом, i-я компонента -го приближения вычисляется по формуле
Например, при :
- , то есть
- , то есть
- , то есть
Условие сходимости
Приведём достаточное условие сходимости метода.
Теорема
Пусть , где – матрица, обратная к . Тогда при любом выборе начального приближения :
- метод Гаусса-Зейделя сходится;
- скорость сходимости метода равна скорости сходимости геометрической прогрессии со знаменателем ;
- верна оценка погрешности: .
Условие окончания
Условие окончания итерационного процесса Зейделя при достижении точности в упрощённой форме имеет вид:
Более точное условие окончания итерационного процесса имеет вид
и требует больше вычислений. Хорошо подходит для разреженных матриц.
Пример реализации наPythonimport numpy as np
def seidel(A, b, eps):
n = len(A)
x = np.zeros(n) # zero vector
converge = False
while not converge:
x_new = np.copy(x)
for i in range(n):
s1 = sum(A[i][j] * x_new[j] for j in range(i))
s2 = sum(A[i][j] * x[j] for j in range(i + 1, n))
x_new[i] = (b[i] - s1 - s2) / A[i][i]
converge = np.linalg.norm(x_new - x) <= eps
x = x_new
См. также
Примечания
Ссылки
|
|