<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chist</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chist"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Chist"/>
	<updated>2026-10-22T15:52:46Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24965</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24965"/>
		<updated>2017-12-04T08:01:47Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Чистяков И.А., метод Ньютона&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При этом нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1. Каждой зелёной вершине соответствует одна итерация алгоритма (при этом запущено &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; различных процессов), далее все полученные результаты пересылаются в один процесс для последующей обработки и вывода (синяя вершина).&lt;br /&gt;
[[file:Newtone scheme.png|thumb|center|512px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показана зависимость времени работы программы от количества процессоров и степени многочлена (рассматривались уравнения вида &amp;lt;math&amp;gt;z^p - 1 = 0&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results_3d.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, время выполнения пропорционально степени полинома и обратно пропорционально числу процессоров, что согласуется с теоретическими результатами. На рисунке 3 показана зависимость времени работы от числа процессоров при фиксированной степени полинома &amp;lt;math&amp;gt;p = 4&amp;lt;/math&amp;gt;. Можно заметить, что в данном случае полученные результаты достаточно хорошо аппроксимируются функцией &amp;lt;math&amp;gt;y(x) = 50 / x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results.jpg|thumb|center|512px|Рисунок 3. Зависимость от числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Приведённые выше результаты были получены на суперкомпьютере “Ломоносов”.&lt;br /&gt;
Компиляция осуществлялась с помощью команды mpicc библиотеки OpenMPI, версия компилятора — gcc 1.8.4. При этом использовался ключ -std=c99, необходимый для использования описанной в языке Си реализации комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24964</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24964"/>
		<updated>2017-12-04T06:44:57Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Чистяков И.А., метод Ньютона&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При этом нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показана зависимость времени работы программы от количества процессоров и степени многочлена (рассматривались уравнения вида &amp;lt;math&amp;gt;z^p - 1 = 0&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results_3d.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, время выполнения пропорционально степени полинома и обратно пропорционально числу процессоров, что согласуется с теоретическими результатами. На рисунке 3 показана зависимость времени работы от числа процессоров при фиксированной степени полинома &amp;lt;math&amp;gt;p = 4&amp;lt;/math&amp;gt;. Можно заметить, что в данном случае полученные результаты достаточно хорошо аппроксимируются функцией &amp;lt;math&amp;gt;y(x) = 50 / x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results.jpg|thumb|center|512px|Рисунок 3. Зависимость от числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Приведённые выше результаты были получены на суперкомпьютере “Ломоносов”.&lt;br /&gt;
Компиляция осуществлялась с помощью команды mpicc библиотеки OpenMPI, версия компилятора — gcc 1.8.4. При этом использовался ключ -std=c99, необходимый для использования описанной в языке Си реализации комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24152</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24152"/>
		<updated>2017-11-24T17:14:48Z</updated>

		<summary type="html">&lt;p&gt;Chist: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Чистяков И.А., метод Ньютона&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При этом нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показана зависимость времени работы программы от количества процессоров и степени многочлена (рассматривались уравнения вида &amp;lt;math&amp;gt;z^p - 1 = 0&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results_3d.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, время выполнения пропорционально степени полинома и обратно пропорционально числу процессоров, что согласуется с теоретическими результатами. На рисунке 3 показана зависимость времени работы от числа процессоров при фиксированной степени полинома &amp;lt;math&amp;gt;p = 4&amp;lt;/math&amp;gt;. Можно заметить, что в данном случае полученные результаты достаточно хорошо аппроксимируются функцией &amp;lt;math&amp;gt;y(x) = 50 / x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results.jpg|thumb|center|512px|Рисунок 3. Зависимость от числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24151</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24151"/>
		<updated>2017-11-24T17:13:54Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При этом нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показана зависимость времени работы программы от количества процессоров и степени многочлена (рассматривались уравнения вида &amp;lt;math&amp;gt;z^p - 1 = 0&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results_3d.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, время выполнения пропорционально степени полинома и обратно пропорционально числу процессоров, что согласуется с теоретическими результатами. На рисунке 3 показана зависимость времени работы от числа процессоров при фиксированной степени полинома &amp;lt;math&amp;gt;p = 4&amp;lt;/math&amp;gt;. Можно заметить, что в данном случае полученные результаты достаточно хорошо аппроксимируются функцией &amp;lt;math&amp;gt;y(x) = 50 / x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results.jpg|thumb|center|512px|Рисунок 3. Зависимость от числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24069</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24069"/>
		<updated>2017-11-20T12:42:24Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показана зависимость времени работы программы от количества процессоров и степени многочлена (рассматривались уравнения вида &amp;lt;math&amp;gt;z^p - 1 = 0&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results_3d.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, время выполнения пропорционально степени полинома и обратно пропорционально числу процессоров, что согласуется с теоретическими результатами. На рисунке 3 показана зависимость времени работы от числа процессоров при фиксированной степени полинома &amp;lt;math&amp;gt;p = 4&amp;lt;/math&amp;gt;. Можно заметить, что в данном случае полученные результаты достаточно хорошо аппроксимируются функцией &amp;lt;math&amp;gt;y(x) = 50 / x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results.jpg|thumb|center|512px|Рисунок 3. Зависимость от числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24068</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24068"/>
		<updated>2017-11-20T11:35:29Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показана зависимость времени работы программы от количества процессоров и степени многочлена (рассматривались полиномы вида &amp;lt;math&amp;gt;z^p - 1 = 0&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results_3d.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, время выполнения пропорционально степени полинома и обратно пропорционально числу процессоров, что согласуется с теоретическими результатами. На рисунке 3 показана зависимость времени работы от числа процессоров при фиксированной степени полинома &amp;lt;math&amp;gt;p = 4&amp;lt;/math&amp;gt;. Можно заметить, что в данном случае полученные результаты достаточно хорошо аппроксимируются функцией &amp;lt;math&amp;gt;y(x) = 50 / x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scale_results.jpg|thumb|center|512px|Рисунок 3. Зависимость от числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24061</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24061"/>
		<updated>2017-11-20T06:25:14Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм является строго последовательным, однако существует возможность распараллеливания благодаря перебору. Таким образом сложность алгоритма равна &amp;lt;math&amp;gt;O(\frac{N \cdot M}{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показаны результаты работы программы при нахождении корней уравнения &amp;lt;math&amp;gt;z^4 - 1 = 0&amp;lt;/math&amp;gt; на сетке с &amp;lt;math&amp;gt;1024 \times 1024&amp;lt;/math&amp;gt; узлами. Красным отмечено время работы параллельного участка программы (включает в себя время на пересылку данных). Для сравнения синим цветом обозначена функция &amp;lt;math&amp;gt;y(x) = 128 / x&amp;lt;/math&amp;gt;. Из этого можно сделать вывод, что время работы программы обратно пропорционально числу процессоров.&lt;br /&gt;
&lt;br /&gt;
[[file:newton_scale_results.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24059</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24059"/>
		<updated>2017-11-19T22:26:00Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 показаны результаты работы программы при нахождении корней уравнения &amp;lt;math&amp;gt;z^4 - 1 = 0&amp;lt;/math&amp;gt; на сетке с &amp;lt;math&amp;gt;1024 \times 1024&amp;lt;/math&amp;gt; узлами. Красным отмечено время работы параллельного участка программы (включает в себя время на пересылку данных). Для сравнения синим цветом обозначена функция &amp;lt;math&amp;gt;y(x) = 128 / x&amp;lt;/math&amp;gt;. Из этого можно сделать вывод, что время работы программы обратно пропорционально числу процессоров.&lt;br /&gt;
&lt;br /&gt;
[[file:newton_scale_results.jpg|thumb|center|512px|Рисунок 2. Масштабируемость алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24058</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24058"/>
		<updated>2017-11-19T22:14:46Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;. При этом не возникает затрат на пересылку информации о найденных корнях к одному процессу, что позволяет более эффективно работать с памятью.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24057</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24057"/>
		<updated>2017-11-19T22:12:24Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24056</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24056"/>
		<updated>2017-11-19T22:12:08Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации — C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации — C++. Исходный код можно найти в книге &amp;quot;Numerical recipes&amp;quot; &amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics — NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems — Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации — C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации — C, есть интерфейс для Java и Python. Распространяется &amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24055</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24055"/>
		<updated>2017-11-19T22:10:06Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации - C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации - C++. Исходный код можно найти в секции 9.7 книги Numerical recipes(third edition)&amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Numerical Mathematics- NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems -- Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации - C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации - C, есть интерфейс для Java и Python. Распространяется&amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24054</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24054"/>
		<updated>2017-11-19T22:04:12Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*Последовательные реализации&lt;br /&gt;
**ALIAS C++. Язык реализации - C++. Распространяется бесплатно, исходные коды и примеры использования можно скачать на сайте&amp;lt;ref name=&amp;quot;ALIAS&amp;quot;&amp;gt;https://www-sop.inria.fr/coprin/logiciels/ALIAS/ALIAS-C++/ALIAS-C++.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
**Numerical Recipes. Язык реализации - C++. Исходный код можно найти в секции 9.7 книги Numerical recipes(third edition)&amp;lt;ref name=&amp;quot;RECIPES&amp;quot;&amp;gt;http://numerical.recipes&amp;lt;/ref&amp;gt;. Бесплатно доступны&amp;lt;ref name=&amp;quot;RECIPES_old&amp;quot;&amp;gt;http://numerical.recipes/oldverswitcher.html&amp;lt;/ref&amp;gt; предыдущие издания для языков C, Fortran77, Fortran90.&lt;br /&gt;
**Sundials. Язык реализации - C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD. &lt;br /&gt;
**Numerical Mathematics- NewtonLib. Язык реализации - C, Fortran. Исходные коды доступны&amp;lt;ref name=&amp;quot;LIB_book&amp;quot;&amp;gt;http://elib.zib.de/pub/elib/codelib/NewtonLib/index.html&amp;lt;/ref&amp;gt; в качестве приложения к книге&amp;lt;ref name=&amp;quot;LIB&amp;quot;&amp;gt;https://www.amazon.com/Newton-Methods-Nonlinear-Problems-Computational/dp/364223898X/&amp;lt;/ref&amp;gt; Peter Deuflhards &amp;quot;Newton Methods for Nonlinear Problems -- Affine Invariance and Adaptive Algorithms&amp;quot;.&lt;br /&gt;
**PETSc. Язык реализации - C, есть интерфейс для Java и Python. Распространяется&amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD. &lt;br /&gt;
&lt;br /&gt;
*Параллельные реализации&lt;br /&gt;
**Sundials. Язык реализации - C, также есть интерфейс для использования в Fortran-программах. Распространяется&amp;lt;ref name=&amp;quot;SUNDIALS_seq&amp;quot;&amp;gt;http://computation.llnl.gov/projects/sundials/kinsol&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
**PETSc. Язык реализации - C, есть интерфейс для Java и Python. Распространяется&amp;lt;ref name =  PETSC&amp;gt;https://www.mcs.anl.gov/petsc/&amp;lt;/ref&amp;gt; по лицензии BSD.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24053</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24053"/>
		<updated>2017-11-19T21:41:24Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24052</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24052"/>
		<updated>2017-11-19T21:41:12Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Журнал вычислительной математики и математической физики, 2009, том 49, №8б с. 1369—1384, &amp;quot;Параллельная реализация метода Ньютона для решения больших задач линейного программирования&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24051</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24051"/>
		<updated>2017-11-19T21:40:43Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Журнал вычислительной математики и математической физики, 2009, том 49, №8б с. 1369—1384, &amp;quot;Параллельная реализация метода Ньютона для решения больших задач линейного программирования&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24050</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24050"/>
		<updated>2017-11-19T21:35:27Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков. Идеи параллелизма можно также применять при вычислении значения многочлена в точке, однако это становится нерациональным при использовании схемы Горнера. Стоит отметить, что, за исключением перебора по сетке, в алгоритме нет каких-либо циклов.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24049</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24049"/>
		<updated>2017-11-19T21:30:58Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основная идея параллелизма заключается в разбиении сетки на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; участков.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24036</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=24036"/>
		<updated>2017-11-19T13:45:48Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;) — запускается &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессов. В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
Поскольку полученные в каждом процессе результаты необходимо обработать (проверить, являются ли полученные числа корнями; также желательно оставить только уникальные решения), нужно переслать полученные данные в какой-то один процесс. Проверку корней можно осуществлять на том процессоре, где они были получены, но это вызовет дополнительные сложности при работе с памятью во время последующей пересылки.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для определения сложности алгоритма, необходимо выбрать класс функций, для которого будет написана программа (предполагается, что функции &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; заданы аналитически).&lt;br /&gt;
Проведём исследование для многочленов степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, каждый из которых определяется вектором из &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; коэффициентов. Пусть выбран критерий останова, при котором каждое использование метода Ньютона включает в себя &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Основную вычислительную сложность представляют собой операции умножения и деления комплексных чисел с плавающей точкой, будем считать их суммарное количество. Однако, необходимо помнить, что операции над комплексными числами требуют больше ресурсов, чем операции над действительными числами.&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения многочлена степени &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; в точке с помощью тривиального алгоритма необходимо &amp;lt;math&amp;gt;\frac{p(p+1)}{2} + p&amp;lt;/math&amp;gt; операций умножения. Воспользовавшись схемой Горнера, можно сократить число умножений до &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
P(x) = ( \ldots (a_p x + a_{p-1}) x + a_{p-2})x + \ldots + a_1)x + a_0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В каждой итерации метода нужно вычислить не только значение многочлена в точке, но и значение его производной в этой точке. Это добавляет ещё &amp;lt;math&amp;gt;p - 1&amp;lt;/math&amp;gt; операцию. Наконец, в каждой итерации производится ровно одно деление.&lt;br /&gt;
&lt;br /&gt;
Учитывая количество узлов сетки и заданное количество итераций, получим общее число операций умножения деления:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p + N \cdot M \cdot iter\_num \cdot (p + (p - 1) + 1) = p + 2 \cdot N \cdot M \cdot iter\_num \cdot p,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где первое слагаемое соответствует числу операций для вычисления коэффициентов производной многочлена.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Пересылка данных происходит от каждого процесса к первому. При этом в первом процессе так же происходят вычисления, поэтому может возникнуть задержка при пересылке данных, если вычисления в первом процессе ещё не завершены. Однако выделять под обработку пересланных данных отдельный процесс нерационально: в таком случае на нём будет застой во время вычислений на всех остальных процессах.&lt;br /&gt;
&lt;br /&gt;
[[file:Newton_scheme.png|thumb|center|512px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
При этом первый процесс не пересылает свои данные к себе (в привычном понимании пересылки), а просто сохраняет полученные результаты в отдельный массив.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt; действительное число — коэффициенты многочлена.&lt;br /&gt;
* Действительные числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt;, определяющие левый нижний &amp;lt;math&amp;gt;(x_0, y_0)&amp;lt;/math&amp;gt; и правый верхний &amp;lt;math&amp;gt;(x_1, y_1)&amp;lt;/math&amp;gt; узлы прямоугольной сетки. &lt;br /&gt;
* Натуральные числа &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, задающие количество узлов сетки по горизонтали и вертикали&lt;br /&gt;
* Натуральное число &amp;lt;math&amp;gt;iter\_num&amp;lt;/math&amp;gt;, равное количеству итераций при каждом запуске метода Ньютона&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* список всех найденных комплексных чисел &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, удовлетворяющих условию &amp;lt;math&amp;gt;|f(z)| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как хорошо видно, соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, так же является линейной.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
Как уже было замечено, могут возникнуть задержки в связи с пересылкой данных от каждого процесса к первому. Это связано не только с тем, что в первом процессе так же происходят вычисления, но и с тем, что несколько процессов могут отправить запросы на пересылку одновременно. В результате может возникнуть неоптимальное использование мощностей.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23308</id>
		<title>Участник:Chist/Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Chist/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23308"/>
		<updated>2017-10-22T16:44:24Z</updated>

		<summary type="html">&lt;p&gt;Chist: Новая страница: « == Свойства и структура алгоритма ==  === Общее описание алгоритма ===  Метод Ньютона, алгори…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;). В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23303</id>
		<title>Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23303"/>
		<updated>2017-10-22T16:34:19Z</updated>

		<summary type="html">&lt;p&gt;Chist: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;). В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм является частным случаем описанного алгоритма при &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23297</id>
		<title>Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23297"/>
		<updated>2017-10-22T16:29:21Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность алгоритма представляют операции вычисления значения функций в заданной точке, а так же операции вычитания и деления. При этом итерационный процесс запускается &amp;lt;math&amp;gt;N \cdot M&amp;lt;/math&amp;gt; раз, а количество итераций в каждом процессе, вообще говоря, не определено; наиболее популярными условиями останова являются следующие:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| z_{n + 1} - z_{n} \| &amp;lt; \varepsilon,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
| f(z_{n}) | &amp;lt; \varepsilon.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Однако, для верхней оценки числа операций удобно зафиксировать число итераций в каждом процессе. Это так же позволит завершить вычисления в случае, если итерационный процесс не сходится.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для обеспечения параллелизма сперва исходная сетка разбивается на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по возможности равных участков (например, на полосы длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;). В каждом участке последовательно запускаются итерационные процессы для каждого узла сетки, в ходе которых:&lt;br /&gt;
*1. вычисляются значения функций &amp;lt;math&amp;gt;\ f(z_k)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ f&#039;(z_k)&amp;lt;/math&amp;gt; (предполагается, что функции заданы аналитически);&lt;br /&gt;
*2. вычисляется следующая точка:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. если условие останова не выполнено, переходим к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23269</id>
		<title>Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23269"/>
		<updated>2017-10-22T15:23:35Z</updated>

		<summary type="html">&lt;p&gt;Chist: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
Поскольку функция может иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана некоторая функция &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt;, её производная &amp;lt;math&amp;gt;\ f&#039;(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23120</id>
		<title>Метод Ньютона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23120"/>
		<updated>2017-10-21T11:42:11Z</updated>

		<summary type="html">&lt;p&gt;Chist: Новая страница: « == Свойства и структура алгоритма ==  === Общее описание алгоритма ===  Метод Ньютона, алгори…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (1643—1727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить нуль первой производной либо градиента в случае многомерного пространства.&lt;br /&gt;
&lt;br /&gt;
В данной статье мы будем рассматривать только функции-многочлены. Поскольку они могут иметь несколько корней, чтобы попытаться найти их все, необходимо провести перебор начальных приближений. При нас интересуют не только действительные корни, но и комплексные, будет производить перебор по некоторой сетке на комплексной плоскости.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задан некоторый многочлен &amp;lt;math&amp;gt;\ f(x) &amp;lt;/math&amp;gt; и сетка на комплексной плоскости вида&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
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},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\ i &amp;lt;/math&amp;gt; — мнимая единица.&lt;br /&gt;
&lt;br /&gt;
Получим решения уравнения &amp;lt;math&amp;gt;\ f(z) = 0 &amp;lt;/math&amp;gt; с помощью итерационного процесса, определяемого формулой:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
z_{k+1} = z_k - \dfrac{f(z_k)}{f&#039;(z_k)},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где в качестве начального приближения &amp;lt;math&amp;gt;\ z_0&amp;lt;/math&amp;gt; перебираются всевозможные точки рассмотренной сетки.&lt;br /&gt;
&lt;br /&gt;
==== Теоретическое обоснование ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ F(x)&amp;lt;/math&amp;gt; — оператор, отображающий линейное нормированное пространство &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; на линейное нормированное пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Линейный оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, действующий из пространства &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в пространство &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; назовём производной оператора &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(x + \eta) − F(x) − P\eta \|_Y = o(\| \eta \|_H).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать такой оператор &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;F′(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\ X&amp;lt;/math&amp;gt; — решение уравнения &amp;lt;math&amp;gt;F(X) = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\ \Omega_a = \{ x: \| x - X \| &amp;lt; a \}&amp;lt;/math&amp;gt;. Пусть также при некоторых &amp;lt;math&amp;gt;a &amp;gt; 0,\ a_1 \ge 0,\ a_2 \le \infty&amp;lt;/math&amp;gt; выполнены условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\label{requirement_one}&lt;br /&gt;
 \| (F&#039;(X))^{-1} \|_{Y} \le a_1 \text{ при } x \in \Omega_a,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| F(u_1) - F(u_2) - F&#039;(u_2)(u_1 - u_2) \|_{Y} \le a_2 \|u_2 - u_1 \|_{H}^{2} \text{ при } u_1, u_2 \in \Omega_a.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;c = a_1 a_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = \min \{a, c^{-1}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод Ньютона применим на основании следующей теоремы:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Теорема.&#039;&#039;&#039;&lt;br /&gt;
Если выполнены указанные условия и начальное приближение &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; принадлежит &amp;lt;math&amp;gt;\Omega_b&amp;lt;/math&amp;gt;, то итерационный процесс Ньютона&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_{n + 1} = x_{n} - (F&#039;(x_n))^{-1} F(x_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
сходится с оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\| x_n - X \|_{H} \le c^{-1} \left( c \| x_0 - X \|_{H} \right)^{2^n}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательство этой теоремы можно найти в литературе&amp;lt;ref&amp;gt;Н.С. Бахвалов, Н.П. Жидков, Г.М. Кобельков, &#039;&#039;Численные методы&#039;&#039;. Издательство «БИНОМ. Лаборатория знаний», 2008.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chist</name></author>
	</entry>
</feed>