import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
# 1. Настройки функции
def f(x): return np.sqrt(1 - x**2)
a, b = 0, 0.5
n = 10
h = (b - a) / n
x_curve = np.linspace(a, b, 200)
y_curve = f(x_curve)
fig, axes = plt.subplots(2, 3, figsize=(16, 10))
axes = axes.flatten()
fill_style = {'facecolor': 'blue', 'alpha': 0.2, 'edgecolor': 'darkblue', 'lw': 1}
for idx, name in enumerate(["ЛПР", "ППР", "СПР", "ТР", "СИМП", "ММК"]):
ax = axes[idx]
ax.plot(x_curve, y_curve, 'r', lw=2, zorder=10)
if name == "ЛПР":
for i in range(n):
ax.add_patch(Rectangle((a + i*h, 0), h, f(a + i*h), **fill_style))
elif name == "ППР":
for i in range(n):
ax.add_patch(Rectangle((a + i*h, 0), h, f(a + (i+1)*h), **fill_style))
elif name == "СПР":
for i in range(n):
xm = a + i*h + h/2
ax.add_patch(Rectangle((a + i*h, 0), h, f(xm), **fill_style))
ax.scatter(xm, f(xm), color='black', s=10, zorder=11)
elif name == "ТР":
for i in range(n):
xi = a + i*h
ax.fill([xi, xi, xi+h, xi+h], [0, f(xi), f(xi+h), 0], **fill_style)
elif name == "СИМП":
for i in range(0, n, 2):
x_pts = [a+i*h, a+(i+1)*h, a+(i+2)*h]
y_pts = [f(x) for x in x_pts]
p = np.polyfit(x_pts, y_pts, 2)
x_range = np.linspace(x_pts[0], x_pts[2], 30)
ax.fill_between(x_range, 0, np.polyval(p, x_range), **fill_style)
ax.vlines(x_pts, 0, y_pts, color='darkblue', lw=0.5)
ax.scatter(x_pts, y_pts, color='black', s=10, zorder=11)
elif name == "ММК":
# Реалистичная имитация ММК через столбики
# Генерируем точки и смотрим их распределение по 10 интервалам
n_dots = 500
xr = np.random.uniform(a, b, n_dots)
yr = np.random.uniform(0, 1, n_dots)
inside = yr < f(xr)
# Рисуем "столбики" ММК исходя из плотности попаданий
for i in range(n):
xi = a + i*h
# Считаем точки в данном интервале [xi, xi+h]
mask = (xr >= xi) & (xr < xi+h) & inside
if np.any(mask):
# Высота столбика определяется как среднее значение y попавших точек
h_mc = np.mean(f(xr[(xr >= xi) & (xr < xi+h)]))
# Добавляем небольшую случайную погрешность для реализма
h_mc += np.random.normal(0, 0.02)
ax.add_patch(Rectangle((xi, 0), h, h_mc, **fill_style))
# На фоне рисуем сами точки
ax.scatter(xr[inside], yr[inside], s=1, c='green', alpha=0.3)
ax.scatter(xr[~inside], yr[~inside], s=1, c='red', alpha=0.1)
ax.set_title(f"Метод: {name} (n=10)")
ax.set_xlim(a-0.02, b+0.02)
ax.set_ylim(0, 1.1)
ax.grid(True, alpha=0.15)
plt.tight_layout()
plt.show()