Для начала импортируем библиотеку (если ещё не работали с sympy
, см. обзор здесь) и определим символы для переменных, с которыми будем работать.
from sympy import *
x, y = symbols("x y")
Найдём неопределённый интеграл от какой-нибудь функции. Зададим саму функцию и выведем её в красивом свёрстанном виде:
init_printing()
fx = 1 / (2 * x)
fx
Вычислим интеграл (в sympy
константа $C$ в неопределённых интегралах будет опускаться):
integrate(fx, x)
Или что-то более сложное:
$f(x) = \dfrac{1}{1+x^2}$
integrate(1 / (1 + x ** 2), x)
$f(x) = \sin(x) + \cos(x) \cdot e^x$
integrate(sin(x) * cos(x) * exp(x), x)
А теперь посчитаем определённый интеграл. Для этого достаточно дописать границы отрезка, на котором мы интегрируем, внутри функции integrate()
:
integrate(log(x), (x, 1, 2))
Обратите внимание: в таком случае все аргументы функции вводятся в круглых скобках – они должны быть оформлены в кортеж (tuple). Пример кортежа:
t = (2, 5, 10)
t
Иначе ничего не получится:
integrate(log(x), x, 1, 2)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-22-b07d1598b3ef> in <module>() ----> 1 integrate(log(x), x, 1, 2) /anaconda3/lib/python3.6/site-packages/sympy/integrals/integrals.py in integrate(*args, **kwargs) 1289 risch = kwargs.pop('risch', None) 1290 manual = kwargs.pop('manual', None) -> 1291 integral = Integral(*args, **kwargs) 1292 1293 if isinstance(integral, Integral): /anaconda3/lib/python3.6/site-packages/sympy/integrals/integrals.py in __new__(cls, function, *symbols, **assumptions) 73 return function._eval_Integral(*symbols, **assumptions) 74 ---> 75 obj = AddWithLimits.__new__(cls, function, *symbols, **assumptions) 76 return obj 77 /anaconda3/lib/python3.6/site-packages/sympy/concrete/expr_with_limits.py in __new__(cls, function, *symbols, **assumptions) 366 367 if symbols: --> 368 limits, orientation = _process_limits(*symbols) 369 else: 370 # symbol not provided -- we can still try to compute a general form /anaconda3/lib/python3.6/site-packages/sympy/concrete/expr_with_limits.py in _process_limits(*symbols) 67 continue 68 ---> 69 raise ValueError('Invalid limits given: %s' % str(symbols)) 70 71 return limits, orientation ValueError: Invalid limits given: (x, 1, 2)
А теперь рассмотрим какой-нибудь несобственный интеграл, например, интеграл, где оба предела интегрирования стремятся к $\pm \infty$:
integrate(1 / (1 + x ** 2), (x, -oo, oo))
Примечание: символ для бесконечности немного нетривиальный – проще всего его просто скопировать из какой-нибудь документации sympy
(если под рукой нет готового файла).
Интересный факт: вместо готового значения можно вывести само выражение для интегрирования:
Integral(1 / (1 + x ** 2), (x, -oo, oo)) # Integral vs integrate
Про особенности вычисления интегралов в sympy
можно почитать здесь, раздел API Reference.
sympy
¶Посчитаем предел функции $f(x) = e^{-x}$ при $x \to \infty$:
Limit(exp(-x), x, oo) # пока само выражение
limit(exp(-x), x, oo) # результат
А что, если предел равен бесконечности? Проверим:
limit(exp(-x), x, -oo) # и правда
А если предела не существует совсем (даже не-конечного)?
limit(sin(1/x), x, 0) # странный ответ, попробуйте понять, почему
Sympy
также умеет вычислять односторонние пределы:
Limit(1 / (x - 2), x, 2, '-') # левосторонний предел
limit(1 / (x - 2), x, 2, '-') # вычисляем
Limit(1 / (x - 2), x, 2, '+') # правосторонний предел
limit(1 / (x - 2), x, 2, '+') # вычисляем
sympy
¶Создадим матрицу M
и посмотрим на неё:
M = Matrix([[2, 1], [1, 2]])
M
Найдём обратную матрицу:
M.inv()
Найдём её ранг:
M.rank() # в данном случае ожидаемо, что он равен 2
Посчитаем собственные значения матрицы M
:
M.eigenvals() # два значения: 1 и 3
И собственные векторы (какие-нибудь):
M.eigenvects() # два собственных вектора
Приведём матрицу к диагональному виду:
M.diagonalize()
Почему результат включает две матрицы? Вторая матрица – это итоговая диагональная матрица, а первая – это матрица $P$ отсюда:
$$ M=PDP^{−1} $$Примечание: $M$ – это наша исходная матрица, $D$ – диагоналльная матрица.
Можем извлечь диагональную матрицу из полученного кортежа:
M.diagonalize()[1] # второй элемент – элемент с индексом 1
Или используем множественное присваивание:
P, D = M.diagonalize()
D
Можем разложить матрицу, выбрав определённый метод разложения. Например, выберем LU-разложение, то есть представим матрицу M
в виде произведения нижней треугольной матрицы (Lower) и верхней треугольной матрицы (Upper):
M.LUdecomposition()
Проверим, что всё работает корректно – перемножим матрицы из выдачи выше. Опять извлечём первые две матрицы из кортежа:
L, U, N = M.LUdecomposition() # N - просто так, пустая матрица
L
U
Перемножим и сравним:
L * U == M # действительно
True
Вычислите с помощью sympy
пределы 1, 7, 10, 12, 13 отсюда и сравните результаты с предложенными решениями. Всегда ли sympy
корректно возвращает результат (особенно интересуют случаи, когда предел равен $\pm\infty$ или не существует).
Подсказка: кусочно-заданную функцию можно определить с помощью функции Piecewise()
. Пример:
Piecewise((0, x < -1),
(0, x > 1),
( (x ** 2, True)))
Вычислите следующие неопределённые и определённые интегралы:
A
в общем виде (считая, что a
и b
– это какие-то числа):Извлеките полученные на предыдущем шаге собственные значения из словаря так, чтобы с ними можно было работать по отдельности (сохраните первое как lamda1
, второе – как lamda2
. Вычислите значения lamda1
и lamda2
, считая, что $a=5$, $b = 7$.
Найдите собственные вектора матрицы A
в общем виде (считая, что a
и b
– это какие-то числа). Покажите, что эти вектора перпендикулярны друг другу.
Подсказка: Для этого погуглите или посмотрите в документации sympy
, как считать скалярное произведение векторов.