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()