Перейти к содержанию

ЛР 10. Численное интегрирование

Тема: Численное интегрирование методом левых прямоугольников, оптимизация через Cython и многопоточность

Цель работы

Реализовать численное интегрирование методом левых прямоугольников. Изучить способы оптимизации: Cython-компиляция и многопоточное выполнение.

Задание

  • Написать функцию integrate(f, a, b, n_iter) на чистом Python.
  • Написать Cython-версию для ускорения вычислений.
  • Реализовать параллельное вычисление с concurrent.futures.
  • Провести бенчмарк всех вариантов.

Код

Базовая реализация (Python)

import math


def integrate(f, a: float, b: float, *, n_iter: int = 100_000) -> float:
    """
    Численное вычисление интеграла по формуле левых прямоугольников.

    >>> round(integrate(math.cos, 0.0, math.pi, n_iter=10_000), 3)
    0.0
    >>> round(integrate(lambda x: x**2, 0.0, 1.0, n_iter=10_000), 3)
    0.333
    """
    if n_iter <= 0:
        raise ValueError("n_iter must be a positive integer")

    acc = 0.0
    step = (b - a) / n_iter
    for i in range(n_iter):
        acc += f(a + i * step) * step
    return acc

Структура проекта

lab_10/
├── integrate.py             # Базовая реализация
├── cy_integrate.pyx         # Cython-версия
├── concurrent_integrate.py  # Многопоточная версия
├── bench_timeit.py          # Бенчмарк timeit
├── bench_concurrent.py      # Бенчмарк concurrent
├── cy_bench.py              # Бенчмарк Cython
├── setup_cy.py              # Сборка Cython-модуля
└── test_integrate.py        # Тесты

Выводы

Метод левых прямоугольников прост в реализации, но требует большого числа итераций для высокой точности. Cython-компиляция даёт значительное ускорение за счёт статической типизации и компиляции в C. Многопоточность через concurrent.futures эффективна при разделении отрезка на независимые подзадачи.