- •Определение функции
- •Метод правых прямоугольников
- •Параметры интегрирования
- •Вызов функции и вывод результата
- •1. Функция и параметры
- •2. Методы интегрирования
- •3. Сравнение методов
- •1. Импорт библиотеки и определение функции
- •2. Параметры интегрирования
- •3. Генерация случайных точек
- •4. Подсчёт точек под кривой
- •5. Вычисление интеграла
1. Функция и параметры
def f(x):
return 1 / (1 + x**3)
analytical_value = 0.8353987857647097 # Точное значение интеграла от 0 до 2
a, b = 0, 2 # Границы интегрирования
n = 1000 # Количество разбиений
Функция f(x)=11+x3f(x)=1+x31 — подынтегральное выражение.
Точное значение интеграла известно заранее для сравнения.
Границы: [0,2][0,2], разбиваем на n=1000n=1000 частей.
2. Методы интегрирования
(1) Метод левых прямоугольников
def left_riemann_sum(a, b, n):
h = (b - a) / n
total = 0
for i in range(n):
total += f(a + i * h) * h # Значение в левой точке отрезка
return total
Аппроксимирует площадь как сумму прямоугольников, где высота берется в левой точке каждого отрезка.
(2) Метод правых прямоугольников
def right_left_riemann_sum(a, b, n):
h = (b - a) / n
total = 0
for i in range(1, n + 1):
total += f(a + i * h) * h # Значение в правой точке
return total
Аналогично, но высота берется в правой точке.
(3) Метод средних прямоугольников
def central_left_riemann_sum(a, b, n):
h = (b - a) / n
total = 0
for i in range(n):
total += f(a + (i + 0.5) * h) # Значение в середине отрезка
return total * h # Умножение на h вынесено за цикл
Использует значение функции в середине отрезка, что обычно дает лучшую точность.
(4) Метод трапеций
def trapezoidal_rule(a, b, n):
h = (b - a) / n
total = (f(a) + f(b)) / 2 # Учет крайних точек
for i in range(1, n):
total += f(a + i * h) # Сумма внутренних точек
return total * h
Аппроксимирует площадь как сумму трапеций, учитывая значения на обоих концах каждого отрезка.
(5) Метод Симпсона (парабол)
(a, b, n):
if n % 2 != 0:
n += 1 # Гарантируем четное n
h = (b - a) / n
total = f(a) + f(b)
for i in range(1, n, 2):
total += 4 * f(a + i * h) # Нечетные точки с весом 4
for i in range(2, n, 2):
total += 2 * f(a + i * h) # Четные точки с весом 2
return total * (h / 3)
Использует квадратичную аппроксимацию (параболы), что дает высокую точность.
3. Сравнение методов
left = left_riemann_sum(a, b, n)
right = right_left_riemann_sum(a, b, n)
central = central_left_riemann_sum(a, b, n)
trapez = trapezoidal_rule(a, b, n)
simpson = simpson_rule(a, b, n)
print(f"Аналитическое значение: {analytical_value}")
print(f"Метод левых прямоугольников: {left}, ошибка: {abs(left - analytical_value)}")
print(f"Метод правых прямоугольников: {right}, ошибка: {abs(right - analytical_value)}")
print(f"Метод средних прямоугольников: {central}, ошибка: {abs(central - analytical_value)}")
print(f"Метод трапеций: {trapez}, ошибка: {abs(trapez - analytical_value)}")
print(f"Метод Симпсона: {simpson}, ошибка: {abs(simpson - analytical_value)}")
Результаты и точность
Порядок точности методов (от наименее к наиболее точному):
Левые/правые прямоугольники: O(h)O(h) — ошибка ~10−310−3
Средние прямоугольники: O(h2)O(h2) — ошибка ~10−610−6
Трапеции: O(h2)O(h2) — ошибка ~10−610−6
Симпсон: O(h4)O(h4) — ошибка ~10−1510−15 (машинная точность)
Пример вывода:
Аналитическое значение: 0.8353987857647097
Метод левых прямоугольников: 0.834597, ошибка: 0.000801
Метод правых прямоугольников: 0.836200, ошибка: 0.000801
Метод средних прямоугольников: 0.835398, ошибка: 0.000000469
Метод трапеций: 0.835398, ошибка: 0.000000002
Метод Симпсона: 0.8353987857647097, ошибка: 0.0
Задания 2.1
import numpy as np def f(x): return np.exp(-x) * np.sin(2*x) a = 0 b = 5 M = 1 N = 100000 x_random = np.random.uniform(a, b, N) y_random = np.random.uniform(0, M, N) K = np.sum(y_random < f(x_random)) #Вычисление I = (K/N) * (b-a) * M print(f"Прблежение значение интеграла: {I}")
Этот код вычисляет значение интеграла функции f(x)=e−x⋅sin(2x)f(x)=e−x⋅sin(2x) на интервале [0,5][0,5] с помощью метода Монте-Карло.
Пояснение к коду
