Skip to content

Кутергин Валентин. Teхнология SEQ. Вычисление многомерных интегралов с использованием многошаговой схемы (метод прямоугольников). Вариант 9.#67

Open
VALancaster wants to merge 5 commits intolearning-process:masterfrom
VALancaster:kutergin_v_multidimensional_integration_rect_method_seq

Conversation

@VALancaster
Copy link

Описание

Задача: Вычисление многомерных интегралов с использованием многошаговой схемы (метод прямоугольников).
Вариант: 9
Технология: SEQ

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

Реализован последовательный алгоритм численного интегрирования функций произвольной размерности ($N$-мерных интегралов). Используется метод средних прямоугольников, который обеспечивает более высокую точность по сравнению с методами левых или правых прямоугольников за счет вычисления значения функции в центрах элементарных разбиений.

Принцип работы:
Алгоритм разбивает заданный гиперкуб интегрирования на сетку из элементарных гиперпрямоугольников. Общий объем (интеграл) вычисляется как сумма объемов этих элементов, где высота каждого элемента — это значение функции в его геометрическом центре.

Валидация:
Проверяется корректность входных данных:

  1. Количество пар границ интегрирования (limits) должно строго совпадать с количеством указанных шагов разбиения (n_steps).
  2. Векторы входных данных не должны быть пустыми (размерность интеграла $d \ge 1$).
  3. Количество шагов по каждой оси должно быть строго положительным ($n_i > 0$).

Предобработка:
Вычисляется элементарный гиперобъем (произведение шагов по всем осям): $dV = h_1 \cdot h_2 \cdot \dots \cdot h_N$. Данные сохраняются в локальные переменные класса для минимизации обращений к GetInput().

Вычисление (Рекурсивный подход):
Для поддержки произвольной размерности $N$ вместо жестко заданных вложенных циклов реализован рекурсивный обход расчетной сетки:

  • На каждом уровне рекурсии (соответствующем одной размерности) запускается цикл по количеству шагов $n_i$.
  • Вычисляется координата центра текущего шага по данной оси.
  • Если достигнута последняя размерность, вызывается пользовательская функция func и результат суммируется.
  • Если нет — происходит переход на следующий уровень рекурсии.

Постобработка:
Итоговая сумма, накопленная в ходе рекурсии, умножается на гиперобъем $dV$ и передается в выходной контейнер GetOutput().

Тестирование:
Функциональные тесты покрывают различные размерности:

  • 1D_Linear — интегрирование функции $f(x) = x$ (проверка базовой логики).
  • 2D_Linear — интегрирование функции $f(x, y) = x + y$ (проверка вложенности).
  • 3D_Constant — вычисление объема параллелепипеда (проверка работы с константой и 3D).
    Допустимая погрешность для тестов установлена на уровне 1e-4.

Производительность:
Тесты производительности выполняются на 3D интеграле функции средней сложности ($\sin(x) + \cos(y) + z$) с сеткой $200 \times 200 \times 200$. Это дает 8 000 000 итераций, что позволяет оценить базовое время работы алгоритма перед последующим внедрением параллельных технологий (OpenMP, TBB).


Чек-лист

  • Статус CI: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем kutergin_v_multidimensional_integration_rect_method
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant