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}")