Пределы: limit вычисляет точно
«Чему стремится функция?» — предел отвечает на это даже там, где прямая подстановка даёт 0/0. SymPy считает пределы точно.
limit — функция SymPy для вычисления пределов: к чему стремится выражение, когда переменная приближается к заданной точке (или к бесконечности).
Зачем нужны пределы
Предел — фундамент всего анализа: через него определяются и производная, и интеграл, и непрерывность. На практике пределы нужны, чтобы понять поведение функции там, где она «не определена впрямую»: знаменитый sin(x)/x при x→0 даёт неопределённость 0/0, но предел равен ровно 1. Или поведение на бесконечности: куда уходит функция при x→∞?
Знаменитый предел: sin(x)/x при x → 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→∞ — это определение числа e, и SymPy выдаёт точное E.
Односторонние пределы
Иногда функция ведёт себя по-разному слева и справа от точки. У 1/x при x→0 предел справа +∞, а слева −∞. Третий аргумент limit ("+" или "-") задаёт сторону:
| Запрос | Результат | Смысл |
limit(1/x, x, 0, "+") | +∞ | подходим справа (x > 0) |
limit(1/x, x, 0, "-") | −∞ | подходим слева (x < 0) |
Как работает под капотом
Наивно предел можно искать подстановкой всё более близких чисел — но это ненадёжно (мы видели лишь «похоже, 1»). SymPy использует строгий алгоритм на основе рядов: он раскладывает функцию в окрестности точки в ряд (фактически — в ряд Тейлора или более общий) и смотрит на главный член. Для неопределённостей вида 0/0 или ∞/∞ это эквивалентно правилу Лопиталя, но работает и в сложных случаях, где Лопиталь зацикливается. Алгоритм Громова-Гонне (используемый в SymPy) умеет сравнивать «скорости роста» функций и давать точный ответ там, где численное подкрадывание лишь намекает.
Частые ошибки
- Доверять только численному подкрадыванию. Оно может обмануть: для осциллирующих функций (
sin(1/x)) предела нет, а числа «прыгают». - Игнорировать сторону. Если левый и правый пределы разные, двусторонний предел не существует — спрашивайте односторонний.
- Путать предел и значение. Предел в точке может существовать, даже если функция в этой точке не определена (как
sin(x)/xв нуле).
Итог
limitвычисляет точный предел, в том числе устраняя неопределённости 0/0.- Работают пределы на бесконечности и односторонние (аргумент
"+"/"-"). - Численное «подкрадывание» лишь намекает на ответ; SymPy доказывает его.
- Под капотом — разложение в ряд и сравнение скоростей роста, а не подстановка чисел.