Итерационный метод, используемый для решения линейной системы уравнений
В числовой линейной алгебре метод Гаусса –Зейделя , также известный как метод Либмана или метод последовательного смещения , является итеративным методом, используемым для решения системы линейных уравнений . Он назван в честь немецких математиков Карла Фридриха Гаусса и Филиппа Людвига фон Зейделя . Хотя его можно применять к любой матрице с ненулевыми элементами на диагоналях, сходимость гарантируется только в том случае, если матрица либо строго диагонально доминирующая , [1] либо симметричная и положительно определенная . Он был упомянут только в частном письме Гаусса своему ученику Герлингу в 1823 году. [2] Публикация не была представлена до 1874 года Зейделем. [3]
Описание
Пусть будет квадратной системой из 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) — начальное приближение, тогда первое приближенное решение имеет вид:
Используя полученные приближения, итерационная процедура повторяется до тех пор, пока не будет достигнута желаемая точность. Ниже приведены приближенные решения после четырех итераций.
Точное решение системы: (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_new print ( f "Решение: { x } " ) error = np . dot ( A , x ) - b print ( f "Ошибка: { error } " )
Производит вывод:
Система уравнений: [ 10*x1 + -1*x2 + 2*x3 + 0*x4] = [ 6] [ -1*x1 + 11*x2 + -1*x3 + 3*x4] = [ 25] [ 2*x1 + -1*x2 + 10*x3 + -1*x4] = [-11] [ 0*x1 + 3*x2 + -1*x3 + 8*x4] = [ 15] Итерация 1: [ 0. 0. 0. 0.] Итерация 2: [ 0.6 2.32727273 -0.98727273 0.87886364] Итерация 3: [ 1.03018182 2.03693802 -1.0144562 0.98434122] Итерация 4: [ 1,00658504 2,00355502 -1,00252738 0,99835095] Итерация 5: [ 1,00086098 2,00029825 -1,00030728 0,99984975] Итерация 6: [ 1,00009128 2,00002134 -1,00003115 0,9999881 ] Итерация 7: [ 1,00000836 2,00000117 -1,00000275 0,99999922] Итерация 8: [ 1,00000067 2,00000002 -1,00000021 0,99999996] Итерация 9: [ 1,00000004 1,99999999 -1,00000001 1. ] Итерация 10: [ 1. 2. -1. 1.] Решение: [ 1. 2. -1. 1.] Ошибка: [ 2,06480930e-08 -1,25551054e-08 3,61417563e-11 0,00000000e+00]
Программа для решения произвольного количества уравнений с использованием 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. ISBN 978-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.
- Голуб, Джин Х.; Ван Лоан, Чарльз Ф. (1996), Матричные вычисления (3-е изд.), Балтимор: Джонс Хопкинс, ISBN 978-0-8018-5414-9.
- Блэк, Ноэль и Мур, Ширли. «Метод Гаусса-Зейделя». MathWorld .
В данной статье использован текст из статьи Gauss-Seidel_method на CFD-Wiki, которая распространяется по лицензии GFDL .
Внешние ссылки
- «Метод Зейделя», Энциклопедия математики , EMS Press , 2001 [1994]
- Гаусс–Зейдель с www.math-linux.com
- Гаусс-Зейдель из Института целостных численных методов
- Итерация Гаусса Зиделя с сайта www.geocities.com
- Метод Гаусса-Зейделя
- Биксон
- Код Matlab
- Пример кода на языке С