Уровень алгоритма

Метод релаксации матрицы: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Новая страница: «''417 группа, ММП ВМК МГУ''<br> ''Овсиенко Олеся Павловна''<br> == Математическая постановка мето...»
 
Нет описания правки
Строка 1: Строка 1:
''417 группа, ММП ВМК МГУ''<br>
''Овсиенко Олеся Павловна''<br>


== Математическая постановка метода релаксации матрицы ==
{{algorithm
| name              = Метод релаксации для уравнения Лапласа
| serial_complexity = <math>O(it\_max \cdot N^2)</math>
| pf_height        = <math>O(it\_max)</math>
| pf_width          = <math>O(N^2)</math>
| input_data        = <math>N^2</math> (матрица значений)
| output_data      = <math>N^2</math> (матрица значений)
}}


Требуется численно решить краевую задачу для уравнения Лапласа на прямоугольной области:


== Свойства и структура алгоритма ==
=== Общее описание алгоритма ===
Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.
Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.
=== Математическое описание алгоритма ===
Исходная задача: решение уравнения Лапласа 
<math>
<math>
\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]
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0
</math>
</math> 
в прямоугольной области <math>[0,1]\times[0,1]</math> с нулевыми граничными условиями.


с граничными условиями Дирихле:
Дискретизация на равномерной сетке <math>N \times N</math> с шагом <math>h = 1/(N-1)</math> приводит к системе линейных уравнений, которая решается методом Якоби:


Для каждого внутреннего узла <math>(i,j)</math> на итерации <math>k</math>:
<math>
<math>
u(x,y) = g(x,y), \quad (x,y) \in \partial\Omega,
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}
</math>
</math>


где <math>\partial\Omega</math> — граница области.
Критерий остановки:
<math>
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| < \varepsilon_{\text{max}}
</math>


==== Дискретизация задачи ====
Начальное приближение для внутренних точек:
 
<math>
Вводится равномерная сетка с шагом <math>h = \frac{1}{N-1}</math>:
u_{i,j}^{(0)} = 1 + i + j
</math>


Контрольная сумма для верификации:
<math>
<math>
x_i = i \cdot h, \quad y_j = j \cdot h, \quad i,j = 0, 1, \dots, N-1.
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1)
</math>
</math>


Аппроксимируя вторые производные конечными разностями, получаем дискретный аналог уравнения Лапласа для внутренних узлов сетки:
=== Вычислительное ядро алгоритма ===


Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки:
<math>
<math>
\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,
\text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4}
</math>
</math>


что после преобразования даёт:
Для каждой внутренней точки на каждой итерации выполняется:
* 4 чтения значений соседей
* 3 операции сложения
* 1 операция деления
* 1 запись нового значения
* 1 операция вычисления погрешности (разности между старым и новым значением)
 
=== Макроструктура алгоритма ===
 
Алгоритм имеет итерационную структуру:
 
# Инициализация матрицы (граничные условия + начальное приближение)
# Для каждой итерации:
## Вычисление новых значений для всех внутренних точек (релаксация)
## Обновление матрицы
## Вычисление максимальной погрешности
## Проверка условия сходимости
# Вычисление контрольной суммы
 
=== Схема реализации последовательного алгоритма ===
 
* Инициализация матрицы A граничными условиями и начальными значениями,  инициализация матрицы B нулями.
* Цикл по итерациям:
  ```c
  for (it = 1; it <= itmax; it++) {
      eps = 0.0;
      relax();    // Вычисление B[i][j] как среднее соседей из A
      resid();    // Обновление A[i][j] = B[i][j], вычисление погрешности
      if (eps < maxeps) break;
  }
  ```
* Вычисление и вывод контрольной суммы
 
=== Последовательная сложность алгоритма ===
 
Для сетки размером <math>N \times N</math>:
* Каждая итерация требует <math>O(N^2)</math> операций
* Количество итераций зависит от сходимости, ограничено `itmax`
* Общая сложность: <math>O(it\_max \cdot N^2)</math>
 
