<?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=Anlesnichiy</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=Anlesnichiy"/>
	<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/Anlesnichiy"/>
	<updated>2026-10-22T23:25:57Z</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=14582</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=14582"/>
		<updated>2016-10-28T19:21:19Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]](1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]](1.1,1.7,1.10,2.4,2.7)&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения.&amp;lt;br&amp;gt;&lt;br /&gt;
Основная идея алгоритмов Рунге - Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то, применяя различные численные формулы для расчёта интеграла в правой части уравнения, можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши, где правая часть удовлетворяет условиям теорем существования и единственности решения.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4-го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i. Иными словами сам алгоритм совпадает со своим ядром и был описан в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру алгоритма составляют вычисления коэффициентов &amp;lt;math&amp;gt;k_{j},\,j=1,..,4&amp;lt;/math&amp;gt; при нахождении значений искомой функции в каждом узле.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений. Граф имеет трёхмерную структуру, которая представляет собой связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – n, где n – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление одной координаты функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции является одна координата вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. Эти вершины также можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  m вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3mn&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа (рис. 1). Для того чтобы сильно не загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные задачи подаются на все вершины первого типа, а также на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; левых вершин второй группы второго типа и на все вершины первой группы второго типа на первом уровне подаются начальные значения искомой функции (см. пункт [[#HРесурс параллелизма алгоритма|1.8]]). Выходными данными будут результаты срабатывания &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; правых вершин второй группы второго типа на каждом уровне. Результаты срабатывания остальных вершин являются промежуточными данными алгоритма.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Рисунок 1. Информационный граф для системы из двух дифференциальных уравнений.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку данных между другими ПЭ, что довольно сильно замедляет выполнение алгоритма и является накладными расходами при распараллеливании алгоритма.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивости см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;  число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элементов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и, в свою очередь, замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество операций алгоритма равно &amp;lt;math&amp;gt; n(m-1) &amp;lt;/math&amp;gt; при этом совокупность входных и выходных параметров равняется &amp;lt;math&amp;gt; mn + n  + m +4 &amp;lt;/math&amp;gt;. Это означает, что [[глоссарий#Вычислительная мощность|вычислительная мощность]] алгоритма стремиться к 1 при увеличении размерности задачи. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Раздел не закончен.&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод 4-го порядка является самым часто используемым из всех схем Рунге - Кутты, поэтому существует множество его программных последовательных реализаций как коммерческих, так и бесплатных. Одной из самых известных программных реализаций является ode45 в среде MATLAB, у которой имеется большое количество возможностей для настройки численного расчёта, что делает её достаточно удобной для использования. Также метод Рунге - Кутты 4-го порядка реализован в параллельной библиотеке PETSc, которая является свободно распространяемой. Несмотря на то, что в этой библиотеки большинство методов реализовано с использованием параллельных алгоритмов, метод Рунге - Кутта в ней реализован последовательным. Довольно трудно найти параллельную реализацию метода в случае рассмотрения общей задачи Коши, но существует множество научных работ, в которых описываются параллельные реализации метода Рунге - Кутты для конкретных классов систем, например, в [1] описывается параллельная реализация для линейных систем.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100 с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=13807</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=13807"/>
		<updated>2016-10-25T20:24:16Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]](1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]](1.1,1.7,1.10,2.4,2.7)&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения.&amp;lt;br&amp;gt;&lt;br /&gt;
