SymPy - Краткое руководство

SymPy - это библиотека Python для выполнения символьных вычислений. Этоcomputer algebra system(CAS), который можно использовать как отдельное приложение или как библиотеку для других приложений. Его прямая трансляция также доступна наhttps://live.sympy.org/. Поскольку это чистая библиотека Python, ее можно использовать как в интерактивном режиме, так и в качестве программного приложения. SymPy теперь стала популярной символической библиотекой для научной экосистемы Python.

SymPy имеет широкий спектр функций, применимых в области базовой символьной арифметики, исчисления, алгебры, дискретной математики, квантовой физики и т. Д. SymPy может форматировать результаты в различных форматах, включая LaTeX, MathML и т. Д. SymPy распространяется под Новая лицензия BSD. Команда разработчиков во главе сOndřej Čertík и Aaron Meurer опубликовал первую версию SymPy в 2007 году. Текущая версия - 1.5.1.

Некоторые из областей применения SymPy:

  • Polynomials
  • Calculus
  • Дискретная математика
  • Matrices
  • Geometry
  • Plotting
  • Physics
  • Statistics
  • Combinatorics

SymPy имеет одну важную предварительную библиотеку с именем mpmath. Это библиотека Python для реальной и сложной арифметики с плавающей запятой с произвольной точностью. Однако установщик пакетов Python PIP устанавливает его автоматически при установке SymPy следующим образом:

pip install sympy

В других дистрибутивах Python, таких как Anaconda, Enthought Canopy и т. Д., Может быть уже включен SymPy. Чтобы проверить, вы можете ввести следующее в командной строке Python -

>>> import sympy
>>> sympy.__version__

И вы получите следующий результат как текущую версию sympy -

'1.5.1'

Исходный код пакета SymPy доступен по адресу https://github.com/sympy/sympy.

Символьные вычисления относятся к разработке алгоритмов для управления математическими выражениями и другими математическими объектами. Символьные вычисления объединяют математику с информатикой для решения математических выражений с использованием математических символов. Система компьютерной алгебры (CAS), такая как SymPy, точно (а не приблизительно) вычисляет алгебраические выражения, используя те же символы, которые используются в традиционном ручном методе. Например, мы вычисляем квадратный корень из числа, используя математический модуль Python, как показано ниже -

>>> import math 
>>> print (math.sqrt(25), math.sqrt(7))

Вывод для приведенного выше фрагмента кода следующий:

5.0 2.6457513110645907

Как видите, квадратный корень из 7 рассчитывается приблизительно. Но в SymPy квадратные корни чисел, которые не являются точными квадратами, по умолчанию не вычисляются, как указано ниже -

>>> import sympy 
>>> print (sympy.sqrt(7))

Вывод для приведенного выше фрагмента кода следующий:

sqrt(7)

Можно упростить и показать результат выражения символически с помощью фрагмента кода ниже -

>>> import math
>>> print (math.sqrt(12))

Вывод для приведенного выше фрагмента кода следующий:

3.4641016151377544

Вам нужно использовать приведенный ниже фрагмент кода, чтобы выполнить то же самое с помощью sympy -

##sympy output 
>>> print (sympy.sqrt(12))

И результат для этого следующий -

2*sqrt(3)

Код SymPy при запуске в блокноте Jupyter использует библиотеку MathJax для отображения математических символов в форме LatEx. Это показано во фрагменте кода ниже -

>>> from sympy import * 
>>> x=Symbol ('x') 
>>> expr = integrate(x**x, x) 
>>> expr

При выполнении вышеуказанной команды в оболочке python будет сгенерирован следующий вывод:

Integral(x**x, x)

Что эквивалентно

$\int \mathrm{x}^{x}\,\mathrm{d}x$

Квадратный корень из неполного квадрата может быть представлен латексом следующим образом с использованием традиционного символа -

>>> from sympy import * 
>>> x=7 
>>> sqrt(x)

Вывод для приведенного выше фрагмента кода следующий:

$\sqrt7$

Система символьных вычислений, такая как SymPy, выполняет все виды вычислений (например, производные, интегралы и пределы, решает уравнения, работает с матрицами) символически. В пакете SymPy есть различные модули, которые поддерживают построение графиков, печать (например, LATEX), физику, статистику, комбинаторику, теорию чисел, геометрию, логику и т. Д.

Основной модуль в пакете SymPy содержит класс Number, который представляет атомные числа. Этот класс имеет два подкласса: класс Float и Rational. Класс Rational расширен классом Integer.

Класс Float представляет собой число с плавающей запятой произвольной точности.

>>> from sympy import Float 
>>> Float(6.32)

Вывод для приведенного выше фрагмента кода следующий:

6.32

SymPy может преобразовывать целое число или строку в число с плавающей запятой.

>>> Float(10)

10.0

Float('1.33E5')# scientific notation

133000.0

При преобразовании в число с плавающей запятой также можно указать количество цифр для точности, как указано ниже -

>>> Float(1.33333,2)

Вывод для приведенного выше фрагмента кода следующий:

1.3

Представление числа (p / q) представлено как объект класса Rational, где q - ненулевое число.

>>> Rational(3/4)

Вывод для приведенного выше фрагмента кода следующий:

$\frac{3}{4}$

Если число с плавающей запятой передается конструктору Rational (), он возвращает базовое значение своего двоичного представления.

>>> Rational(0.2)

Вывод для приведенного выше фрагмента кода следующий:

$\frac{3602879701896397}{18014398509481984}$

Для упрощения представления укажите ограничение знаменателя.

>>> Rational(0.2).limit_denominator(100)

Вывод для приведенного выше фрагмента кода следующий:

$\frac{1}{5}$

Когда строка передается конструктору Rational (), возвращается рациональное число произвольной точности.

>>> Rational("3.65")

Вывод для приведенного выше фрагмента кода следующий:

$\frac{73}{20}$

Рациональный объект также может быть получен, если переданы два числовых аргумента. Части числителя и знаменателя доступны как свойства.

>>> a=Rational(3,5) 
>>> print (a) 
>>> print ("numerator:{}, denominator:{}".format(a.p, a.q))

Вывод для приведенного выше фрагмента кода следующий:

3/5

numerator:3, denominator:5

>>> a

Вывод для приведенного выше фрагмента кода следующий:

$\frac{3}{5}$

Целочисленный класс в SymPy представляет собой целое число любого размера. Конструктор может принимать число с плавающей запятой или рациональное число, но дробная часть отбрасывается.

>>> Integer(10)

Вывод для приведенного выше фрагмента кода следующий:

10

>>> Integer(3.4)

Вывод для приведенного выше фрагмента кода следующий:

3

>>> Integer(2/7)

Вывод для приведенного выше фрагмента кода следующий:

0

SymPy имеет RealNumberкласс, который действует как псевдоним для Float. SymPy также определяет Zero и One как одноэлементные классы, доступные через S.Zero и S.One соответственно, как показано ниже -

>>> S.Zero

Результат выглядит следующим образом -

0

>>> S.One

Результат выглядит следующим образом -

1

Другими предопределенными объектами числа Singleton являются Half, NaN, Infinity и ImaginaryUnit.

>>> from sympy import S 
>>> print (S.Half)

Результат выглядит следующим образом -

½

>>> print (S.NaN)

Результат выглядит следующим образом -

nan

Бесконечность доступна как объект символа oo или S.Infinity.

>>> from sympy import oo 
>>> oo

Вывод для приведенного выше фрагмента кода следующий:

$\infty$

>>> S.Infinity

Вывод для приведенного выше фрагмента кода следующий:

$\infty$

Номер ImaginaryUnit может быть импортирован как символ I или доступен как S.ImaginaryUnit и представляет собой квадратный корень из -1.

>>> from sympy import I 
>>> I

Когда вы выполняете приведенный выше фрагмент кода, вы получаете следующий результат:

i

>>> S.ImaginaryUnit

Вывод приведенного выше фрагмента выглядит следующим образом:

i

>>> from sympy import sqrt 
>>> i=sqrt(-1) 
>>> i*i

Когда вы выполняете приведенный выше фрагмент кода, вы получаете следующий результат:

-1

Symbolэто самый важный класс в библиотеке symPy. Как упоминалось ранее, символьные вычисления выполняются с помощью символов. Переменные SymPy являются объектами класса Symbols.

