Пределы: 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 доказывает его.
  • Под капотом — разложение в ряд и сравнение скоростей роста, а не подстановка чисел.
Проверьте себя
1. Чему равен предел sin(x)/x при x → 0?
A0
B1
CНе существует (неопределённость 0/0)
DБесконечность
2. Зачем у limit бывает третий аргумент '+' или '-'?
AДля округления
BЧтобы задать сторону подхода к точке (справа или слева) — у разрывных функций пределы с разных сторон могут отличаться
CДля выбора точности
DЭто знак результата
3. Почему SymPy считает пределы надёжнее численного «подкрадывания» к точке?
AОн быстрее подставляет числа
BОн использует строгий алгоритм на основе разложения в ряд и сравнения скоростей роста, а не подстановку, которая может обмануть
CОн округляет результат
DЧисленный способ всегда верен