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


import math

def gaussian_integral_taylor(a, b, eps=1e-10, max_terms=100):
    """
    Вычисляет интеграл от exp(-x^2) на отрезке [a, b] с помощью ряда Тейлора.
    
    Параметры:
    a, b -- пределы интегрирования
    eps -- требуемая относительная точность (остановка, когда |член| < eps * |сумма|)
    max_terms -- максимальное число членов ряда
    
    Возвращает:
    приближённое значение интеграла
    """
    if a == b:
        return 0.0
    
    integral = 0.0
    n = 0
    term = (b - a)  # при n=0: (-1)^0/0! * (b^1 - a^1)/1 = b - a
    
    while n < max_terms:
        integral += term
        n += 1
        # рекуррентное вычисление следующего члена для устойчивости
        # term_{n} = term_{n-1} * (-1) * (b^(2n+1)-a^(2n+1)) / (b^(2n-1)-a^(2n-1)) * (2n-1)/(2n+1) * 1/n
        # но проще вычислить напрямую с использованием math.pow, чтобы избежать деления на ноль
        # для улучшения точности при больших n используем логарифмы или прямое вычисление
        try:
            # Прямое вычисление через факториал и степени (для не слишком больших n)
            # При n > 170 факториал вызовет переполнение, но max_terms обычно не такой большой
            coeff = (-1)**n / math.factorial(n)
            delta = (b**(2*n+1) - a**(2*n+1)) / (2*n+1)
            term = coeff * delta
        except OverflowError:
            print(f"Переполнение на n={n}, прекращаем суммирование.")
            break
        
        # Критерий остановки по относительной погрешности
        if abs(term) < eps * abs(integral):
            break
    
    if n == max_terms:
        print(f"Достигнуто максимальное число членов ({max_terms}), точность может быть недостаточной.")
    
    return integral

def exact_integral(a, b):
    """Точное значение интеграла от exp(-x^2) через функцию ошибок erf."""
    return (math.sqrt(math.pi) / 2) * (math.erf(b) - math.erf(a))

# Пример использования
if __name__ == "__main__":
    # Ввод пределов интегрирования
    try:
        a = float(input("Введите нижний предел a: "))
        b = float(input("Введите верхний предел b: "))
    except ValueError:
        print("Некорректный ввод. Используем a=0, b=1.")
        a, b = 0.0, 1.0
    
    # Вычисление приближённого значения
    approx = gaussian_integral_taylor(a, b, eps=1e-12, max_terms=100)
    exact = exact_integral(a, b)
    
    print(f"\nПриближённое значение (ряд Тейлора): {approx:.12f}")
    print(f"Точное значение (через erf):       {exact:.12f}")
    print(f"Абсолютная погрешность:            {abs(approx - exact):.2e}")