Аргументом функции Symbol () является строка, содержащая символ, который можно присвоить переменной.

>>> from sympy import Symbol 
>>> x=Symbol('x') 
>>> y=Symbol('y') 
>>> expr=x**2+y**2 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^2 + y^2$

Символ может состоять из более чем одного алфавита.

>>> s=Symbol('side') 
>>> s**3

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$side^3$

SymPy также имеет Symbols()функция, которая может определять несколько символов одновременно. Строка содержит имена переменных, разделенных запятой или пробелом.

>>> from sympy import symbols 
>>> x,y,z=symbols("x,y,z")

В модуле abc SymPy все латинские и греческие алфавиты определены как символы. Следовательно, этот метод удобен вместо создания экземпляра объекта Symbol.

>>> from sympy.abc import x,y,z

Однако имена C, O, S, I, N, E и Qпредопределенные символы. Кроме того, символы с более чем одним алфавитом не определены в модуле abc, для которого вы должны использовать объект Symbol, как указано выше. Модуль abc определяет специальные имена, которые могут обнаруживать определения в пространстве имен SymPy по умолчанию. clash1 содержит одиночные буквы, а clash2 - многобуквенные символы конфликта

>>> from sympy.abc import _clash1, _clash2 
>>> _clash1

Вывод приведенного выше фрагмента выглядит следующим образом:

{'C': C, 'O': O, 'Q': Q, 'N': N, 'I': I, 'E': E, 'S': S}

>>> _clash2

Вывод приведенного выше фрагмента выглядит следующим образом:

{'beta': beta, 'zeta': zeta, 'gamma': gamma, 'pi': pi}

Индексированные символы могут быть определены с использованием синтаксиса, аналогичного функции range (). Диапазоны обозначаются двоеточием. Тип диапазона определяется символом справа от двоеточия. Если itr - цифра, все смежные цифры слева принимаются в качестве неотрицательного начального значения. Все смежные цифры справа считаются на 1 больше конечного значения.

>>> from sympy import symbols 
>>> symbols('a:5')

Вывод приведенного выше фрагмента выглядит следующим образом:

(a0, a1, a2, a3, a4)

>>> symbols('mark(1:4)')

Вывод приведенного выше фрагмента выглядит следующим образом:

(mark1, mark2, mark3)

Одна из самых простых операций, выполняемых с математическим выражением, - это подстановка. Функция subs () в SymPy заменяет все вхождения первого параметра вторым.

>>> from sympy.abc import x,a 
>>> expr=sin(x)*sin(x)+cos(x)*cos(x) 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\sin^2(x)+\cos^2(x)$

>>> expr.subs(x,a)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\sin^2(a)+\cos^2(a)$

Эта функция полезна, если мы хотим оценить определенное выражение. Например, мы хотим вычислить значения следующего выражения, заменив a на 5.

>>> expr=a*a+2*a+5 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$a^2 + 2a + 5$

expr.subs(a,5)

Приведенный выше фрагмент кода дает следующий результат -

40

>>> from sympy.abc import x 
>>> from sympy import sin, pi 
>>> expr=sin(x) 
>>> expr1=expr.subs(x,pi) 
>>> expr1

Приведенный выше фрагмент кода дает следующий результат -

0

Эта функция также используется для замены части выражения на другую часть выражения. В следующем примере b заменяется на a + b.

>>> from sympy.abc import a,b 
>>> expr=(a+b)**2 
>>> expr1=expr.subs(b,a+b) 
>>> expr1

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$(2a + b)^2$

Функция sympify () используется для преобразования любого произвольного выражения, чтобы его можно было использовать как выражение SymPy. Обычные объекты Python, такие как целочисленные объекты, конвертируются в SymPy. Целые числа и т. Д., Строки также преобразуются в выражения SymPy.

>>> expr="x**2+3*x+2" 
>>> expr1=sympify(expr) 
>>> expr1 
>>> expr1.subs(x,2)

Приведенный выше фрагмент кода дает следующий результат -

12

Любой объект Python можно преобразовать в объект SymPy. Однако, поскольку преобразование внутренне использует функцию eval (), не следует использовать несанкционированное выражение, иначе возникает SympifyError.

>>> sympify("x***2")
---------------------------------------------------------------------------

SympifyError: ошибка Sympify выражения "не удалось проанализировать" x *** 2 "из-за того, что возникло исключение.

Функция sympify () принимает следующие аргументы: * strict: по умолчанию False. Если установлено значение True, преобразуются только типы, для которых определено явное преобразование. В противном случае возникает SympifyError. * оценить: если установлено значение False, арифметические операции и операторы будут преобразованы в их эквиваленты в SymPy без оценки выражения.

>>> sympify("10/5+4/2")

Приведенный выше фрагмент кода дает следующий результат -

4

>>> sympify("10/5+4/2", evaluate=False)

Приведенный выше фрагмент кода дает следующий результат -

$\frac{10}{5}+\frac{4}{2}$

Эта функция оценивает данное числовое выражение с точностью до 100 цифр с плавающей запятой. Функция также принимает параметр subs как объект словаря числовых значений для символов. Рассмотрим следующее выражение

>>> from sympy.abc import r 
>>> expr=pi*r**2 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\Pi{r^2}$

Чтобы оценить приведенное выше выражение с помощью функции evalf (), заменив r на 5

>>> expr.evalf(subs={r:5})

Приведенный выше фрагмент кода дает следующий результат -

78.5398163397448

По умолчанию точность с плавающей запятой составляет до 15 цифр, которые могут быть заменены любым числом до 100. Следующее выражение оценивается с точностью до 20 цифр.

>>> expr=a/b 
>>> expr.evalf(20, subs={a:100, b:3})

Приведенный выше фрагмент кода дает следующий результат -

33.333333333333333333

Функция lambdify переводит выражения SymPy в функции Python. Если выражение должно оцениваться в большом диапазоне значений, функция evalf () неэффективна. lambdify действует как лямбда-функция, за исключением того, что он преобразует имена SymPy в имена заданной числовой библиотеки, обычно NumPy. По умолчанию lambdify реализуется в стандартной математической библиотеке.

>>> expr=1/sin(x) 
>>> f=lambdify(x, expr) 
>>> f(3.14)

Приведенный выше фрагмент кода дает следующий результат -

627.8831939138764

Выражение может иметь более одной переменной. В этом случае первым аргументом функции lambdify () является список переменных, за которым следует выражение, которое нужно оценить.

>>> expr=a**2+b**2 
>>> f=lambdify([a,b],expr) 
>>> f(2,3)

Приведенный выше фрагмент кода дает следующий результат -

13

Однако, чтобы использовать библиотеку numpy в качестве числового бэкенда, мы должны определить то же самое в качестве аргумента для функции lambdify ().

>>> f=lambdify([a,b],expr, "numpy")

Мы используем два массива numpy для двух аргументов a и b в приведенной выше функции. Время выполнения значительно меньше в случае массивов numpy.

>>> import numpy 
>>> l1=numpy.arange(1,6) 
>>> l2=numpy.arange(6,11) 
>>> f(l1,l2)

Приведенный выше фрагмент кода дает следующий результат -

array([ 37, 53, 73, 97, 125], dtype=int32)

Булевы функции определены в sympy.basic.booleanarg module. Можно создавать логические выражения с помощью стандартных операторов Python & (And), | (Или), ~ (Не), а также с >> и <<. Логические выражения наследуются от класса Basic, определенного в основном модуле SymPy.

Функция BooleanTrue

Эта функция эквивалентна True, как в ядре Python. Он возвращает синглтон, который может быть получен S.true.

>>> from sympy import * 
>>> x=sympify(true) 
>>> x, S.true

Приведенный выше фрагмент кода дает следующий результат -

(Правда правда)

Функция BooleanFalse

Точно так же эта функция эквивалентна Boolean False в Python и может быть доступна с помощью S.false

>>> from sympy import * 
>>> x=sympify(false) 
>>> x, S.false

Приведенный выше фрагмент кода дает следующий результат -

(Ложь, Ложь)

И функция

Логическая функция И оценивает два своих аргумента и возвращает False, если любой из них имеет значение False. Функция эмулирует оператор &.