Основная идея алгоритмов Рунге - Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то, применяя различные численные формулы для расчёта интеграла в правой части уравнения, можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши, где правая часть удовлетворяет условиям теорем существования и единственности решения.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4-го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i. Иными словами сам алгоритм совпадает со своим ядром и был описан в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру алгоритма составляют вычисления коэффициентов &amp;lt;math&amp;gt;k_{j},\,j=1,..,4&amp;lt;/math&amp;gt; при нахождении значений искомой функции в каждом узле.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений. Граф имеет трёхмерную структуру, которая представляет собой связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – n, где n – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление одной координаты функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции является одна координата вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. Эти вершины также можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  m вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3mn&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа (рис. 1). Для того чтобы сильно не загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные задачи подаются на все вершины первого типа, а также на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; левых вершин второй группы второго типа и на все вершины первой группы второго типа на первом уровне подаются начальные значения искомой функции (см. пункт [[#HРесурс параллелизма алгоритма|1.8]]). Выходными данными будут результаты срабатывания &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; правых вершин второй группы второго типа на каждом уровне. Результаты срабатывания остальных вершин являются промежуточными данными алгоритма.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Рисунок 1. Информационный граф для системы из двух дифференциальных уравнений.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку данных между другими ПЭ, что довольно сильно замедляет выполнение алгоритма и является накладными расходами при распараллеливании алгоритма.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивости см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;  число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элементов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и, в свою очередь, замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество операций алгоритма равно &amp;lt;math&amp;gt; n(m-1) &amp;lt;/math&amp;gt; при этом совокупность входных и выходных параметров равняется &amp;lt;math&amp;gt; mn + n  + m +4 &amp;lt;/math&amp;gt;. Это означает, что [[глоссарий#Вычислительная мощность|вычислительная мощность]] алгоритма стремиться к 1 при увеличении размерности задачи. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Раздел не закончен.&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод 4-го порядка является самым часто используемым из всех схем Рунге - Кутты, поэтому существует множество его программных последовательных реализаций как коммерческих, так и бесплатных. Одной из самых известных программных реализаций является ode45 в среде MATLAB, у которой имеется большое количество возможностей для настройки численного расчёта, что делает её достаточно удобной для использования. Также метод Рунге - Кутты 4-го порядка реализован в параллельной библиотеке PETSc, которая является свободно распространяемой. Несмотря на то, что в этой библиотеки большинство методов реализовано с использованием параллельных алгоритмов, метод Рунге - Кутта в ней реализован последовательным. Довольно трудно найти параллельную реализацию метода в случае рассмотрения общей задачи Коши, но существует множество научных работ, в которых описываются параллельные реализации метода Рунге - Кутты для конкретных классов систем, например, в [1] описывается параллельная реализация для линейных систем.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100 с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Anlesnichiy&amp;diff=13804</id>
		<title>Обсуждение участника:Anlesnichiy</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Anlesnichiy&amp;diff=13804"/>
		<updated>2016-10-25T20:02:16Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* П. 1.7 - рисунок не пронумерован, нет ссылки на него.&lt;br /&gt;
  Пронумеровали рисунок, в тексте сделали ссылку на него. Рисунок мы рисовали сами.&lt;br /&gt;
* П. 1.10 - не указана вычислительная мощность алгоритма.&lt;br /&gt;
  В П.10 добавлен пункт про вычислительную мощность алгоритма&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Anlesnichiy&amp;diff=13803</id>
		<title>Обсуждение участника:Anlesnichiy</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Anlesnichiy&amp;diff=13803"/>
		<updated>2016-10-25T20:02:00Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* П. 1.7 - рисунок не пронумерован, нет ссылки на него.&lt;br /&gt;
  Пронумеровали рисунок, в тексте сделали ссылку на него. Рисунок мы рисовали сами.&lt;br /&gt;
* П. 1.10 - не указана вычислительная мощность алгоритма.&lt;br /&gt;
  В П.10 добавлен пункт про вычислительную сложность алгоритма&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=13802</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=13802"/>
		<updated>2016-10-25T20:01:14Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]](1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]](1.1,1.7,1.10,2.4,2.7)&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения.&amp;lt;br&amp;gt;&lt;br /&gt;
