Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2сем / лаб / ЛР-1.docx
Скачиваний:
0
Добавлен:
04.04.2026
Размер:
59.06 Кб
Скачать

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)}")

 Результаты и точность

  1. Порядок точности методов (от наименее к наиболее точному):

    • Левые/правые прямоугольники: 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 (машинная точность)

  2. Пример вывода:

Аналитическое значение: 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)=ex⋅sin(2x) на интервале [0,5][0,5] с помощью метода Монте-Карло.

 Пояснение к коду

Соседние файлы в папке лаб