<?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=Alina</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=Alina"/>
	<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/Alina"/>
	<updated>2026-10-23T04:22:54Z</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17116</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17116"/>
		<updated>2016-11-14T19:30:58Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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;
&lt;br /&gt;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Информационный граф|1.7]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] ([[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
p.s. можете, пожалуйста, в обсуждении поточнее указать, что именно нужно исправить в рисунке? спасибо&lt;br /&gt;
&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runge graf.png|650 px]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов. Т.к. количество итераций цикла равно &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а число уравнений равно &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, то при классификации по высоте ЯПФ метод относится к алгоритмам со сложностью &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью &amp;lt;math&amp;gt; O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Вход:&lt;br /&gt;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Проведём исследование масштабируемости параллельной реализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность:  0.0003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости по направлению увеличения числа процессоров: -0.0000463530943148&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости по по направлению увеличения размерности задачи: -0.00000914692634229&lt;br /&gt;
&lt;br /&gt;
Общая оценка масштабируемости по направлению увеличения параметров : -0.00000347135643949&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках представлены графики производительности и эффективности выбранной реализации алгоритма Рунге-Кутта в зависимости от числа процессоров и размерности системы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algowiki efficiency.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17114</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17114"/>
		<updated>2016-11-14T19:24:45Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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;
&lt;br /&gt;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Информационный граф|1.7]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] ([[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
p.s. можете, пожалуйста, в обсуждении поточнее указать, что именно нужно исправить в рисунке? спасибо&lt;br /&gt;
&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runge graf.png|650 px]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов. Т.к. количество итераций цикла равно &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а число уравнений равно &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, то при классификации по высоте ЯПФ метод относится к алгоритмам со сложностью &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью &amp;lt;math&amp;gt; O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Вход:&lt;br /&gt;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Проведём исследование масштабируемости параллельной реализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность:  0.0003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&lt;br /&gt;
&lt;br /&gt;
-0.0000463530943148&lt;br /&gt;
-0.00000914692634229&lt;br /&gt;
-0.00000347135643949&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algowiki efficiency.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17112</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17112"/>
		<updated>2016-11-14T19:23:51Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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;
&lt;br /&gt;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Информационный граф|1.7]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] ([[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
p.s. можете, пожалуйста, в обсуждении поточнее указать, что именно нужно исправить в рисунке? спасибо&lt;br /&gt;
&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runge graf.png|650 px]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов. Т.к. количество итераций цикла равно &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а число уравнений равно &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, то при классификации по высоте ЯПФ метод относится к алгоритмам со сложностью &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью &amp;lt;math&amp;gt; O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Вход:&lt;br /&gt;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Проведём исследование масштабируемости параллельной реализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность:  0.0003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&lt;br /&gt;
&lt;br /&gt;
-0.0000463530943148&lt;br /&gt;
-0.00000914692634229&lt;br /&gt;
-0.00000347135643949&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algowiki efficiency.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17106</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17106"/>
		<updated>2016-11-14T18:53:58Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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;
&lt;br /&gt;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Информационный граф|1.7]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] ([[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
p.s. можете, пожалуйста, в обсуждении поточнее указать, что именно нужно исправить в рисунке? спасибо&lt;br /&gt;
&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runge graf.png|650 px]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов. Т.к. количество итераций цикла равно &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а число уравнений равно &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, то при классификации по высоте ЯПФ метод относится к алгоритмам со сложностью &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью &amp;lt;math&amp;gt; O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Вход:&lt;br /&gt;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Проведём исследование масштабируемости параллельной реализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность:  0.0003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algowiki efficiency.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17105</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17105"/>
		<updated>2016-11-14T18:53:12Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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;
&lt;br /&gt;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Информационный граф|1.7]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] ([[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
p.s. можете, пожалуйста, в обсуждении поточнее указать, что именно нужно исправить в рисунке? спасибо&lt;br /&gt;
&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runge graf.png|650 px]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов. Т.к. количество итераций цикла равно &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а число уравнений равно &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, то при классификации по высоте ЯПФ метод относится к алгоритмам со сложностью &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью &amp;lt;math&amp;gt; O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Вход:&lt;br /&gt;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Минимальная эффективность:  0.0003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algowiki efficiency.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17101</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=17101"/>
		<updated>2016-11-14T18:43:17Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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;
&lt;br /&gt;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Информационный граф|1.7]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] ([[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
p.s. можете, пожалуйста, в обсуждении поточнее указать, что именно нужно исправить в рисунке? спасибо&lt;br /&gt;
&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runge graf.png|650 px]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов. Т.к. количество итераций цикла равно &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, а число уравнений равно &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, то при классификации по высоте ЯПФ метод относится к алгоритмам со сложностью &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью &amp;lt;math&amp;gt; O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Вход:&lt;br /&gt;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Минимальная эффективность:  0.0003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algowiki efficiency.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15263</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15263"/>
		<updated>2016-10-31T19:13:13Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]],  [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] (разделы: [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum\limits^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h; \ \bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum\limits^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j1}, \ j = \overline{1, i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j2}, \ j = \overline{1, i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{jm}, \ j = \overline{1, i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i1} = y^n_1 + hg_{i1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i2} = y^n_2 + hg_{i2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{im} = y^n_m + hg_{im}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i1} = \sum\limits_{j=1}^{i-1}a_{ij}k_{j1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i2} = \sum\limits_{j=1}^{i-1}a_{ij}k_{j2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{im} = \sum\limits_{j=1}^{i-1}a_{ij}k_{jm}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j1}, \ j = \overline{1, i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j2}, \ j = \overline{1, i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{jm}, \ j = \overline{1, i-1}&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15261</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15261"/>
		<updated>2016-10-31T19:11:29Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]],  [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] (разделы: [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j1}, \ j = \overline{1, i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j2}, \ j = \overline{1, i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{jm}, \ j = \overline{1, i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i1} = y^n_1 + hg_{i1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i2} = y^n_2 + hg_{i2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{im} = y^n_m + hg_{im}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i1} = \sum\limits_{j=1}^{i-1}a_{ij}k_{j1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{i2} = \sum\limits_{j=1}^{i-1}a_{ij}k_{j2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g_{im} = \sum\limits_{j=1}^{i-1}a_{ij}k_{jm}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j1}, \ j = \overline{1, i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{j2}, \ j = \overline{1, i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_{jm}, \ j = \overline{1, i-1}&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15251</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15251"/>
		<updated>2016-10-31T18:52:55Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]],  [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] (разделы: [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; \bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15250</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15250"/>
		<updated>2016-10-31T18:52:22Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]],  [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] (разделы: [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Устойчивость. Алгоритм устойчив на любом конечном отрезке при условии ограниченности производной &amp;lt;math&amp;gt; /bar f&#039;_y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15238</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15238"/>
		<updated>2016-10-31T18:42:46Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
Авторы: [[Участник:Alexboboshko|Бобошко А.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]],  [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] (разделы: [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]],[[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]],  [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность и сходимость. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15219</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15219"/>
		<updated>2016-10-31T18:20:40Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[U:Alexboboshko|Бобошко А.]], [[U:Alina|Юмакаева А.]]&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
== Свойства и структура алгоритма ==&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. &lt;br /&gt;
&lt;br /&gt;
* Гибкость. Эти методы легко программируются. Также (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
* Точность. Если метод Рунге-Кутта аппроксимирует исходное уравнение, то он сходится при диаметре разбиения &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
* Вычислительная мощность алгоритма стремится к константе, так как число операций равно &amp;lt;math&amp;gt;4mn&amp;lt;/math&amp;gt;, а суммарный объем входных и выходных данных составляет &amp;lt;math&amp;gt;mn + n + m + 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15210</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15210"/>
		<updated>2016-10-31T18:11:32Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[U:Alexboboshko|Бобошко А.]], [[U:Alina|Юмакаева А.]]&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
== Свойства и структура алгоритма ==&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &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,\  b&amp;lt;/math&amp;gt; - границы отрезка - размерность 2&lt;br /&gt;
#&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - число итераций - размерность 1&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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-мерных векторов - размерность &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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(m+1)&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15198</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=15198"/>
		<updated>2016-10-31T17:50:20Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[U:Alexboboshko|Бобошко А.]], [[U:Alina|Юмакаева А.]]&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
== Свойства и структура алгоритма ==&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Каждая итерация алгоритма может быть представлена следующими этапами:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление коэффициентов &amp;lt;math&amp;gt;k_i , i = 1, \dots, 4 , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Вычисление следующего приближения &amp;lt;math&amp;gt; y_{i+1} = y_i + [k_1 + 2 k_2 + 2 k_3 + k_4 ]/6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Переход на следующую итерацию или выход из цикла при достижении заданной точности&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &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; c &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; c=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Lineprinter&amp;diff=8235</id>
		<title>Обсуждение участника:Lineprinter</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:Lineprinter&amp;diff=8235"/>
		<updated>2016-10-14T21:20:28Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8224</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8224"/>
		<updated>2016-10-14T21:19:12Z</updated>

		<summary type="html">&lt;p&gt;Alina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}} &lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
== Свойства и структура алгоритма ==&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8221</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8221"/>
		<updated>2016-10-14T21:18:46Z</updated>

		<summary type="html">&lt;p&gt;Alina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}} &lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
&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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8220</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8220"/>
		<updated>2016-10-14T21:18:17Z</updated>

		<summary type="html">&lt;p&gt;Alina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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(m) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; O(n) &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;
{{Assignment}} &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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:finperf.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPу, а так же в библиотеке PETSc.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Lineprinter&amp;diff=8217</id>
		<title>Обсуждение участника:Lineprinter</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:Lineprinter&amp;diff=8217"/>
		<updated>2016-10-14T21:17:39Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8150</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8150"/>
		<updated>2016-10-14T20:45:25Z</updated>

		<summary type="html">&lt;p&gt;Alina: Alina переименовал страницу [[Участники: Бобошко Алексей, Юмакаева Алина/Решение начальной задачи Коши для системы обыкновенных дифференци…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPy.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8145</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=8145"/>
		<updated>2016-10-14T20:43:30Z</updated>

		<summary type="html">&lt;p&gt;Alina: Alina переименовал страницу Рк в [[Участники: Бобошко Алексей, Юмакаева Алина/Решение начальной задачи Коши для системы обыкновенных дифф…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Для системы обыкновенных дифференциальных уравнений размерности  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; явный &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-стадийный метод Рунге-Кутты имеет следующий вид:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar y_{n+1}   = \bar y_n + h\sum^{s}_{i=1} b_{i}k_{i}\\&lt;br /&gt;
	 	\bar k_i    = \bar f(x_n + c_{i}h;\bar g_i); i = \overline{1,s}\\&lt;br /&gt;
	 	\bar g_i    = \bar y_n + h\sum^{i-1}_{j=1}a_{ij}\bar k_j\\&lt;br /&gt;
 	\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление любой аппроксимации решения состоит в вычислении множества коэффициентов &amp;lt;math&amp;gt;k_i =(k_i1,k_i2,...,k_im), i=\overline{1,s}&amp;lt;/math&amp;gt; и,собственно,приближенного решения &amp;lt;math&amp;gt;y_{n+1}(h)&amp;lt;/math&amp;gt;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. Для разработки параллельного алгоритма использовался математический аппарат графов влияния [1].&lt;br /&gt;
&lt;br /&gt;
[[Файл:rungekutta.png]]&lt;br /&gt;
&lt;br /&gt;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го шагового коэффициента в случае, если &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем случае для каждого шагового коэффициента &amp;lt;math&amp;gt;k_i , i = \overline{1, s}&amp;lt;/math&amp;gt; , соответственно, &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; компонент вектора &amp;lt;math&amp;gt;g_i , i = \overline{1, s}&amp;lt;/math&amp;gt; могут быть вычислены параллельно&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;l=m&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m=p&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;l=[m/p]&amp;lt;/math&amp;gt; компонент при &amp;lt;math&amp;gt;m&amp;gt;p&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; 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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&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;h&amp;lt;/math&amp;gt; → 0, причем порядок точности совпадает с порядком аппроксимации. В случае методов 4-го порядка это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок &amp;lt;math&amp;gt;O(h^4)&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPy.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[1]  Воеводин В.В., Воеводин Вл. В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;br /&gt;
&lt;br /&gt;
[2] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[3] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[4] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=7968</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=7968"/>
		<updated>2016-10-14T19:05:53Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;y_{i+1}&amp;lt;/math&amp;gt; :&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y_{i+1} = y_i + \int\limits_{t_i}^{t_{i+1}}f(t,y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритмов Рунге-Кутты состоит в замене функции &amp;lt;math&amp;gt;f(t,y)&amp;lt;/math&amp;gt;, которая зависит от неизвестной функции &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt;, некоторым приближением. Чем точнее будет приближенное значение подынтегральной функции, тем точнее будет посчитан интеграл и точнее будет определено значение &amp;lt;math&amp;gt;y_{i+1}&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;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \ \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пример программы на языке C&lt;br /&gt;
&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    void main(){&lt;br /&gt;
       float t=0, dt = 0.05;&lt;br /&gt;
       float vx = 1, vy = 2;&lt;br /&gt;
       float x=0, y=0;&lt;br /&gt;
       vector U(x, y, vx, vy);&lt;br /&gt;
       vector k1, k2, k3, k4;&lt;br /&gt;
       while(U.y &amp;gt;= 0){&lt;br /&gt;
           k1 = F(U, t)*dt;&lt;br /&gt;
           k2 = F(U + 0.5*k1, t+0.5*dt)*dt;&lt;br /&gt;
           k3 = F(U + 0.5*k2, t+0.5*dt)*dt;&lt;br /&gt;
           k4 = F(U + k3, t+dt)*dt;&lt;br /&gt;
           U = U + 1.0/6.0 * (k1 + 2*k2 + 2*k3 + k4);&lt;br /&gt;
           t += dt;       &lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
http://www.alexeypetrov.narod.ru/C/runge_about.html&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:rungekutta.png]]&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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. Эти методы легко программируются. Они обладают достаточными для широкого круга задач свойствами точности и устойчивости. Эти методы (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.&lt;br /&gt;
&lt;br /&gt;
Если при диаметре разбиения отрезка h → 0 метод Рунге-Кутта аппроксимирует исходное уравнение, то причем порядок точности совпадает с порядком аппроксимации. Это значит, что ошибка на одном шаге имеет порядок &amp;lt;math&amp;gt;O(h^5)&amp;lt;/math&amp;gt;, а суммарная ошибка на конечном интервале интегрирования имеет порядок O(h^4) .&lt;br /&gt;
&lt;br /&gt;
Увеличивая число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Однако уже при &amp;lt;math&amp;gt;p&amp;gt;5&amp;lt;/math&amp;gt; эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; над методами, в которых &amp;lt;math&amp;gt;p=4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=5&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;
Стандартная схема 4-го порядка реализована в различных математических пакетах (Maple, MathCAD, Maxima), в библиотеке для языка программирования Python - SciPy.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007. &lt;br /&gt;
&lt;br /&gt;
[2] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. &lt;br /&gt;
&lt;br /&gt;
[3] Самарский А. А., Гулин А. В. Численные методы. М.: Наука, 1989.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4719</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4719"/>
		<updated>2016-10-07T15:28:35Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:rungekutta.png]]&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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение &amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4718</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4718"/>
		<updated>2016-10-07T15:23:20Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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; m/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;
#&amp;lt;math&amp;gt; \bar y_{0} \in \mathbb{R}^m &amp;lt;/math&amp;gt; - начальное значение &amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;a,\  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;\bar y_{1},\dots, \bar y_n \in \mathbb{R}^m&amp;lt;/math&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;\bar x \in \mathbb{R}^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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4717</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4717"/>
		<updated>2016-10-07T15:13:18Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Метод Рунге-Кутта четвертого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка для системы ДУ ====&lt;br /&gt;
Запишем задачу Коши в векторном виде&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d \bar y}{dt} = \bar f(t, \bar y); \ \bar y(t_0) = \bar y_0 = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
		y_{10}\\&lt;br /&gt;
		\vdots\\&lt;br /&gt;
		y_{m0}\\&lt;br /&gt;
	\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
a \leq t \leq b&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	 \begin{cases}&lt;br /&gt;
	 	\bar k_1    = h\bar f(t_i,\bar y_i)\\&lt;br /&gt;
	 	\bar k_2    = h\bar f(t_i + h/2,\bar y_i + \bar k_1/2)\\&lt;br /&gt;
	 	\bar k_3    = h\bar f(t_i + h/2,\bar y_i + \bar k_2/2)\\&lt;br /&gt;
	 	\bar k_4    = h\bar f(t_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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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; m/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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4713</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4713"/>
		<updated>2016-10-07T15:06:19Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Метод Рунге-Кутта четвертого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Метод Рунге-Кутта четвертого порядка ====&lt;br /&gt;
Зададим равномерную сетку&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t_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;
:&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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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; m/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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4712</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4712"/>
		<updated>2016-10-07T15:04:06Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;
:&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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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; m/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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4711</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4711"/>
		<updated>2016-10-07T14:57:48Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Общая формулировка методов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Будем обозначать через &amp;lt;math&amp;gt;u(t)&amp;lt;/math&amp;gt; точное решение задачи Коши, а через &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; - приближенное решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;
:&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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4710</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4710"/>
		<updated>2016-10-07T14:55:40Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Общая формулировка методов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Введем по переменному &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; равномерную сетку с шагом &amp;lt;math&amp;gt;\tau &amp;gt; 0 &amp;lt;/math&amp;gt;, т.е. рассмотрим множество точек &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{align}&lt;br /&gt;
\omega_n = \left \{{t_n = n\tau, \ n = 0,\ 1,\ 2, \ \dots} \right \}.&lt;br /&gt;
    \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;
:&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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4682</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4682"/>
		<updated>2016-10-07T13:29:48Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;
:&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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;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 сложений.&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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4668</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4668"/>
		<updated>2016-10-07T12:56:12Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;
:&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;k_i ( i = 1, \dots, 4) , &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;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; последовательно вычисляются функции &amp;lt;math&amp;gt;k_i \ ( i = 1, \dots, 4) &amp;lt;/math&amp;gt;. После этого вычисляется значение &amp;lt;math&amp;gt;y_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4667</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4667"/>
		<updated>2016-10-07T12:53:42Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Метод Рунге-Кутта четвертого порядка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;
:&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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4666</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4666"/>
		<updated>2016-10-07T12:52:40Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&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;k_i ( i = 1, \dots, 4) , &amp;lt;/math&amp;gt; то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4665</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4665"/>
		<updated>2016-10-07T12:47:32Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&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;
В описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении k_i ( i = 1, \dots, 4) , то есть основное внимание следует уделить распараллеливанию этой операции.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4662</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4662"/>
		<updated>2016-10-07T11:58:32Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4661</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4661"/>
		<updated>2016-10-07T11:52:41Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Общая формулировка методов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{array}{l}&lt;br /&gt;
         k_1 = f(t_n, y_n), \ k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
         k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots, \\&lt;br /&gt;
         k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
    \end{array}{l}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Затем из формулы &amp;lt;math&amp;gt;\frac{y_{n+1}-y_n}{\tau} = \sum_{i = 1}^{m} \sigma_i k_i &amp;lt;/math&amp;gt; находится новое значение  &amp;lt;math&amp;gt; y_{n+1} = y(t_{n+1}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку в описанной выше вычислительной схеме наиболее трудоемкой является операция расчета правых частей ОДУ при вычислении &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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4659</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4659"/>
		<updated>2016-10-07T11:36:41Z</updated>

		<summary type="html">&lt;p&gt;Alina: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{du}{dt} = f(t,u),  u(0)=u_0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Явный m-этапный метод Рунге-Кутта состоит в следующем. Пусть решение &amp;lt;math&amp;gt; y_n = y(t_n) &amp;lt;/math&amp;gt; уже известно. Задаются числовые коэффициенты &amp;lt;math&amp;gt; a_i, \ b_{ij},\ i = 2, 3, \dots, m,\ j = 1, 2, \dots, m-1,\ \sigma_i,\ i = 1, 2, \dots, m, &amp;lt;/math&amp;gt; и последовательно вычисляются функции&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
k_1 = f(t_n, y_n), k_2 = f(t_n+a_2\tau,\ y_n+b_{21}\tau k_1) \\&lt;br /&gt;
k_3 = f(t_n+a_3 \tau, \ y_n+b_{31}\tau k_1+b_{32}\tau k_2), \  \dots,\\&lt;br /&gt;
k_m = f(t_n+a_m \tau, \ y_n+b_{m1}\tau k_1+b_{m2}\tau k_2+\dots+b_{m,m-1}\tau k_{m-1})&lt;br /&gt;
\end{align}&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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4494</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4494"/>
		<updated>2016-10-03T13:50:39Z</updated>

		<summary type="html">&lt;p&gt;Alina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &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;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4492</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4492"/>
		<updated>2016-10-03T13:28:27Z</updated>

		<summary type="html">&lt;p&gt;Alina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = РК&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;
Основные авторы описания: &lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4491</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4491"/>
		<updated>2016-10-03T13:22:36Z</updated>

		<summary type="html">&lt;p&gt;Alina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = &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;
Основные авторы описания: &lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4490</id>
		<title>Участник:Alexboboshko/Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 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:Alexboboshko/%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%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%D0%B0_4-%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0&amp;diff=4490"/>
		<updated>2016-10-03T13:21:46Z</updated>

		<summary type="html">&lt;p&gt;Alina: Новая страница: «{{algorithm | name              = Решение задачи Коши для системы ОДУ методом Рунге-Кутты 4 порядка | serial…»&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;
Основные авторы описания: &lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; 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]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alina</name></author>
	</entry>
</feed>