>>> from sympy import * 
>>> from sympy.logic.boolalg import And 
>>> x,y=symbols('x y') 
>>> x=True 
>>> y=True 
>>> And(x,y), x"&"y

Приведенный выше фрагмент кода дает следующий результат -

(Правда правда)

>>> y=False 
>>> And(x,y), x"&"y

Приведенный выше фрагмент кода дает следующий результат -

(Ложь, Ложь)

Или функция

Эта функция оценивает два логических аргумента и возвращает True, если любой из них имеет значение True. | Оператор удобно имитирует его поведение.

>>> from sympy import * 
>>> from sympy.logic.boolalg import Or 
>>> x,y=symbols('x y') 
>>> x=True 
>>> y=False 
>>> Or(x,y), x|y

Приведенный выше фрагмент кода дает следующий результат -

(Правда правда)

>>> x=False 
>>> y=False 
>>> Or(x,y), x|y

Приведенный выше фрагмент кода дает следующий результат -

(Ложь, Ложь)

Не работает

Функция Logical Not приводит к отрицанию логического аргумента. Он возвращает True, если его аргумент равен False, и возвращает False, если True. Оператор ~ выполняет операцию, аналогичную функции Not. Это показано в примере ниже -

>>> from sympy import * 
>>> from sympy.logic.boolalg import Or, And, Not 
>>> x,y=symbols('x y') 
>>> x=True 
>>> y=False 
>>> Not(x), Not(y)

Приведенный выше фрагмент кода дает следующий результат -

(Ложь Правда)

>>> Not(And(x,y)), Not(Or(x,y))

Приведенный выше фрагмент кода дает следующий результат -

(Верно, неверно)

Функция Xor

Функция логического XOR (исключающее ИЛИ) возвращает True, если нечетное число аргументов равно True, а остальные - False, и возвращает False, если четное количество аргументов имеет значение True, а остальные - False. Аналогичную операцию выполняет оператор ^.

>>> from sympy import * 
>>> from sympy.logic.boolalg import Xor 
>>> x,y=symbols('x y') 
>>> x=True 
>>> y=False

>>> Xor(x,y), x^y

Приведенный выше фрагмент кода дает следующий результат -

(Правда правда)

>>> a,b,c,d,e=symbols('a b c d e') 
>>> a,b,c,d,e=(True, False, True, True, False) 
>>> Xor(a,b,c,d,e)

Приведенный выше фрагмент кода дает следующий результат -

Правда

В приведенном выше случае три аргумента (нечетное число) имеют значение True, поэтому Xor возвращает true. Однако, если количество аргументов True четное, это приводит к False, как показано ниже -

>>> a,b,c,d,e=(True, False, False, True, False) 
>>> Xor(a,b,c,d,e)

Приведенный выше фрагмент кода дает следующий результат -

Ложь

Функция Nand

Эта функция выполняет операцию логической И-НЕ. Он оценивает свои аргументы и возвращает True, если любой из них имеет значение False, и False, если все они истинны.

>>> from sympy import * 
>>> from sympy.logic.boolalg import Nand 
>>> a,b,c=symbols('a b c') 
>>> a,b,c=(True, False, True) 
>>> Nand(a,b,c), Nand(a,c)

Приведенный выше фрагмент кода дает следующий результат -

(Верно, неверно)

Ни функции

Эта функция выполняет операцию логического ИЛИ-ИЛИ. Он оценивает свои аргументы и возвращает False, если какой-либо из них является True, и True, если все они ложны.

>>> from sympy import * 
>>> from sympy.logic.boolalg import Nor 
>>> a,b,c=symbols('a b c') 
>>> a,b,c=(True, False, True) 
>>> Nor(a,b,c), Nor(a,c)

Приведенный выше фрагмент кода дает следующий результат -

(Ложь, Ложь)

Обратите внимание, что хотя SymPy предоставляет оператор ^ для Xor, ~ для Not, | для функций Or и & для And для удобства, их обычное использование в Python - побитовые операторы. Следовательно, если операнды являются целыми числами, результаты будут другими.

Эквивалентная функция

Эта функция возвращает отношение эквивалентности. Эквивалент (A, B) равен True тогда и только тогда, когда A и B оба True или оба False. Функция возвращает True, если все аргументы логически эквивалентны. В противном случае возвращает False.

>>> from sympy import * 
>>> from sympy.logic.boolalg import Equivalent 
>>> a,b,c=symbols('a b c') 
>>> a,b,c=(True, False, True) 
>>> Equivalent(a,b), Equivalent(a,c)

Приведенный выше фрагмент кода дает следующий результат -

(Ложь Правда)

Функция ITE

Эта функция действует как предложение If then else в языке программирования. Site (A, B, C) оценивает и возвращает результат B, если A истинно, иначе он возвращает результат C. Все аргументы должны быть логическими.

>>> from sympy import * >>> from sympy.logic.boolalg import ITE >>> a,b,c=symbols('a b c') >>> a,b,c=(True, False, True) 
>>> ITE(a,b,c), ITE(a,c,b)

Приведенный выше фрагмент кода дает следующий результат -

(Ложь Правда)

Модуль предположений в пакете SymPy содержит инструменты для извлечения информации о выражениях. Для этого модуль определяет функцию ask ().

sympy.assumptions.ask(property)

Следующие свойства предоставляют полезную информацию о выражении -

algebraic(x)

Чтобы быть алгебраическим, число должно быть корнем ненулевого полиномиального уравнения с рациональными коэффициентами. √2, потому что √2 является решением x2 - 2 = 0, поэтому оно алгебраическое.

complex(x)

Предикат комплексного числа. Это верно тогда и только тогда, когда x принадлежит набору комплексных чисел.

composite(x)

Предикат составного числа, возвращаемый функцией ask (Q.composite (x)), истинен тогда и только тогда, когда x является положительным целым числом и имеет по крайней мере один положительный делитель, отличный от 1 и самого числа.

even, odd

Метод ask () возвращает true, если x находится в наборе четных чисел и наборе нечетных чисел соответственно.

imaginary

Это свойство представляет предикат мнимого числа. Это правда, если x можно записать как действительное число, умноженное на мнимую единицу I.

integer

Это свойство, возвращаемое Q.integer (x), возвращает истину, если x принадлежит набору четных чисел.

rational, irrational

Q.irrational (x) истинно тогда и только тогда, когда x - любое действительное число, которое не может быть выражено как отношение целых чисел. Например, пи - иррациональное число.

positive, negative

Предикаты для проверки положительного или отрицательного числа

zero, nonzero

Предикаты для проверки, равно ли число нулю или нет

>>> from sympy import * 
>>> x=Symbol('x') 
>>> x=10 
>>> ask(Q.algebraic(pi))
False
>>> ask(Q.complex(5-4*I)), ask( Q.complex(100))
(True, True)
>>> x,y=symbols("x y") 
>>> x,y=5,10 
>>> ask(Q.composite(x)), ask(Q.composite(y))
(False, True)
>>> ask(Q.even(x)), ask(Q.even(y))
(False, True)
>>> x,y= 2*I, 4+5*I 
>>> ask(Q.imaginary(x)), ask(Q.imaginary(y))
(True, False)
>>> x,y=5,10 
>>> ask(Q.even(x)), ask(Q.even(y)), ask(Q.odd(x)), ask(Q.odd(y))
(False, True, True, False)
>>> x,y=5,-5 
>>> ask(Q.positive(x)), ask(Q.negative(y)), ask(Q.positive(x)), ask(Q.negative(y))
(True, True, True, True)
>>> ask(Q.rational(pi)), ask(Q.irrational(S(2)/3))
(False, False)
>>> ask(Q.zero(oo)), ask(Q.nonzero(I))
(False, False)

Sympy обладает мощной способностью упрощать математические выражения. В SymPy есть много функций для выполнения различного рода упрощений. Существует общая функция, называемая simpleify (), которая пытается получить простейшую форму выражения.

упрощать

Эта функция определена в модуле sympy.simplify. simpleify () пытается применить интеллектуальную эвристику, чтобы сделать входное выражение «проще». Следующий код показывает упрощенное выражение$sin^2(x)+cos^2(x)$.

>>> from sympy import * 
>>> x=Symbol('x')
>>> expr=sin(x)**2 + cos(x)**2 
>>> simplify(expr)

