sympy
¶sympy
¶Прежде, чем содержательно обсуждать логику работы и функционал библиотеки, её необходимо установить. Для этого необходимо
на Windows: зайти в Anaсonda Command Prompt и ввести в нём pip install sympy
на MacOS или Linux: открыть терминал и ввести в нём pip install sympy
.
Когда библиотека установлена, полезно проверить, что всё прошло, как нужно. Импортируем sympy
:
import sympy
Теперь, когда убедились в том, что библиотека импортируется, импортируем все её функции сразу, чтобы не вводить название библиотеки каждый раз при вызове функций:
from sympy import *
Библиотека sympy
(сокращение от Symbolic Python) – библиотека для символьных вычислений в Python. Что такое символьные вычисления? В отличие от обычных вычислений (разделить одну числовую переменную на другую, сложить два числа), в таких вычислениях мы работаем с переменными как с символами. Так, мы можем сообщить Python, что строка "x", преобразованная особым образом, это не обычная строка в Python (текст), а переменная в том смысле, в котором мы понимаем её в математике. То есть, мы можем записать выражение "2x(x+1)"
и Python будет понимать, что можно не только поставить на место x
любое число и посчитать результат, но и работать с такой строкой как с математическим выражением: раскрывать скобки, упрощать, находить производную, считать её значение в точке и так далее.
Рассмотрим пример. Сообщим Python, чтобы далее он воспринимал x
и y
в выражениях как математические переменные:
x, y = symbols("x y")
Посмотрим на них:
x
x
y
y
А теперь на выражения, их содержащие:
2 * x
2*x
x ** 2 + y ** 2
x**2 + y**2
Обратите внимание: теперь x
и y
вводятся без кавычек! Python и так понимает, что мы имеем в виду те x
и y
, которые мы зафиксировали в symbols()
. Если бы этого не сделали, он бы относился к ним как к обычным переменным и в случае, если бы мы не присвоили им значения, выдавал бы ошибку вида NameError: name 'x' is not defined
.
Выведем выражение на экран в более красивом виде:
pprint(x ** 2 + y ** 2)
2 2 x + y
Или в ещё более красивом виде (LaTeX-style):
init_printing() # для красивого вида последующих выражений
x ** 2 + y ** 2
(x + y) ** 2 - x/y
Теперь попробуем сохранить какое-нибудь математическое выражение и поподставлять в него значения x
и y
:
expr = (x + y)**2
expr
expr.subs(x, 2) # x=2
expr.subs(y, 8) # y=8
А теперь всё сразу:
expr.subs({x: 4, y:5}) # x=4, y=5
Оно ещё и посчиталось! Для вычисления значения выражения можно использовать специальный метод evalf()
(от evaluate function):
expr2 = 3 * x ** 2 + 5 / y
expr2
expr2.evalf(subs={x:2, y:4})
Теперь посмотрим на что-то более интересное. Посмотрим, как с помощью sympy
можно упрощать выражения:
primer1 = 3 * (x - 2 * x) + 5 * x
primer1.simplify() # упростили!
primer2 = (x + y) * 2
primer2.simplify() # тоже упростили
Или раскрывать скобки по известным формулам:
p = (x + y) ** 2
p.expand()
q = (x + y) ** 3
q.expand()
И даже по тригонометрическим формулам:
trig = sin(2 * x)
expand_trig(trig)
sympy
¶Для начала найдём простенькую производную первого порядка (первую производную) некоторой функции $f(x)$:
fx = x ** 3 + 2* x + 1/x
fx
fx.diff(x) # дифференцируем по x
Вопрос: как найти значение производной в точке, если совместить .diff()
и .evalf()
?
Найдем производную второго порядка (вторую производную):
fx.diff(x, 2) # вторая производная по x
А теперь рассмотрим функцию от двух переменных:
fu = x ** y + y ** 3
fu
И найдем частные производные по x
и y
:
fu.diff(x)
fu.diff(y)
Теперь вернёмся к функции от одной переменной и попробуем решить стандартную задачу: найти точки экстремума функции. Для этого нам понадобится функция solve()
, которая позволяет решать уравнения (по умолчанию выражение приравнивается к нулю). Посмотрим, как она работает.
solve(2 * x ** 2 - 1) # 2x^2 -1
Теперь совместим: найдём производную и приравняем её к нулю:
f = sqrt(16 - 4 * x - x ** 2)
f
dv = f.diff(x)
dv
solve(dv) # приравниваем результат к 0
Так как вообще ответов может быть несколько, результат выдаётся в виде списка. Извлечём из него единственный элемент.
solve(dv)[0]
Пока мы проверили только необходимое условие существования экстремума. Пойдём дальше и посмотрим, что у нас со второй производной (может, это просто точка перегиба):
dv2 = f.diff(x, 2)
dv2
dv2.evalf(subs={x:-2})
В точке $-2$ значение второй производной меньше нуля. Полученная точка является точкой экстремума, а именно, точкой максимума функции. Конечно, в данном случае можно было обойтись и без этого, просто посмотреть на знаки значений производной функции при $x > -2$ и $x<-2$, но это вы можете проделать самостоятельно.