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


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