Приведенный выше фрагмент кода дает следующий результат -

1

расширять

Expand () - одна из наиболее распространенных функций упрощения в SymPy, используемая для раскрытия полиномиальных выражений. Например -

>>> a,b=symbols('a b') 
>>> expand((a+b)**2)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$a^2 + 2ab + b^2$

>>> expand((a+b)*(a-b))

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$a^2 - b^2$

Функция expand () делает выражения больше, а не меньше. Обычно это так, но часто выражение становится меньше после вызова для него метода expand ().

>>> expand((x + 1)*(x - 2) - (x - 1)*x)

Приведенный выше фрагмент кода дает следующий результат -

-2

фактор

Эта функция берет многочлен и разлагает его на неприводимые множители по рациональным числам.

>>> x,y,z=symbols('x y z') 
>>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
>>> factor(expr)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$z(x + 2y)^2$

>>> factor(x**2+2*x+1)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$(x + 1)^2$

Функция factor () противоположна функции expand (). Каждый из факторов, возвращаемых функцией factor (), гарантированно несократим. Функция factor_list () возвращает более структурированный вывод.

>>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
>>> factor_list(expr)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

(1, [(z, 1), (x + 2*y, 2)])

собирать

Эта функция собирает дополнительные члены выражения относительно списка выражений с точностью до степеней с рациональными показателями.

>>> expr=x*y + x - 3 + 2*x**2 - z*x**2 + x**3 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^3 + x^2z + 2x^2 + xy + x - 3$

Функция collect () для этого выражения приводит к следующему:

