Пределы: limit вычисляет точно
«Чему стремится функция?» — предел отвечает на это даже там, где прямая подстановка даёт 0/0. SymPy считает пределы точно.
limit — функция SymPy для вычисления пределов: к чему стремится выражение, когда переменная приближается к заданной точке (или к бесконечности).
Зачем нужны пределы
Предел — фундамент всего анализа: через него определяются и производная, и интеграл, и непрерывность. На практике пределы нужны, чтобы понять поведение функции там, где она «не определена впрямую»: знаменитый $\sin(x)/x$ при $x \to 0$ даёт неопределённость $0/0$, но предел равен ровно $1$. Или поведение на бесконечности: куда уходит функция при $x \to \infty$?
Знаменитый предел: $\sin(x)/x$ при $x \to 0$
Подставить $x=0$ нельзя — будет $0/0$. Но численно можно подкрасться к нулю и посмотреть, к чему стремится отношение:
import math
print("Приближаемся к x=0 для sin(x)/x:")
for x in [0.1, 0.01, 0.001, 0.0001]:
print(f" x={x:<8} ->", round(math.sin(x) / x, 8))
print("Предел, похоже, равен 1")
Вывод:
Приближаемся к x=0 для sin(x)/x: x=0.1 -> 0.99833417 x=0.01 -> 0.99998333 x=0.001 -> 0.99999983 x=0.0001 -> 1.0 Предел, похоже, равен 1
Численно мы лишь догадываемся, что предел равен 1. SymPy доказывает это точно.
Пределы в SymPy
import sympy as sp
x = sp.symbols("x")
print(sp.limit(sp.sin(x)/x, x, 0)) # 1 — точно
print(sp.limit((1 + 1/x)**x, x, sp.oo)) # E — число Эйлера!
print(sp.limit(1/x, x, 0, "+")) # oo (предел справа)
print(sp.limit(1/x, x, 0, "-")) # -oo (предел слева)
Вторая строка особенно красива: предел $(1+1/x)^x$ при $x \to \infty$ — это определение числа e, и SymPy выдаёт точное E.
Односторонние пределы
Иногда функция ведёт себя по-разному слева и справа от точки. У $1/x$ при $x \to 0$ предел справа $+\infty$, а слева $-\infty$. Третий аргумент limit ("+" или "-") задаёт сторону:
| Запрос | Результат | Смысл |
limit(1/x, x, 0, "+") | $+\infty$ | подходим справа ($x \gt 0$) |
limit(1/x, x, 0, "-") | $-\infty$ | подходим слева ($x \lt 0$) |
Как работает под капотом
Наивно предел можно искать подстановкой всё более близких чисел — но это ненадёжно (мы видели лишь «похоже, 1»). SymPy использует строгий алгоритм на основе рядов: он раскладывает функцию в окрестности точки в ряд (фактически — в ряд Тейлора или более общий) и смотрит на главный член. Для неопределённостей вида $0/0$ или $\infty/\infty$ это эквивалентно правилу Лопиталя, но работает и в сложных случаях, где Лопиталь зацикливается. Алгоритм Громова-Гонне (используемый в SymPy) умеет сравнивать «скорости роста» функций и давать точный ответ там, где численное подкрадывание лишь намекает.
Частые ошибки
- Доверять только численному подкрадыванию. Оно может обмануть: для осциллирующих функций ($\sin(1/x)$) предела нет, а числа «прыгают».
- Игнорировать сторону. Если левый и правый пределы разные, двусторонний предел не существует — спрашивайте односторонний.
- Путать предел и значение. Предел в точке может существовать, даже если функция в этой точке не определена (как $\sin(x)/x$ в нуле).
Итог
limitвычисляет точный предел, в том числе устраняя неопределённости $0/0$.- Работают пределы на бесконечности и односторонние (аргумент
"+"/"-"). - Численное «подкрадывание» лишь намекает на ответ; SymPy доказывает его.
- Под капотом — разложение в ряд и сравнение скоростей роста, а не подстановка чисел.