Пусть будет квадратной системой из n линейных уравнений, где:
Когда и известны, а неизвестно, метод Гаусса–Зейделя может быть использован для итеративного приближения . Вектор обозначает начальное предположение для , часто для . Обозначим через -ое приближение или итерацию , а через приближение на следующей (или -ой) итерации.
Формула на основе матрицы
Решение получается итеративно с помощью разложения
матрицы на нижний треугольный компонент и строго верхний треугольный компонент , такой что . [4] Более конкретно, разложение на и задается формулой:
Почему работает матричная формула
Систему линейных уравнений можно переписать как:
Метод Гаусса–Зейделя теперь решает левую часть этого выражения для , используя предыдущее значение для в правой части. Аналитически это можно записать как
Формула на основе элементов
Однако, используя преимущество треугольной формы , элементы можно вычислить последовательно для каждой строки, используя прямую подстановку : [5]
Обратите внимание, что формула использует два суммирования на итерацию, которые можно выразить как одно суммирование , использующее последнюю вычисленную итерацию . Процедура обычно продолжается до тех пор, пока изменения, внесенные итерацией, не станут ниже некоторого допуска, например, достаточно малого остатка .
Обсуждение
Поэлементная формула для метода Гаусса–Зейделя похожа на формулу (итеративного) метода Якоби , но с важным отличием:
В методе Гаусса-Зейделя вычисление использует элементы , которые уже были вычислены, и только элементы , которые не были вычислены в -й итерации. Это означает, что, в отличие от метода Якоби, требуется только один вектор хранения, поскольку элементы могут быть перезаписаны по мере их вычисления, что может быть выгодно для очень больших задач.
Однако, в отличие от метода Якоби, вычисления для каждого элемента, как правило, гораздо сложнее реализовать параллельно , поскольку они могут иметь очень длинный критический путь , и, таким образом, наиболее осуществимы для разреженных матриц . Кроме того, значения на каждой итерации зависят от порядка исходных уравнений.
Метод Гаусса–Зейделя может сходиться, даже если эти условия не выполняются.
Голуб и Ван Лоан приводят теорему для алгоритма, который разбивается на две части. Предположим, что является невырожденным. Пусть будет спектральным радиусом . Тогда итерации, определенные с помощью , сходятся к для любого начального вектора, если является невырожденным и . [8]
Алгоритм
Поскольку элементы могут быть перезаписаны по мере их вычисления в этом алгоритме, требуется только один вектор хранения, а индексация векторов опускается. Алгоритм выглядит следующим образом:
Алгоритм метода Гаусса–Зейделя : входы : A , b , выход: φВыбрать начальное предположение φ для решения повторить до сходимости для i от 1 до n сделать σ ← 0 для j от 1 до n сделать если j ≠ i то σ ← σ + a ij φ j конец если конец ( j -цикл) φ i ← ( b i − σ ) / a ii конец ( i -цикл) проверить, достигнута ли сходимость конец (повторить)
Примеры
Пример для матричной версии
Линейная система, показанная как, задается формулой:
Используйте уравнение
в форме,
где:
Разложим на сумму нижней треугольной компоненты и строгой верхней треугольной компоненты :
Обратное значение :
Теперь найдите:
С помощью и векторы можно получить итеративно.
Прежде всего, выберите , например Чем ближе догадка к окончательному решению, тем меньше итераций потребуется алгоритму.
Затем рассчитайте:
Как и ожидалось, алгоритм сходится к решению: .
На самом деле матрица A строго диагонально доминирующая, но не положительно определенная.
Еще один пример для матричной версии
Другая линейная система, показанная как, имеет вид:
Используйте уравнение
в форме,
где:
Разложим на сумму нижней треугольной компоненты и строгой верхней треугольной компоненты :
Обратное значение :
Теперь найдите:
С помощью и векторы можно получить итеративно.
Прежде всего, нам нужно выбрать , например
Затем рассчитайте:
В тесте на сходимость мы обнаруживаем, что алгоритм расходится. Фактически, матрица не является ни диагонально доминирующей, ни положительно определенной. Тогда сходимость к точному решению
не гарантируется и, в этом случае, не произойдет.
Пример для версии уравнения
Предположим, что даны уравнения и начальная точка . На любом шаге итерации Гаусса-Зейделя решите первое уравнение для в терминах ; затем решите второе уравнение для в терминах только что найденного и оставшегося ; и продолжите до . Затем повторяйте итерации до тех пор, пока не будет достигнута сходимость, или прервитесь, если расхождение в решениях начнет выходить за пределы предопределенного уровня.
Рассмотрим пример:
Решая и получаем:
Предположим, что (0, 0, 0, 0) — начальное приближение, тогда первое приближенное решение имеет вид:
Используя полученные приближения, итерационная процедура повторяется до тех пор, пока не будет достигнута желаемая точность. Ниже приведены приближенные решения после четырех итераций.
0,6
2.32727
−0,987273
0,878864
1.03018
2.03694
−1,01446
0,984341
1.00659
2.00356
−1,00253
0,998351
1.00086
2.0003
−1,00031
0,99985
Точное решение системы: (1, 2, −1, 1) .
Пример использования Python и NumPy
Следующая итерационная процедура создает вектор решения линейной системы уравнений:
импортировать numpy как npПРЕДЕЛ_ИТЕРАЦИИ = 1000# инициализируем матрицу A = np . array ( [ [ 10.0 , - 1.0 , 2.0 , 0.0 ], [ - 1.0 , 11.0 , - 1.0 , 3.0 ], [ 2.0 , - 1.0 , 10.0 , - 1.0 ], [ 0.0 , 3.0 , - 1.0 , 8.0 ], ] ) # инициализируем вектор RHS b = np . array ( [ 6.0 , 25.0 , - 11.0 , 15.0 ])print ( " Система уравнений:" ) для i в диапазоне ( A.shape [ 0 ]): row = [ f " { A [ i , j ] : 3g } *x { j + 1 } " для j в диапазоне ( A.shape [ 1 ] ) ] print ( "[ {0} ] = [ {1:3g} ]" .format ( " +" .join ( row ) , b [ i ] ))x = np.zeros_like ( b , np.float_ ) для it_count в диапазоне ( 1 , ITERATION_LIMIT ) : x_new = np.zeros_like ( x , dtype = np.float_ ) print ( f " Итерация { it_count } : { x } " ) для i в диапазоне ( A.shape [ 0 ] ) : s1 = np.dot ( A [ i , : i ] , x_new [ : i ] ) s2 = np.dot ( A [ i , i + 1 : ] , x [ i + 1 : ] ) x_new [ i ] = ( b [ i ] -s1 - s2 ) / A [ i , i ] если np.allclose ( x , x_new , rtol = 1e - 8 ) : break x = x_newprint ( f "Решение: { x } " ) error = np . dot ( A , x ) - b print ( f "Ошибка: { error } " )
Программа для решения произвольного количества уравнений с использованием Matlab
Следующий код использует формулу
функция x = gauss_seidel ( A, b, x, iters ) для i = 1 : iters для j = 1 : размер ( A , 1 ) x ( j ) = ( b ( j ) - сумма ( A ( j ,:) ' .* x ) + A ( j , j ) * x ( j )) / A ( j , j ); конец, конец , конец
^ Зауэр, Тимоти (2006). Числовой анализ (2-е изд.). Pearson Education, Inc. стр. 109. ISBN978-0-321-78367-7.
↑
Гаусс 1903, стр. 279; прямая ссылка.
^ Зайдель, Людвиг (1874). «Über ein Verfahren, die Gleichungen, auf welche die Methode der kleinsten Quadrate führt, sowie lineäre Gleichungen überhaupt, durch последовательные Annäherung aufzulösen» [О процессе решения последовательным приближением уравнений, к которым приводит метод наименьших квадратов, а также линейных уравнения в целом]. Abhandlungen der Mathematish-Physikalischen Klasse der Königlich Bayerischen Akademie der Wissenschaften (на немецком языке). 11 (3): 81–108 .
^ Голуб и Ван Лоан 1996, с. 511.
^ Голуб и Ван Лоан 1996, уравнение (10.1.3)
^ Голуб и Ван Лоан 1996, Thm 10.1.2.
^ Bagnara, Roberto (март 1995 г.). «Единое доказательство сходимости методов Якоби и Гаусса-Зейделя». SIAM Review . 37 (1): 93–97 . CiteSeerX 10.1.1.26.5207 . doi :10.1137/1037008. JSTOR 2132758.
^ Голуб и Ван Лоан 1996, Thm 10.1.2
Ссылки
Гаусс, Карл Фридрих (1903), Werke (на немецком языке), том. 9, Геттинген: Köninglichen Gesellschaft der Wissenschaften.