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