Конкретно для каждой внутренней точки на каждой итерации:
* 4 операции чтения
* 3 сложения
* 1 деление
* 1 запись
* 1 вычитание и взятие модуля для погрешности
 
=== Информационный граф ===
 
Граф алгоритма представляет собой регулярную структуру:
 
<gallery>
File:information_graph.png|Информационный граф метода релаксации для <math>N</math> = 4, <math>max\_it</math> = 2
</gallery>
 
=== Ресурс параллелизма алгоритма ===
 
Алгоритм обладает высоким потенциалом параллелизма:
* На каждой итерации все внутренние точки могут обновляться независимо
* Высота ЯПФ: <math>O(it\_max)</math> (последовательные итерации)
* Ширина ЯПФ: <math>O(N^2)</math> (все точки могут обрабатываться параллельно на одной итерации)
 
В MPI-реализации:
* Сетка разбивается на горизонтальные полосы
* Каждый процесс обрабатывает свою полосу
* Необходим обмен граничными строками между соседними процессами
* Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций
 
=== Входные и выходные данные алгоритма ===
 
Входные данные:
* Размер сетки <math>N</math> (целое число)
* Матрица значений <math>A</math> размером <math>N \times N</math> (вещественные числа)
* Параметры: maxeps (точность), itmax (максимальное число итераций)
 
Выходные данные:
* Матрица <math>A</math> с решением (вещественные числа)
* Контрольная сумма <math>S</math> (вещественное число)
* Число выполненных итераций (целое)
* Время выполнения (в параллельной версии)
 
Объём данных: <math>O(N^2)</math>
 
=== Свойства алгоритма ===
 
# Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.
# Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально <math>N^2</math> для достижения заданной точности.
# Устойчивость: Алгоритм устойчив к ошибкам округления.
# Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.
# Вычислительная мощность: Отношение числа операций к объёму данных составляет <math>O(it\_max)</math>.
 
== Программная реализация алгоритма ==
 
=== Особенности реализации последовательного алгоритма ===
 
В последовательной реализации:
# Используются две матрицы <math>A</math> и <math>B</math> для хранения значений на текущей и предыдущей итерациях.
# Граничные условия заданы нулевыми.
# Начальное приближение: <math>A[i][j] = 1.0 + i + j</math> для внутренних точек.
# Реализован режим вычисления максимальной погрешности для контроля сходимости.
# Контрольная сумма вычисляется по формуле, включающей веса <math>(i+1)(j+1)</math>.
 
Ключевые особенности:
 
    ```c
    // Вычисление нового значения
    B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;
    // Обновление и вычисление погрешности
    e = fabs(A[i][j] - B[i][j]);
    A[i][j] = B[i][j];
    eps = Max(eps, e);
    ```


<math>
=== Возможные способы и особенности параллельной реализации алгоритма ===
u_{i,j} = \frac{u_{i-1,j} + u_{i+1,j} + u_{i,j-1} + u_{i,j+1}}{4}.
</math>


==== Итерационный метод решения ====
MPI-реализация включает следующие особенности:


Для решения полученной системы линейных уравнений используется метод Якоби (релаксации). На каждой итерации <math>k</math> новые значения вычисляются как:
* Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.
* Распределение нагрузки: При неравномерном разбиении (когда <math>N</math> не кратно числу процессов) первые процессы получают на одну строку больше.
* Обмен граничными данными: Используются неблокирующие операции <math>MPI\_Isend / MPI\_Irecv</math> для перекрытия вычислений и коммуникаций.
* Вычисление погрешности: Локальные погрешности собираются с помощью <math>MPI\_Allreduce</math> для нахождения глобального максимума.
* Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью <math>MPI\_Reduce</math>.


