Участник:Chist/Метод Ньютона: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
(Новая страница: « == Свойства и структура алгоритма == === Общее описание алгоритма === Метод Ньютона, алгори…»)
 
Строка 66: Строка 66:
 
=== Макроструктура алгоритма ===
 
=== Макроструктура алгоритма ===
  
Для обеспечения параллелизма сперва исходная сетка разбивается на <math>n</math> по возможности равных участков (например, на полосы длины <math>M</math>). В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:
+
Для обеспечения параллелизма сперва исходная сетка разбивается на <math>n</math> по возможности равных участков (например, на полосы длины <math>M</math>) — запускается <math>n</math> процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:
 
*1. вычисляются значения функций <math>\ f(z_k)</math>, <math>\ f'(z_k)</math> (предполагается, что функции заданы аналитически);
 
*1. вычисляются значения функций <math>\ f(z_k)</math>, <math>\ f'(z_k)</math> (предполагается, что функции заданы аналитически);
 
*2. вычисляется следующая точка:
 
*2. вычисляется следующая точка:
Строка 73: Строка 73:
 
</math>
 
</math>
 
*3. если условие останова не выполнено, переходим к шагу 1.
 
*3. если условие останова не выполнено, переходим к шагу 1.
 +
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.
  
 
=== Схема реализации последовательного алгоритма ===
 
=== Схема реализации последовательного алгоритма ===
Строка 79: Строка 80:
  
 
=== Последовательная сложность алгоритма ===
 
=== Последовательная сложность алгоритма ===
 +
 +
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции <math>\ f(x) </math>, <math>\ f'(x) </math> заданы аналитически).
 +
Проведём исследование для многочленов степени <math>p</math>, каждый из которых определяется вектором из <math>p + 1</math> коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя <math>iter\_num</math> операций.
 +
 +
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.
 +
 +
Для вычисления значения многочлена степени <math>p</math> в точке с помощью тривиального алгоритма необходимо <math>\frac{p(p+1)}{2} + p</math> операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до <math>p</math>:
 +
:<math>
 +
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.
 +
</math>
 +
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё <math>p - 1</math> операцию. Наконец, в каждой итерации производится ровно одно деление.
 +
 +
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:
 +
:<math>
 +
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,
 +
</math>
 +
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.
  
 
=== Информационный граф ===
 
=== Информационный граф ===
 +
 +
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.
 +
 +
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]
 +
 +
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.
  
 
=== Ресурс параллелизма алгоритма ===
 
=== Ресурс параллелизма алгоритма ===
  
 
=== Входные и выходные данные алгоритма ===
 
=== Входные и выходные данные алгоритма ===
 +
 +
'''Входные данные''':
 +
* <math>p + 1</math> действительное число — коэффициенты многочлена.
 +
* Действительные числа <math>x_0</math>, <math>y_0</math>, <math>x_1</math>, <math>y_1</math>, определяющие левый нижний <math>(x_0, y_0)</math> и правый верхний <math>(x_1, y_1)</math> узлы прямоугольной сетки.
 +
* Натуральные числа <math>M</math> и <math>N</math>, задающие количество узлов сетки по горизонтали и вертикали
 +
* Натуральное число <math>iter\_num</math>, равное количеству итераций при каждом запуске метода Ньютона
 +
 +
'''Выходные данные''':
 +
* список всех найденных комплексных чисел <math>z</math>, удовлетворяющих условию <math>|f(z)| < \varepsilon</math>.
  
 
=== Свойства алгоритма ===
 
=== Свойства алгоритма ===
 +
 +
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.
 +
 +
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.
 +
 +
Очевидно, что алгоритм является детерминированным.
 +
 +
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.
  
 
== Программная реализация алгоритма ==
 
== Программная реализация алгоритма ==

Версия 16:45, 19 ноября 2017

1 Свойства и структура алгоритма

1.1 Общее описание алгоритма

Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.

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

1.2 Математическое описание алгоритма

Пусть задана некоторая функция \ f(x) , её производная \ f'(x) и сетка на комплексной плоскости вида

z_0 = \left( x_0 + \alpha \dfrac{x_1 - x_0}{N} \right) + i \cdot \left( y_0 + \beta \dfrac{y_1 - y_0}{M} \right), \qquad \alpha = \overline{1, N},\ \beta = \overline{1, M},

