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


import numpy as np
import matplotlib.pyplot as plt
import math
from matplotlib.patches import Rectangle

# --- 1. Настройки Варианта 20 ---
def f(x):
    # Функция из варианта 20: sqrt(1 - x^2)
    return np.sqrt(1 - x**2)

a, b = 0, 0.5 # Границы интегрирования
n = 10
h = (b - a) / n

# Аналитическое значение для идеальной точности (16 нулей)
TRUE_VAL = math.pi/12 + math.sqrt(3)/8

# --- 2. Визуализация методов ---
fig, axes = plt.subplots(2, 3, figsize=(16, 11))
axes = axes.flatten()
x_curve = np.linspace(a, b, 200)

# Стилизация
STYLE = {'alpha': 0.5, 'edgecolor': 'black', 'lw': 0.8} # lw=0.8 для равной толщины линий
COLOR_BLUE = '#add8e6' 
COLOR_RED = '#ff4444'

methods = ["ЛПР", "ППР", "СПР", "ТР", "СИМП", "ММК"]

for idx, name in enumerate(methods):
    ax = axes[idx]
    ax.plot(x_curve, f(x_curve), color='#0055ff', lw=2.5, zorder=10)
    
    if name == "ЛПР":
        for i in range(n):
            ax.add_patch(Rectangle((a+i*h, 0), h, f(a+i*h), facecolor=COLOR_BLUE, **STYLE))
            
    elif name == "ППР":
        for i in range(n):
            ax.add_patch(Rectangle((a+i*h, 0), h, f(a+(i+1)*h), facecolor=COLOR_BLUE, **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), facecolor=COLOR_BLUE, **STYLE))
            
    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], color=COLOR_BLUE, **STYLE)
            
    elif name == "СИМП":
        # Рисуем 5 парабол, накрывающих по 2 интервала каждая
        for i in range(0, n, 2):
            x_seg = [a+i*h, a+(i+1)*h, a+(i+2)*h]
            y_seg = f(np.array(x_seg))
            poly = np.polyfit(x_seg, y_seg, 2)
            
            xr = np.linspace(x_seg[0], x_seg[2], 40)
            ax.fill_between(xr, 0, np.polyval(poly, xr), color=COLOR_BLUE, alpha=0.5, zorder=4)

        # ОТРИСОВКА 10 СТОЛБИКОВ: рисуем линии одинаковой толщины на каждом шаге h
        x_lines = np.linspace(a, b, n + 1)
        ax.vlines(x_lines, 0, f(x_lines), color='black', lw=0.8, zorder=5)
        # Добавляем горизонтальные засечки для завершения вида столбиков
        for i in range(n):
            xi = a + i*h
            ax.plot([xi, xi+h], [f(xi), f(xi+h)], color='black', lw=0.5, alpha=0.3, zorder=5)

    elif name == "ММК":
        # 10 случайных накладывающихся столбиков [как на фото 20260508_130745.jpg]
        for i in range(n):
            rand_x = np.random.uniform(a, b - h)
            # Высота около графика с небольшим шумом
            height = f(rand_x) + np.random.uniform(-0.02, 0.02)
            ax.add_patch(Rectangle(
                (rand_x, 0), h, height, 
                facecolor=COLOR_RED, alpha=0.35, 
                edgecolor='darkred', lw=1, zorder=5
            ))

    ax.set_title(f"Метод: {name} (n={n})", fontsize=11, fontweight='bold')
    ax.set_xlim(a-0.02, b+0.02)
    ax.set_ylim(0, 1.1)
    ax.grid(True, ls=':', alpha=0.4)

plt.tight_layout()

# --- 3. Высокоточный расчет для таблицы (n=1000) ---
def simpson_final(n_val):
    if n_val % 2 != 0: n_val += 1
    h_s = (b - a) / n_val
    x = np.linspace(a, b, n_val + 1)
    y = f(x)
    res = (h_s/3) * (y[0] + y[-1] + 4*np.sum(y[1:-1:2]) + 2*np.sum(y[2:-2:2]))
    return res

s_hat = simpson_final(1000)
delta = abs(TRUE_VAL - s_hat)
sigma = (delta / TRUE_VAL) * 100

print(f"\nАналитическое (истинное) S = {TRUE_VAL:.18f}")
print("="*105)
# Вывод в стиле вашего интерфейса
print(f"| n = 1000 | СИМПСОН | Ŝ = {s_hat:.18f} | Δ = {delta:.2e} | δ = {sigma:.16f}% |")
print("="*105)

plt.show()