<math>
    ```c
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},
    // Обмен граничными строками
</math>
    if (rank > 0) {
        MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &req[req_count++]);
        MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &req[req_count++]);
    }
    if (rank < size-1) {
        MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &req[req_count++]);
        MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &req[req_count++]);
    }
    ```


где <math>i,j = 1, 2, \dots, N-2</math> — индексы внутренних узлов.
* Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.
* Измерение времени: Использование <math>MPI\_Wtime</math> для точного измерения времени выполнения.


==== Критерий остановки ====
=== Результаты прогонов===


Итерационный процесс прекращается, когда максимальное изменение между итерациями становится меньше заданной точности:
Для получения полных результатов необходимо провести серию экспериментов с различными:
# Размерами сетки ( <math>N</math> = 512, 1024, 2048, 4096 )
# Количеством процессов ( 1, 2, 3, ... , 28 )
# Параметрами точности ( <math>maxeps</math> = 0.1e-7 )


<math>
Результаты:
\max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| < \varepsilon_{\text{max}}.
* Ускорение работы с ростом числа процессов (до определённого предела)
</math>
* Увеличение времени выполнения с ростом N
* Зависимость числа итераций от точности и размера сетки
* Накладные расходы на коммуникации в MPI-версии


==== Начальные и граничные условия ====


В конкретной реализации:
== Литература ==
* Граничные условия: <math>u_{0,j} = u_{N-1,j} = u_{i,0} = u_{i,N-1} = 0</math>
* Начальное приближение для внутренних точек: <math>u_{i,j}^{(0)} = 1 + i + j</math>


==== Контроль корректности ====
1. Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.


Для верификации результата вычисляется контрольная сумма:
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.


<math>
3. Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.
S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (j+1) \cdot (i+1),
</math>


которая должна совпадать для всех корректных реализаций алгоритма.
4. Документация по MPI: https://www.mpi-forum.org/docs/

Версия от 00:18, 9 декабря 2025



Метод релаксации для уравнения Лапласа
Последовательный алгоритм
Последовательная сложность [math]\displaystyle{ O(it\_max \cdot N^2) }[/math]
Объём входных данных [math]\displaystyle{ N^2 }[/math] (матрица значений)
Объём выходных данных [math]\displaystyle{ N^2 }[/math] (матрица значений)
Параллельный алгоритм
Высота ярусно-параллельной формы [math]\displaystyle{ O(it\_max) }[/math]
Ширина ярусно-параллельной формы [math]\displaystyle{ O(N^2) }[/math]


Свойства и структура алгоритма

Общее описание алгоритма

Метод релаксации является одним из простейших итерационных методов решения уравнений в частных производных. В данной реализации он применяется для численного решения уравнения Лапласа на прямоугольной области с граничными условиями Дирихле. Алгоритм основан на дискретизации уравнения с использованием конечно-разностной схемы и последующем итеративном обновлении значений в узлах сетки до достижения заданной точности.

Метод широко используется в вычислительной физике для решения стационарных задач, таких как распределение потенциала, тепловое равновесие и др. Благодаря простоте реализации и естественному параллелизму (каждая точка сетки обновляется независимо на каждой итерации) алгоритм хорошо подходит для распараллеливания на многопроцессорных системах.

Математическое описание алгоритма

Исходная задача: решение уравнения Лапласа [math]\displaystyle{ \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0 }[/math] в прямоугольной области [math]\displaystyle{ [0,1]\times[0,1] }[/math] с нулевыми граничными условиями.

Дискретизация на равномерной сетке [math]\displaystyle{ N \times N }[/math] с шагом [math]\displaystyle{ h = 1/(N-1) }[/math] приводит к системе линейных уравнений, которая решается методом Якоби:

Для каждого внутреннего узла [math]\displaystyle{ (i,j) }[/math] на итерации [math]\displaystyle{ k }[/math]: [math]\displaystyle{ 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} }[/math]

Критерий остановки: [math]\displaystyle{ \max_{i,j} |u_{i,j}^{(k)} - u_{i,j}^{(k-1)}| \lt \varepsilon_{\text{max}} }[/math]

