Вывод формул и LaTeX; SymPy против SciPy
SymPy не только считает — он красиво печатает формулы в LaTeX для научных статей. И финальный вопрос раздела: символьное или численное?
LaTeX — стандарт набора математических формул в научных публикациях; SymPy умеет автоматически переводить свои выражения в LaTeX-код.
Зачем печатать LaTeX
Учёный выводит формулу — и ему надо вставить её в статью, презентацию или диссертацию, где математика набирается в LaTeX. Переписывать вручную сложную формулу — мучительно и чревато опечатками. SymPy решает это: вывел формулу символьно, нажал latex(expr) — получил готовый код для вставки. Никаких ручных \frac и \sqrt.
SymPy печатает LaTeX
import sympy as sp
x = sp.symbols("x")
expr = sp.Integral(x**2, (x, 0, 1))
print(sp.latex(expr)) # \int\limits_{0}^{1} x^{2}\, dx
deriv = sp.diff(sp.sin(x)/x, x)
print(sp.latex(deriv)) # \frac{\cos{(x)}}{x} - \frac{\sin{(x)}}{x^{2}}
quad = sp.solve(x**2 + sp.symbols("b")*x + 1, x)
print(sp.latex(quad[0])) # формула корня в LaTeX
В Jupyter ещё лучше: SymPy рендерит формулы как настоящую математику прямо в блокноте — без ручного LaTeX вообще.
Простой «LaTeX-генератор» руками
Чтобы понять идею, напишем крошечный конвертер дроби в LaTeX на stdlib — SymPy делает то же, но для любых выражений:
def fraction_to_latex(numerator, denominator):
return "\\frac{" + str(numerator) + "}{" + str(denominator) + "}"
def power_to_latex(base, exp):
return str(base) + "^{" + str(exp) + "}"
print(fraction_to_latex("x", "2")) # \frac{x}{2}
print(power_to_latex("x", "3")) # x^{3}
print(fraction_to_latex(power_to_latex("x", 2), "y")) # \frac{x^{2}}{y}
Вывод:
\frac{x}{2}
x^{3}
\frac{x^{2}}{y}
Видно правило: SymPy рекурсивно обходит дерево выражения и для каждого узла вставляет нужную LaTeX-конструкцию (\frac, ^{}, \sqrt). Наш пример делает это для двух случаев — SymPy для всех.
SymPy против SciPy: финальная таблица
Теперь, изучив оба мира, сведём выбор в одну таблицу — это главный практический вывод курса:
| Критерий | SymPy (символьно) | SciPy (численно) |
| Результат | точная формула | приближённое число |
| Скорость | медленно | очень быстро |
| Размер задачи | малый/средний | огромный |
| Когда брать | вывод формулы, точность, анализ «в буквах» | данные, симуляции, массовый счёт |
| Пример | «выведи формулу производной» | «посчитай производную в 10⁶ точках» |
Правило выбора и связка
Простое правило: нужна формула или точность — SymPy; нужны числа и скорость — SciPy. Но самое мощное — их связка, которую мы уже видели: SymPy выводит формулу, lambdify компилирует её, SciPy/NumPy считает массово. Так инженерную задачу решают красиво: символьно получают аналитическую зависимость (понятную, проверяемую), а потом численно подставляют конкретные данные с полной скоростью.
Как работает под капотом
Генерация LaTeX — это, как и lambdify, обход дерева выражения, но с другим «принтером» на выходе. Где lambdify печатает Python-код, LaTeX-принтер печатает математическую разметку: узел деления → \frac{...}{...}, степень → ^{...}, корень → \sqrt{...}, функция → \sin{(...)}. SymPy имеет несколько таких «принтеров» (для LaTeX, для обычного текста, для кода на C/Fortran, для Python) — все они обходят одно и то же дерево, но по-разному его форматируют. Это элегантный пример паттерна «посетитель»: структура одна, представлений много.
Частые ошибки
- Экранирование в строке. LaTeX полон обратных слешей; в Python-строке их надо удваивать или брать «сырую» строку.
- Брать SymPy для больших численных задач. Это медленно; выведите формулу и переходите на SciPy/NumPy.
- Забывать про связку lambdify. Не выбирайте «или-или» — самое сильное решение часто использует оба инструмента.
Итог
- SymPy печатает формулы в LaTeX (
latex(expr)) для статей и презентаций. - Генерация LaTeX и кода — это обход дерева разными «принтерами».
- SymPy — для формул и точности, SciPy — для чисел и скорости.
- Сильнейший приём — связка: SymPy выводит формулу → lambdify → SciPy считает.