Специальные функции: гамма, Бесселя, erf

За пределами sin и exp есть «спецфункции» — решения важных уравнений, которым дали имена. SciPy считает их все.

Специальные функции — устоявшийся набор математических функций (гамма, Бесселя, erf и др.), которые возникают в решениях типовых уравнений физики и не выражаются через элементарные.

Зачем им отдельный подмодуль

Элементарных функций (степень, логарифм, синус) не хватает: интеграл от e^(−x²), колебания мембраны барабана, факториал нецелого числа — для всего этого математики ввели специальные функции и научились их быстро считать. scipy.special — это «расширенный калькулятор» с десятками таких функций, точных до последнего бита.

Три знаменитые функции

ФункцияСмыслГде встречается
Гамма Γ(x)факториал для нецелых: Γ(n) = (n−1)!статистика, комбинаторика
Erf(x)интеграл от гауссова колоколатеория вероятностей, диффузия
Бесселя Jₙ(x)колебания круглых/цилиндрич. системакустика, оптика, антенны

Гамма-функция «руками»: факториал и не только

Для целых Γ(n) = (n−1)!. Это можно проверить даже на stdlib — в math есть и factorial, и сама gamma:

import math

print("4! =", math.factorial(4))
print("Gamma(5) =", math.gamma(5))      # = 4! = 24
print("Gamma(0.5) =", round(math.gamma(0.5), 6))  # = sqrt(pi)
print("sqrt(pi)   =", round(math.sqrt(math.pi), 6))

Вывод:

4! = 24
Gamma(5) = 24.0
Gamma(0.5) = 1.772454
sqrt(pi)   = 1.772454

Удивительный факт: Γ(1/2) = √π. Гамма-функция «продолжает» факториал на дробные и даже отрицательные значения.

Функция ошибок erf — мост к статистике

Мы уже встречали math.erf в уроке про распределения. Это не случайность: cdf нормального распределения выражается через erf. erf(x) — это (с точностью до масштаба) площадь под колоколом Гаусса от 0 до x:

import math

print("erf(0)   =", math.erf(0))           # 0 — площадь нулевая
print("erf(1)   =", round(math.erf(1), 6)) # ~0.842701
print("erf(inf) =", math.erf(10))          # ~1 — вся площадь

Вывод:

erf(0)   = 0.0
erf(1)   = 0.842701
erf(inf) = 1.0

А в SciPy — весь зоопарк

from scipy.special import gamma, erf, jv, comb

print(gamma(5))      # 24.0
print(erf(1))        # 0.8427007929497149
print(jv(0, 2.4048)) # ~0 — первый ноль функции Бесселя J0
print(comb(10, 3))   # 120.0 — число сочетаний C(10,3)

В scipy.special — сотни функций: Лежандра, гипергеометрические, дзета Римана, эллиптические интегралы. Все вычисляются с машинной точностью по выверенным алгоритмам.

Как работает под капотом

Спецфункции не считают «по определению» (через интеграл или бесконечный ряд) — это было бы медленно и неточно. Вместо этого используют аппроксимации: для разных диапазонов аргумента подобраны рациональные приближения или асимптотические разложения, дающие почти полную точность double за считанные операции. Например, erf на малых x раскладывают в ряд Тейлора, а на больших — в асимптотический ряд. Подбор этих приближений — отдельное искусство численной математики, и SciPy наследует лучшие из них из библиотеки Cephes.

Частые ошибки

  • Считать факториал большого числа напрямую. 200! переполнит обычный float; работают с логарифмом гаммы gammaln.
  • Путать erf и cdf нормали. Они связаны, но не равны: cdf(x) = ½(1 + erf(x/√2)).
  • Ждать элементарную формулу. Спецфункции на то и специальные — у них нет выражения через sin/exp/log.

Итог

  • Спецфункции — именованные решения типовых уравнений, не выразимые элементарно.
  • Гамма обобщает факториал (Γ(n)=(n−1)!, Γ(½)=√π), erf — площадь под гауссом, Бессель — колебания.
  • Часть из них (gamma, erf, factorial) есть даже в stdlib-модуле math.
  • Полный «зоопарк» — в scipy.special, считается через выверенные аппроксимации.
Проверьте себя
1. Чему равна гамма-функция от целого n?
An!
B(n−1)!
C
D2^n
2. Почему функция erf тесно связана с нормальным распределением?
AСлучайное совпадение
Berf — это (с точностью до масштаба) интеграл от гауссова колокола, через него выражается cdf нормали
Cerf — это и есть pdf нормали
DОни не связаны
3. Как scipy.special так быстро и точно считает спецфункции?
AПрямым вычислением бесконечных рядов
BИспользуя выверенные аппроксимации (ряды Тейлора/асимптотики/рациональные приближения) для разных диапазонов аргумента
CЧерез символьную математику
DТаблицами значений