Участник:Bvdmitri/Адаптивное интегрирование
Основные авторы описания: Д.В.Багаев
Содержание
- 1 Свойства и структура алгоритма
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макростуктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Локальность данных и вычислений
- 2.3 Возможные способы и особенности параллельной реализации алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Адаптивное интегрирование — метод быстрого вычисления интеграла функции, который использует адаптивное изменение плотности сетки интегрирования. На промежутках, где функция гладкая, сетка разреженная, на промежутках со значительными колебаниями значений сетка гуще для получения необходимой точности.
1.2 Математическое описание алгоритма
Формулы метода:
- Интеграл функции вычисляется по квадратурной формуле Симпсона с числом узловых точек равным 4 и 8 на отрезке [math][a, b] [/math].
- Вычисляется разность найденных значений
- Если разность интегралов меньше либо равна желаемой точности интегрирования ε - заканчиваем процедуру.
- Если разность больше, то отрезок разбивается на два : [math][a, \tfrac{a + b} {2}][/math] и [math][\tfrac{a + b} {2}, b][/math] и для каждого отрезка повторяется процедура 1, затем возвращается сумма полученных значений.
Алгоритм имеет рекурсивную природу.
1.3 Вычислительное ядро алгоритма
Основное время работы алгоритма приходится на рекурсивные вызовы, а также на вычисление определенных интегралов методом Симпсона на отрезках, полученных в результате рекурсивного разбиения.
1.4 Макростуктура алгоритма
1.5 Схема реализации последовательного алгоритма
Простейшую рекурсивную реализацию данного алгоритма , которая не использует ресурсы параллелизма можно посмотреть здесь.
#include "SequentialMethod.h"
SequentialMethod::SequentialMethod(double eps, const std::function<double(double)> &f) : IntegrationMethod(eps, f) {}
double SequentialMethod::integrate(double a, double b) {
double x = simpson(a, b, 4);
double y = simpson(a, b, 8);
if (fabs(x - y) < eps) {
return y;
} else {
return integrate(a, (a + b) / 2.0) + integrate((a + b) / 2.0, b);
}
}
SequentialMethod::~SequentialMethod() {}
1.6 Последовательная сложность алгоритма
Явную формулу сложности последовательного алгоритма выписать не представляется возможным, так как сложность зависит от структуры интегрируемой функции, длины отрезка, а так же необходимой точности.
1.7 Информационный граф
У алгоритма есть несколько возможностей для распараллеливания.
В первом случае можно разбить отрезок на фиксированное число под-отрезков, и каждый под отрезок считать на одном процессоре с дальнейшим суммированием результатов с каждого процессора. Внутри процессора используется схема стека задач. Рекурсия заменяется на операции добавить и достать задачу из общего стека задач.
Во втором случае можно использовать управляющий узел для распределения задач между вычислительными узлами. В данном случае можно избежать ситуации, когда интегрируемая функция сильно осциллирует лишь на небольшом участке отрезка и большинство процессоров завершают свою работу раньше и ждут остальных.
1.8 Ресурс параллелизма алгоритма
1.9 Входные и выходные данные алгоритма
1.9.1 Входные данные
- Функция.
- Отрезок интегрирования [math][a, b][/math].
- Желаемая точность интегрирования [math]\varepsilon[/math].
1.9.2 Выходные данные
- Определенный интеграл функции на отрезке [a, b] с точностью ε.
1.10 Свойства алгоритма
- Алгоритм устроен таким образом, что шаг сетки необходимой для вычисления определенного интеграла с заданной точностью адаптируется под сложность функции.
- Алгоритм является детерминированным и устойчивым