Специальные функции: гамма, Бесселя, 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, считается через выверенные аппроксимации.