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


import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as spi

# ------------------------------------------------------------
# Параметры задачи (можно легко изменить)
# ------------------------------------------------------------
def f(x):
    """Подынтегральная функция. Замените на свою при необходимости."""
    return x**2

a = 0.5          # начало отрезка
b = 1.5          # конец отрезка
n = 10           # число разбиений (чётное для Симпсона)
h = (b - a) / n  # шаг

# ------------------------------------------------------------
# 1. Левые прямоугольники
# ------------------------------------------------------------
def left_rect(f, a, b, n):
    h = (b - a) / n
    x = np.linspace(a, b - h, n)   # n точек от a до b-h
    return h * np.sum(f(x))

S_left = left_rect(f, a, b, n)

# ------------------------------------------------------------
# 2. Правые прямоугольники
# ------------------------------------------------------------
def right_rect(f, a, b, n):
    h = (b - a) / n
    x = np.linspace(a + h, b, n)   # n точек от a+h до b
    return h * np.sum(f(x))

S_right = right_rect(f, a, b, n)

# ------------------------------------------------------------
# 3. Средние прямоугольники
# ------------------------------------------------------------
def mid_rect(f, a, b, n):
    h = (b - a) / n
    x = np.linspace(a + h/2, b - h/2, n)
    return h * np.sum(f(x))

S_mid = mid_rect(f, a, b, n)

# ------------------------------------------------------------
# 4. Метод трапеций (собственная реализация)
# ------------------------------------------------------------
def trapezoid(f, a, b, n):
    h = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    return h * (np.sum(y) - 0.5 * (y[0] + y[-1]))

S_trap = trapezoid(f, a, b, n)

# ------------------------------------------------------------
# 5. Метод Симпсона (собственная реализация)
# ------------------------------------------------------------
def simpson(f, a, b, n):
    if n % 2 != 0:
        raise ValueError("Число интервалов n должно быть чётным")
    h = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    # коэффициенты: 1, 4, 2, 4, 2, ..., 4, 1
    coeff = np.ones(n + 1)
    coeff[1:-1:2] = 4   # нечётные индексы внутри
    coeff[2:-1:2] = 2   # чётные индексы внутри
    return h / 3 * np.sum(coeff * y)

S_simp = simpson(f, a, b, n)

# ------------------------------------------------------------
# 6. Библиотечный метод трапеций (scipy)
# ------------------------------------------------------------
x_dense = np.linspace(a, b, 1000)   # для точности возьмём много точек
y_dense = f(x_dense)
S_trap_sp = spi.trapezoid(y_dense, x_dense)

# ------------------------------------------------------------
# 7. Библиотечный метод Симпсона (scipy)
# ------------------------------------------------------------
S_simp_sp = spi.simpson(y_dense, x=x_dense)

# ------------------------------------------------------------
# 8. Точное значение (quad)
# ------------------------------------------------------------
S_exact, err = spi.quad(f, a, b)

# ------------------------------------------------------------
# Вывод результатов
# ------------------------------------------------------------
print("Интеграл f(x) = x^2 на отрезке [0.5, 1.5]")
print("=" * 50)
print(f"Левые прямоугольники      : {S_left:.8f}")
print(f"Правые прямоугольники     : {S_right:.8f}")
print(f"Средние прямоугольники    : {S_mid:.8f}")
print(f"Трапеции (своя реализация): {S_trap:.8f}")
print(f"Симпсон (своя реализация) : {S_simp:.8f}")
print(f"Трапеции (scipy)          : {S_trap_sp:.8f}")
print(f"Симпсон (scipy)           : {S_simp_sp:.8f}")
print(f"Точное значение (quad)    : {S_exact:.8f}")
print("=" * 50)

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

plt.figure(figsize=(8, 5))
plt.plot(x_plot, y_plot, 'b-', linewidth=2, label=r'$f(x) = x^2$')
plt.fill_between(x_plot, y_plot, alpha=0.2)
plt.title('График функции на интервале [0.5, 1.5]')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()
plt.tight_layout()
plt.show()