Участник:Sergey.protserov/Метод Якоби решения СЛАУ: различия между версиями
(+= 1.3, 1.4, 1.5) |
(+= 1.6, 1.7, 1.9) |
||
Строка 48: | Строка 48: | ||
<math>y^{n+1}_{i} = \frac{1}{a_{ii}}\left(f_{i} - \sum_{j=1,\,j \ne i}^{m}a_{ij}y^{n}_{j}\right),\quad i = 1,\,\dots,\,m</math>. | <math>y^{n+1}_{i} = \frac{1}{a_{ii}}\left(f_{i} - \sum_{j=1,\,j \ne i}^{m}a_{ij}y^{n}_{j}\right),\quad i = 1,\,\dots,\,m</math>. | ||
− | В качестве условия окончания итерационного процесса можно использовать условие <math>\left\lVert y^{n+1} - y^{n}\right\rVert \le \varepsilon</math>, где <math>\varepsilon</math> — заданная точность. Для оценки ошибки можно использовать невязку <math>Ay^{n+1} - f</math>. | + | В качестве условия окончания итерационного процесса можно использовать условие <math>\left\lVert y^{n+1} - y^{n}\right\rVert \le \varepsilon</math>, где <math>\varepsilon</math> — заданная точность. Кроме того, можно ограничить максимальное число итераций, задав <math>n_{max}</math>. Для оценки ошибки можно использовать невязку <math>Ay^{n+1} - f</math>. |
=== Вычислительное ядро алгоритма === | === Вычислительное ядро алгоритма === | ||
− | Основное время работы алгоритма приходится на последовательные вычисления векторов <math>y^{n+1}</math> по формуле, приведённой в предыдущем пункте, при уже вычисленных в начале работы алгоритма матрице <math>D^{-1} | + | Основное время работы алгоритма приходится на последовательные вычисления векторов <math>y^{n+1}</math> по формуле, приведённой в предыдущем пункте, при уже вычисленных в начале работы алгоритма матрице <math>D^{-1}A</math> и векторе <math>D^{-1}f</math>. |
=== Макроструктура алгоритма === | === Макроструктура алгоритма === | ||
В описываемом алгоритме можно выделить следующие макрооперации: | В описываемом алгоритме можно выделить следующие макрооперации: | ||
# вычисление <math>D^{-1}</math> | # вычисление <math>D^{-1}</math> | ||
− | # вычисление <math>D^{-1} | + | # вычисление <math>D^{-1}A</math> |
# вычисление <math>D^{-1}f</math> | # вычисление <math>D^{-1}f</math> | ||
− | # вычисление <math>y^{n+1} = D^{-1} | + | # вычисление <math>y^{n+1} = \left(I - D^{-1}A\right)y^{n} + D^{-1}f</math> |
Макрооперации 1-3 выполняются единожды, и в силу того, что матрица <math>D</math> — диагональная, занимают лишь незначительную часть времени работы алгоритма. | Макрооперации 1-3 выполняются единожды, и в силу того, что матрица <math>D</math> — диагональная, занимают лишь незначительную часть времени работы алгоритма. | ||
− | Макрооперация 4 выполняется многократно до наступления сходимости, поэтому она составляет вычислительное ядро алгоритма. | + | Макрооперация 4 выполняется многократно до наступления сходимости или достижения максимального числа итераций, поэтому она составляет вычислительное ядро алгоритма. |
+ | |||
+ | Кроме того, если в качестве критерия завершения работы алгоритма используется условие <math>\left\lVert y^{n+1} - y^{n}\right\rVert \le \varepsilon</math>, требуется также вычислять указанную величину. В дальнейшем при описании алгоритма мы будем предполагать, что этот критерий не используется, а используется завершение работы по достижении максимального числа итераций. | ||
=== Схема реализации последовательного алгоритма === | === Схема реализации последовательного алгоритма === | ||
# составить диагональную матрицу <math>D</math> | # составить диагональную матрицу <math>D</math> | ||
# вычислить <math>D^{-1}</math> | # вычислить <math>D^{-1}</math> | ||
− | # вычислить <math>D^{-1} | + | # вычислить <math>D^{-1}A</math> |
# вычислить <math>D^{-1}f</math> | # вычислить <math>D^{-1}f</math> | ||
− | # | + | # выполнять вычисления по формуле <math>y^{n+1} = \left(I - D^{-1}A\right)y^{n} + D^{-1}f</math>, <math>n = 0,\,1,\,\dots,\,n_{max}</math> |
− | |||
− | |||
При этом на <math>n</math>-ом шаге итераций необходимо хранить оба вектора <math>y^{n}</math>, <math>y^{n+1}</math>. | При этом на <math>n</math>-ом шаге итераций необходимо хранить оба вектора <math>y^{n}</math>, <math>y^{n+1}</math>. | ||
+ | |||
+ | === Последовательная сложность алгоритма === | ||
+ | Шаг 2 предыдущего пункта требует выполнения <math>m</math> операций деления вещественных чисел, шаг 3 (с учётом того, что матрица <math>D^{-1}</math> — диагональная) требует выполнения <math>m^{2}</math> операций умножения вещественных чисел, аналогично шаг 4 требует <math>m</math> операций умножения, а каждая итерация шага 7 требует <math>m^{2}</math> умножений и <math>m^{2} + 2m</math> сложений/вычитаний. | ||
+ | |||
+ | === Ресурс параллелизма алгоритма === | ||
+ | Шаг 2 требует один ярус из <math>m</math> операций деления, шаг 3 требует BEGIN FIXME один ярус из <math>m^{2}</math> операций умножения, шаг 4 требует один ярус из <math>m</math> операций умножения, а каждая итерация шага 7 требует по <math>m</math> ярусов умножений и сложений (в каждом из ярусов — <math>m</math> операций) для выполнения умножения матрицы на вектор <ref name="AW">https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82)#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0</ref> и ещё два яруса по <math>m</math> сложений/вычитаний END FIXME, причём итерации выполняются последовательно. | ||
+ | |||
+ | === Входные и выходные данные алгоритма === | ||
+ | Входные данные: | ||
+ | # Вещественная <math>m \times m</math> матрица <math>A</math>, вообще говоря, плотная | ||
+ | # Вещественный <math>m</math>-мерный вектор правой части <math>f</math> | ||
+ | # Вещественный <math>m</math>-мерный вектор начального приближения <math>y^{0}</math> | ||
+ | # Максимальное число итераций алгоритма <math>n_{max}</math> | ||
+ | Выходные данные: | ||
+ | # Вещественный <math>m</math>-мерный вектор приближённого решения <math>y^{n_{max}}</math> | ||
== Литература == | == Литература == | ||
<references /> | <references /> |
Версия 14:50, 21 ноября 2019
Содержание
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Метод Якоби -- одношаговый стационарный итерационный метод решения СЛАУ вида [math]Ay = f[/math], где [math] A = \left( \begin{array}{ccc} a_{11} & \dots & a_{1m} \\ \vdots & \ddots & \vdots \\ a_{m1} & \dots & a_{mm} \\ \end{array} \right) [/math], [math] f = \left( \begin{array}{c} f_{1} \\ \vdots \\ f_{m} \\ \end{array} \right) [/math], [math] y = \left( \begin{array}{c} y_{1} \\ \vdots \\ y_{m} \\ \end{array} \right) [/math], [math]\det A \ne 0[/math].
Каноническая форма одношагового стационарного итерационного метода имеет вид [1]: [math] B\frac{y^{n+1} - y^{n}}{\tau} + Ay^{n} = f, \quad n = 0,\,1,\,\dots\,, [/math]
где [math]B[/math] — невырожденная матрица [math]m \times m[/math], [math]\tau \in \mathbb{R}[/math], [math]y^{0}[/math] — заданное начальное приближение. Решение исходной СЛАУ находится приближённо посредством последовательных итераций. На [math]n[/math]-ом шаге находится [math]y^{n+1}[/math] — очередное приближение для искомого решения [math]y[/math].
В методе Якоби [math]\tau = 1[/math], [math]B = D[/math], где [math]D[/math] — диагональная матрица, элементы которой совпадают с элементами, стоящими на главной диагонали матрицы [math]A[/math].
Достаточным условием сходимости метода является свойство строгого диагонального преобладания у матрицы [math]A[/math]. [2]
1.2 Математическое описание алгоритма
В обозначениях предыдущего пункта выражение для [math]y^{n+1}[/math] через [math]y^{n}[/math]: [math]y^{n+1} = D^{-1}\left(D-A\right)y^{n} + D^{-1}f[/math].
В поэлементной записи:
[math]y^{n+1}_{i} = \frac{1}{a_{ii}}\left(f_{i} - \sum_{j=1,\,j \ne i}^{m}a_{ij}y^{n}_{j}\right),\quad i = 1,\,\dots,\,m[/math].
В качестве условия окончания итерационного процесса можно использовать условие [math]\left\lVert y^{n+1} - y^{n}\right\rVert \le \varepsilon[/math], где [math]\varepsilon[/math] — заданная точность. Кроме того, можно ограничить максимальное число итераций, задав [math]n_{max}[/math]. Для оценки ошибки можно использовать невязку [math]Ay^{n+1} - f[/math].
1.3 Вычислительное ядро алгоритма
Основное время работы алгоритма приходится на последовательные вычисления векторов [math]y^{n+1}[/math] по формуле, приведённой в предыдущем пункте, при уже вычисленных в начале работы алгоритма матрице [math]D^{-1}A[/math] и векторе [math]D^{-1}f[/math].
1.4 Макроструктура алгоритма
В описываемом алгоритме можно выделить следующие макрооперации:
- вычисление [math]D^{-1}[/math]
- вычисление [math]D^{-1}A[/math]
- вычисление [math]D^{-1}f[/math]
- вычисление [math]y^{n+1} = \left(I - D^{-1}A\right)y^{n} + D^{-1}f[/math]
Макрооперации 1-3 выполняются единожды, и в силу того, что матрица [math]D[/math] — диагональная, занимают лишь незначительную часть времени работы алгоритма.
Макрооперация 4 выполняется многократно до наступления сходимости или достижения максимального числа итераций, поэтому она составляет вычислительное ядро алгоритма.
Кроме того, если в качестве критерия завершения работы алгоритма используется условие [math]\left\lVert y^{n+1} - y^{n}\right\rVert \le \varepsilon[/math], требуется также вычислять указанную величину. В дальнейшем при описании алгоритма мы будем предполагать, что этот критерий не используется, а используется завершение работы по достижении максимального числа итераций.
1.5 Схема реализации последовательного алгоритма
- составить диагональную матрицу [math]D[/math]
- вычислить [math]D^{-1}[/math]
- вычислить [math]D^{-1}A[/math]
- вычислить [math]D^{-1}f[/math]
- выполнять вычисления по формуле [math]y^{n+1} = \left(I - D^{-1}A\right)y^{n} + D^{-1}f[/math], [math]n = 0,\,1,\,\dots,\,n_{max}[/math]
При этом на [math]n[/math]-ом шаге итераций необходимо хранить оба вектора [math]y^{n}[/math], [math]y^{n+1}[/math].
1.6 Последовательная сложность алгоритма
Шаг 2 предыдущего пункта требует выполнения [math]m[/math] операций деления вещественных чисел, шаг 3 (с учётом того, что матрица [math]D^{-1}[/math] — диагональная) требует выполнения [math]m^{2}[/math] операций умножения вещественных чисел, аналогично шаг 4 требует [math]m[/math] операций умножения, а каждая итерация шага 7 требует [math]m^{2}[/math] умножений и [math]m^{2} + 2m[/math] сложений/вычитаний.
1.7 Ресурс параллелизма алгоритма
Шаг 2 требует один ярус из [math]m[/math] операций деления, шаг 3 требует BEGIN FIXME один ярус из [math]m^{2}[/math] операций умножения, шаг 4 требует один ярус из [math]m[/math] операций умножения, а каждая итерация шага 7 требует по [math]m[/math] ярусов умножений и сложений (в каждом из ярусов — [math]m[/math] операций) для выполнения умножения матрицы на вектор [3] и ещё два яруса по [math]m[/math] сложений/вычитаний END FIXME, причём итерации выполняются последовательно.
1.8 Входные и выходные данные алгоритма
Входные данные:
- Вещественная [math]m \times m[/math] матрица [math]A[/math], вообще говоря, плотная
- Вещественный [math]m[/math]-мерный вектор правой части [math]f[/math]
- Вещественный [math]m[/math]-мерный вектор начального приближения [math]y^{0}[/math]
- Максимальное число итераций алгоритма [math]n_{max}[/math]
Выходные данные:
- Вещественный [math]m[/math]-мерный вектор приближённого решения [math]y^{n_{max}}[/math]
2 Литература
- ↑ Абакумов М. В., Гулин А.В. Лекции по численным методам математической физики. - Москва: ИНФРА-М, 2013. - 61 с.
- ↑ Bagnara, Roberto. (2001). A Unified Proof For The Convergence Of Jacobi And Gauss-Seidel Methods. SIAM Review. 37. 10.1137/1037008.
- ↑ https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82)#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0