Начальное приближение для внутренних точек: [math]\displaystyle{ u_{i,j}^{(0)} = 1 + i + j }[/math]

Контрольная сумма для верификации: [math]\displaystyle{ S = \frac{1}{N^2} \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} u_{i,j} \cdot (i+1) \cdot (j+1) }[/math]

Вычислительное ядро алгоритма

Вычислительное ядро алгоритма состоит из операций обновления значений во внутренних узлах сетки: [math]\displaystyle{ \text{new_val} = \frac{\text{left} + \text{right} + \text{top} + \text{bottom}}{4} }[/math]

Для каждой внутренней точки на каждой итерации выполняется:

  • 4 чтения значений соседей
  • 3 операции сложения
  • 1 операция деления
  • 1 запись нового значения
  • 1 операция вычисления погрешности (разности между старым и новым значением)

Макроструктура алгоритма

Алгоритм имеет итерационную структуру:

  1. Инициализация матрицы (граничные условия + начальное приближение)
  2. Для каждой итерации:
    1. Вычисление новых значений для всех внутренних точек (релаксация)
    2. Обновление матрицы
    3. Вычисление максимальной погрешности
    4. Проверка условия сходимости
  3. Вычисление контрольной суммы

Схема реализации последовательного алгоритма

  • Инициализация матрицы A граничными условиями и начальными значениями, инициализация матрицы B нулями.
  • Цикл по итерациям:
  ```c
  for (it = 1; it <= itmax; it++) {
      eps = 0.0;
      relax();     // Вычисление B[i][j] как среднее соседей из A
      resid();     // Обновление A[i][j] = B[i][j], вычисление погрешности
      if (eps < maxeps) break;
  }
  ```
  • Вычисление и вывод контрольной суммы

Последовательная сложность алгоритма

Для сетки размером [math]\displaystyle{ N \times N }[/math]:

  • Каждая итерация требует [math]\displaystyle{ O(N^2) }[/math] операций
  • Количество итераций зависит от сходимости, ограничено `itmax`
  • Общая сложность: [math]\displaystyle{ O(it\_max \cdot N^2) }[/math]

Конкретно для каждой внутренней точки на каждой итерации:

  • 4 операции чтения
  • 3 сложения
  • 1 деление
  • 1 запись
  • 1 вычитание и взятие модуля для погрешности

Информационный граф

Граф алгоритма представляет собой регулярную структуру:

Ресурс параллелизма алгоритма

Алгоритм обладает высоким потенциалом параллелизма:

  • На каждой итерации все внутренние точки могут обновляться независимо
  • Высота ЯПФ: [math]\displaystyle{ O(it\_max) }[/math] (последовательные итерации)
  • Ширина ЯПФ: [math]\displaystyle{ O(N^2) }[/math] (все точки могут обрабатываться параллельно на одной итерации)

В MPI-реализации:

  • Сетка разбивается на горизонтальные полосы
  • Каждый процесс обрабатывает свою полосу
  • Необходим обмен граничными строками между соседними процессами
  • Используются неблокирующие операции MPI для перекрытия вычислений и коммуникаций

Входные и выходные данные алгоритма

Входные данные:

  • Размер сетки [math]\displaystyle{ N }[/math] (целое число)
  • Матрица значений [math]\displaystyle{ A }[/math] размером [math]\displaystyle{ N \times N }[/math] (вещественные числа)
  • Параметры: maxeps (точность), itmax (максимальное число итераций)

Выходные данные:

  • Матрица [math]\displaystyle{ A }[/math] с решением (вещественные числа)
  • Контрольная сумма [math]\displaystyle{ S }[/math] (вещественное число)
  • Число выполненных итераций (целое)
  • Время выполнения (в параллельной версии)

Объём данных: [math]\displaystyle{ O(N^2) }[/math]