>>> collect(expr,x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^3 + x^2(2 - z) + x(y + 1) - 3$

>>> expr=y**2*x + 4*x*y*z + 4*y**2*z+y**3+2*x*y 
>>> collect(expr,y)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$Y^3+Y^2(x+4z)+y(4xz+2x)$

отменить

Функция cancel () принимает любую рациональную функцию и преобразует ее в стандартную каноническую форму, p / q, где p и q - расширенные многочлены без общих множителей. Старшие коэффициенты p и q не имеют знаменателей, т. Е. Являются целыми числами.

>>> expr1=x**2+2*x+1 
>>> expr2=x+1 
>>> cancel(expr1/expr2)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x+1$

>>> expr = 1/x + (3*x/2 - 2)/(x - 4) 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{\frac{3x}{2} - 2}{x - 4} + \frac{1}{x}$

>>> cancel(expr)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{3x^2 - 2x - 8}{2x^2 - 8}$

>>> expr=1/sin(x)**2 
>>> expr1=sin(x) 
>>> cancel(expr1*expr)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{1}{\sin(x)}$

trigsimp

Эта функция используется для упрощения тригонометрических тождеств. Можно отметить, что соглашения об именах для обратных тригонометрических функций заключаются в добавлении a перед именем функции. Например, обратный косинус или арккосинус называется acos ().

>>> from sympy import trigsimp, sin, cos 
>>> from sympy.abc import x, y
>>> expr = 2*sin(x)**2 + 2*cos(x)**2 
>>> trigsimp(expr)

2

Функция trigsimp использует эвристику для применения наиболее подходящего тригонометрического тождества.

Powersimp

Эта функция уменьшает данное выражение, комбинируя степени с аналогичными основаниями и показателями.

>>> expr=x**y*x**z*y**z 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^y x^z y^z$

>>> powsimp(expr)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^{y+z} y^z$

Вы можете заставить powsimp () объединять только базы или только показатели, изменяя comb = 'base' или comb = 'exp'. По умолчанию Combine = 'all' делает и то, и другое. Если force имеет значение True, базы будут объединены без проверки предположений.

>>> powsimp(expr, combine='base', force=True)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^y(xy)^z$

гребешок

Комбинаторные выражения, включающие факториал и биномы, можно упростить с помощью функции combsimp (). SymPy предоставляет функцию factorial ()

>>> expr=factorial(x)/factorial(x - 3) 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{x!}{(x - 3)!}$

Чтобы упростить приведенное выше комбинаторное выражение, мы используем функцию combsimp () следующим образом:

>>> combsimp(expr)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x(x-2)(x-1)$

Бином (x, y) - это количество способов выбрать y элементов из набора x различных элементов. Его также часто пишут как xCy.

>>> binomial(x,y)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$(\frac{x}{y})$

>>> combsimp(binomial(x+1, y+1)/binomial(x, y))

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{x + 1}{y + 1}$

бревенчатый комбайн

Эта функция берет логарифмы и объединяет их, используя следующие правила:

  • log (x) + log (y) == log (x * y), если оба положительны
  • a * log (x) == log (x ** a), если x положительно, а a реально
>>> logcombine(a*log(x) + log(y) - log(z))

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$a\log(x) + \log(y) - \log(z)$

Если для параметра силы этой функции установлено значение True, то предположения, приведенные выше, будут считаться выполненными, если уже не существует предположений относительно количества.

>>> logcombine(a*log(x) + log(y) - log(z), force=True)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\log\frac{x^a y}{z}$

Производная функции - это мгновенная скорость изменения одной из переменных. Это эквивалентно нахождению наклона касательной к функции в точке. Мы можем найти дифференцирование математических выражений в форме переменных, используя функцию diff () в пакете SymPy.

diff(expr, variable)
>>> from sympy import diff, sin, exp 
>>> from sympy.abc import x,y 
>>> expr=x*sin(x*x)+1 >>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x\sin(x^2) + 1$

>>> diff(expr,x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$2x^2\cos(x^2) + \sin(x^2)$

>>> diff(exp(x**2),x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

2xex2

Чтобы взять несколько производных, передайте переменную столько раз, сколько хотите дифференцировать, или передайте число после переменной.

>>> diff(x**4,x,3)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$24x$

>>> for i in range(1,4): print (diff(x**4,x,i))

Приведенный выше фрагмент кода дает следующее выражение -

4*x**3

12*x**2

24*x

Также можно вызвать метод diff () выражения. Работает аналогично функции diff ().

>>> expr=x*sin(x*x)+1 
>>> expr.diff(x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$2x^2\cos(x^2) + \sin(x^2)$

Неоцененный производный инструмент создается с использованием класса Derivative. Он имеет тот же синтаксис, что и функция diff (). Чтобы оценить неоцененную производную, используйте метод doit.

>>> from sympy import Derivative 
>>> d=Derivative(expr) 
>>> d

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{d}{dx}(x\sin(x^2)+1)$

>>> d.doit()

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$2x^2\cos(x^2) + \sin(x^2)$

Пакет SymPy содержит модуль интегралов. В нем реализованы методы вычисления определенных и неопределенных интегралов выражений. Метод интегрировать () используется для вычисления как определенных, так и неопределенных интегралов. Чтобы вычислить неопределенный или примитивный интеграл, просто передайте переменную после выражения.

Например -

integrate(f, x)

Чтобы вычислить определенный интеграл, передайте аргумент следующим образом:

(integration_variable, lower_limit, upper_limit)
>>> from sympy import * 
>>> x,y = symbols('x y') 
>>> expr=x**2 + x + 1 
>>> integrate(expr, x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{x^3}{3} + \frac{x^2}{2} + x$

>>> expr=sin(x)*tan(x) 
>>> expr 
>>> integrate(expr,x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$-\frac{\log(\sin(x) - 1)}{2} + \frac{\log(\sin(x) + 1)}{2} - \sin(x)$

Пример определенного интеграла приведен ниже -

>>> expr=exp(-x**2) 
>>> integrate(expr,(x,0,oo) )

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{\sqrt\pi}{2}$

Вы можете передать несколько предельных кортежей для выполнения множественного интеграла. Пример приведен ниже -

>>> expr=exp(-x**2 - y**2)
>>> integrate(expr,(x,0,oo),(y,0,oo))

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{\pi}{4}$

Вы можете создать неоцененный интеграл с помощью объекта Integral, который можно оценить, вызвав метод doit ().

>>> expr = Integral(log(x)**2, x) 
>>> expr

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\int \mathrm\log(x)^2 \mathrm{d}x$

>>> expr.doit()

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x\log(x)^2 - 2xlog(x) + 2x$

Интегральные преобразования

SymPy поддерживает различные типы интегральных преобразований следующим образом:

  • laplace_transform
  • fourier_transform
  • sine_transform
  • cosine_transform
  • hankel_transform

Эти функции определены в модуле sympy.integrals.transforms. Следующие примеры вычисляют преобразование Фурье и преобразование Лапласа соответственно.

Example 1

>>> from sympy import fourier_transform, exp 
>>> from sympy.abc import x, k 
>>> expr=exp(-x**2) 
>>> fourier_transform(expr, x, k)

При выполнении вышеуказанной команды в оболочке python будет сгенерирован следующий вывод:

sqrt(pi)*exp(-pi**2*k**2)

Что эквивалентно -

$\sqrt\pi * e^{\pi^2k^2}$

Example 2

>>> from sympy.integrals import laplace_transform 
>>> from sympy.abc import t, s, a 
>>> laplace_transform(t**a, t, s)

При выполнении вышеуказанной команды в оболочке python будет сгенерирован следующий вывод:

(s**(-a)*gamma(a + 1)/s, 0, re(a) > -1)

В математике матрица - это двумерный массив чисел, символов или выражений. Теория манипуляций с матрицами занимается выполнением арифметических операций над матричными объектами при соблюдении определенных правил.

Линейное преобразование - одно из важных приложений матриц. Многие научные области, особенно связанные с физикой, используют приложения, связанные с матрицами.

В пакете SymPy есть модуль матриц, который занимается обработкой матриц. Он включает класс Matrix, объект которого представляет собой матрицу.

Note: If you want to execute all the snippets in this chapter individually, you need to import the matrix module as shown below −

>>> from sympy.matrices import Matrix

Example

>>> from sympy.matrices import Matrix 
>>> m=Matrix([[1,2,3],[2,3,1]]) 
>>> m
$\displaystyle \left[\begin{matrix}1 & 2 & 3\\2 & 3 & 1\end{matrix}\right]$

При выполнении вышеуказанной команды в оболочке python будет сгенерирован следующий вывод:

[1 2 3 2 3 1]

Матрица создается из объектов List соответствующего размера. Вы также можете получить матрицу, распределив элементы списка по заданному количеству строк и столбцов.

>>> M=Matrix(2,3,[10,40,30,2,6,9]) 
>>> M
$\displaystyle \left[\begin{matrix}10 & 40 & 30\\2 & 6 & 9\end{matrix}\right]$

При выполнении вышеуказанной команды в оболочке python будет сгенерирован следующий вывод:

[10 40 30 2 6 9]

Матрица - изменяемый объект. Модуль матриц также предоставляет класс ImmutableMatrix для получения неизменяемой матрицы.

Основные манипуляции

В shape Свойство объекта Matrix возвращает его размер.

>>> M.shape

Вывод для приведенного выше кода выглядит следующим образом:

(2,3)

Методы row () и col () соответственно возвращают строку или столбец указанного числа.

>>> M.row(0)
$\displaystyle \left[\begin{matrix}10 & 40 & 30\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[10 40 30]

>>> M.col(1)
$\displaystyle \left[\begin{matrix}40\\6\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[40 6]

Используйте оператор среза Python для извлечения одного или нескольких элементов, принадлежащих строке или столбцу.

>>> M.row(1)[1:3]
[6, 9]

Класс Matrix имеет методы row_del () и col_del (), которые удаляют указанную строку / столбец из данной матрицы -

>>> M=Matrix(2,3,[10,40,30,2,6,9]) 
>>> M.col_del(1) 
>>> M

При выполнении вышеуказанной команды в оболочке python будет сгенерирован следующий вывод:

Matrix([[10, 30],[ 2, 9]])

Вы можете применить стиль к выводу, используя следующую команду -

$\displaystyle \left[\begin{matrix}10 & 30\\2 & 9\end{matrix}\right]$

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[10 30 2 9]

>>> M.row_del(0) 
>>> M

$\displaystyle \left[\begin{matrix}2 & 9\end{matrix}\right]$

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[2 9]

Точно так же методы row_insert () и col_insert () добавляют строки или столбцы по указанному индексу строки или столбца.

>>> M1=Matrix([[10,30]]) 
>>> M=M.row_insert(0,M1)
>>> M

$\displaystyle \left[\begin{matrix}10 & 30\\2 & 9\end{matrix}\right]$

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[10 40 30 2 9]

>>> M2=Matrix([40,6]) 
>>> M=M.col_insert(1,M2) 
>>> M

$\displaystyle \left[\begin{matrix}10 & 40 & 30\\2 & 6 & 9\end{matrix}\right]$

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[10 40 30 6 9]

Арифметические операции

Обычные операторы +, - и * определены для выполнения сложения, вычитания и умножения.

>>> M1=Matrix([[1,2,3],[3,2,1]]) 
>>> M2=Matrix([[4,5,6],[6,5,4]]) 
>>> M1+M2

$\displaystyle \left[\begin{matrix}5 & 7 & 9\\9 & 7 & 5\end{matrix}\right]$

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[5 7 9 9 7 5]

>>> M1-M2
$\displaystyle \left[\begin{matrix}-3 & -3 & -3\\-3 & -3 & -3\end{matrix}\right]$

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[- 3 -3 -3 -3 -3 -3]

Умножение матриц возможно только в том случае, если - Количество столбцов 1-й матрицы должно равняться количеству строк 2-й матрицы. - И результат будет иметь то же количество строк, что и первая матрица, и такое же количество столбцов, как и вторая матрица.

>>> M1=Matrix([[1,2,3],[3,2,1]]) 
>>> M2=Matrix([[4,5],[6,6],[5,4]]) 
>>> M1*M2
$\displaystyle \left[\begin{matrix}31 & 29\\29 & 31\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[31 29 29 31]

>>> M1.T
$\displaystyle \left[\begin{matrix}1 & 3\\2 & 2\\3 & 1\end{matrix}\right]$

После выполнения кода получается следующий вывод -

[1 3 2 2 3 1]

Для вычисления определителя матрицы используйте метод det (). Определитель - это скалярное значение, которое может быть вычислено из элементов квадратной матрицы.

>>> M=Matrix(3,3,[10,20,30,5,8,12,9,6,15])
>>> M
$\displaystyle \left[\begin{matrix}10 & 20 & 30\\5 & 8 & 12\\9 & 6 & 15\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[10 20 30 5 8 12 9 6 15]

>>> M.det()

Вывод для приведенного выше кода выглядит следующим образом:

-120

Матричные конструкторы

SymPy предоставляет множество специальных типов матричных классов. Например, матрица идентичности, матрица всех нулей и единиц и т.д. Эти классы называются глазами, нулями и единицами соответственно. Матрица идентичности - это квадратная матрица, элементы которой по диагонали равны 1, остальные элементы равны 0.

Example

from sympy.matrices import eye eye(3)

Output

Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
$\displaystyle \left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[1 0 0 0 1 0 0 0 1]

В матрице diag элементы по диагонали инициализируются в соответствии с предоставленными аргументами.

>>> from sympy.matrices import diag 
>>> diag(1,2,3)

$\displaystyle \left[\begin{matrix}1 & 0 & 0\\0 & 2 & 0\\0 & 0 & 3\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[1 0 0 0 2 0 0 0 3]

Все элементы в нулевой матрице инициализируются нулем.

>>> from sympy.matrices import zeros 
>>> zeros(2,3)

$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[0 0 0 0 0 0]

Аналогично, единицы - это матрица, в которой все элементы установлены в 1.

>>> from sympy.matrices import ones
>>> ones(2,3)

$\displaystyle \left[\begin{matrix}1 & 1 & 1\\1 & 1 & 1\end{matrix}\right]$

Вывод для приведенного выше кода выглядит следующим образом:

[1 1 1 1 1 1]

Пакет Sympy имеет класс Function, который определен в модуле sympy.core.function. Это базовый класс для всех прикладных математических функций, а также конструктор для неопределенных классов функций.

Следующие категории функций унаследованы от класса Function -

  • Функции для комплексного числа
  • Тригонометрические функции
  • Функции для целого числа
  • Комбинаторные функции
  • Прочие разные функции

Функции для комплексного числа

Этот набор функций определен в sympy.functions.elementary.complexes модуль.

re

Эта функция возвращает действительную часть выражения -

>>> from sympy import * 
>>> re(5+3*I)

Вывод для приведенного выше фрагмента кода приведен ниже -

5

>>> re(I)

Вывод для приведенного выше фрагмента кода -

0

Im

Эта функция возвращает мнимую часть выражения -

>>> im(5+3*I)

Вывод для приведенного выше фрагмента кода приведен ниже -

3

>>> im(I)

Вывод для приведенного выше фрагмента кода приведен ниже -

1

sign

Эта функция возвращает комплексный знак выражения.

Для реального выражения знак будет -

  • 1, если выражение положительное
  • 0, если выражение равно нулю
  • -1, если выражение отрицательное

Если выражение мнимое, возвращается знак -

  • I, если im (выражение) положительно
  • -I, если im (выражение) отрицательное
>>> sign(1.55), sign(-1), sign(S.Zero)

Вывод для приведенного выше фрагмента кода приведен ниже -

(1, -1, 0)

>>> sign (-3*I), sign(I*2)

Вывод для приведенного выше фрагмента кода приведен ниже -

(-I, I)

Abs

Эта функция возвращает абсолютное значение комплексного числа. Он определяется как расстояние между началом координат (0,0) и точкой (a, b) на комплексной плоскости. Эта функция является расширением встроенной функции abs () для приема символьных значений.

>>> Abs(2+3*I)

Вывод для приведенного выше фрагмента кода приведен ниже -

$\sqrt13$

conjugate

Эта функция возвращает конъюгат комплексного числа. Чтобы найти комплексное сопряжение, мы меняем знак мнимой части.

>>> conjugate(4+7*I)

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

4 - 7i

Тригонометрические функции

SymPy имеет определения для всех тригонометрических соотношений - sin cos, tan и т. Д., А также их обратные аналоги, такие как asin, acos, atan и т. Д. Эти функции вычисляют соответствующее значение для заданного угла, выраженного в радианах.

>>> sin(pi/2), cos(pi/4), tan(pi/6)

Вывод для приведенного выше фрагмента кода приведен ниже -

(1, sqrt(2)/2, sqrt(3)/3)

>>> asin(1), acos(sqrt(2)/2), atan(sqrt(3)/3)

Вывод для приведенного выше фрагмента кода приведен ниже -

(pi/2, pi/4, pi/6)

Функции над целым числом

Это набор функций для выполнения различных операций с целым числом.

ceiling

Это одномерная функция, которая возвращает наименьшее целочисленное значение, не меньшее, чем его аргумент. В случае комплексных чисел потолок действительной и мнимой частей отдельно.

>>> ceiling(pi), ceiling(Rational(20,3)), ceiling(2.6+3.3*I)

Вывод для приведенного выше фрагмента кода приведен ниже -

(4, 7, 3 + 4*I)

floor

Эта функция возвращает наибольшее целочисленное значение, не превышающее ее аргумент. В случае комплексных чисел эта функция также использует отдельно действительную и мнимую части.

>>> floor(pi), floor(Rational(100,6)), floor(6.3-5.9*I)

Вывод для приведенного выше фрагмента кода приведен ниже -

(3, 16, 6 - 6*I)

frac

Эта функция представляет собой дробную часть x.

>>> frac(3.99), frac(Rational(10,3)), frac(10)

Вывод для приведенного выше фрагмента кода приведен ниже -

(0.990000000000000, 1/3, 0)

Комбинаторные функции

Комбинаторика - это область математики, занимающаяся проблемами выбора, расположения и работы в конечной или дискретной системе.

factorial

Факториал очень важен в комбинаторике, где он дает количество способов, которыми могут быть переставлены n объектов. Это символически представлено как ð ?? '¥! Эта функция является реализацией функции факториала по неотрицательным целым числам, факториал отрицательного целого числа - комплексная бесконечность.

>>> x=Symbol('x') 
>>> factorial(x)

Вывод для приведенного выше фрагмента кода приведен ниже -

x!

>>> factorial(5)

Вывод для приведенного выше фрагмента кода приведен ниже -

120

>>> factorial(-1)

Вывод для приведенного выше фрагмента кода приведен ниже -

$\infty\backsim$

биномиальный

Эта функция определяет количество способов, которыми мы можем выбрать k элементов из набора n элементов.

>>> x,y=symbols('x y') 
>>> binomial(x,y)

Вывод для приведенного выше фрагмента кода приведен ниже -

$(\frac{x}{y})$

>>> binomial(4,2)

Вывод для приведенного выше фрагмента кода приведен ниже -

6

Строки треугольника Паскаля могут быть созданы с помощью биномиальной функции.

>>> for i in range(5): print ([binomial(i,j) for j in range(i+1)])

После выполнения приведенного выше фрагмента кода вы получите следующий результат:

[1]

[1, 1]

[1, 2, 1]

[1, 3, 3, 1]

[1, 4, 6, 4, 1]

fibonacci

Числа Фибоначчи - это целочисленная последовательность, определяемая начальными членами F0 = 0, F1 = 1 и двухчленным рекуррентным соотношением Fn = Fnâˆ'1 + Fnâˆ'2.

>>> [fibonacci(x) for x in range(10)]

Следующий результат получается после выполнения приведенного выше фрагмента кода -

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

tribonacci

Числа Трибоначчи представляют собой целочисленную последовательность, определяемую начальными членами F0 = 0, F1 = 1, F2 = 1 и трехчленным рекуррентным соотношением Fn = Fn-1 + Fn-2 + Fn-3.

>>> tribonacci(5, Symbol('x'))

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^8 + 3x^5 + 3x^2$

>>> [tribonacci(x) for x in range(10)]

Следующий результат получается после выполнения приведенного выше фрагмента кода -

[0, 1, 1, 2, 4, 7, 13, 24, 44, 81]

Разные функции

Ниже приведен список некоторых часто используемых функций -

Min- Возвращает минимальное значение списка. Он назван Min, чтобы избежать конфликтов со встроенной функцией min.

Max- Возвращает максимальное значение списка. Он назван Max, чтобы избежать конфликтов со встроенной функцией max.

root - Возвращает корень n-й степени из x.

sqrt - Возвращает главный квадратный корень из x.

cbrt - Эта функция вычисляет главный кубический корень из x (сокращение для x ++ Rational (1,3)).

Ниже приведены примеры перечисленных выше различных функций и их соответствующих выходов.

>>> Min(pi,E)

e

>>> Max(5, Rational(11,2))

$\frac{11}{2}$

>>> root(7,Rational(1,2))

49

>>> sqrt(2)

$\sqrt2$

>>> cbrt(1000)

10

В математике система счисления Quaternion - это расширение комплексных чисел. Каждый объект Quaternion содержит четыре скалярные переменные и четыре измерения, одно реальное измерение и три мнимых измерения.

Кватернион представлен следующим выражением -

q = a + bi + cj + dk

где a, b, c и d - действительные числа и i, j, k являются кватернионными единицами, такими что i2 == j2 == k2 == ijk

В sympy.algebras.quaternion модуль имеет класс Quaternion.

>>> from sympy.algebras.quaternion import Quaternion 
>>> q=Quaternion(2,3,1,4) 
>>> q

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$2 + 3i + 1j + 4k$

Кватернионы используются в чистой математике, а также в прикладной математике, компьютерной графике, компьютерном зрении и т. Д.

>>> from sympy import * 
>>> x=Symbol('x') 
>>> q1=Quaternion(x**2, x**3, x) >>> q1

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$x^2 + x^3i + xj + 0k$

Объект Quaternion также может иметь мнимые коэффициенты

>>> q2=Quaternion(2,(3+2*I), x**2, 3.5*I) 
>>> q2

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$2 + (3 + 2i)i + x2j + 3.5ik$

Добавить()

Этот метод, доступный в классе Quaternion, выполняет добавление двух объектов Quaternion.

>>> q1=Quaternion(1,2,3,4) 
>>> q2=Quaternion(4,3,2,1) 
>>> q1.add(q2)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$5 + 5i + 5j + 5k$

В объект Quaternion можно добавить число или символ.

>>> q1+2

Следующий результат получается после выполнения приведенного выше фрагмента кода -

$3 + 2i + 3j + 4k$

>>> q1+x

Следующий результат получается после выполнения приведенного выше фрагмента кода -

$(x + 1) + 2i + 3j + 4k$

mul ()

Этот метод выполняет умножение двух кватернионных объектов.

>>> q1=Quaternion(1,2,1,2) 
>>> q2=Quaternion(2,4,3,1) 
>>> q1.mul(q2)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$(-11) + 3i + 11j + 7k$

обратный ()

Этот метод возвращает инверсию объекта кватерниона.

>>> q1.inverse()

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{1}{10} + (-\frac{1}{5})i + (-\frac{1}{10})j + (-\frac{1}{5})k$

pow ()

Этот метод возвращает мощность объекта кватерниона.

>>> q1.pow(2)

Следующий результат получается после выполнения приведенного выше фрагмента кода -

$(-8) + 4i + 2j + 4k$

exp ()

Этот метод вычисляет экспоненту объекта Quaternion, т.е. eq

>>> q=Quaternion(1,2,4,3) 
>>> q.exp()

Следующий результат получается после выполнения приведенного выше фрагмента кода -

$e\cos(\sqrt29) + \frac{2\sqrt29e\sin(\sqrt29)}{29}i + \frac{4\sqrt29e\sin(\sqrt29)}{29}j + \frac{3\sqrt29e\sin}{29}k$

Поскольку символы = и == определены в Python как операторы присваивания и равенства, их нельзя использовать для формулирования символьных уравнений. SymPy предоставляет функцию Eq () для создания уравнения.

>>> from sympy import * 
>>> x,y=symbols('x y') 
>>> Eq(x,y)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

x = y

Поскольку x = y возможно тогда и только тогда, когда xy = 0, приведенное выше уравнение может быть записано как -

>>> Eq(x-y,0)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

x − y = 0

Модуль решателя в SymPy предоставляет функцию soveset (), прототип которой выглядит следующим образом:

solveset(equation, variable, domain)

Домен по умолчанию S.Complexes. Используя функцию resolveset (), мы можем решить алгебраическое уравнение следующим образом:

>>> solveset(Eq(x**2-9,0), x)

Получен следующий результат -

{−3, 3}

>>> solveset(Eq(x**2-3*x, -2),x)

Следующий результат получается после выполнения приведенного выше фрагмента кода -

{1,2}

Результатом набора решений является FiniteSet решений. Если решений нет, возвращается EmptySet.

>>> solveset(exp(x),x)

Следующий результат получается после выполнения приведенного выше фрагмента кода -

$\varnothing$

Линейное уравнение

Мы должны использовать функцию linsolve () для решения линейных уравнений.

Например, уравнения следующие:

ху = 4

х + у = 1

>>> from sympy import * 
>>> x,y=symbols('x y') 
>>> linsolve([Eq(x-y,4),Eq( x + y ,1) ], (x, y))

Следующий результат получается после выполнения приведенного выше фрагмента кода -

$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$

Функция linsolve () также может решать линейные уравнения, выраженные в матричной форме.

>>> a,b=symbols('a b') 
>>> a=Matrix([[1,-1],[1,1]]) 
>>> b=Matrix([4,1]) 
>>> linsolve([a,b], (x,y))

Мы получим следующий результат, если выполним приведенный выше фрагмент кода -

$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$

Нелинейное уравнение

Для этого мы используем функцию nonlinsolve (). Уравнения для этого примера -

а 2 + а = 0 ab = 0

>>> a,b=symbols('a b') 
>>> nonlinsolve([a**2 + a, a - b], [a, b])

Мы получим следующий результат, если выполним приведенный выше фрагмент кода -

$\lbrace(-1, -1),(0,0)\rbrace$

дифференциальное уравнение

Сначала создайте неопределенную функцию, передав cls = Function функции символов. Чтобы решить дифференциальные уравнения, используйте dsolve.

>>> x=Symbol('x') 
>>> f=symbols('f', cls=Function) 
>>> f(x)

Следующий результат получается после выполнения приведенного выше фрагмента кода -

f(x)

Здесь f (x) - неоцененная функция. Его производная следующая -

>>> f(x).diff(x)

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$\frac{d}{dx}f(x)$

Сначала мы создаем объект Eq, соответствующий следующему дифференциальному уравнению

>>> eqn=Eq(f(x).diff(x)-f(x), sin(x)) 
>>> eqn

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$-f(x) + \frac{d}{dx}f(x)= \sin(x)$

>>> dsolve(eqn, f(x))

Приведенный выше фрагмент кода дает результат, эквивалентный приведенному ниже выражению -

$f(x)=(c^1-\frac{e^-xsin(x)}{2}-\frac{e^-xcos(x)}{2})e^x$

SymPy использует библиотеку Matplotlib в качестве бэкэнда для визуализации 2-D и 3-D графиков математических функций. Убедитесь, что Matplotlib доступен в текущей установке Python. Если нет, установите то же самое, используя следующую команду -

pip install matplotlib

Поддержка печати определяется в модуле sympy.plotting. Следующие функции присутствуют в модуле построения графиков -

  • plot - 2D линейные графики

  • plot3d - трехмерные линейные графики

  • plot_parametric - 2D параметрические графики

  • plot3d_parametric - 3D параметрические графики

Функция plot () возвращает экземпляр класса Plot. Фигура графика может иметь одно или несколько выражений SymPy. Хотя он может использовать Matplotlib в качестве бэкэнда, также могут использоваться другие бэкэнды, такие как texplot, pyglet или Google charts API.

plot(expr, range, kwargs)

где expr - любое допустимое выражение symPy. Если не указано иное, для диапазона используется значение по умолчанию (-10, 10).

В следующем примере показаны значения x2 для каждого значения в диапазоне (-10,10) -

>>> from sympy.plotting import plot 
>>> from sympy import * 
>>> x=Symbol('x') 
>>> plot(x**2, line_color='red')

Чтобы нарисовать несколько графиков для одного и того же диапазона, перед кортежем диапазона укажите несколько выражений.

>>> plot( sin(x),cos(x), (x, -pi, pi))

Вы также можете указать отдельный диапазон для каждого выражения.

plot((expr1, range1), (expr2, range2))

На следующем рисунке показаны графики sin (x) и cos (x) в разных диапазонах.

>>> plot( (sin(x),(x, -2*pi, 2*pi)),(cos(x), (x, -pi, pi)))

В функции plot () могут быть указаны следующие необязательные аргументы ключевого слова.

  • line_color - определяет цвет линии графика.

  • title - строка, которая будет отображаться как заголовок

  • xlabel - строка, которая будет отображаться как метка для оси X

  • ylabel - строка, которая будет отображаться как метка для оси y

>>> plot( (sin(x),(x, -2*pi, 2*pi)),(cos(x), (x, -pi, pi)), line_color='red', title='SymPy plot example')

Функция plot3d () отображает трехмерный график.

plot3d(expr, xrange, yrange, kwargs)

В следующем примере рисуется трехмерный график поверхности -

>>> from sympy.plotting import plot3d 
>>> x,y=symbols('x y') 
>>> plot3d(x*y, (x, -10,10), (y, -10,10))

Как и в 2D-графике, на трехмерном графике также может быть несколько графиков, каждый с разным диапазоном.

>>> plot3d(x*y, x/y, (x, -5, 5), (y, -5, 5))

Функция plot3d_parametric_line () отображает 3-х мерный параметрический линейный график.

>>> from sympy.plotting import plot3d_parametric_line 
>>> plot3d_parametric_line(cos(x), sin(x), x, (x, -5, 5))

Чтобы нарисовать параметрический график поверхности, используйте функцию plot3d_parametric_surface ().

plot3d_parametric_surface(xexpr, yexpr, zexpr, rangex, rangey, kwargs)

>>> from sympy.plotting import plot3d_parametric_surface 
>>> plot3d_parametric_surface(cos(x+y), sin(x-y), x-y, (x, -5, 5), (y, -5, 5))

Модуль геометрии в SymPy позволяет создавать двухмерные объекты, такие как линия, круг и т. Д. Затем мы можем получить информацию о них, такую ​​как проверка коллинеарности или поиск пересечения.

Точка

Класс Point представляет собой точку в евклидовом пространстве. Следующий пример проверяет коллинеарность точек -

>>> from sympy.geometry import Point 
>>> from sympy import * 
>>> x=Point(0,0) 
>>> y=Point(2,2) 
>>> z=Point(4,4) 
>>> Point.is_collinear(x,y,z)

Output

True

>>> a=Point(2,3) 
>>> Point.is_collinear(x,y,a)

Output

False

Метод distance () класса Point вычисляет расстояние между двумя точками

>>> x.distance(y)

Output

$2\sqrt2$

Расстояние также может быть представлено в виде символов.

Линия

Линия получается из двух объектов Point. Метод crossction () возвращает точку пересечения, если две прямые пересекают друг друга.

>>> from sympy.geometry import Point, Line 
>>> p1, p2=Point(0,5), Point(5,0) 
>>> l1=Line(p1,p2)
>>> l2=Line(Point(0,0), Point(5,5)) 
>>> l1.intersection(l2)

Output

[Point2D(5/2, 5/2)]

>>> l1.intersection(Line(Point(0,0), Point(2,2)))

Output

[Point2D(5/2, 5/2)]

>>> x,y=symbols('x y') 
>>> p=Point(x,y) 
>>> p.distance(Point(0,0))

Output

$\sqrt{x^2 + y^2}$

Треугольник

Эта функция строит треугольник из трех точечных объектов.

Triangle(a,b,c)

>>> t=Triangle(Point(0,0),Point(0,5), Point(5,0)) 
>>> t.area

Output

$-\frac{25}{2}$

Эллипс

Сущность эллиптической геометрии создается путем передачи объекта Point, соответствующего центру, и двух чисел для горизонтального и вертикального радиуса.

ellipse(center, hradius, vradius)

>>> from sympy.geometry import Ellipse, Line 
>>> e=Ellipse(Point(0,0),8,3) 
>>> e.area

Output

$24\pi$

Врадиус может быть получен косвенно с помощью параметра эксцентриситета.

>>> e1=Ellipse(Point(2,2), hradius=5, eccentricity=Rational(3,4)) 
>>> e1.vradius

Output

$\frac{5\sqrt7}{4}$

В apoapsis эллипса - наибольшее расстояние между фокусом и контуром.

>>> e1.apoapsis

Output

$\frac{35}{4}$

Следующий оператор вычисляет окружность эллипса -

>>> e1.circumference

Output

$20E(\frac{9}{16})$

В equation метод эллипса возвращает уравнение эллипса.

>>> e1.equation(x,y)

Output

$(\frac{x}{5}-\frac{2}{5})^2 + \frac{16(y-2)2}{175} - 1$

В математике набор - это четко определенный набор различных объектов, которые могут быть числами, людьми, буквами алфавита или даже другими наборами. Set также является одним из встроенных типов в Python. SymPy предоставляет модуль наборов. Он содержит определения различных типов наборов и имеет функции для выполнения операций над наборами, таких как пересечение, объединение и т. Д.

Set - это базовый класс для любого другого типа набора в SymPy. Обратите внимание, что он отличается от типа данных встроенного набора Python. Класс Interval представляет реальные интервалы, а его граничное свойство возвращаетFiniteSet объект.

>>> from sympy import Interval 
>>> s=Interval(1,10).boundary 
>>> type(s)

sympy.sets.sets.FiniteSet

FiniteSet - это набор дискретных чисел. Его можно получить из любого объекта последовательности, такого как список или строка.

>>> from sympy import FiniteSet 
>>> FiniteSet(range(5))

Output

$\lbrace\lbrace0,1,...,4\rbrace\rbrace$

>>> numbers=[1,3,5,2,8] 
>>> FiniteSet(*numbers)

Output

$\lbrace1,2,3,5,8\rbrace$

>>> s="HelloWorld" 
>>> FiniteSet(*s)

Output

{H,W,d,e,l,o,r}

Обратите внимание, что, как и во встроенном наборе, набор SymPy также представляет собой набор отдельных объектов.

ConditionSet набор элементов, удовлетворяющих заданному условию

>>> from sympy import ConditionSet, Eq, Symbol 
>>> x=Symbol('x') 
>>> s=ConditionSet(x, Eq(x**2-2*x,0), Interval(1,10)) >>> s

Output

$\lbrace x\mid x\in[1,10]∧x^2 - 2x =0\rbrace$

Unionпредставляет собой составной набор. Он включает в себя все элементы в двух наборах. Обратите внимание, что элементы, которые есть в обоих, появятся в Союзе только один раз.

>>> from sympy import Union 
>>> l1=[3,1,5,7] 
>>> l2=[9,7,2,1] 
>>> a=FiniteSet(*l1) 
>>> b=FiniteSet(*l2) 
>>> Union(a,b)

Intersection с другой стороны, содержит только те элементы, которые присутствуют в обоих.

>>> from sympy import Intersection 
>>> Intersection(a,b)

ProductSet объект представляет собой декартово произведение элементов в обоих наборах.

>>> from sympy import ProductSet 
>>> l1=[1,2] 
>>> l2=[2,3] 
>>> a=FiniteSet(*l1) 
>>> b=FiniteSet(*l2) 
>>> set(ProductSet(a,b))

Complement(a,b) сохраняет элементы в исключительных элементах, которые являются общими для набора b.

>>> from sympy import Complement 
>>> l1=[3,1,5,7] 
>>> l2=[9,7,2,1] 
>>> a=FiniteSet(*l1) 
>>> b=FiniteSet(*l2) 
>>> Complement(a,b), Complement(b,a)

SymmetricDifference набор содержит только необычные элементы в обоих наборах.

>>> from sympy import SymmetricDifference 
>>> l1=[3,1,5,7] 
>>> l2=[9,7,2,1] 
>>> a=FiniteSet(*l1) 
>>> b=FiniteSet(*l2) 
>>> SymmetricDifference(a,b)

Output

{2,3,5,9}

В SymPy доступно несколько принтеров. Ниже приводится частичный список -

  • str
  • srepr
  • ASCII красивый принтер
  • Unicode симпатичный принтер
  • LaTeX
  • MathML
  • Dot

Объекты SymPy также можно отправлять в качестве вывода в код различных языков, таких как C, Fortran, Javascript, Theano и Python.

SymPy использует символы Unicode для вывода вывода в виде красивой печати. Если вы используете консоль Python для выполнения сеанса SymPy, лучшая красивая среда печати активируется вызовом функции init_session ().

>>> from sympy import init_session 
>>> init_session()

Консоль IPython для SymPy 1.5.1 (Python 3.7.4-64-бит) (основные типы: python).

Эти команды были выполнены -

>>> from __future__ import division
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
>>> init_printing()

Документацию можно найти на https://docs.sympy.org/1.5.1/.

>>> Integral(sqrt(1/x),x)

$\int \sqrt\frac{1}{x} dx$

Если LATEX не установлен, но установлен Matplotlib, он будет использовать механизм визуализации Matplotlib. Если Matplotlib не установлен, он использует симпатичный принтер Unicode. Однако блокнот Jupyter использует MathJax для рендеринга LATEX.

В терминале, который не поддерживает Unicode, используется симпатичный принтер ASCII.

Чтобы использовать принтер ASCII, используйте функцию pprint () со свойством use_unicode, установленным на False

>>> pprint(Integral(sqrt(1/x),x),use_unicode=False)

Доступ к симпатичному принтеру Unicode также осуществляется из pprint () и pretty (). Если терминал поддерживает Unicode, он используется автоматически. Если pprint () не может определить, что терминал поддерживает Unicode, вы можете передать use_unicode = True, чтобы заставить его использовать Unicode.

Чтобы получить LATEX-форму выражения, используйте функцию latex ().

>>> print(latex(Integral(sqrt(1/x),x)))

\int \sqrt{\frac{1}{x}}\, dx

Вы также можете использовать математический принтер. для этой цели импортируйте функцию print_mathml. Версия строки получается функцией mathml ().

>>> from sympy.printing.mathml import print_mathml 
>>> print_mathml(Integral(sqrt(1/x),x))

<apply>

<int/>

<bvar>

<ci>x</ci>

</bvar>

<apply>

<root/>

<apply>

<power/>

<ci>x</ci>

<cn>-1</cn>

</apply>

</apply>

</apply>

>>>mathml(Integral(sqrt(1/x),x))

'<apply><int/><bvar><ci>x</ci></bvar><apply><root/><apply><power/><ci>x</ci><cn>-1</cn></apply></apply></apply>'