Основная идея алгоритмов Рунге - Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то, применяя различные численные формулы для расчёта интеграла в правой части уравнения, можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши, где правая часть удовлетворяет условиям теорем существования и единственности решения.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4-го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i. Иными словами сам алгоритм совпадает со своим ядром и был описан в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру алгоритма составляют вычисления коэффициентов &amp;lt;math&amp;gt;k_{j},\,j=1,..,4&amp;lt;/math&amp;gt; при нахождении значений искомой функции в каждом узле.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений. Граф имеет трёхмерную структуру, которая представляет собой связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – n, где n – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление одной координаты функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции является одна координата вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. Эти вершины также можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  m вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3mn&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4m&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа (рис. 1). Для того чтобы сильно не загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные задачи подаются на все вершины первого типа, а также на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; левых вершин второй группы второго типа и на все вершины первой группы второго типа на первом уровне подаются начальные значения искомой функции (см. пункт [[#HРесурс параллелизма алгоритма|1.8]]). Выходными данными будут результаты срабатывания &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; правых вершин второй группы второго типа на каждом уровне. Результаты срабатывания остальных вершин являются промежуточными данными алгоритма.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Рисунок 1. Информационный граф для системы из двух дифференциальных уравнений.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку данных между другими ПЭ, что довольно сильно замедляет выполнение алгоритма и является накладными расходами при распараллеливании алгоритма.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивости см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;  число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элементов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и, в свою очередь, замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество операций алгоритма равно &amp;lt;math&amp;gt; n(m-1) &amp;lt;/math&amp;gt; при этом совокупность входных и выходных параметров равняется &amp;lt;math&amp;gt; mn + n  + m +4 &amp;lt;/math&amp;gt;. Это означает, что [глоссарий#Вычислительная мощность|вычислительная мощность]] алгоритма стремиться к 1 при увеличении размерности задачи. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Раздел не закончен.&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод 4-го порядка является самым часто используемым из всех схем Рунге - Кутты, поэтому существует множество его программных последовательных реализаций как коммерческих, так и бесплатных. Одной из самых известных программных реализаций является ode45 в среде MATLAB, у которой имеется большое количество возможностей для настройки численного расчёта, что делает её достаточно удобной для использования. Также метод Рунге - Кутты 4-го порядка реализован в параллельной библиотеке PETSc, которая является свободно распространяемой. Несмотря на то, что в этой библиотеки большинство методов реализовано с использованием параллельных алгоритмов, метод Рунге - Кутта в ней реализован последовательным. Довольно трудно найти параллельную реализацию метода в случае рассмотрения общей задачи Коши, но существует множество научных работ, в которых описываются параллельные реализации метода Рунге - Кутты для конкретных классов систем, например, в [1] описывается параллельная реализация для линейных систем.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100 с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6786</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6786"/>
		<updated>2016-10-13T19:10:05Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i. Иными словами сам алгоритм совпадает со своим ядром и был описан в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – mc, где mc – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3pmc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;  число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6766</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6766"/>
		<updated>2016-10-13T19:01:34Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: Пересчитана ширина алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – mc, где mc – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3pmc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;  число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6765</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6765"/>
		<updated>2016-10-13T19:01:02Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – mc, где mc – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3pmc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;  число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6763</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6763"/>
		<updated>2016-10-13T19:00:29Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – mc, где mc – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3pmc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число, а так же р-1 пересылку.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – O(m) (при условии, что &amp;lt;math&amp;gt; p = m &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6758</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6758"/>
		<updated>2016-10-13T18:53:52Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней – mc, где mc – количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + bc&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;3pmc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4p&amp;lt;/math&amp;gt;, а их общее количество – &amp;lt;math&amp;gt;4pmc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – 16.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6750</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6750"/>
		<updated>2016-10-13T18:45:34Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_i \rightarrow \bar y_i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
k_l \rightarrow \bar k_l&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar k_l = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
	k^i_{l,1}\\&lt;br /&gt;
	\vdots\\&lt;br /&gt;
	k^i_{l,m}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы, &amp;lt;math&amp;gt; l = 1, \dots, 4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из n одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m = n/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней - nc, где nc - количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + b*c&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;3*p*nc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – 16.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6736</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6736"/>
		<updated>2016-10-13T18:38:34Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из n одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m = n/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней - nc, где nc - количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + b*c&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;3*p*nc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – 16.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; – расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6734</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6734"/>
		<updated>2016-10-13T18:38:10Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из n одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m = n/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней - nc, где nc - количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + b*c&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;3*p*nc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – 16.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге-Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6733</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6733"/>
		<updated>2016-10-13T18:37:47Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из n одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m = n/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней - nc, где nc - количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + b*c&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;3*p*nc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – 16.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге - Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6731</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=6731"/>
		<updated>2016-10-13T18:36:48Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]], [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&lt;br /&gt;
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Основная идея алгоритмов Рунге - &lt;br /&gt;
Кутты состоит в замене правой части дифференциального уравнения, зависящей от искомой неизвестной функции, некоторым приближением. Если задачу Коши переписать в интегральном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y(x) = y_{0} + \int\limits_{x_{0}}^{x}f(t,y)dt,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
то применяя различные численные формулы для расчёта интеграла в правой части уравнения можно получить методы Рунге - Кутты различных порядков.&lt;br /&gt;
&lt;br /&gt;
Общий вид формул методов Рунге - Кутты с шагом сетки &amp;lt;math&amp;gt;h_{n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y = f(t,y),\,\,\,    y(t_{0}) = y_{0},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{n+1} = y_{n} + h_{n+1}\sum\limits_{i=1}^{s}b_{i}K_{n}^{i},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
K_{n}^{i} = f(t_{n} + c_{i}h_{n+1}, y_{n} + h_{n+1}\sum\limits_{j=1}^{i-1}a_{ij}K_{n}^{j}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Конкретный метод Рунге - Кутты определяется набором коэффициентов &amp;lt;math&amp;gt;b_{i}, c_{j}, a_{ij}&amp;lt;/math&amp;gt;, которые должны удовлетворять определённым соотношениям.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для ДУ первого порядка ====&lt;br /&gt;
Рассмотрим задачу Коши&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты 4-го порядка для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным яром алгоритма можно считать вычисление значение вектора &amp;lt;math&amp;gt; \bar y_i &amp;lt;/math&amp;gt;, то есть вычислительным ядром является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Приведем возможную реализацию последовательного алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 function [x, y] = RungeKutta4(y0, a, b, n)&lt;br /&gt;
     h = (b-a)/n;&lt;br /&gt;
     x = a : h : b&lt;br /&gt;
&lt;br /&gt;
     y(:, 1) = y0;&lt;br /&gt;
     for i = 2 : n&lt;br /&gt;
         k1        = h*func(x(i), y(:, i))&lt;br /&gt;
         k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
         k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
         k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
         y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма аналитически и графически.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть задана система из n одномерных дифференциальных уравнений и вычислительная система с p процессорными элементами. При этом &amp;lt;math&amp;gt;m = n/p&amp;lt;/math&amp;gt; - целое число (если это не так, то на одном процессорном элементе будет вычисляться отличное от других элементов количество координат вектора решения системы). Граф имеет трёхмерную структуру, которая представляет собой, связанные между собой ограниченные плоскости (уровни). На каждом i-ом уровне вычисляется i-ое приближение вектора решения системы. Всего таких уровней - nc, где nc - количество узлов, в которых вычисляется приближённое решение системы дифференциальных уравнений. Выходные данные i-го уровня являются входными данными для i+1-го уровня.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины информационного графа делятся на два типа:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Первому типу вершин соответствует вычисление m координат функции, стоящей в правой части дифференциального уравнения, в точках, подаваемых на вход вершине. Результатом выполнения операции являются m координат вектора &amp;lt;math&amp;gt;k_{l},\,\,\,l = 1,2,3,4&amp;lt;/math&amp;gt;. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Второму типу вершин соответствует операция &amp;lt;math&amp;gt;a + b*c&amp;lt;/math&amp;gt;. В свою очередь эти вершины можно разделить на две группы. В вершинах первой группы вычисляются выражения, результат которых будет подаваться в качестве аргументов для вершин первого типа, при этом входными данными для этих вершин будут результаты срабатывания  p вершин первого типа, расположенных на одном уровне. На каждом уровне вершин первой группы будет &amp;lt;math&amp;gt;3*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;3*p*nc&amp;lt;/math&amp;gt;. Входными данными для вершин второй группы будет результат срабатывания одной вершины первого типа и одной вершины такой же вершины второго типа. Результатом срабатывания данной вершины на i-ом уровне будут m координат вектора i-го приближения решения системы. На каждом уровне таких вершин будет &amp;lt;math&amp;gt;4*p&amp;lt;/math&amp;gt;, а их общее количество - &amp;lt;math&amp;gt;4*p*nc&amp;lt;/math&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведём графическую иллюстрацию информационного графа. Для того, чтобы несильно загромождать граф, рассмотрим случай системы из двух дифференциальных уравнений и вычислительную систему из двух процессорных элементов. Красным цветом обозначены вершины первого типа, зелёным - вершины второго типа. Входные данные подаются на вход всех вершин, кроме второй группы вершин второго типа.&lt;br /&gt;
[[Файл:Graf_2_rk.jpg|500px|thumb|center|Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что данный алгоритм обладает конечным параллелизмом, но не массовым, так как циклы алгоритма являются информационно зависимыми.&lt;br /&gt;
&lt;br /&gt;
На каждом ярусе в данном алгоритме каждый ПЭ производит четыре операции вычисления правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число.&lt;br /&gt;
При этом количество итераций цикла равно длине вектора &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
Из вышеуказанного следует, что при классификации по высоте [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] алгоритм имеет сложность &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ – 16.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Перечислим основные свойства алгоритма:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Точность. Как следует из названия, у метода Рунге - Кутты 4-го порядка ошибка на конечно интервале интегрирования имеет порядок &amp;lt;math&amp;gt;\mathcal{O}(h^{4})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - расстояние между узлами, в которых вычисляется искомая функция.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Устойчивость. Метод имеет интервал абсолютной устойчивости &amp;lt;math&amp;gt;(-2.78; 0)&amp;lt;/math&amp;gt;. (Определение понятия интервала абсолютной устойчивочти см. [2])&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение числа расчётов функции, стоящей в правой части задачи Коши, при последовательном алгоритме к числу расчётов при параллельном равняется &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число, используемых процессорных элементов. То есть при увеличении числа используемых процессорных элемнтов скорость расчётов увеличивается, но стоит учитывать, что число пересылок данных между процессами при этом резко увеличивается также и в свою очередь замедляет работу программы.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если известен класс функций, которые могут стоять в правой части задачи Коши, то алгоритм можно эффективно модифицировать, чтобы избавиться от лишних пересылок данных.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
Минимальная эффективность реализации 0.00032%;&lt;br /&gt;
&lt;br /&gt;
Максимальная эффективность реализации 0.54%;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Perf_rk.jpg|500px|thumb|center|Изменение производительности параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
[[Файл:Eff_rk.jpg|500px|thumb|center|Эффекивность работы параллельного алгоритма в зависимости от размерности системы]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости метода Рунге - Кутты 4-го порядка: &lt;br /&gt;
&lt;br /&gt;
1. По числу процессоров -0.0000417;&lt;br /&gt;
&lt;br /&gt;
2. По размеру задачи  0.00000526;&lt;br /&gt;
 &lt;br /&gt;
3. По двум направлениям -0.000000027;&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
MATLAB, PETsc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
[2] А. Ф. Заусаев. Разностные методы решения обыкновенных дифференциальных уравнений. Учебное пособие. Самарский гос. техн. ун-т, 2010 - 100с.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=5418</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=5418"/>
		<updated>2016-10-11T18:49:51Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 for i = 1 : n&lt;br /&gt;
     k1        = h*func(x(i), y(:, i))&lt;br /&gt;
     k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
     k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
     k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
     y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4538</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4538"/>
		<updated>2016-10-05T16:12:22Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
Приведем пример кода на С:&lt;br /&gt;
Реализация алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 for i = 1 : n&lt;br /&gt;
     k1        = h*func(x(i), y(:, i))&lt;br /&gt;
     k2        = h*func(x(i) + h/2, y(:, i) + k1/2)&lt;br /&gt;
     k3        = h*func(x(i) + h/2, y(:, i) + k2/2)&lt;br /&gt;
     k4        = h*func(x(i) + h, y(:, i) + k3)&lt;br /&gt;
     y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4537</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4537"/>
		<updated>2016-10-05T16:12:09Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
Приведем пример кода на С:&lt;br /&gt;
Реализация алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 for i = 1 : n&lt;br /&gt;
     k1        = h*func(x(i), y(:, i))\\&lt;br /&gt;
     k2        = h*func(x(i) + h/2, y(:, i) + k1/2)\\&lt;br /&gt;
     k3        = h*func(x(i) + h/2, y(:, i) + k2/2)\\&lt;br /&gt;
     k4        = h*func(x(i) + h, y(:, i) + k3)\\&lt;br /&gt;
     y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4536</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4536"/>
		<updated>2016-10-05T16:11:53Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: Дописан пункт 1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
Приведем пример кода на С:&lt;br /&gt;
Реализация алгоритма на языке Matlab (правая часть ОДУ задана в виде функции func(x,y))&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 for i = 1 : n&lt;br /&gt;
     k1         = h*func(x(i), y(:, i))\\&lt;br /&gt;
     k2         = h*func(x(i) + h/2, y(:, i) + k1/2)\\&lt;br /&gt;
     k3         = h*func(x(i) + h/2, y(:, i) + k2/2)\\&lt;br /&gt;
     k4         = h*func(x(i) + h, y(:, i) + k3)\\&lt;br /&gt;
     y(:, i+1) = y(:, i) + (k1 + 2*k2 + 2*k3 + k4)/6 &lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанного в пункте [[#Вычислительное ядро алгоритма|1.3]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4489</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4489"/>
		<updated>2016-10-03T13:03:23Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; 4mn &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4488</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4488"/>
		<updated>2016-10-03T13:02:45Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: Внес значение размера входных/выходных данных&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; (m+1)n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4487</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4487"/>
		<updated>2016-10-03T13:01:37Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &amp;lt;/math&amp;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; \bar y_i &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; \bar x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер выходных данных: &amp;lt;math&amp;gt; (m+1)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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4486</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4486"/>
		<updated>2016-10-03T12:58:33Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;&lt;br /&gt;
# границы временного интервала &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt;&lt;br /&gt;
# частота дискретизации &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всего размер входных данных: &amp;lt;math&amp;gt; m + 3 &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;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4485</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4485"/>
		<updated>2016-10-03T12:55:21Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&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; y^0 &amp;lt;/math&amp;gt; размерности m&lt;br /&gt;
# границы временного интервала a и b&lt;br /&gt;
# частота дискретизации n&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4484</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4484"/>
		<updated>2016-10-03T12:53:06Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + \bar k_1/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + \bar k_2/2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4483</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4483"/>
		<updated>2016-10-03T12:46:13Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + [ k_1 + 2k_2 + 2k_3 + k_4 ]/6 \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4482</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4482"/>
		<updated>2016-10-03T12:46:00Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ]/6 \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4481</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4481"/>
		<updated>2016-10-03T12:45:08Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_{i+1} = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4480</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4480"/>
		<updated>2016-10-03T12:44:00Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Каждый шаг цикла алгоритма состоит из 4 обращений к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt;, 11 умножений и 10 сложений. Так как обращение к функции &amp;lt;math&amp;gt; \bar f &amp;lt;/math&amp;gt; является наиболее сложной операцией, то сложность линейного выполнения алгоритма можно определить как &amp;lt;math&amp;gt; 4mn &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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4479</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4479"/>
		<updated>2016-10-03T12:43:10Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; m/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4478</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4478"/>
		<updated>2016-10-03T12:35:05Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является цикл по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4477</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4477"/>
		<updated>2016-10-03T12:34:54Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]].&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4476</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4476"/>
		<updated>2016-10-03T12:32:43Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4475</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4475"/>
		<updated>2016-10-03T12:32:23Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + k_1/2)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + k_2/2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4474</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4474"/>
		<updated>2016-10-03T12:31:47Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 [ k_1 + 2k_2 + 2k_3 + k_4 ] \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4473</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4473"/>
		<updated>2016-10-03T12:31:23Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + ih,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = hf(x_i,y_i)\\&lt;br /&gt;
	 k_2    = hf(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = hf(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = hf(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4472</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4472"/>
		<updated>2016-10-03T12:25:57Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m – размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4471</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4471"/>
		<updated>2016-10-03T12:25:29Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m - размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4470</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4470"/>
		<updated>2016-10-03T12:24:39Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m -- размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_{i+1} = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4469</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4469"/>
		<updated>2016-10-03T12:17:30Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m -- размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_i+1 = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктурой алгоритма является одна итерация цикла по i, описанный в пункте [[#Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка|1.2.2]]&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;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4468</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4468"/>
		<updated>2016-10-03T12:06:10Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m -- размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_i+1 = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&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;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4467</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4467"/>
		<updated>2016-10-03T12:04:47Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: Добавлена структура&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m -- размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_i+1 = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&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;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4438</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4438"/>
		<updated>2016-10-01T20:12:55Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: Добавлен раздел &amp;quot;Ресурс параллелизма алгоритма&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Ресурс параллелизма алгоритма|1.3]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m -- размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_i+1 = \bar y_i + 1/6 [ \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 ] \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &amp;lt;math&amp;gt;k_i ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;, то основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
Здесь будет применяться подход декомпозиции уравнений системы ОДУ на подсистемы.&lt;br /&gt;
Поэтому для инициализации рассмотрим следующую схему декомпозиции данных по имеющимся процессорным элементам с локальной памятью: на каждый &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;- ПЭ (процессорный элемент) (&amp;lt;math&amp;gt;\mu = 0, \dots, p-1 &amp;lt;/math&amp;gt;) распределяется &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; дифференциальных уравнений и вектор &amp;lt;math&amp;gt; \bar y_0 &amp;lt;/math&amp;gt;. Далее расчеты производятся по следующей схеме:&lt;br /&gt;
# на каждом ПЭ одновременно вычисляются &amp;lt;math&amp;gt; n/p &amp;lt;/math&amp;gt; соответствующих компонент вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_1 ]_{\mu} = h[ \bar f(x_i, \bar y_i) ]_{\mu} &amp;lt;/math&amp;gt;&lt;br /&gt;
# для обеспечения второго расчетного этапа необходимо провести сборку вектора &amp;lt;math&amp;gt; \bar k_1 &amp;lt;/math&amp;gt; целиком на каждом ПЭ. Затем независимо выполняется вычисление компонент вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt; [ \bar k_2 ]_{\mu} = h[ \bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_2 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_3:\ [ \bar k_3 ]_{\mu} = h [\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# проводится сборка вектора &amp;lt;math&amp;gt; \bar k_3 &amp;lt;/math&amp;gt; на каждом ПЭ, вычисляются компоненты вектора &amp;lt;math&amp;gt; \bar k_4:\ [ \bar k_4 ]_{\mu} = h [\bar f(x_i + h,\bar y_i + \bar k_3)]_{\mu} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# рассчитываются с идеальным параллелизмом компоненты вектора &amp;lt;math&amp;gt; \bar y_{i+1}:\ [\bar y_{i+1}]_{\mu} = [\bar y_{i}]_{\mu} + ([ \bar k_1 ]_{\mu} + 2[ \bar k_2 ]_{\mu} + 2[ \bar k_3 ]_{\mu} + [ \bar k_4 ]_{\mu})/6\ &amp;lt;/math&amp;gt; и производится сборка вектора &amp;lt;math&amp;gt; \bar y_{i+1} &amp;lt;/math&amp;gt; на каждом ПЭ. Если необходимо продолжить вычислительный процесс, то полагается &amp;lt;math&amp;gt; i = i + 1 &amp;lt;/math&amp;gt; и осуществляется переход на п. 1&lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ , шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] А. В. Старченко, В. Н. Берцун. Методы параллельных вычислений - Издательство Томского университета, 2013 - 173 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4377</id>
		<title>Участник:Anlesnichiy/Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка</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:Anlesnichiy/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%9A%D0%BE%D1%88%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%9E%D0%94%D0%A3_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-%D0%9A%D1%83%D1%82%D1%82%D1%8B_4_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4377"/>
		<updated>2016-09-28T15:00:12Z</updated>

		<summary type="html">&lt;p&gt;Anlesnichiy: Создал страницу. Пробное добавление материала&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка&lt;br /&gt;
| serial_complexity = ?&lt;br /&gt;
| pf_height         = ?&lt;br /&gt;
| pf_width          = ?&lt;br /&gt;
| input_data        = ?&lt;br /&gt;
| output_data       = ?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Anlesnichiy|А.А. Лесничий]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]]), [[Участник:Алимов Дамир Алиевич|Д.А. Алимов]]&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Метод Рунге-Кутты четвертого порядка — наиболее распространенный метод из семейства методов Метод Рунге-Кутты численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.&lt;br /&gt;
&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;&lt;br /&gt;
y&#039; = f(x,y),\ a \leq x \leq b;\ y(a) = y^0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = a + i*h,\ i = 1,\dots, n,\ h = \frac{b-a}{n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
 Введём обозначения &amp;lt;math&amp;gt;y(x_i) = y_i&amp;lt;/math&amp;gt;. Получим вычислительную формулу:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
         k_1    = h*f(x_i,y_i)\\&lt;br /&gt;
	 k_2    = h*f(x_i + h/2,y_i + 1/2 k_1)\\&lt;br /&gt;
	 k_3    = h*f(x_i + h/2,y_i + 1/2 k_2)\\&lt;br /&gt;
	 k_4    = h*f(x_i + h,y_i + k_3)\\&lt;br /&gt;
	 y_i+1 = y_i + 1/6 \lbrace k_1 + 2k_2 + 2k_3 + k_4 \rbrace \\&lt;br /&gt;
     \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутты для задачи Коши для системы ДУ первого порядка ====&lt;br /&gt;
Численное решение задачи Коши для систем ОДУ 1-го порядка методами Рунге-Кутты ищется по тем же формулам, что и для ОДУ первого порядка. Например, решение методом Рунге-Кутты 4  го порядка можно найти, если положить:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
	y_i \rightarrow \bar y_i\\&lt;br /&gt;
	f(x_i,y_i) \rightarrow \bar f(x_i,\bar y_i)\\&lt;br /&gt;
	k_l \rightarrow \bar k_l,\ l = 1, \dots, 4\\&lt;br /&gt;
	\bar k_l = &lt;br /&gt;
	\begin{pmatrix}&lt;br /&gt;
		k^i_{l,1}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		k^i_{l,m}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где m -- размерность системы.&lt;br /&gt;
В результате получим&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h*\bar f(x_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h*\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_1)\\&lt;br /&gt;
	 	\bar k_3    = h*\bar f(x_i + h/2,\bar y_i + 1/2 \bar k_2)\\&lt;br /&gt;
	 	\bar k_4    = h*\bar f(x_i + h,\bar y_i + \bar k_3)\\&lt;br /&gt;
	 	\bar y_i+1 = \bar y_i + 1/6 \lbrace \bar k_1 + 2\bar k_2 + 2\bar k_3 + \bar k_4 \rbrace \\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anlesnichiy</name></author>
	</entry>
</feed>