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


import numpy as np
from scipy.integrate import quad

# 1. Настройки функции (Вариант 20)
def f(x):
    # Используем numpy для высокой точности вычислений
    return np.sqrt(1 - np.power(x, 2))

a, b = 0, 0.5
n_values = [10, 100, 1000]

# Истинное значение с максимальной точностью
true_val, _ = quad(f, a, b, epsabs=1.49e-15, epsrel=1.49e-15)

# --- 2. Функции методов ---

def left_rect(f, a, b, n):
    h = (b - a) / n
    x = np.linspace(a, b - h, n)
    return np.sum(f(x)) * h

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

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

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

def simpson(f, a, b, n):
    if n % 2 != 0: n += 1
    h = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    # Формула Симпсона: h/3 * (y0 + 4*y1 + 2*y2 + 4*y3 + ... + yn)
    res = y[0] + y[-1] + 4 * np.sum(y[1:-1:2]) + 2 * np.sum(y[2:-2:2])
    return res * (h / 3)

def monte_carlo(f, a, b, n):
    # Для ММК точность зависит от количества точек (сделаем n*100 для солидности)
    x_rand = np.random.uniform(a, b, n * 100)
    return (b - a) * np.mean(f(x_rand))

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

# --- 3. Вывод таблицы ---

print(f"Истинное значение площади (S): {true_val:.15f}")
print("="*95)

for n in n_values:
    print(f"| n = {n:<87} |")
    print("-" * 95)
    print(f"| {'Метод':<7} | {'Ŝ (Результат)':<17} | {'Δ (Абс. погр.)':<13} | {'δ (Относ. %)':<15} |")
    print("-" * 95)
    
    for name, func in methods.items():
        res = func(f, a, b, n)
        abs_err = abs(true_val - res)
        rel_err_pct = (abs_err / true_val) * 100
        
        # .12f даст много знаков, .2e покажет порядок погрешности (например, 1.23e-14)
        print(f"| {name:<7} | Ŝ={res:<15.12f} | Δ={abs_err:<11.2e} | δ={rel_err_pct:<13.8f}% |")
    
    print("="*95)
    print()