<?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=%D0%9E%D0%B2%D1%81%D0%B8%D0%B5%D0%BD%D0%BA%D0%BE+%D0%9E%D0%BB%D0%B5%D1%81%D1%8F</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=%D0%9E%D0%B2%D1%81%D0%B8%D0%B5%D0%BD%D0%BA%D0%BE+%D0%9E%D0%BB%D0%B5%D1%81%D1%8F"/>
	<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/%D0%9E%D0%B2%D1%81%D0%B8%D0%B5%D0%BD%D0%BA%D0%BE_%D0%9E%D0%BB%D0%B5%D1%81%D1%8F"/>
	<updated>2026-10-22T14:56:57Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30308</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30308"/>
		<updated>2025-12-09T04:04:52Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод релаксации матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом релаксации:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма состоит из четырёх групп вершин, расположенных в целочисленных узлах областей различной размерности.&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|1150px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
1) Первая группа вершин (входные данные и инициализация) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в двумерной области с координатами &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Диапазоны изменения координат: &amp;lt;math&amp;gt;i ∈ [0, N−1] , j ∈ [0, N−1]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Операция:  &lt;br /&gt;
* если &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i = N−1&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = N−1&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;A[i][j] = 0&amp;lt;/math&amp;gt; (граничные условия),  &lt;br /&gt;
* иначе &amp;lt;math&amp;gt;A[i][j] = 1 + i + j&amp;lt;/math&amp;gt; (начальное приближение внутри области).  &lt;br /&gt;
&lt;br /&gt;
Результат: элементы массива &amp;lt;math&amp;gt;A[i][j]&amp;lt;/math&amp;gt; на итерации 0.  &lt;br /&gt;
Все вершины этой группы являются источниками (входными данными алгоритма).  &lt;br /&gt;
На рисунке соответствуют синим прямоугольникам слева с надписью &amp;lt;math&amp;gt;A[i][j]^{(0)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Вторая группа вершин (релаксация — вычисление нового слоя) : &lt;br /&gt;
 &lt;br /&gt;
Расположена в трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
Диапазоны изменения координат:  &lt;br /&gt;
&amp;lt;math&amp;gt;i ∈ [1, N−2] , j ∈ [1, N−2] ,  k ∈ [1, it\_max]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — номер выполненной итерации.  &lt;br /&gt;
&lt;br /&gt;
Соответствующая операция:  &lt;br /&gt;
&amp;lt;math&amp;gt;B[i][j] = (A[i−1][j] + A[i+1][j] + A[i][j−1] + A[i][j+1]) / 4.0&amp;lt;/math&amp;gt;&lt;br /&gt;
(усреднение по четырём соседям — шаблон «крест»).&lt;br /&gt;
&lt;br /&gt;
Аргументы операции:  &lt;br /&gt;
четыре значения &amp;lt;math&amp;gt;A[⋅][⋅]&amp;lt;/math&amp;gt; с предыдущего слоя (итерации &amp;lt;math&amp;gt;k−1&amp;lt;/math&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания: элемент нового слоя &amp;lt;math&amp;gt;B[i][j]^{(k)}&amp;lt;/math&amp;gt;.  &lt;br /&gt;
На рисунке — зелёные блоки с надписью &amp;lt;math&amp;gt;B[i][j]^{(k)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3) Третья группа вершин (вычисление невязки и обновление &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в той же трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Операция выполняется сразу после второй группы на той же итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;e = |A[i][j]^{(k-1)} − B[i][j]^{(k)}|&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A[i][j]^{(k)} = B[i][j]^{(k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;eps^{(k)} = max(eps^{(k)}, e)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы: значения &amp;lt;math&amp;gt;A[i][j]^{(k-1)}&amp;lt;/math&amp;gt; из первой группы вершин и &amp;lt;math&amp;gt;B[i][j]^{(k)}&amp;lt;/math&amp;gt; из второй группы вершин.  &lt;br /&gt;
&lt;br /&gt;
Результат:  &lt;br /&gt;
* обновлённое значение &amp;lt;math&amp;gt;A[i][j]^{(k)}&amp;lt;/math&amp;gt;, которое будет использовано на следующей итерации,  &lt;br /&gt;
* вклад в глобальную норму невязки &amp;lt;math&amp;gt;eps^{(k)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На рисунке — жёлтые блоки с надписями вида &amp;lt;math&amp;gt;A[i][j]^{(k)} = B[i][j]^{(k)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4) Четвёртая группа вершин (условия завершения) :&lt;br /&gt;
  &lt;br /&gt;
Состоит из двух типов вершин скалярной размерности (координата &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Вершины сравнения &amp;lt;math&amp;gt;eps^{(k)} &amp;lt; max\_eps&amp;lt;/math&amp;gt; :&lt;br /&gt;
** Координата &amp;lt;math&amp;gt;k ∈ [1, it\_max]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** Аргумент — накопленное на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;eps^{(k)}&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** На рисунке — фиолетовые овалы с надписью &amp;lt;math&amp;gt;eps^{(k)} &amp;lt; max\_eps&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вершина проверки числа итераций &amp;lt;math&amp;gt;iteration = it\_max&amp;lt;/math&amp;gt; : На рисунке — красный прямоугольник справа.&lt;br /&gt;
&lt;br /&gt;
Обе вершины являются стоками-условиями (управляющие вершины).  &lt;br /&gt;
При выполнении любого из условий (YES) происходит выход из цикла (break).  &lt;br /&gt;
При невыполнении обоих условий (NO) алгоритм переходит к следующей итерации &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, граф имеет ярко выраженную волновую структуру по итерациям &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, с полным барьером синхронизации в конце каждой итерации (все элементы нового слоя должны быть вычислены перед подсчётом невязки и переходом к следующей итерации).&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения результатов была проведена серия экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;max\_eps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
[[file:correct_result.png|thumb|center|700px|Зависимость времени выполнения от размера матрицы и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов подтверждают корректность и эффективность MPI-реализации : &lt;br /&gt;
* Время выполнения растёт пропорционально квадрату размера сетки, демонстрируя сложность &amp;lt;math&amp;gt;O(N²)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Алгоритм хорошо масштабируется: для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4096 использование 28 процессов ускоряет вычисления в 20 раз по сравнению с последовательной версией. &lt;br /&gt;
* Значения контрольной суммы сохраняются при любом количестве процессов, что подтверждает корректность обмена данными. &lt;br /&gt;
* Наилучшая эффективность достигается при балансе между объёмом вычислений на процесс и затратами на коммуникации.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
# Самарский А. А., Гулин А. В. Численные методы. - M.: Наука, 1989.&lt;br /&gt;
# Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
# Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
# Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30307</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30307"/>
		<updated>2025-12-09T04:03:51Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод релаксации для уравнения Лапласа&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом релаксации:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма состоит из четырёх групп вершин, расположенных в целочисленных узлах областей различной размерности.&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|1150px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
1) Первая группа вершин (входные данные и инициализация) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в двумерной области с координатами &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Диапазоны изменения координат: &amp;lt;math&amp;gt;i ∈ [0, N−1] , j ∈ [0, N−1]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Операция:  &lt;br /&gt;
* если &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i = N−1&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = N−1&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;A[i][j] = 0&amp;lt;/math&amp;gt; (граничные условия),  &lt;br /&gt;
* иначе &amp;lt;math&amp;gt;A[i][j] = 1 + i + j&amp;lt;/math&amp;gt; (начальное приближение внутри области).  &lt;br /&gt;
&lt;br /&gt;
Результат: элементы массива &amp;lt;math&amp;gt;A[i][j]&amp;lt;/math&amp;gt; на итерации 0.  &lt;br /&gt;
Все вершины этой группы являются источниками (входными данными алгоритма).  &lt;br /&gt;
На рисунке соответствуют синим прямоугольникам слева с надписью &amp;lt;math&amp;gt;A[i][j]^{(0)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Вторая группа вершин (релаксация — вычисление нового слоя) : &lt;br /&gt;
 &lt;br /&gt;
Расположена в трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
Диапазоны изменения координат:  &lt;br /&gt;
&amp;lt;math&amp;gt;i ∈ [1, N−2] , j ∈ [1, N−2] ,  k ∈ [1, it\_max]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — номер выполненной итерации.  &lt;br /&gt;
&lt;br /&gt;
Соответствующая операция:  &lt;br /&gt;
&amp;lt;math&amp;gt;B[i][j] = (A[i−1][j] + A[i+1][j] + A[i][j−1] + A[i][j+1]) / 4.0&amp;lt;/math&amp;gt;&lt;br /&gt;
(усреднение по четырём соседям — шаблон «крест»).&lt;br /&gt;
&lt;br /&gt;
Аргументы операции:  &lt;br /&gt;
четыре значения &amp;lt;math&amp;gt;A[⋅][⋅]&amp;lt;/math&amp;gt; с предыдущего слоя (итерации &amp;lt;math&amp;gt;k−1&amp;lt;/math&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания: элемент нового слоя &amp;lt;math&amp;gt;B[i][j]^{(k)}&amp;lt;/math&amp;gt;.  &lt;br /&gt;
На рисунке — зелёные блоки с надписью &amp;lt;math&amp;gt;B[i][j]^{(k)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3) Третья группа вершин (вычисление невязки и обновление &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в той же трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Операция выполняется сразу после второй группы на той же итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;e = |A[i][j]^{(k-1)} − B[i][j]^{(k)}|&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A[i][j]^{(k)} = B[i][j]^{(k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;eps^{(k)} = max(eps^{(k)}, e)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы: значения &amp;lt;math&amp;gt;A[i][j]^{(k-1)}&amp;lt;/math&amp;gt; из первой группы вершин и &amp;lt;math&amp;gt;B[i][j]^{(k)}&amp;lt;/math&amp;gt; из второй группы вершин.  &lt;br /&gt;
&lt;br /&gt;
Результат:  &lt;br /&gt;
* обновлённое значение &amp;lt;math&amp;gt;A[i][j]^{(k)}&amp;lt;/math&amp;gt;, которое будет использовано на следующей итерации,  &lt;br /&gt;
* вклад в глобальную норму невязки &amp;lt;math&amp;gt;eps^{(k)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На рисунке — жёлтые блоки с надписями вида &amp;lt;math&amp;gt;A[i][j]^{(k)} = B[i][j]^{(k)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4) Четвёртая группа вершин (условия завершения) :&lt;br /&gt;
  &lt;br /&gt;
Состоит из двух типов вершин скалярной размерности (координата &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Вершины сравнения &amp;lt;math&amp;gt;eps^{(k)} &amp;lt; max\_eps&amp;lt;/math&amp;gt; :&lt;br /&gt;
** Координата &amp;lt;math&amp;gt;k ∈ [1, it\_max]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** Аргумент — накопленное на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;eps^{(k)}&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** На рисунке — фиолетовые овалы с надписью &amp;lt;math&amp;gt;eps^{(k)} &amp;lt; max\_eps&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вершина проверки числа итераций &amp;lt;math&amp;gt;iteration = it\_max&amp;lt;/math&amp;gt; : На рисунке — красный прямоугольник справа.&lt;br /&gt;
&lt;br /&gt;
Обе вершины являются стоками-условиями (управляющие вершины).  &lt;br /&gt;
При выполнении любого из условий (YES) происходит выход из цикла (break).  &lt;br /&gt;
При невыполнении обоих условий (NO) алгоритм переходит к следующей итерации &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, граф имеет ярко выраженную волновую структуру по итерациям &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, с полным барьером синхронизации в конце каждой итерации (все элементы нового слоя должны быть вычислены перед подсчётом невязки и переходом к следующей итерации).&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения результатов была проведена серия экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;max\_eps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
[[file:correct_result.png|thumb|center|700px|Зависимость времени выполнения от размера матрицы и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов подтверждают корректность и эффективность MPI-реализации : &lt;br /&gt;
* Время выполнения растёт пропорционально квадрату размера сетки, демонстрируя сложность &amp;lt;math&amp;gt;O(N²)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Алгоритм хорошо масштабируется: для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4096 использование 28 процессов ускоряет вычисления в 20 раз по сравнению с последовательной версией. &lt;br /&gt;
* Значения контрольной суммы сохраняются при любом количестве процессов, что подтверждает корректность обмена данными. &lt;br /&gt;
* Наилучшая эффективность достигается при балансе между объёмом вычислений на процесс и затратами на коммуникации.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
# Самарский А. А., Гулин А. В. Численные методы. - M.: Наука, 1989.&lt;br /&gt;
# Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
# Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
# Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30306</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30306"/>
		<updated>2025-12-09T03:46:32Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод релаксации для уравнения Лапласа&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом релаксации:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма состоит из четырёх групп вершин, расположенных в целочисленных узлах областей различной размерности.&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|1150px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
1) Первая группа вершин (входные данные и инициализация) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в двумерной области с координатами &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Диапазоны изменения координат: &amp;lt;math&amp;gt;i ∈ [0, N−1] , j ∈ [0, N−1]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Операция:  &lt;br /&gt;
* если &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i = N−1&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = N−1&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;A[i][j] = 0&amp;lt;/math&amp;gt; (граничные условия),  &lt;br /&gt;
* иначе &amp;lt;math&amp;gt;A[i][j] = 1 + i + j&amp;lt;/math&amp;gt; (начальное приближение внутри области).  &lt;br /&gt;
&lt;br /&gt;
Результат: элементы массива &amp;lt;math&amp;gt;A[i][j]&amp;lt;/math&amp;gt; на итерации 0.  &lt;br /&gt;
Все вершины этой группы являются источниками (входными данными алгоритма).  &lt;br /&gt;
На рисунке соответствуют синим прямоугольникам слева с надписью &amp;lt;math&amp;gt;A[i][j]⁽⁰⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Вторая группа вершин (релаксация — вычисление нового слоя) : &lt;br /&gt;
 &lt;br /&gt;
Расположена в трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
Диапазоны изменения координат:  &lt;br /&gt;
&amp;lt;math&amp;gt;i ∈ [1, N−2] , j ∈ [1, N−2] ,  k ∈ [1, it\_max]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — номер выполненной итерации.  &lt;br /&gt;
&lt;br /&gt;
Соответствующая операция:  &lt;br /&gt;
&amp;lt;math&amp;gt;B[i][j] = (A[i−1][j] + A[i+1][j] + A[i][j−1] + A[i][j+1]) / 4.0&amp;lt;/math&amp;gt;&lt;br /&gt;
(усреднение по четырём соседям — шаблон «крест»).&lt;br /&gt;
&lt;br /&gt;
Аргументы операции:  &lt;br /&gt;
четыре значения &amp;lt;math&amp;gt;A[⋅][⋅]&amp;lt;/math&amp;gt; с предыдущего слоя (итерации &amp;lt;math&amp;gt;k−1&amp;lt;/math&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания: элемент нового слоя &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
На рисунке — зелёные блоки с надписью &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3) Третья группа вершин (вычисление невязки и обновление &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в той же трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Операция выполняется сразу после второй группы на той же итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;e = |A[i][j]⁽ᵏ⁻¹⁾ − B[i][j]⁽ᵏ⁾|&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;eps⁽ᵏ⁾ = max(eps⁽ᵏ⁾, e)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы: значения &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁻¹⁾&amp;lt;/math&amp;gt; из первой группы вершин и &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt; из второй группы вершин.  &lt;br /&gt;
&lt;br /&gt;
Результат:  &lt;br /&gt;
* обновлённое значение &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;, которое будет использовано на следующей итерации,  &lt;br /&gt;
* вклад в глобальную норму невязки &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На рисунке — жёлтые блоки с надписями вида &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4) Четвёртая группа вершин (условия завершения) :&lt;br /&gt;
  &lt;br /&gt;
Состоит из двух типов вершин скалярной размерности (координата &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Вершины сравнения &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt; :&lt;br /&gt;
** Координата &amp;lt;math&amp;gt;k ∈ [1, it\_max]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** Аргумент — накопленное на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** На рисунке — фиолетовые овалы с надписью &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вершина проверки числа итераций &amp;lt;math&amp;gt;iteration = it\_max&amp;lt;/math&amp;gt; : На рисунке — красный прямоугольник справа.&lt;br /&gt;
&lt;br /&gt;
Обе вершины являются стоками-условиями (управляющие вершины).  &lt;br /&gt;
При выполнении любого из условий (YES) происходит выход из цикла (break).  &lt;br /&gt;
При невыполнении обоих условий (NO) алгоритм переходит к следующей итерации &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, граф имеет ярко выраженную волновую структуру по итерациям &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, с полным барьером синхронизации в конце каждой итерации (все элементы нового слоя должны быть вычислены перед подсчётом невязки и переходом к следующей итерации).&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения результатов была проведена серия экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;max\_eps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
[[file:correct_result.png|thumb|center|700px|Зависимость времени выполнения от размера матрицы и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов подтверждают корректность и эффективность MPI-реализации : &lt;br /&gt;
* Время выполнения растёт пропорционально квадрату размера сетки, демонстрируя сложность &amp;lt;math&amp;gt;O(N²)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Алгоритм хорошо масштабируется: для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4096 использование 28 процессов ускоряет вычисления в 20 раз по сравнению с последовательной версией. &lt;br /&gt;
* Значения контрольной суммы сохраняются при любом количестве процессов, что подтверждает корректность обмена данными. &lt;br /&gt;
* Наилучшая эффективность достигается при балансе между объёмом вычислений на процесс и затратами на коммуникации.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
# Самарский А. А., Гулин А. В. Численные методы. - M.: Наука, 1989.&lt;br /&gt;
# Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
# Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
# Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30305</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30305"/>
		<updated>2025-12-09T03:42:53Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &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;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом релаксации:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма состоит из четырёх групп вершин, расположенных в целочисленных узлах областей различной размерности.&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|1150px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
1) Первая группа вершин (входные данные и инициализация) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в двумерной области с координатами &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Диапазоны изменения координат: &amp;lt;math&amp;gt;i ∈ [0, N−1] , j ∈ [0, N−1]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Операция:  &lt;br /&gt;
* если &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i = N−1&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = N−1&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;A[i][j] = 0&amp;lt;/math&amp;gt; (граничные условия),  &lt;br /&gt;
* иначе &amp;lt;math&amp;gt;A[i][j] = 1 + i + j&amp;lt;/math&amp;gt; (начальное приближение внутри области).  &lt;br /&gt;
&lt;br /&gt;
Результат: элементы массива &amp;lt;math&amp;gt;A[i][j]&amp;lt;/math&amp;gt; на итерации 0.  &lt;br /&gt;
Все вершины этой группы являются источниками (входными данными алгоритма).  &lt;br /&gt;
На рисунке соответствуют синим прямоугольникам слева с надписью &amp;lt;math&amp;gt;A[i][j]⁽⁰⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Вторая группа вершин (релаксация — вычисление нового слоя) : &lt;br /&gt;
 &lt;br /&gt;
Расположена в трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
Диапазоны изменения координат:  &lt;br /&gt;
&amp;lt;math&amp;gt;i ∈ [1, N−2] , j ∈ [1, N−2] ,  k ∈ [1, it\_max]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — номер выполненной итерации.  &lt;br /&gt;
&lt;br /&gt;
Соответствующая операция:  &lt;br /&gt;
&amp;lt;math&amp;gt;B[i][j] = (A[i−1][j] + A[i+1][j] + A[i][j−1] + A[i][j+1]) / 4.0&amp;lt;/math&amp;gt;&lt;br /&gt;
(усреднение по четырём соседям — шаблон «крест»).&lt;br /&gt;
&lt;br /&gt;
Аргументы операции:  &lt;br /&gt;
четыре значения &amp;lt;math&amp;gt;A[⋅][⋅]&amp;lt;/math&amp;gt; с предыдущего слоя (итерации &amp;lt;math&amp;gt;k−1&amp;lt;/math&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания: элемент нового слоя &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
На рисунке — зелёные блоки с надписью &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3) Третья группа вершин (вычисление невязки и обновление &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в той же трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Операция выполняется сразу после второй группы на той же итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;e = |A[i][j]⁽ᵏ⁻¹⁾ − B[i][j]⁽ᵏ⁾|&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;eps⁽ᵏ⁾ = max(eps⁽ᵏ⁾, e)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы: значения &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁻¹⁾&amp;lt;/math&amp;gt; из первой группы вершин и &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt; из второй группы вершин.  &lt;br /&gt;
&lt;br /&gt;
Результат:  &lt;br /&gt;
* обновлённое значение &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;, которое будет использовано на следующей итерации,  &lt;br /&gt;
* вклад в глобальную норму невязки &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На рисунке — жёлтые блоки с надписями вида &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4) Четвёртая группа вершин (условия завершения) :&lt;br /&gt;
  &lt;br /&gt;
Состоит из двух типов вершин скалярной размерности (координата &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Вершины сравнения &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt; :&lt;br /&gt;
** Координата &amp;lt;math&amp;gt;k ∈ [1, it\_max]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** Аргумент — накопленное на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** На рисунке — фиолетовые овалы с надписью &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вершина проверки числа итераций &amp;lt;math&amp;gt;iteration = it\_max&amp;lt;/math&amp;gt; : На рисунке — красный прямоугольник справа.&lt;br /&gt;
&lt;br /&gt;
Обе вершины являются стоками-условиями (управляющие вершины).  &lt;br /&gt;
При выполнении любого из условий (YES) происходит выход из цикла (break).  &lt;br /&gt;
При невыполнении обоих условий (NO) алгоритм переходит к следующей итерации &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, граф имеет ярко выраженную волновую структуру по итерациям &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, с полным барьером синхронизации в конце каждой итерации (все элементы нового слоя должны быть вычислены перед подсчётом невязки и переходом к следующей итерации).&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения результатов была проведена серия экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;max\_eps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
[[file:correct_result.png|thumb|center|700px|Зависимость времени выполнения от размера матрицы и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов подтверждают корректность и эффективность MPI-реализации : &lt;br /&gt;
* Время выполнения растёт пропорционально квадрату размера сетки, демонстрируя сложность &amp;lt;math&amp;gt;O(N²)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Алгоритм хорошо масштабируется: для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4096 использование 28 процессов ускоряет вычисления в 20 раз по сравнению с последовательной версией. &lt;br /&gt;
* Значения контрольной суммы сохраняются при любом количестве процессов, что подтверждает корректность обмена данными. &lt;br /&gt;
* Наилучшая эффективность достигается при балансе между объёмом вычислений на процесс и затратами на коммуникации.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
# Самарский А. А., Гулин А. В. Численные методы. - M.: Наука, 1989.&lt;br /&gt;
# Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
# Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
# Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Correct_result.png&amp;diff=30304</id>
		<title>Файл:Correct result.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Correct_result.png&amp;diff=30304"/>
		<updated>2025-12-09T02:53:36Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Result_of_method.png&amp;diff=30303</id>
		<title>Файл:Result of method.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Result_of_method.png&amp;diff=30303"/>
		<updated>2025-12-09T02:29:43Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30302</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30302"/>
		<updated>2025-12-09T02:19:23Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: /* Информационный граф алгоритма */&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;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом Якоби:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма состоит из четырёх групп вершин, расположенных в целочисленных узлах областей различной размерности.&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|1150px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
1) Первая группа вершин (входные данные и инициализация) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в двумерной области с координатами &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Диапазоны изменения координат: &amp;lt;math&amp;gt;i ∈ [0, N−1] , j ∈ [0, N−1]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Операция:  &lt;br /&gt;
* если &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i = N−1&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = N−1&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;A[i][j] = 0&amp;lt;/math&amp;gt; (граничные условия),  &lt;br /&gt;
* иначе &amp;lt;math&amp;gt;A[i][j] = 1 + i + j&amp;lt;/math&amp;gt; (начальное приближение внутри области).  &lt;br /&gt;
&lt;br /&gt;
Результат: элементы массива &amp;lt;math&amp;gt;A[i][j]&amp;lt;/math&amp;gt; на итерации 0.  &lt;br /&gt;
Все вершины этой группы являются источниками (входными данными алгоритма).  &lt;br /&gt;
На рисунке соответствуют синим прямоугольникам слева с надписью &amp;lt;math&amp;gt;A[i][j]⁽⁰⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Вторая группа вершин (релаксация — вычисление нового слоя) : &lt;br /&gt;
 &lt;br /&gt;
Расположена в трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
Диапазоны изменения координат:  &lt;br /&gt;
&amp;lt;math&amp;gt;i ∈ [1, N−2] , j ∈ [1, N−2] ,  k ∈ [1, it\_max]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — номер выполненной итерации.  &lt;br /&gt;
&lt;br /&gt;
Соответствующая операция:  &lt;br /&gt;
&amp;lt;math&amp;gt;B[i][j] = (A[i−1][j] + A[i+1][j] + A[i][j−1] + A[i][j+1]) / 4.0&amp;lt;/math&amp;gt;&lt;br /&gt;
(усреднение по четырём соседям — шаблон «крест»).&lt;br /&gt;
&lt;br /&gt;
Аргументы операции:  &lt;br /&gt;
четыре значения &amp;lt;math&amp;gt;A[⋅][⋅]&amp;lt;/math&amp;gt; с предыдущего слоя (итерации &amp;lt;math&amp;gt;k−1&amp;lt;/math&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания: элемент нового слоя &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
На рисунке — зелёные блоки с надписью &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3) Третья группа вершин (вычисление невязки и обновление &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в той же трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Операция выполняется сразу после второй группы на той же итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;e = |A[i][j]⁽ᵏ⁻¹⁾ − B[i][j]⁽ᵏ⁾|&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;eps⁽ᵏ⁾ = max(eps⁽ᵏ⁾, e)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы: значения &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁻¹⁾&amp;lt;/math&amp;gt; из первой группы вершин и &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt; из второй группы вершин.  &lt;br /&gt;
&lt;br /&gt;
Результат:  &lt;br /&gt;
* обновлённое значение &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;, которое будет использовано на следующей итерации,  &lt;br /&gt;
* вклад в глобальную норму невязки &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На рисунке — жёлтые блоки с надписями вида &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4) Четвёртая группа вершин (условия завершения) :&lt;br /&gt;
  &lt;br /&gt;
Состоит из двух типов вершин скалярной размерности (координата &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Вершины сравнения &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt; :&lt;br /&gt;
** Координата &amp;lt;math&amp;gt;k ∈ [1, it\_max]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** Аргумент — накопленное на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** На рисунке — фиолетовые овалы с надписью &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вершина проверки числа итераций &amp;lt;math&amp;gt;iteration = it\_max&amp;lt;/math&amp;gt; : На рисунке — красный прямоугольник справа.&lt;br /&gt;
&lt;br /&gt;
Обе вершины являются стоками-условиями (управляющие вершины).  &lt;br /&gt;
При выполнении любого из условий (YES) происходит выход из цикла (break).  &lt;br /&gt;
При невыполнении обоих условий (NO) алгоритм переходит к следующей итерации &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, граф имеет ярко выраженную волновую структуру по итерациям &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, с полным барьером синхронизации в конце каждой итерации (все элементы нового слоя должны быть вычислены перед подсчётом невязки и переходом к следующей итерации).&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения полных результатов необходимо провести серию экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;max\_eps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
Результаты:&lt;br /&gt;
* Ускорение работы с ростом числа процессов (до определённого предела)&lt;br /&gt;
* Увеличение времени выполнения с ростом N&lt;br /&gt;
* Зависимость числа итераций от точности и размера сетки&lt;br /&gt;
* Накладные расходы на коммуникации в MPI-версии&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
# Самарский А. А., Гулин А. В. Численные методы. - M.: Наука, 1989.&lt;br /&gt;
# Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
# Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
# Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30301</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30301"/>
		<updated>2025-12-09T01:50:47Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &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;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом Якоби:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|1150px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
1) Первая группа вершин (входные данные и инициализация) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в двумерной области с координатами &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Диапазоны изменения координат: &amp;lt;math&amp;gt;i ∈ [0, N−1] , j ∈ [0, N−1]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Операция:  &lt;br /&gt;
* если &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i = N−1&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = 0&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;j = N−1&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;A[i][j] = 0&amp;lt;/math&amp;gt; (граничные условия),  &lt;br /&gt;
* иначе &amp;lt;math&amp;gt;A[i][j] = 1 + i + j&amp;lt;/math&amp;gt; (начальное приближение внутри области).  &lt;br /&gt;
&lt;br /&gt;
Результат: элементы массива &amp;lt;math&amp;gt;A[i][j]&amp;lt;/math&amp;gt; на итерации 0.  &lt;br /&gt;
Все вершины этой группы являются источниками (входными данными алгоритма).  &lt;br /&gt;
На рисунке соответствуют синим прямоугольникам слева с надписью &amp;lt;math&amp;gt;A[i][j]⁽⁰⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Вторая группа вершин (релаксация — вычисление нового слоя) : &lt;br /&gt;
 &lt;br /&gt;
Расположена в трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
Диапазоны изменения координат:  &lt;br /&gt;
&amp;lt;math&amp;gt;i ∈ [1, N−2] , j ∈ [1, N−2] ,  k ∈ [1, it\_max]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — номер выполненной итерации.  &lt;br /&gt;
&lt;br /&gt;
Соответствующая операция:  &lt;br /&gt;
&amp;lt;math&amp;gt;B[i][j] = (A[i−1][j] + A[i+1][j] + A[i][j−1] + A[i][j+1]) / 4.0&amp;lt;/math&amp;gt;&lt;br /&gt;
(усреднение по четырём соседям — шаблон «крест»).&lt;br /&gt;
&lt;br /&gt;
Аргументы операции:  &lt;br /&gt;
четыре значения &amp;lt;math&amp;gt;A[⋅][⋅]&amp;lt;/math&amp;gt; с предыдущего слоя (итерации &amp;lt;math&amp;gt;k−1&amp;lt;/math&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания: элемент нового слоя &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
На рисунке — зелёные блоки с надписью &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3) Третья группа вершин (вычисление невязки и обновление &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) :&lt;br /&gt;
 &lt;br /&gt;
Расположена в той же трёхмерной области с координатами &amp;lt;math&amp;gt;(i, j, k)&amp;lt;/math&amp;gt;.  &lt;br /&gt;
Операция выполняется сразу после второй группы на той же итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;e = |A[i][j]⁽ᵏ⁻¹⁾ − B[i][j]⁽ᵏ⁾|&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;eps⁽ᵏ⁾ = max(eps⁽ᵏ⁾, e)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы: значения &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁻¹⁾&amp;lt;/math&amp;gt; из первой группы вершин и &amp;lt;math&amp;gt;B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt; из второй группы вершин.  &lt;br /&gt;
&lt;br /&gt;
Результат:  &lt;br /&gt;
* обновлённое значение &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;, которое будет использовано на следующей итерации,  &lt;br /&gt;
* вклад в глобальную норму невязки &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На рисунке — жёлтые блоки с надписями вида &amp;lt;math&amp;gt;A[i][j]⁽ᵏ⁾ = B[i][j]⁽ᵏ⁾&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4) Четвёртая группа вершин (условия завершения) :&lt;br /&gt;
  &lt;br /&gt;
Состоит из двух типов вершин скалярной размерности (координата &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Вершины сравнения &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt; :&lt;br /&gt;
** Координата &amp;lt;math&amp;gt;k ∈ [1, it\_max]&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** Аргумент — накопленное на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;eps⁽ᵏ⁾&amp;lt;/math&amp;gt;.  &lt;br /&gt;
** На рисунке — фиолетовые овалы с надписью &amp;lt;math&amp;gt;eps⁽ᵏ⁾ &amp;lt; max\_eps&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вершина проверки числа итераций &amp;lt;math&amp;gt;iteration = it\_max&amp;lt;/math&amp;gt; : На рисунке — красный прямоугольник справа.&lt;br /&gt;
&lt;br /&gt;
Обе вершины являются стоками-условиями (управляющие вершины).  &lt;br /&gt;
При выполнении любого из условий (YES) происходит выход из цикла (break).  &lt;br /&gt;
При невыполнении обоих условий (NO) алгоритм переходит к следующей итерации &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, граф имеет ярко выраженную волновую структуру по итерациям &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, с полным барьером синхронизации в конце каждой итерации (все элементы нового слоя должны быть вычислены перед подсчётом невязки и переходом к следующей итерации).&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения полных результатов необходимо провести серию экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;max\_eps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
Результаты:&lt;br /&gt;
* Ускорение работы с ростом числа процессов (до определённого предела)&lt;br /&gt;
* Увеличение времени выполнения с ростом N&lt;br /&gt;
* Зависимость числа итераций от точности и размера сетки&lt;br /&gt;
* Накладные расходы на коммуникации в MPI-версии&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
# Самарский А. А., Гулин А. В. Численные методы. - M.: Наука, 1989.&lt;br /&gt;
# Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
# Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
# Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30300</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30300"/>
		<updated>2025-12-09T00:37:13Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &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;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом Якоби:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма представляет собой регулярную структуру:&lt;br /&gt;
&lt;br /&gt;
[[file:information_graph.png|thumb|center|970px|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4 , &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения полных результатов необходимо провести серию экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;maxeps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
Результаты:&lt;br /&gt;
* Ускорение работы с ростом числа процессов (до определённого предела)&lt;br /&gt;
* Увеличение времени выполнения с ростом N&lt;br /&gt;
* Зависимость числа итераций от точности и размера сетки&lt;br /&gt;
* Накладные расходы на коммуникации в MPI-версии&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
1. Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
&lt;br /&gt;
2. Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
&lt;br /&gt;
3. Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
&lt;br /&gt;
4. Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30299</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30299"/>
		<updated>2025-12-09T00:31:09Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &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;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом Якоби:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма представляет собой регулярную структуру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:information_graph.png|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4, &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:information_graph.png|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4, &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения полных результатов необходимо провести серию экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;maxeps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
Результаты:&lt;br /&gt;
* Ускорение работы с ростом числа процессов (до определённого предела)&lt;br /&gt;
* Увеличение времени выполнения с ростом N&lt;br /&gt;
* Зависимость числа итераций от точности и размера сетки&lt;br /&gt;
* Накладные расходы на коммуникации в MPI-версии&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
1. Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
&lt;br /&gt;
2. Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
&lt;br /&gt;
3. Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
&lt;br /&gt;
4. Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30297</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=30297"/>
		<updated>2025-12-09T00:18:34Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &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;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (матрица значений)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.&lt;br /&gt;
&lt;br /&gt;
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходная задача: решение уравнения Лапласа  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
в прямоугольной области &amp;lt;math&amp;gt;[0,1]\times[0,1]&amp;lt;/math&amp;gt; с нулевыми граничными условиями.&lt;br /&gt;
&lt;br /&gt;
Дискретизация на равномерной сетке &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;h = 1/(N-1)&amp;lt;/math&amp;gt; приводит к системе линейных уравнений, которая решается методом Якоби:&lt;br /&gt;
&lt;br /&gt;
Для каждого внутреннего узла &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; на итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4}&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;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}&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;
u_{i,j}^{(0)} = 1 + i + j&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;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для каждой внутренней точки на каждой итерации выполняется:&lt;br /&gt;
* 4 чтения значений соседей&lt;br /&gt;
* 3 операции сложения&lt;br /&gt;
* 1 операция деления&lt;br /&gt;
* 1 запись нового значения&lt;br /&gt;
* 1 операция вычисления погрешности (разности между старым и новым значением)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет итерационную структуру:&lt;br /&gt;
&lt;br /&gt;
# Инициализация матрицы (граничные условия + начальное приближение)&lt;br /&gt;
# Для каждой итерации:&lt;br /&gt;
## Вычисление новых значений для всех внутренних точек (релаксация)&lt;br /&gt;
## Обновление матрицы&lt;br /&gt;
## Вычисление максимальной погрешности&lt;br /&gt;
## Проверка условия сходимости&lt;br /&gt;
# Вычисление контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.&lt;br /&gt;
* Цикл по итерациям:&lt;br /&gt;
   ```c&lt;br /&gt;
   for (it = 1; it &amp;lt;= itmax; it++) {&lt;br /&gt;
       eps = 0.0;&lt;br /&gt;
       relax();     // Вычисление B[i][j] как среднее соседей из A&lt;br /&gt;
       resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности&lt;br /&gt;
       if (eps &amp;lt; maxeps) break;&lt;br /&gt;
   }&lt;br /&gt;
   ```&lt;br /&gt;
* Вычисление и вывод контрольной суммы&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для сетки размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt;:&lt;br /&gt;
* Каждая итерация требует &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Количество итераций зависит от сходимости, ограничено `itmax`&lt;br /&gt;
* Общая сложность: &amp;lt;math&amp;gt;O(it\_max \cdot N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конкретно для каждой внутренней точки на каждой итерации:&lt;br /&gt;
* 4 операции чтения&lt;br /&gt;
* 3 сложения&lt;br /&gt;
* 1 деление&lt;br /&gt;
* 1 запись&lt;br /&gt;
* 1 вычитание и взятие модуля для погрешности&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма представляет собой регулярную структуру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:information_graph.png|Информационный граф метода релаксации для &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 4, &amp;lt;math&amp;gt;max\_it&amp;lt;/math&amp;gt; = 2&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает высоким потенциалом параллелизма:&lt;br /&gt;
* На каждой итерации все внутренние точки могут обновляться независимо&lt;br /&gt;
* Высота ЯПФ: &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt; (последовательные итерации)&lt;br /&gt;
* Ширина ЯПФ: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; (все точки могут обрабатываться параллельно на одной итерации)&lt;br /&gt;
&lt;br /&gt;
В MPI-реализации:&lt;br /&gt;
* Сетка разбивается на горизонтальные полосы&lt;br /&gt;
* Каждый процесс обрабатывает свою полосу&lt;br /&gt;
* Необходим обмен граничными строками между соседними процессами&lt;br /&gt;
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* Размер сетки &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; (целое число)&lt;br /&gt;
* Матрица значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N \times N&amp;lt;/math&amp;gt; (вещественные числа)&lt;br /&gt;
* Параметры: maxeps (точность), itmax (максимальное число итераций)&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с решением (вещественные числа)&lt;br /&gt;
* Контрольная сумма &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; (вещественное число)&lt;br /&gt;
* Число выполненных итераций (целое)&lt;br /&gt;
* Время выполнения (в параллельной версии)&lt;br /&gt;
&lt;br /&gt;
Объём данных: &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.&lt;br /&gt;
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; для достижения заданной точности.&lt;br /&gt;
# Устойчивость: Алгоритм устойчив к ошибкам округления.&lt;br /&gt;
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.&lt;br /&gt;
# Вычислительная мощность: Отношение числа операций к объёму данных составляет &amp;lt;math&amp;gt;O(it\_max)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной реализации:&lt;br /&gt;
# Используются две матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; для хранения значений на текущей и предыдущей итерациях.&lt;br /&gt;
# Граничные условия заданы нулевыми.&lt;br /&gt;
# Начальное приближение: &amp;lt;math&amp;gt;A[i][j] = 1.0 + i + j&amp;lt;/math&amp;gt; для внутренних точек.&lt;br /&gt;
# Реализован режим вычисления максимальной погрешности для контроля сходимости.&lt;br /&gt;
# Контрольная сумма вычисляется по формуле, включающей веса &amp;lt;math&amp;gt;(i+1)(j+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ключевые особенности:&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Вычисление нового значения&lt;br /&gt;
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;&lt;br /&gt;
    // Обновление и вычисление погрешности&lt;br /&gt;
    e = fabs(A[i][j] - B[i][j]);&lt;br /&gt;
    A[i][j] = B[i][j];&lt;br /&gt;
    eps = Max(eps, e);&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MPI-реализация включает следующие особенности:&lt;br /&gt;
&lt;br /&gt;
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.&lt;br /&gt;
* Распределение нагрузки: При неравномерном разбиении (когда &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не кратно числу процессов) первые процессы получают на одну строку больше.&lt;br /&gt;
* Обмен граничными данными: Используются неблокирующие операции &amp;lt;math&amp;gt;MPI\_Isend / MPI\_Irecv&amp;lt;/math&amp;gt; для перекрытия вычислений и коммуникаций.&lt;br /&gt;
* Вычисление погрешности: Локальные погрешности собираются с помощью &amp;lt;math&amp;gt;MPI\_Allreduce&amp;lt;/math&amp;gt; для нахождения глобального максимума.&lt;br /&gt;
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью &amp;lt;math&amp;gt;MPI\_Reduce&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    ```c&lt;br /&gt;
    // Обмен граничными строками&lt;br /&gt;
    if (rank &amp;gt; 0) {&lt;br /&gt;
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    if (rank &amp;lt; size-1) {&lt;br /&gt;
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &amp;amp;req[req_count++]);&lt;br /&gt;
    }&lt;br /&gt;
    ```&lt;br /&gt;
&lt;br /&gt;
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.&lt;br /&gt;
* Измерение времени: Использование &amp;lt;math&amp;gt;MPI\_Wtime&amp;lt;/math&amp;gt; для точного измерения времени выполнения.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов===&lt;br /&gt;
&lt;br /&gt;
Для получения полных результатов необходимо провести серию экспериментов с различными:&lt;br /&gt;
# Размерами сетки ( &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = 512, 1024, 2048, 4096 )&lt;br /&gt;
# Количеством процессов ( 1, 2, 3, ... , 28 )&lt;br /&gt;
# Параметрами точности ( &amp;lt;math&amp;gt;maxeps&amp;lt;/math&amp;gt; = 0.1e-7 )&lt;br /&gt;
&lt;br /&gt;
Результаты:&lt;br /&gt;
* Ускорение работы с ростом числа процессов (до определённого предела)&lt;br /&gt;
* Увеличение времени выполнения с ростом N&lt;br /&gt;
* Зависимость числа итераций от точности и размера сетки&lt;br /&gt;
* Накладные расходы на коммуникации в MPI-версии&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
1. Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.&lt;br /&gt;
&lt;br /&gt;
2. Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes: The Art of Scientific Computing. — 3rd ed. — Cambridge University Press, 2007.&lt;br /&gt;
&lt;br /&gt;
3. Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.&lt;br /&gt;
&lt;br /&gt;
4. Документация по MPI: https://www.mpi-forum.org/docs/&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Information_graph.png&amp;diff=30295</id>
		<title>Файл:Information graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Information_graph.png&amp;diff=30295"/>
		<updated>2025-12-09T00:16:05Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=29956</id>
		<title>Метод релаксации матрицы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BB%D0%B0%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=29956"/>
		<updated>2025-11-05T10:08:30Z</updated>

		<summary type="html">&lt;p&gt;Овсиенко Олеся: Новая страница: «&amp;#039;&amp;#039;417 группа, ММП ВМК МГУ&amp;#039;&amp;#039;&amp;lt;br&amp;gt; &amp;#039;&amp;#039;Овсиенко Олеся Павловна&amp;#039;&amp;#039;&amp;lt;br&amp;gt;  == Математическая постановка мето...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;417 группа, ММП ВМК МГУ&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Овсиенко Олеся Павловна&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическая постановка метода релаксации матрицы ==&lt;br /&gt;
&lt;br /&gt;
Требуется численно решить краевую задачу для уравнения Лапласа на прямоугольной области:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0, \quad (x,y) \in \Omega = [0,1] \times [0,1]&lt;br /&gt;
&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;
u(x,y) = g(x,y), \quad (x,y) \in \partial\Omega,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\partial\Omega&amp;lt;/math&amp;gt; — граница области.&lt;br /&gt;
&lt;br /&gt;
==== Дискретизация задачи ====&lt;br /&gt;
&lt;br /&gt;
Вводится равномерная сетка с шагом &amp;lt;math&amp;gt;h = \frac{1}{N-1}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_i = i \cdot h, \quad y_j = j \cdot h, \quad i,j = 0, 1, \dots, N-1.&lt;br /&gt;
&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{u_{i-1,j} - 2u_{i,j} + u_{i+1,j}}{h^2} + \frac{u_{i,j-1} - 2u_{i,j} + u_{i,j+1}}{h^2} = 0,&lt;br /&gt;
&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;
u_{i,j} = \frac{u_{i-1,j} + u_{i+1,j} + u_{i,j-1} + u_{i,j+1}}{4}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Итерационный метод решения ====&lt;br /&gt;
&lt;br /&gt;
Для решения полученной системы линейных уравнений используется метод Якоби (релаксации). На каждой итерации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; новые значения вычисляются как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_{i,j}^{(k)} = \frac{u_{i-1,j}^{(k-1)} + u_{i+1,j}^{(k-1)} + u_{i,j-1}^{(k-1)} + u_{i,j+1}^{(k-1)}}{4},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;i,j = 1, 2, \dots, N-2&amp;lt;/math&amp;gt; — индексы внутренних узлов.&lt;br /&gt;
&lt;br /&gt;
==== Критерий остановки ====&lt;br /&gt;
&lt;br /&gt;
Итерационный процесс прекращается, когда максимальное изменение между итерациями становится меньше заданной точности:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| &amp;lt; \varepsilon_{\text{max}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Начальные и граничные условия ====&lt;br /&gt;
&lt;br /&gt;
В конкретной реализации:&lt;br /&gt;
* Граничные условия: &amp;lt;math&amp;gt;u_{0,j} = u_{N-1,j} = u_{i,0} = u_{i,N-1} = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Начальное приближение для внутренних точек: &amp;lt;math&amp;gt;u_{i,j}^{(0)} = 1 + i + j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Контроль корректности ====&lt;br /&gt;
&lt;br /&gt;
Для верификации результата вычисляется контрольная сумма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (j+1) \cdot (i+1),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которая должна совпадать для всех корректных реализаций алгоритма.&lt;/div&gt;</summary>
		<author><name>Овсиенко Олеся</name></author>
	</entry>
</feed>