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


import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.integrate import quad

# 1. Определение функции и пределов интегрирования
def f(x):
    return np.power(np.maximum(4 - 25*x**2, 0), 3/2)

a, b = 0.2, 0.4

# 2. Аналитическое/Точное вычисление S_ist
S_ist, _ = quad(f, a, b)
print(f"Точное значение интеграла (S_ist): {S_ist}")

# 3. Реализация численных методов
def left_rect(f, a, b, n):
    x = np.linspace(a, b, n+1)
    return np.sum(f(x[:-1])) * (b-a)/n

def right_rect(f, a, b, n):
    x = np.linspace(a, b, n+1)
    return np.sum(f(x[1:])) * (b-a)/n

def mid_rect(f, a, b, n):
    x = np.linspace(a, b, n+1)
    x_mid = (x[:-1] + x[1:]) / 2
    return np.sum(f(x_mid)) * (b-a)/n

def trapz(f, a, b, n):
    x = np.linspace(a, b, n+1)
    y = f(x)
    return (b-a)/n * (np.sum(y) - 0.5*(y[0] + y[-1]))

def simpson(f, a, b, n):
    if n % 2 != 0: n += 1
    x = np.linspace(a, b, n+1)
    y = f(x)
    dx = (b-a)/n
    return dx/3 * (y[0] + y[-1] + 4*np.sum(y[1:-1:2]) + 2*np.sum(y[2:-1:2]))

def monte_carlo(f, a, b, n):
    np.random.seed(42) # Для воспроизводимости
    x = np.random.uniform(a, b, n)
    return (b-a) * np.mean(f(x))

methods = {
    'ЛПР': left_rect,
    'ППР': right_rect,
    'СПР': mid_rect,
    'ТР': trapz,
    'СИМП': simpson,
    'ММК': monte_carlo
}

ns = [10, 100, 1000]
results = []

# Формирование таблицы
for name, func in methods.items():
    row = {'Метод': name}
    for n in ns:
        S = func(f, a, b, n)
        delta = abs(S - S_ist)
        gamma = delta / abs(S_ist)
        row[f'S^ (n={n})'] = S
        row[f'дельта (n={n})'] = delta
        row[f'гамма (n={n})'] = gamma
    results.append(row)

df = pd.DataFrame(results)
print("\nТаблица результатов:")
print(df.to_string())

# 4. Построение графиков
x_vals = np.linspace(a, b, 400)
y_vals = f(x_vals)

# График самой функции
plt.figure(figsize=(8, 5))
plt.plot(x_vals, y_vals, 'b-', label=r'$f(x) = \sqrt{(4 - 25x^2)^3}$', linewidth=2)
plt.title("График функции f(x)")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.show()

# График с наложенными фигурами (Метод левых прямоугольников, n=10)
n_plot = 10
x_edges = np.linspace(a, b, n_plot+1)
x_left = x_edges[:-1]
y_left = f(x_left)

plt.figure(figsize=(10, 6))
plt.plot(x_vals, y_vals, 'b-', label=r'$f(x)$', linewidth=2)
plt.bar(x_left, y_left, width=(b-a)/n_plot, alpha=0.4, align='edge', 
        edgecolor='black', color='orange', label=f'ЛПР (n={n_plot})')
plt.plot(x_left, y_left, 'ko', label='Точки вычисления (Левые)')
plt.title("График f(x) и площади по методу левых прямоугольников")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.show()