stringtranslate.com

Метод Гаусса–Зейделя

В числовой линейной алгебре метод Гаусса –Зейделя , также известный как метод Либмана или метод последовательного смещения , является итеративным методом, используемым для решения системы линейных уравнений . Он назван в честь немецких математиков Карла Фридриха Гаусса и Филиппа Людвига фон Зейделя . Хотя его можно применять к любой матрице с ненулевыми элементами на диагоналях, сходимость гарантируется только в том случае, если матрица либо строго диагонально доминирующая , [1] либо симметричная и положительно определенная . Он был упомянут только в частном письме Гаусса своему ученику Герлингу в 1823 году. [2] Публикация не была представлена ​​до 1874 года Зейделем. [3]

Описание

Пусть будет квадратной системой из n линейных уравнений, где:

Когда и известны, а неизвестно, метод Гаусса–Зейделя может быть использован для итеративного приближения . Вектор обозначает начальное предположение для , часто для . Обозначим через -ое приближение или итерацию , а через приближение на следующей (или -ой) итерации.

Формула на основе матрицы

Решение получается итеративно с помощью разложения матрицы на нижний треугольный компонент и строго верхний треугольный компонент , такой что . [4] Более конкретно, разложение на и задается формулой:

Почему работает матричная формула

Систему линейных уравнений можно переписать как:

Метод Гаусса–Зейделя теперь решает левую часть этого выражения для , используя предыдущее значение для в правой части. Аналитически это можно записать как

Формула на основе элементов

Однако, используя преимущество треугольной формы , элементы можно вычислить последовательно для каждой строки, используя прямую подстановку : [5]

Обратите внимание, что формула использует два суммирования на итерацию, которые можно выразить как одно суммирование , использующее последнюю вычисленную итерацию . Процедура обычно продолжается до тех пор, пока изменения, внесенные итерацией, не станут ниже некоторого допуска, например, достаточно малого остатка .

Обсуждение

Поэлементная формула для метода Гаусса–Зейделя похожа на формулу (итеративного) метода Якоби , но с важным отличием:

В методе Гаусса-Зейделя вычисление использует элементы , которые уже были вычислены, и только элементы , которые не были вычислены в -й итерации. Это означает, что, в отличие от метода Якоби, требуется только один вектор хранения, поскольку элементы могут быть перезаписаны по мере их вычисления, что может быть выгодно для очень больших задач.

Однако, в отличие от метода Якоби, вычисления для каждого элемента, как правило, гораздо сложнее реализовать параллельно , поскольку они могут иметь очень длинный критический путь , и, таким образом, наиболее осуществимы для разреженных матриц . Кроме того, значения на каждой итерации зависят от порядка исходных уравнений.

Гаусс-Зейдель — это то же самое, что и последовательная сверхрелаксация с .

Конвергенция

Свойства сходимости метода Гаусса–Зейделя зависят от матрицы . А именно, известно, что процедура сходится, если:

Метод Гаусса–Зейделя может сходиться, даже если эти условия не выполняются.

Голуб и Ван Лоан приводят теорему для алгоритма, который разбивается на две части. Предположим, что является невырожденным. Пусть будет спектральным радиусом . Тогда итерации, определенные с помощью , сходятся к для любого начального вектора, если является невырожденным и . [8]

Алгоритм

Поскольку элементы могут быть перезаписаны по мере их вычисления в этом алгоритме, требуется только один вектор хранения, а индексация векторов опускается. Алгоритм выглядит следующим образом:

Алгоритм метода Гаусса–Зейделя : входы  :  A , b  , выход:  φ Выбрать начальное предположение φ для решения  повторить до сходимости для  i  от 1 до  n  сделать  σ ← 0  для  j  от 1 до  n  сделать  если  ji  то  σσ + 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 ); конец, конец , конец                     

Смотрите также

Примечания

  1. ^ Зауэр, Тимоти (2006). Числовой анализ (2-е изд.). Pearson Education, Inc. стр. 109. ISBN 978-0-321-78367-7.
  2. Гаусс 1903, стр. 279; прямая ссылка.
  3. ^ Зайдель, Людвиг (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 Mathematich-Physikalischen Klasse der Königlich Bayerischen Akademie der Wissenschaften (на немецком языке). 11 (3): 81–108.
  4. ^ Голуб и Ван Лоан 1996, с. 511.
  5. ^ Голуб и Ван Лоан 1996, уравнение (10.1.3)
  6. ^ Голуб и Ван Лоан 1996, Thm 10.1.2.
  7. ^ Bagnara, Roberto (март 1995 г.). «Единое доказательство сходимости методов Якоби и Гаусса-Зейделя». SIAM Review . 37 (1): 93–97. CiteSeerX 10.1.1.26.5207 . doi :10.1137/1037008. JSTOR  2132758. 
  8. ^ Голуб и Ван Лоан 1996, Thm 10.1.2

Ссылки

В данной статье использован текст из статьи Gauss-Seidel_method на CFD-Wiki, которая распространяется по лицензии GFDL .


Внешние ссылки