Итерационный метод решения линейной системы уравнений
В числовая линейная алгебра , то Метод Гаусса – Зейделя , также известный как Метод Либмана или метод последовательного вытеснения , является итерационный метод используется для решения система линейных уравнений . Он назван в честь Немецкий математики Карл Фридрих Гаусс и Филипп Людвиг фон Зайдель , и аналогичен Метод Якоби . Хотя его можно применить к любой матрице с ненулевыми элементами на диагоналях, сходимость гарантируется только в том случае, если матрица либо строго по диагонали ,[1] или же симметричный и положительно определенный . Об этом упоминалось только в частном письме Гаусса своему ученику. Герлинг в 1823 г.[2] До 1874 года Зайдель не выпустил ни одной публикации.
Описание
Метод Гаусса – Зейделя представляет собой итерационная техника для решения квадратной системы п линейные уравнения с неизвестными Икс :
А Икс = б { Displaystyle А mathbf {x} = mathbf {b}} .Он определяется итерацией
L ∗ Икс ( k + 1 ) = б − U Икс ( k ) , { Displaystyle L _ {*} mathbf {x} ^ {(k + 1)} = mathbf {b} -U mathbf {x} ^ {(k)},} куда Икс ( k ) { Displaystyle mathbf {х} ^ {(к)}} это k ое приближение или итерация Икс , Икс ( k + 1 ) { Displaystyle mathbf {x}, , mathbf {x} ^ {(к + 1)}} следующий или k + 1 итерация Икс { displaystyle mathbf {x}} , а матрица А раскладывается на нижний треугольный компонент L ∗ { displaystyle L _ {*}} , а строго верхнетреугольный компонент U : А = L ∗ + U { displaystyle A = L _ {*} + U} .[3]
Более подробно выпишите А , Икс и б в их составных частях:
А = [ а 11 а 12 ⋯ а 1 п а 21 а 22 ⋯ а 2 п ⋮ ⋮ ⋱ ⋮ а п 1 а п 2 ⋯ а п п ] , Икс = [ Икс 1 Икс 2 ⋮ Икс п ] , б = [ б 1 б 2 ⋮ б п ] . { displaystyle A = { begin {bmatrix} a_ {11} & a_ {12} & cdots & a_ {1n} a_ {21} & a_ {22} & cdots & a_ {2n} vdots & vdots & ddots & vdots a_ {n1} & a_ {n2} & cdots & a_ {nn} end {bmatrix}}, qquad mathbf {x} = { begin {bmatrix} x_ {1} x_ {2} vdots x_ {n} end {bmatrix}}, qquad mathbf {b} = { begin {bmatrix} b_ {1} b_ {2} vdots b_ {n} end {bmatrix}}.} Тогда разложение А в его нижнюю треугольную составляющую и строго верхнюю треугольную составляющую:
А = L ∗ + U куда L ∗ = [ а 11 0 ⋯ 0 а 21 а 22 ⋯ 0 ⋮ ⋮ ⋱ ⋮ а п 1 а п 2 ⋯ а п п ] , U = [ 0 а 12 ⋯ а 1 п 0 0 ⋯ а 2 п ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 0 ] . { displaystyle A = L _ {*} + U qquad { text {where}} qquad L _ {*} = { begin {bmatrix} a_ {11} & 0 & cdots & 0 a_ {21} & a_ {22 } & cdots & 0 vdots & vdots & ddots & vdots a_ {n1} & a_ {n2} & cdots & a_ {nn} end {bmatrix}}, quad U = { begin { bmatrix} 0 & a_ {12} & cdots & a_ {1n} 0 & 0 & cdots & a_ {2n} vdots & vdots & ddots & vdots 0 & 0 & cdots & 0 end {bmatrix}}.} Систему линейных уравнений можно переписать как:
L ∗ Икс = б − U Икс { Displaystyle L _ {*} mathbf {x} = mathbf {b} -U mathbf {x}} Теперь метод Гаусса – Зейделя решает левую часть этого выражения для Икс , используя предыдущее значение для Икс с правой стороны. Аналитически это можно записать как:
Икс ( k + 1 ) = L ∗ − 1 ( б − U Икс ( k ) ) . { displaystyle mathbf {x} ^ {(k + 1)} = L _ {*} ^ {- 1} ( mathbf {b} -U mathbf {x} ^ {(k)}).} Однако, пользуясь преимуществом треугольной формы L ∗ { displaystyle L _ {*}} , элементы Икс (k +1) можно вычислить последовательно, используя прямая замена :
Икс я ( k + 1 ) = 1 а я я ( б я − ∑ j = 1 я − 1 а я j Икс j ( k + 1 ) − ∑ j = я + 1 п а я j Икс j ( k ) ) , я = 1 , 2 , … , п . { displaystyle x_ {i} ^ {(k + 1)} = { frac {1} {a_ {ii}}} left (b_ {i} - sum _ {j = 1} ^ {i-1 } a_ {ij} x_ {j} ^ {(k + 1)} - sum _ {j = i + 1} ^ {n} a_ {ij} x_ {j} ^ {(k)} right), quad i = 1,2, dots, n.} [4] Процедура обычно продолжается до тех пор, пока изменения, внесенные в итерацию, не станут ниже некоторого допуска, например, достаточно малого остаточный .
Обсуждение Поэлементная формула метода Гаусса – Зейделя чрезвычайно похожа на формулу метода Метод Якоби .
Расчет Икс (k +1) использует элементы Икс (k +1) которые уже были вычислены, и только элементы Икс (k ) которые не были вычислены в итерации k + 1. Это означает, что, в отличие от метода Якоби, требуется только один вектор хранения, поскольку элементы могут быть перезаписаны по мере их вычисления, что может быть выгодно для очень больших задач.
Однако, в отличие от метода Якоби, вычисления для каждого элемента не могут быть выполнены в параллельно . Кроме того, значения на каждой итерации зависят от порядка исходных уравнений.
Гаусс-Зайдель такой же, как SOR (последовательное чрезмерное расслабление) с ω = 1 { displaystyle omega = 1} .
Конвергенция
Свойства сходимости метода Гаусса – Зейделя зависят от матрицы А . А именно, известно, что процедура сходится, если:
Метод Гаусса – Зейделя иногда сходится, даже если эти условия не выполняются.
Алгоритм
Поскольку элементы могут быть перезаписаны по мере их вычисления в этом алгоритме, необходим только один вектор хранения, а индексирование вектора опущено. Алгоритм следующий:
Входы: А , б Выход: ϕ { displaystyle phi} Выберите первоначальное предположение ϕ { displaystyle phi} к решению повторение до схождения за я из 1 до того как п делать σ ← 0 { displaystyle sigma leftarrow 0} за j из 1 до того как п делать если j ≠ я тогда σ ← σ + а я j ϕ j { displaystyle sigma leftarrow sigma + a_ {ij} phi _ {j}} конец, если конец (j -петля) ϕ я ← 1 а я я ( б я − σ ) { displaystyle phi _ {i} leftarrow { frac {1} {a_ {ii}}} (b_ {i} - sigma)} конец (я -loop) проверить, достигнута ли сходимостьконец (повторение) Примеры
Пример для матричной версии Линейная система, показанная как А Икс = б { Displaystyle А mathbf {x} = mathbf {b}} дан кем-то:
А = [ 16 3 7 − 11 ] { displaystyle A = { begin {bmatrix} 16 & 3 7 & -11 end {bmatrix}}} и б = [ 11 13 ] . { displaystyle b = { begin {bmatrix} 11 13 end {bmatrix}}.} Мы хотим использовать уравнение
Икс ( k + 1 ) = L ∗ − 1 ( б − U Икс ( k ) ) { displaystyle mathbf {x} ^ {(k + 1)} = L _ {*} ^ {- 1} ( mathbf {b} -U mathbf {x} ^ {(k)})} в виде
Икс ( k + 1 ) = Т Икс ( k ) + C { displaystyle mathbf {x} ^ {(k + 1)} = T mathbf {x} ^ {(k)} + C} куда:
Т = − L ∗ − 1 U { displaystyle T = -L _ {*} ^ {- 1} U} и C = L ∗ − 1 б . { displaystyle C = L _ {*} ^ {- 1} mathbf {b}.} Мы должны разложить А { displaystyle A _ {} ^ {}} в сумму нижней треугольной составляющей L ∗ { displaystyle L _ {*} ^ {}} и строгий верхнетреугольный компонент U { displaystyle U _ {} ^ {}} :
L ∗ = [ 16 0 7 − 11 ] { displaystyle L _ {*} = { begin {bmatrix} 16 & 0 7 & -11 end {bmatrix}}} и U = [ 0 3 0 0 ] . { displaystyle U = { begin {bmatrix} 0 & 3 0 & 0 end {bmatrix}}.} Обратное L ∗ { displaystyle L _ {*} ^ {}} является:
L ∗ − 1 = [ 16 0 7 − 11 ] − 1 = [ 0.0625 0.0000 0.0398 − 0.0909 ] { displaystyle L _ {*} ^ {- 1} = { begin {bmatrix} 16 & 0 7 & -11 end {bmatrix}} ^ {- 1} = { begin {bmatrix} 0,0625 & 0,0000 0,0398 & -0.0909 конец {bmatrix}}} .Теперь мы можем найти:
Т = − [ 0.0625 0.0000 0.0398 − 0.0909 ] × [ 0 3 0 0 ] = [ 0.000 − 0.1875 0.000 − 0.1194 ] , { displaystyle T = - { begin {bmatrix} 0,0625 & 0,0000 0,0398 & -0,0909 end {bmatrix}} times { begin {bmatrix} 0 & 3 0 & 0 end {bmatrix}} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1194 end {bmatrix}},} C = [ 0.0625 0.0000 0.0398 − 0.0909 ] × [ 11 13 ] = [ 0.6875 − 0.7439 ] . { displaystyle C = { begin {bmatrix} 0,0625 & 0,0000 0,0398 & -0,0909 end {bmatrix}} times { begin {bmatrix} 11 13 end {bmatrix}} = { begin { bmatrix} 0,6875 - 0,7439 end {bmatrix}}.} Теперь у нас есть Т { displaystyle T _ {} ^ {}} и C { displaystyle C _ {} ^ {}} и мы можем использовать их для получения векторов Икс { displaystyle mathbf {x}} итеративно.
Прежде всего, мы должны выбрать Икс ( 0 ) { Displaystyle mathbf {х} ^ {(0)}} : мы можем только догадываться. Чем точнее предположение, тем быстрее будет работать алгоритм.
Мы предполагаем:
Икс ( 0 ) = [ 1.0 1.0 ] . { displaystyle x ^ {(0)} = { begin {bmatrix} 1.0 1.0 end {bmatrix}}.} Затем мы можем вычислить:
Икс ( 1 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 1.0 1.0 ] + [ 0.6875 − 0.7443 ] = [ 0.5000 − 0.8636 ] . { displaystyle x ^ {(1)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 1.0 1.0 end {bmatrix} } + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,5000 - 0,8636 end {bmatrix}}.} Икс ( 2 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 0.5000 − 0.8636 ] + [ 0.6875 − 0.7443 ] = [ 0.8494 − 0.6413 ] . { displaystyle x ^ {(2)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 0,5000 - 0,8636 end {bmatrix }} + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,8494 - 0,6413 end {bmatrix}}.} Икс ( 3 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 0.8494 − 0.6413 ] + [ 0.6875 − 0.7443 ] = [ 0.8077 − 0.6678 ] . { displaystyle x ^ {(3)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 0,8494 - 0,6413 конец {bmatrix}} + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,8077 - 0,6678 end {bmatrix}}.} Икс ( 4 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 0.8077 − 0.6678 ] + [ 0.6875 − 0.7443 ] = [ 0.8127 − 0.6646 ] . { displaystyle x ^ {(4)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 0.8077 - 0,6678 end {bmatrix }} + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,8127 - 0,6646 end {bmatrix}}.} Икс ( 5 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 0.8127 − 0.6646 ] + [ 0.6875 − 0.7443 ] = [ 0.8121 − 0.6650 ] . { displaystyle x ^ {(5)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 0,8127 - 0,6646 end {bmatrix }} + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,8121 - 0,6650 end {bmatrix}}.} Икс ( 6 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 0.8121 − 0.6650 ] + [ 0.6875 − 0.7443 ] = [ 0.8122 − 0.6650 ] . { displaystyle x ^ {(6)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 0,8121 - 0,6650 end {bmatrix }} + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,8122 - 0,6650 end {bmatrix}}.} Икс ( 7 ) = [ 0.000 − 0.1875 0.000 − 0.1193 ] × [ 0.8122 − 0.6650 ] + [ 0.6875 − 0.7443 ] = [ 0.8122 − 0.6650 ] . { displaystyle x ^ {(7)} = { begin {bmatrix} 0,000 & -0,1875 0,000 & -0,1193 end {bmatrix}} times { begin {bmatrix} 0,8122 - 0,6650 end {bmatrix }} + { begin {bmatrix} 0,6875 - 0,7443 end {bmatrix}} = { begin {bmatrix} 0,8122 - 0,6650 end {bmatrix}}.} Как и ожидалось, алгоритм сходится к точному решению:
Икс = А − 1 б ≈ [ 0.8122 − 0.6650 ] . { displaystyle mathbf {x} = A ^ {- 1} mathbf {b} приблизительно { begin {bmatrix} 0.8122 - 0.6650 end {bmatrix}}.} На самом деле матрица A строго диагонально доминирует (но не положительно определена).
Другой пример для матричной версии Другая линейная система, обозначенная как А Икс = б { Displaystyle А mathbf {x} = mathbf {b}} дан кем-то:
А = [ 2 3 5 7 ] { displaystyle A = { begin {bmatrix} 2 & 3 5 & 7 end {bmatrix}}} и б = [ 11 13 ] . { displaystyle b = { begin {bmatrix} 11 13 end {bmatrix}}.} Мы хотим использовать уравнение
Икс ( k + 1 ) = L ∗ − 1 ( б − U Икс ( k ) ) { displaystyle mathbf {x} ^ {(k + 1)} = L _ {*} ^ {- 1} ( mathbf {b} -U mathbf {x} ^ {(k)})} в виде
Икс ( k + 1 ) = Т Икс ( k ) + C { displaystyle mathbf {x} ^ {(k + 1)} = T mathbf {x} ^ {(k)} + C} куда:
Т = − L ∗ − 1 U { displaystyle T = -L _ {*} ^ {- 1} U} и C = L ∗ − 1 б . { displaystyle C = L _ {*} ^ {- 1} mathbf {b}.} Мы должны разложить А { displaystyle A _ {} ^ {}} в сумму нижней треугольной составляющей L ∗ { displaystyle L _ {*} ^ {}} и строгий верхнетреугольный компонент U { displaystyle U _ {} ^ {}} :
L ∗ = [ 2 0 5 7 ] { displaystyle L _ {*} = { begin {bmatrix} 2 & 0 5 & 7 end {bmatrix}}} и U = [ 0 3 0 0 ] . { displaystyle U = { begin {bmatrix} 0 & 3 0 & 0 end {bmatrix}}.} Обратное L ∗ { displaystyle L _ {*} ^ {}} является:
L ∗ − 1 = [ 2 0 5 7 ] − 1 = [ 0.500 0.000 − 0.357 0.143 ] { displaystyle L _ {*} ^ {- 1} = { begin {bmatrix} 2 & 0 5 & 7 end {bmatrix}} ^ {- 1} = { begin {bmatrix} 0,500 и 0,000 - 0,357 и 0,143 end {bmatrix}}} .Теперь мы можем найти:
Т = − [ 0.500 0.000 − 0.357 0.143 ] × [ 0 3 0 0 ] = [ 0.000 − 1.500 0.000 1.071 ] , { displaystyle T = - { begin {bmatrix} 0,500 и 0,000 - 0,357 и 0,143 end {bmatrix}} times { begin {bmatrix} 0 & 3 0 & 0 end {bmatrix} } = { begin {bmatrix} 0,000 & -1,500 0,000 & 1.071 end {bmatrix}},} C = [ 0.500 0.000 − 0.357 0.143 ] × [ 11 13 ] = [ 5.500 − 2.071 ] . { displaystyle C = { begin {bmatrix} 0,500 и 0,000 - 0,357 и 0,143 end {bmatrix}} times { begin {bmatrix} 11 13 end {bmatrix}} = { begin {bmatrix} 5.500 - 2.071 end {bmatrix}}.} Теперь у нас есть Т { displaystyle T _ {} ^ {}} и C { displaystyle C _ {} ^ {}} и мы можем использовать их для получения векторов Икс { displaystyle mathbf {x}} итеративно.
Прежде всего, мы должны выбрать Икс ( 0 ) { Displaystyle mathbf {х} ^ {(0)}} : мы можем только догадываться. Чем точнее предположение, тем быстрее будет выполнен алгоритм.
Мы предполагаем:
Икс ( 0 ) = [ 1.1 2.3 ] . { displaystyle x ^ {(0)} = { begin {bmatrix} 1.1 2.3 end {bmatrix}}.} Затем мы можем вычислить:
Икс ( 1 ) = [ 0 − 1.500 0 1.071 ] × [ 1.1 2.3 ] + [ 5.500 − 2.071 ] = [ 2.050 0.393 ] . { displaystyle x ^ {(1)} = { begin {bmatrix} 0 & -1,500 0 & 1.071 end {bmatrix}} times { begin {bmatrix} 1.1 2.3 end { bmatrix}} + { begin {bmatrix} 5.500 - 2.071 end {bmatrix}} = { begin {bmatrix} 2.050 0.393 end {bmatrix}}.} Икс ( 2 ) = [ 0 − 1.500 0 1.071 ] × [ 2.050 0.393 ] + [ 5.500 − 2.071 ] = [ 4.911 − 1.651 ] . { displaystyle x ^ {(2)} = { begin {bmatrix} 0 & -1.500 0 & 1.071 end {bmatrix}} times { begin {bmatrix} 2.050 0.393 end { bmatrix}} + { begin {bmatrix} 5.500 - 2.071 end {bmatrix}} = { begin {bmatrix} 4.911 - 1.651 end {bmatrix}}.} Икс ( 3 ) = ⋯ . { Displaystyle х ^ {(3)} = cdots. ,} Если мы проверим сходимость, мы обнаружим, что алгоритм расходится. На самом деле матрица A не является ни диагонально доминирующей, ни положительно определенной. Тогда сходимость к точному решению
Икс = А − 1 б = [ − 38 29 ] { displaystyle mathbf {x} = A ^ {- 1} mathbf {b} = { begin {bmatrix} -38 29 end {bmatrix}}} не гарантируется и в этом случае не произойдет.
Пример для версии уравнения Предположим, что k уравнения, где Икс п - векторы этих уравнений и отправная точка Икс 0 . Из первого уравнения решите для Икс 1 с точки зрения Икс п + 1 , Икс п + 2 , … , Икс п . { displaystyle x_ {n + 1}, x_ {n + 2}, dots, x_ {n}.} Для следующих уравнений подставьте предыдущие значенияИкс с.
Чтобы было понятно, рассмотрим пример.
10 Икс 1 − Икс 2 + 2 Икс 3 = 6 , − Икс 1 + 11 Икс 2 − Икс 3 + 3 Икс 4 = 25 , 2 Икс 1 − Икс 2 + 10 Икс 3 − Икс 4 = − 11 , 3 Икс 2 − Икс 3 + 8 Икс 4 = 15. { displaystyle { begin {array} {rrrrl} 10x_ {1} & - x_ {2} & + 2x_ {3} && = 6, - x_ {1} & + 11x_ {2} & - x_ {3 } & + 3x_ {4} & = 25, 2x_ {1} & - x_ {2} & + 10x_ {3} & - x_ {4} & = - 11, & 3x_ {2} & - x_ { 3} & + 8x_ {4} & = 15. end {array}}} Решение для Икс 1 , Икс 2 , Икс 3 { displaystyle x_ {1}, x_ {2}, x_ {3}} и Икс 4 { displaystyle x_ {4}} дает:
Икс 1 = Икс 2 / 10 − Икс 3 / 5 + 3 / 5 , Икс 2 = Икс 1 / 11 + Икс 3 / 11 − 3 Икс 4 / 11 + 25 / 11 , Икс 3 = − Икс 1 / 5 + Икс 2 / 10 + Икс 4 / 10 − 11 / 10 , Икс 4 = − 3 Икс 2 / 8 + Икс 3 / 8 + 15 / 8. { displaystyle { begin {align} x_ {1} & = x_ {2} / 10-x_ {3} / 5 + 3/5, x_ {2} & = x_ {1} / 11 + x_ { 3} / 11-3x_ {4} / 11 + 25/11, x_ {3} & = - x_ {1} / 5 + x_ {2} / 10 + x_ {4} / 10-11 / 10, x_ {4} & = - 3x_ {2} / 8 + x_ {3} /8+15/8.end {выровнено}}} Предположим, мы выбираем (0, 0, 0, 0) в качестве начального приближения первое приближенное решение дается выражением
Икс 1 = 3 / 5 = 0.6 , Икс 2 = ( 3 / 5 ) / 11 + 25 / 11 = 3 / 55 + 25 / 11 = 2.3272 , Икс 3 = − ( 3 / 5 ) / 5 + ( 2.3272 ) / 10 − 11 / 10 = − 3 / 25 + 0.23272 − 1.1 = − 0.9873 , Икс 4 = − 3 ( 2.3272 ) / 8 + ( − 0.9873 ) / 8 + 15 / 8 = 0.8789. { displaystyle { begin {align} x_ {1} & = 3/5 = 0,6, x_ {2} & = (3/5) /11+25/11=3/55+25/11=2.3272 , x_ {3} & = - (3/5) / 5 + (2.3272) /10-11/10=-3/25+0.23272-1.1=-0.9873, x_ {4} & = - 3 (2.3272) / 8 + (- 0.9873) /8+15/8=0.8789.end {выровнено}}} Используя полученные приближения, итерационная процедура повторяется до тех пор, пока не будет достигнута желаемая точность. Ниже приведены приблизительные решения после четырех итераций.
Икс 1 Икс 2 Икс 3 Икс 4 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 { displaystyle { begin {array} {llll} x_ {1} & x_ {2} & x_ {3} & x_ {4} hline 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 end {array}}} Точное решение системы (1, 2, −1, 1) .
Пример использования Python и NumPy Следующая численная процедура просто выполняет итерацию для получения вектора решения.
импорт тупой в качестве нп ITERATION_LIMIT = 1000 # инициализируем матрицу А = нп . множество ([[ 10. , - 1. , 2. , 0. ], [ - 1. , 11. , - 1. , 3. ], [ 2. , - 1. , 10. , - 1. ], [ 0. , 3. , - 1. , 8. ]]) # инициализировать вектор RHS б = нп . множество ([ 6.0 , 25.0 , - 11.0 , 15.0 ]) Распечатать ( «Система уравнений:» ) за я в классифицировать ( А . форма [ 0 ]): ряд = [ " {0: 3g} *Икс {1} " . формат ( А [ я , j ], j + 1 ) за j в классифицировать ( А . форма [ 1 ])] Распечатать ( "[ {0} ] = [ {1: 3g} ]" . формат ( " + " . присоединиться ( ряд ), б [ я ])) Икс = нп . zeros_like ( б ) за it_count в классифицировать ( 1 , ITERATION_LIMIT ): x_new = нп . zeros_like ( Икс ) Распечатать ( "Итерация {0} : {1} " . формат ( it_count , Икс )) за я в классифицировать ( А . форма [ 0 ]): s1 = нп . точка ( А [ я , : я ], x_new [: я ]) s2 = нп . точка ( А [ я , я + 1 :], Икс [ я + 1 :]) x_new [ я ] = ( б [ я ] - s1 - s2 ) / А [ я , я ] если нп . всезакрыть ( Икс , x_new , rtol = 1e-8 ): перемена Икс = x_new Распечатать ( "Решение: {0} " . формат ( Икс )) ошибка = нп . точка ( А , Икс ) - б Распечатать ( "Ошибка: {0} " . формат ( ошибка )) Производит вывод:
Система из уравнения : [ 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 В следующем коде используется формула Икс я ( k + 1 ) = 1 а я я ( б я − ∑ j < я а я j Икс j ( k + 1 ) − ∑ j > я а я j Икс j ( k ) ) , я , j = 1 , 2 , … , п { displaystyle x_ {i} ^ {(k + 1)} = { frac {1} {a_ {ii}}} left (b_ {i} - sum _ {j i} a_ {ij} x_ {j} ^ {(k)} right), quad i, j = 1,2, ldots , n}
функция Икс = gauss_seidel ( А, б, х, итерс) за я = 1 : iters за j = 1 : размер ( А , 1 ) Икс ( j ) = ( 1 / А ( j , j )) * ( б ( j ) - А ( j ,:) * Икс + А ( j , j ) * Икс ( j )); конец конец конец Смотрите также
Примечания
Рекомендации
Гаусс, Карл Фридрих (1903), Werke (на немецком), 9 , Геттинген: Köninglichen Gesellschaft der Wissenschaften .Голуб, Джин Х. ; Ван Лоан, Чарльз Ф. (1996), Матричные вычисления (3-е изд.), Балтимор: Джонс Хопкинс, ISBN 978-0-8018-5414-9 .Блэк, Ноэль и Мур, Ширли. «Метод Гаусса-Зейделя» . MathWorld . Эта статья включает текст из статьи Gauss-Seidel_method на CFD-Wiki что находится под GFDL лицензия.
внешняя ссылка
Ключевые идеи Проблемы Аппаратное обеспечение Программного обеспечения