где \ i — мнимая единица.

Получим решения уравнения \ f(z) = 0 с помощью итерационного процесса, определяемого формулой:

z_{k+1} = z_k - \dfrac{f(z_k)}{f'(z_k)},

где в качестве начального приближения \ z_0 перебираются всевозможные точки рассмотренной сетки.

1.2.1 Теоретическое обоснование

Пусть \ F(x) — оператор, отображающий линейное нормированное пространство H на линейное нормированное пространство Y. Линейный оператор P, действующий из пространства H в пространство Y, назовём производной оператора F(x) в точке x, если

\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).

Будем обозначать такой оператор P как F′(x).

Пусть \ X — решение уравнения F(X) = 0, \ \Omega_a = \{ x: \| x - X \| \lt a \}. Пусть также при некоторых a \gt 0,\ a_1 \ge 0,\ a_2 \le \infty выполнены условия:

\label{requirement_one} \| (F'(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,
\| F(u_1) - F(u_2) - F'(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.

Обозначим c = a_1 a_2, b = \min \{a, c^{-1}\}.

Метод Ньютона применим на основании следующей теоремы:

Теорема. Если выполнены указанные условия и начальное приближение x_0 принадлежит \Omega_b, то итерационный процесс Ньютона

x_{n + 1} = x_{n} - (F'(x_n))^{-1} F(x_n)

сходится с оценкой погрешности

\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.

Доказательство этой теоремы можно найти в литературе[1].

1.3 Вычислительное ядро алгоритма

Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается N \cdot M раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:

\| z_{n + 1} - z_{n} \| \lt \varepsilon,
| f(z_{n}) | \lt \varepsilon.

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

1.4 Макроструктура алгоритма

Для обеспечения параллелизма сперва исходная сетка разбивается на n по возможности равных участков (например, на полосы длины M) — запускается n процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:

  • 1. вычисляются значения функций \ f(z_k), \ f'(z_k) (предполагается, что функции заданы аналитически);
  • 2. вычисляется следующая точка:
z_{k+1} = z_k - \dfrac{f(z_k)}{f'(z_k)};
  • 3. если условие останова не выполнено, переходим к шагу 1.

Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.

1.5 Схема реализации последовательного алгоритма

Последовательный алгоритм является частным случаем описанного алгоритма при n = 1.

1.6 Последовательная сложность алгоритма

Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции \ f(x) , \ f'(x) заданы аналитически). Проведём исследование для многочленов степени p, каждый из которых определяется вектором из p + 1 коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя iter\_num операций.

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

Для вычисления значения многочлена степени p в точке с помощью тривиального алгоритма необходимо \frac{p(p+1)}{2} + p операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до p:

P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.

В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё p - 1 операцию. Наконец, в каждой итерации производится ровно одно деление.

Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:

p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,

где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.

1.7 Информационный граф

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

Рисунок 1. Граф алгоритма.

При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.

1.8 Ресурс параллелизма алгоритма

1.9 Входные и выходные данные алгоритма

Входные данные:

  • p + 1 действительное число — коэффициенты многочлена.
  • Действительные числа x_0, y_0, x_1, y_1, определяющие левый нижний (x_0, y_0) и правый верхний (x_1, y_1) узлы прямоугольной сетки.
  • Натуральные числа M и N, задающие количество узлов сетки по горизонтали и вертикали
  • Натуральное число iter\_num, равное количеству итераций при каждом запуске метода Ньютона

Выходные данные:

  • список всех найденных комплексных чисел z, удовлетворяющих условию |f(z)| \lt \varepsilon.

1.10 Свойства алгоритма

Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.

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

Очевидно, что алгоритм является детерминированным.

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

2 Программная реализация алгоритма

2.1 Особенности реализации последовательного алгоритма

2.2 Локальность данных и вычислений

2.3 Возможные способы и особенности параллельной реализации алгоритма

2.4 Масштабируемость алгоритма и его реализации

2.5 Динамические характеристики и эффективность реализации алгоритма

2.6 Выводы для классов архитектур

2.7 Существующие реализации алгоритма

3 Литература

<references \>

  1. Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, Численные методы. Издательство «БИНОМ. Лаборатория знаний», 2008.