Свойства алгоритма

  1. Детерминированность: При фиксированных входных данных и последовательном выполнении результат детерминирован.
  2. Сходимость: Метод сходится медленно (линейно), количество итераций пропорционально [math]\displaystyle{ N^2 }[/math] для достижения заданной точности.
  3. Устойчивость: Алгоритм устойчив к ошибкам округления.
  4. Масштабируемость: Хорошо масштабируется на параллельных системах благодаря локальности данных.
  5. Вычислительная мощность: Отношение числа операций к объёму данных составляет [math]\displaystyle{ O(it\_max) }[/math].

Программная реализация алгоритма

Особенности реализации последовательного алгоритма

В последовательной реализации:

  1. Используются две матрицы [math]\displaystyle{ A }[/math] и [math]\displaystyle{ B }[/math] для хранения значений на текущей и предыдущей итерациях.
  2. Граничные условия заданы нулевыми.
  3. Начальное приближение: [math]\displaystyle{ A[i][j] = 1.0 + i + j }[/math] для внутренних точек.
  4. Реализован режим вычисления максимальной погрешности для контроля сходимости.
  5. Контрольная сумма вычисляется по формуле, включающей веса [math]\displaystyle{ (i+1)(j+1) }[/math].

Ключевые особенности:

   ```c
   // Вычисление нового значения
   B[i][j] = (A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]) / 4.0;
   // Обновление и вычисление погрешности
   e = fabs(A[i][j] - B[i][j]);
   A[i][j] = B[i][j];
   eps = Max(eps, e);
   ```

Возможные способы и особенности параллельной реализации алгоритма

MPI-реализация включает следующие особенности:

  • Разбиение данных: Сетка разбивается на горизонтальные полосы, каждая обрабатывается отдельным процессом.
  • Распределение нагрузки: При неравномерном разбиении (когда [math]\displaystyle{ N }[/math] не кратно числу процессов) первые процессы получают на одну строку больше.
  • Обмен граничными данными: Используются неблокирующие операции [math]\displaystyle{ MPI\_Isend / MPI\_Irecv }[/math] для перекрытия вычислений и коммуникаций.
  • Вычисление погрешности: Локальные погрешности собираются с помощью [math]\displaystyle{ MPI\_Allreduce }[/math] для нахождения глобального максимума.
  • Вычисление контрольной суммы: Частичные суммы вычисляются на каждом процессе и собираются с помощью [math]\displaystyle{ MPI\_Reduce }[/math].
   ```c
   // Обмен граничными строками
   if (rank > 0) {
       MPI_Irecv(localA[0], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &req[req_count++]);
       MPI_Isend(localA[1], N, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, &req[req_count++]);
   }
   if (rank < size-1) {
       MPI_Irecv(localA[local_rows+1], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &req[req_count++]);
       MPI_Isend(localA[local_rows], N, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, &req[req_count++]);
   }
   ```
  • Оптимизация: Пропуск вычислений для граничных строк на первом и последнем процессах.
  • Измерение времени: Использование [math]\displaystyle{ MPI\_Wtime }[/math] для точного измерения времени выполнения.

Результаты прогонов

Для получения полных результатов необходимо провести серию экспериментов с различными:

  1. Размерами сетки ( [math]\displaystyle{ N }[/math] = 512, 1024, 2048, 4096 )
  2. Количеством процессов ( 1, 2, 3, ... , 28 )
  3. Параметрами точности ( [math]\displaystyle{ maxeps }[/math] = 0.1e-7 )

Результаты:

  • Ускорение работы с ростом числа процессов (до определённого предела)
  • Увеличение времени выполнения с ростом N
  • Зависимость числа итераций от точности и размера сетки
  • Накладные расходы на коммуникации в MPI-версии


Литература

1. Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. — М.: Наука, 1978.

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.

3. Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. — 3rd ed. — MIT Press, 2014.

4. Документация по MPI: https://www.mpi-forum.org/docs/