Загрузка данных


import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import trapezoid, simpson, quad

# Параметры задачи (вариант 6)
a = 0.5
b = 1.0
n = 10
h = (b - a) / n   # 0.05

# Подынтегральная функция
def f(x):
    return 1 / (2 * x**2 + 1)

# 1. Левые прямоугольники (вперёд)
x_left = np.arange(a, b, h)
S1 = h * np.sum(f(x_left))

# 2. Правые прямоугольники (назад)
x_right = np.arange(a + h, b + h/10, h)   # до b включительно
S2 = h * np.sum(f(x_right))

# 3. Средние прямоугольники
x_mid = np.arange(a + h/2, b, h)
S3 = h * np.sum(f(x_mid))

# 4. Трапеции (ручная реализация)
x_trap = np.arange(a, b, h)
S4 = h * np.sum((f(x_trap) + f(x_trap + h)) / 2)

# 5. Симпсон (ручная реализация)
x_even = np.arange(a + h, b, h)        # для коэффициента 2
x_mid_simp = np.arange(a + h/2, b, h)  # для коэффициента 4
S5 = h/6 * (f(a) + f(b) + 2*np.sum(f(x_even)) + 4*np.sum(f(x_mid_simp)))

# 6. Встроенный метод трапеций (scipy/numpy)
x_all = np.linspace(a, b, n+1)
y_all = f(x_all)
S6 = trapezoid(y_all, x_all)

# 7. Встроенный метод Симпсона
S7 = simpson(y_all, x=x_all)

# 8. Адаптивный квадратурный метод quad
S8, _ = quad(f, a, b)

# Вывод результатов
print("Интеграл ∫_{0.5}^{1} dx/(2x²+1)")
print(f"1. Левые прямоугольники:   {S1:.8f}")
print(f"2. Правые прямоугольники:  {S2:.8f}")
print(f"3. Средние прямоугольники: {S3:.8f}")
print(f"4. Трапеции (ручной):      {S4:.8f}")
print(f"5. Симпсон (ручной):       {S5:.8f}")
print(f"6. scipy.trapezoid:        {S6:.8f}")
print(f"7. scipy.simpson:          {S7:.8f}")
print(f"8. scipy.quad:             {S8:.8f}")

# Построение графика
x_fine = np.linspace(a, b, 200)
y_fine = f(x_fine)

plt.figure(figsize=(10, 5))
plt.plot(x_fine, y_fine, 'r-', linewidth=2, label='f(x) = 1/(2x²+1)')
plt.fill_between(x_fine, y_fine, alpha=0.2, color='red')
plt.title('Подынтегральная функция на отрезке [0.5, 1]')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.show()