<?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=Alexboboshko</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=Alexboboshko"/>
	<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/Alexboboshko"/>
	<updated>2026-10-22T17:17:39Z</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=18868</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=18868"/>
		<updated>2016-11-21T19:36:47Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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(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 Суперкомпьютерного комплекса Московского университета]. Компилятор mpicc, без опций запуска, подключались библиотеки intel/13.1.0 impi/4.1.0 slurm/2.5.6&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>Alexboboshko</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=17115</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=17115"/>
		<updated>2016-11-14T19:27:02Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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;
[[Файл: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>Alexboboshko</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=17110</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=17110"/>
		<updated>2016-11-14T19:22:00Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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>Alexboboshko</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=17088</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=17088"/>
		<updated>2016-11-14T17:51:54Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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;
[[Файл: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>Alexboboshko</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=17084</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=17084"/>
		<updated>2016-11-14T17:40:43Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность:  0.000003169 %&lt;br /&gt;
Максимальная эффективность: 0.8591 %&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>Alexboboshko</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=17082</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=17082"/>
		<updated>2016-11-14T17:34:34Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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;
[[Файл:fintime.jpg]]&lt;br /&gt;
&lt;br /&gt;
Минимальная эффективность:  0.0000051284 &lt;br /&gt;
Максимальная эффективность: 0.010529&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>Alexboboshko</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=16069</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=16069"/>
		<updated>2016-11-07T16:02:26Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
[[Файл: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>Alexboboshko</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=16068</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=16068"/>
		<updated>2016-11-07T16:02:03Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(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;
[[Файл: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>Alexboboshko</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=15990</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=15990"/>
		<updated>2016-11-06T17:13:00Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
Авторы: [[Участник: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;
[[Файл: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>Alexboboshko</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=15989</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=15989"/>
		<updated>2016-11-06T17:12:30Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Авторы: [[Участник: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;
[[Файл: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>Alexboboshko</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=15988</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=15988"/>
		<updated>2016-11-06T17:09:44Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Авторы: [[Участник: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;
Для системы обыкновенных дифференциальных уравнений размерности  &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;
[[Файл: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>Alexboboshko</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=15987</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=15987"/>
		<updated>2016-11-06T17:09:32Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Авторы: [[Участник: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;
Для системы обыкновенных дифференциальных уравнений размерности  &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;
[[Файл: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>Alexboboshko</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=15986</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=15986"/>
		<updated>2016-11-06T17:07:15Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Авторы: [[Участник: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;
Для системы обыкновенных дифференциальных уравнений размерности  &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; x &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;
[[Файл: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>Alexboboshko</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=15985</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=15985"/>
		<updated>2016-11-06T17:06:51Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Авторы: [[Участник: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;
Для системы обыкновенных дифференциальных уравнений размерности  &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; x &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; , а при классификации по ширине ЯПФ - к алгоритмам со сложностью O(m).&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>Alexboboshko</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=15304</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=15304"/>
		<updated>2016-10-31T19:52:10Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
Авторы: [[Участник: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;
Для системы обыкновенных дифференциальных уравнений размерности  &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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15303</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=15303"/>
		<updated>2016-10-31T19:51:55Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
&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;
{{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;
&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;
[[Файл: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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15302</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=15302"/>
		<updated>2016-10-31T19:51:42Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
{{Assignment}}&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;
Для системы обыкновенных дифференциальных уравнений размерности  &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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15295</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=15295"/>
		<updated>2016-10-31T19:48:54Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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.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;
Для системы обыкновенных дифференциальных уравнений размерности  &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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15293</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=15293"/>
		<updated>2016-10-31T19:47:27Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[[Файл: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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15292</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=15292"/>
		<updated>2016-10-31T19:47:14Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[[Файл:Runge graf.png|800 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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15290</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=15290"/>
		<updated>2016-10-31T19:47:01Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[[Файл:Runge graf.png|200 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;
Заметим, что в данном алгоритме производится четыре операции вычисления вектора правых частей ОДУ, шестнадцать операций сложения векторов и умножения вектора на число и четыре операции глобальной сборки векторов.&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>Alexboboshko</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=15287</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=15287"/>
		<updated>2016-10-31T19:46:34Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[[Файл:Runge graf.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>Alexboboshko</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=15247</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=15247"/>
		<updated>2016-10-31T18:49:49Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Литература */&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;
&lt;br /&gt;
[5] Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие. — М.: Высш. шк., 1994.&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexboboshko</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=15229</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=15229"/>
		<updated>2016-10-31T18:28:09Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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>Alexboboshko</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=15227</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=15227"/>
		<updated>2016-10-31T18:26:49Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]], [[#Масштабируемость алгоритма и его реализации|2.4]])), [[Участник:Alina|Юмакаева А.]] (разделы [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|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>Alexboboshko</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=15223</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=15223"/>
		<updated>2016-10-31T18:25:09Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]]),  [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Alina|Юмакаева А.]] (разделы [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|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>Alexboboshko</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=15222</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=15222"/>
		<updated>2016-10-31T18:24:43Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]]),  [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Alina|Юмакаева А.] (разделы [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|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>Alexboboshko</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=15220</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=15220"/>
		<updated>2016-10-31T18:23:32Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]]),    Основные авторы описани(разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Alina|Юмакаева А.] (разделы [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|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>Alexboboshko</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=15207</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=15207"/>
		<updated>2016-10-31T18:06:38Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Входные и выходные данные алгоритма */&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>Alexboboshko</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=15206</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=15206"/>
		<updated>2016-10-31T18:06:13Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Входные и выходные данные алгоритма */&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; - число итераций - размерность &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
Итоговый объем входных данных - &amp;lt;math&amp;gt;m+3&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; - &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>Alexboboshko</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=15197</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=15197"/>
		<updated>2016-10-31T17:43:00Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Последовательная сложность алгоритма */&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;
Для каждого &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>Alexboboshko</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=15196</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=15196"/>
		<updated>2016-10-31T17:42:38Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Последовательная сложность алгоритма */&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;
Для каждого &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; с &amp;lt;/math&amp;gt;. В таком случае последовательную сложность алгоритма можно считать равной &amp;lt;math&amp;gt; 4mnc &amp;lt;/math&amp;gt;, но далее для простоты расчетов примем константу &amp;lt;math&amp;gt; с=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>Alexboboshko</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=15190</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=15190"/>
		<updated>2016-10-31T17:20:38Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Схема реализации последовательного алгоритма */&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;
Для каждого &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 сложений.&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>Alexboboshko</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=15189</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=15189"/>
		<updated>2016-10-31T17:20:21Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Макроструктура алгоритма */&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;
Для каждого &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>Alexboboshko</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=8208</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=8208"/>
		<updated>2016-10-14T21:14:32Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Существующие реализации алгоритма */&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;
Основные авторы описания: &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>Alexboboshko</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=8194</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=8194"/>
		<updated>2016-10-14T21:09:07Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость реализации алгоритма */&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;
Основные авторы описания: &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 - 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>Alexboboshko</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=8191</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=8191"/>
		<updated>2016-10-14T21:08:27Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Масштабируемость алгоритма и его реализации */&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;
Основные авторы описания: &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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>Alexboboshko</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=8153</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=8153"/>
		<updated>2016-10-14T20:47:03Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
Основные авторы описания: &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>Alexboboshko</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=8138</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=8138"/>
		<updated>2016-10-14T20:41:18Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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>Alexboboshko</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=8127</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=8127"/>
		<updated>2016-10-14T20:35:20Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: &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;
Основные авторы описания: Abob&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>Alexboboshko</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=8069</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=8069"/>
		<updated>2016-10-14T19:52:19Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Литература */&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>Alexboboshko</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=8068</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=8068"/>
		<updated>2016-10-14T19:51:14Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[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>Alexboboshko</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=8064</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=8064"/>
		<updated>2016-10-14T19:47:42Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
&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;.Для явных схем вычисление шаговых коэффициентов есть сугубо последовательный процесс. &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;
[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>Alexboboshko</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=8061</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=8061"/>
		<updated>2016-10-14T19:40:19Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[[Файл:rungekutta.png]]&lt;br /&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;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;
[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>Alexboboshko</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=8056</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=8056"/>
		<updated>2016-10-14T19:35:33Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
[[Файл:rungekutta.png]]&lt;br /&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 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;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &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;
[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>Alexboboshko</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=8052</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=8052"/>
		<updated>2016-10-14T19:33:44Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Макроструктура алгоритма */&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;
[[Файл:rungekutta.png]]&lt;br /&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_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;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &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;
[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>Alexboboshko</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=8051</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=8051"/>
		<updated>2016-10-14T19:33:28Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Макроструктура алгоритма */&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;
=== Схема реализации последовательного алгоритма ===&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;
&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_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;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &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;
[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>Alexboboshko</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=8050</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=8050"/>
		<updated>2016-10-14T19:33:01Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;
&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_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;
Задача распараллеливания в такой постановке сводится к отысканию максимального независимого множества вершин орграфа, причем вершинам графа сопоставляются выполняемые операции и вершины соединяются дугами тогда и только тогда, когда результат выполнения одной операции влияет на результат смежной. На рисунке выше приведен граф влияния для вычисления вектора значений &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;
[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>Alexboboshko</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=8036</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=8036"/>
		<updated>2016-10-14T19:26:45Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;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;
[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>Alexboboshko</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=8035</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=8035"/>
		<updated>2016-10-14T19:26:28Z</updated>

		<summary type="html">&lt;p&gt;Alexboboshko: /* Информационный граф */&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;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;
[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>Alexboboshko</name></author>
	</entry>
</feed>