NumPy оперирует массивами чисел, Matplotlib строит графики по числовым данным.
Но в математике и физике мы часто работаем с символами и выражениями:
\[x^2 - y^2 = (x - y)(x + y)\]
Символьные вычисления - это преобразования математических выражений в аналитическом виде, без подстановки конкретных чисел.
SymPy - библиотека для символьной математики.
Основные возможности:
алгебраические преобразования;
решение уравнений и систем уравнений;
математический анализ (пределы, производные, интегралы);
линейная алгебра (матрицы, определители);
теория чисел, комбинаторика;
построение графиков функций.
Установка:
По аналогии с NumPy и Pandas, принято использовать псевдоним:
После этого выражения будут отображаться в виде формул, а не в упрощённом виде.
Символ - это “переменная” в математическом смысле. Создаётся объектом класса Symbol:
Имя переменной Python и имя символа могут не совпадать:
\(2x + 1\).
Используем функцию symbols() (с маленькой буквы!):
С символами работают обычные операторы Python:
\(2x + y\).
SymPyавтоматически сокращает простые выражения:
\(3x\)
Чтобы раскрыть скобки - нужно явно вызвать функцию expand.
expandФункция expand() раскрывает скобки и приводит подобные:
\[x^2 + 5x + 6\]
factorФункция factor() выполняет обратную операцию:
\[(x - y)(x + y)\]
simplifyФункция simplify() ищет наиболее компактную форму для выражения:
\[1\]
subsМетод subs() подставляет значения в выражение:
\[4y + 4 + y^2\]
Путь при равноускоренном движении: \(s = ut + \dfrac{at^2}{2}\).
Ответ: \(24\) метра.
solveФункция solve() решает уравнения.
SymPy ищет корни выражения, приравниваемого к нулю!
Уравнение \(x - 5 = 7\) нужно переписать: \(x - 5 - 7 = 0\).
\[[12]\]
Результат - список корней.
Решим уравнение \(3x + 7 = 22\):
\[[5]\]
\(x^2 + 5x + 4 = 0\):
\[[-4,\ -1]\]
Уравнение \(x^2 + x + 1 = 0\) не имеет действительных корней:
\[\left[-\frac{1}{2} - \frac{\sqrt{3}\,i}{2},\ -\frac{1}{2} + \frac{\sqrt{3}\,i}{2}\right]\]
SymPy работает в поле комплексных чисел автоматически. Мнимая единица обозначается в коде как I.
Найдём \(t\) из формулы \(s = ut + \dfrac{at^2}{2}\):
\[\left[\frac{-u - \sqrt{2as + u^2}}{a},\ \frac{-u + \sqrt{2as + u^2}}{a}\right]\]
Указываем вторым аргументом, какую переменную ищем.
\[\begin{cases} 2x + 3y = 6 \\ 3x + 2y = 12 \end{cases}\]
Переносим всё в левую часть:
\[\left[\left\{x: \frac{24}{5},\ y: -\frac{6}{5}\right\}\right]\]
Подставим найденные значения обратно:
\[0\]
Оба выражения обратились в ноль - решение верно.
Решим \(\sin(x) = \dfrac{1}{2}\):
\[\left[\frac{\pi}{6},\ \frac{5\pi}{6}\right]\]
sp.Rational(1, 2) - дробь \(\frac{1}{2}\), а не 0.5.
sympifyПреобразуем строку в выражение SymPy:
\[x^2 + 3x + 2\]
В Matplotlib для построения графика функции нужно было создать массивы x и y. В SymPy достаточно выражения:

Ограничим \(x\) отрезком \([-5,\ 5]\):

Именованные параметры title, xlabel, ylabel:
Парабола \(y = x^2 - 4\):


sp.pi - символ числа \(\pi\).
Передаём несколько выражений в plot():

show=False - не показывать график сразу;p[0], p[1] - обращение к отдельным линиям;'r', 'g', 'b', 'c', 'm', 'y', 'k', 'w'.Найдём пересечение \(y = 2x + 3\) и \(y = 3x + 1\) аналитически:
\[[2]\]
При \(x = 2\): \(y = 2 \cdot 2 + 3 = 7\). Точка пересечения: \((2,\ 7)\).
Точка пересечения графиков
SymPy - символьные, NumPy - числовые вычисления.
Численное значение выражения можно получить с помощью функции evalf:
\[4.55580621596148\]
Для более тонкой настройки графиков можно конвертировать SymPy-выражение в функцию Python:
lambdify() создаёт быструю численную функцию из символьного выражения.
| Задача | Функция / метод |
|---|---|
| Объявить символ | sp.Symbol('x'), sp.symbols('x y z') |
| Раскрыть скобки | sp.expand() |
| Разложить на множители | sp.factor() |
| Упростить | sp.simplify() |
| Подставить значение | .subs({x: 2}) |
| Получить число | .evalf() |
| Преобразовать строку | sp.sympify() |
| Решить уравнение | sp.solve() |
| Построить график | sp.plot() |