Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
11
Результатом будет кортеж (х0, х1, х2), с которым можно
проводить операции, применимые к кортежам, например операцию *: 3*x. Выполнив команды init_printing(); pprint(x) для приведенного ранее кода, получим отображение результата с индексами (х0, х1, х2).
Отличие функции symbols от var состоит в том, что первая функ-
ция возвращает ссылку на символьный объект в виде какой-либо пере­менной. Для использования в дальнейшем ее нужно присвоить кон­кретной переменной (например, a=symbols('err')). Функция var добав­ляет созданные переменные в текущее пространство имен. Синтаксис функции аналогичен функции symbols:
from sympy import var, log var("a b") a**2+log(b) # a2+log(b)
В функциях symbols() и var() можно объявлять тип и накладывать
ограничения на символьные переменные. Например:
x = symbols('x', integer=True) # объявляем переменную целой x = symbols('x', positive = True, integer=True) x, y, z = symbols('x,y,z', real=True)
Иногда без таких ограничений на переменные очевидные преоб-
разования не работают. Так, результатом выполнения кода
from sympy import * x=symbols('x') abs(x+1)
будет | x+1|.
Результат изменится, если объявить х положительной
переменной:
from sympy import * x=symbols('x', positive=True) abs(x+1)
Результат: х+1. Имя переменной из пространства имен можно удалить командой
del имя1, имя2,.., например del x,y.
Функции. В модуле sympy.core.function библиотеки SymPy есть
класс Function. Это базовый класс для всех математических функций. Среди функций класса есть функции для комплексных чисел, тригонометрические
12
функции, функции для работы с целыми числами, комбинаторные и другие функции. К функциям для работы с целыми числами относятся функции ceiling() и floor(). Функция ceiling() возвращает самое маленькое целое число, которое не меньше аргумента, указанного в скобках: ceiling(6.7), ceiling(Rational(14, 3)), ceiling(-5.7), ceiling(5.1) # (7, 5, -5, 6). Функция floor() производит округление в меньшую сторону: floor(6.7), floor(-5.7), floor(5.1) # (6, -6, 5). Функция frac() возвращает дробную часть числа в десятичном представлении: frac(3/4),frac(1/3),frac(4.096). Ре­зультат: (0.750000000000000, 0.333333333333333, 0.0960000000000001). Такое число знаков после запятой появилось из-за наличия в строке беско­нечной дроби 1/3.
В библиотеке есть функции упрощения: expand(), simplify(), fac-
tor(), collect(), trigsimp(), powsimp(), logcombine(), combsimp().
Функцию expand() используют, чтобы раскрыть скобки у выра-
жения, например у выражения (х+6)3:
from sympy import *
var("x") t=(x+6)**3 t.expand()
Результат:
32
18 108 216.x x x+ + +
С помощью этой же функции можно, например, выразить tg(x+y)
через tg(x) и tg(y):
from sympy import * var("x y") tan(x+y).expand(trig=True)
В результате получим
tan( ) tan( )
tan( )tan( ) 1 tan( )tan( ) 1
xy
x y x y
+
− + − +
Данное выражение можно упростить, применив функцию simplify(): tan(x+y).expand(trig=True).simplify().
Для разложения многочлена на множители используют функцию
factor(). Разложим на множители многочлен
4 3 3 2 2 2 2 2 2
2 8 4 24 4 12 12 :x x y x x y x y x xy xy y+ + − + − − − +
from sympy import * var("x y") t= 2*x**4+x**3*y+8*x**3-x**2*y**2+4*x**2*y-\
13
24*x**2-4*x*y**2-12*x*y+12*y**2 factor(t)
Вместо последней строки можно записать t.factor()
Результат: (x−2)(x+6)(x+y)(2x−y). Разложить многочлен на множители можно с помощью функции
factor_list(). Она возвращает список факторов (множителей) в виде кор­тежа вида (фактор, степень):
factor_list(t) # (1, [(x – 2, 1), (x + y, 1), (x + 6, 1), (2*x – y, 1)])
Собрать слагаемые с точностью до степеней с рациональными показа­телями можно с помощью функции collect():
from sympy import * var("x y z") t= x*y*z + x – 3 – x**2 – y**2+z**2*x**2 + x**3 t #
3 2 2 2 2
3x x z x xyz x y+ − + + − −
collect(t,x) #
3 2 2 2
( 1) ( 1) 3x x z x yz y− − + + − −
Функция collect() создает несократимую дробь
exp 1
,
exp 2
r
r
используя
в качестве аргументов рациональные функции expr1 и expr2:
from sympy import * var("x") expr2=x**2+2*x+1 expr1=x+1
cancel(expr1/expr2) # Результат
1
1х +
t=S(1)/3*x**2+2*x+1 cancel(expr1/t) # Результат
2
33
63
х
хх
+
++
Для упрощения выражений, содержащих тригонометрические
функции, используют функцию trigsimp():
from sympy import * var("x y") expr=sin(x)*cos(y)+cos(x)*sin(y)+y+2*cos(x)**2-1 trigsimp(expr) # y+sin(x+y)+cos(2x)
14
Упростить математические выражения, содержащие степени,
можно с помощью функции powsimp():
from sympy import * var("x") t=x**2*x**3.+x**1.5*x*x**2.5 powsimp(t) # Результат 2x
5.0
Комбинаторные выражения, включающие факториал и биномы,
можно упростить с помощью функции combsimp(). В SymPy есть функ­ция factorial(), с помощью которой вычисляют факториал от числа, сто­ящего в скобках, и функция binomial(n,m), вычисляющая
!
.
!( )!
m
n
n
C
m n m
=
−
Обозначение этого выражения в SymPy
.
n m
 

Вычис-
лим, например,
!
:
( 2)!
х
х −
from sympy import * var("x") t=factorial(x)/factorial(x-2)
t # Результат
!
( 2)!
х
х −
combsimp(t) # Результат x(x−1) y=binomial(x,x-2)/binomial(x+1,x-3)
Результат:
2
1
3
x
x x
x
 
−

+
 
−

, где в числителе и в знаменателе указано
число сочетаний из x по (x-2) и из (x+1) по (x-3) соответственно.
combsimp(y) # Результат
12
( 2)( 1)хх−+
Для упрощения выражений, содержащих логарифмы, исполь-
зуют функцию logcombine():
from sympy import * var("x y a b") z=log(x)-a*log(x)+b*log(x*y) z # Результат −alog(x)+blog(xy)+log(x) logcombine(z) # Результат log(xx-a(xy)b)
15
Для разложения выражения на дроби используют функцию
apart(expr,x). Разложим, например, на дроби выражение
2
1
:
32хх++
from sympy import * var("x");t=1/(x**2+3*x+2);z=apart(t,x);z
11
21xx
−+ ++
Чтобы привести дробь к одному знаменателю, используют функ-
цию together(expr,x). Привести к общему знаменателю сумму
2
23
:
3 2 2
xx
x
x x x
+
++
− + −
from sympy import * var("x");together(x+(2*x+3)/(x**2-3*x+2)+x/(x-2))
22
2
( 2)( 3 2) ( 3 2) ( 2)(2 3)
( 2)( 3 2)
x x x x x x x x x
x x x
− − + + − + + − +
− − +
Очевидно, что полученное выражение можно упростить. Это де-
лается с помощью функции simplify():
from sympy import * var("x");w=together(x+(2*x+3)/(x**2-3*x+2)+x/(x-2)).simplify();w
Вместо последней строки можно записать:
w=together(x+(2*x+3)/(x**2-3*x+2)+x/(x-2));simplify(w)
В обоих случаях получим
32
2
2 3 3
.
32
x x x
xx
− + +
−+
Для вычисления значения символьного выражения применяют
функцию evalf(), которая преобразует выражение в число с плавающей точкой. В скобках указывается необходимое число значащих цифр:
from sympy import pi,E;d=pi**2+E;d.evalf(5)
12.588
Операции с символьными переменными. Одной из важнейших
операций при работе с символьными переменными является операция подстановки subs(). С ее помощью одни переменные могут быть заме­нены на другие переменные, числа или выражения:
from sympy import * var("x y z a") t=x**2+sin(x)+y/z t.subs(x,a+1).subs(y,1)
16
В результате в выражении t переменная х будет заменена на вы-
ражение а+1, а переменная y – на число 1:
2
1
( 1) sin( 1) .aa
z
+ + + +
Аргумент метода subs() может быть последовательностью, кото­рая должна содержать пары (старое значение, новое значение), а может быть символьным выражением, поэтому проведенные в предыдущем примере замены можно было провести таким образом:
from sympy import *
var("x y z")
t=x**2+sin(x)+y/z
t.subs([(x,a+1),(y,1)]) # выполнена подстановка x=a+1, y=1
С помощью этой функции можно вычислить значение выражения при конкретных значениях переменных, использовав в качестве выра­жения в скобках структуру данных словарь:
from sympy import *;
a, b, c= symbols('a:c');
expr=a+b**2+sin(c);
expr.evalf(5, subs={a: 100, b: 3, c: pi/4}) # 109.71
Вместо последней строки можно написать:
expr.subs({a: 100, b: 3, c: pi/4}).evalf(5)
Подстановки выполняются последовательно. В приведенном коде
from sympy import *
var("x y")
z=x**2+x/y+y**5
d=z.subs([(x,y),(y,x)]);d сначала переменная x заменяется на y. Получается d=y2+y/y+y5= =y2+1+y5. Затем переменная y заменяется на x. Получается d=х2+1+х5.
Если мы просто хотим получить выражение d=y2+y/x+x5, это можно сделать, добавив еще один параметр в функцию subs():
simultaneous=True. Замены будут проведены одновременно:
from sympy import *
var("x y")
z=x**2+x/y+y**5
d=z.subs([(x,y),(y,x)],simultaneous=True) ;d
Результат:
52
.
y
xy
x
++
17
Можно функцию или переменную заменить на другую функцию или переменную:
from sympy import *
var("x y")
z=x**2+x/y+y**5
d=z.subs(x,sin(y));d
Результат:
52
sin( )
sin ( ) .
y
yy
y
++
Вычислить значение символьного выражения можно с помощью функции lambdify(), которая переводит выражения SymPy в функции Python. lambdify действует как лямбда-функция с тем исключением, что она конвертирует SymPy в имена числовой библиотеки, обычно NumPy. По умолчанию же она реализована на основе стандартной библиотеки
math. Пример работы функции lambdify, содержащей три аргумента:
from sympy import *
a, b, c= symbols('a:c');
expr=a+b**2+sin(c);
f = lambdify([a,b,c], expr)
f(100,3,3.1415/4) # 109.70709040200144
Модуль assumptions в SymPy включает инструменты для получе­ния информации о выражениях. Для этого используется функция ask(). Можно получить информацию о том, является ли число алгебраиче­ским (algebraic(x)), комплексным (complex(x)), составным (composite(x)), четным (even(x)) или нечетным (odd(x)), мнимым (imaginary(x)), целым (integer(x)), рациональным (rational(x)) или ирра­циональным (irrational(x)), положительным (positive(x)) или отрица­тельным (negative(x)), равным (positive(x)) или не равным нулю (nega-
tive(x)):
from sympy import *
ask(Q.algebraic(pi)) # False
x, y = symbols("x y")
x,y=7, 15
ask(Q.composite(x)), ask(Q.composite(y)) # (False, True)
ask(Q.rational(x)) # True
ask(Q.zero(x)) # False
18
Более подробную информацию о функции ask() можно найти в работе С. Ю. Борю1.
Логические выражения. Булевы функции расположены в мо­дуле sympy.basic.booleanarg. Их можно создать и с помощью стандарт­ных операторов Python: & (And), | (Or), ~ (Not) и т. д. Булевы выражения наследуются от класса Basic.
Функция логического И (AND) анализирует два аргумента и воз- вращает «ложь», если хотя бы один из них является «ложью». Эта функ- ция заменяет оператор &:
from sympy import *
from sympy.logic.boolalg import *
x, y = symbols('x y')
x=True
y=True
And(x,y),x,y # (True, True, True)
Функция логического ИЛИ (OR) анализирует два аргумента и воз- вращает «истину», если хотя бы один из них является «истиной». Эта функция заменяет оператор |:
x=True;y=False;Or(x,y),x,y # (True, True, False)
Функция отрицания Not выдает False, если аргумент принимает значение True, и наоборот. В Python для этого используется оператор ~:
x=True;y=False;Not(x),Not(y) # (False, True)
Функция исключающего ИЛИ (XOR) возвращает True, если нечет- ное количество аргументов является True, а остальные – False. False же вернется в том случае, если четное количество аргументов True, а остальные – False:
from sympy import *
from sympy.logic.boolalg import *
x,y,z = symbols('x y z')
x=True;y=False;z=True
Xor(x, y, z, y, z) # True
Xor(x, y, z, y) # False
1
Борю С. Ю. Модули и пакеты в Python: учеб.-метод. пособие для студентов естественно-научных спе-
циальностей. Запорожье: ЗНУ, 2021. 286 с.
19
Штрих Шеффера, отрицание конъюнкции NAND. Результатом работы функции является True, если хотя бы один из аргументов равен
False, и False – если они истинные:
from sympy import *
from sympy.logic.boolalg import *
x,y,z = symbols('x y z')
x=True;y=False;z=True
Nand(x, y, z, y) # True
Функция Вебба, отрицание дизъюнкции Nor. Результатом работы функции является False, если хотя бы один из аргументов True, или же
True, если все аргументы принимают значения False:
x=True;y=False;z=True;Nor(x, y, z) # False
Функция эквивалентности Equivalent. Эта функция возвращает отношение эквивалентности. Equivalent(A, B) будет равно True тогда и только тогда, когда A и B оба будут True или False. Функция вернет True, если все аргументы являются логически эквивалентными. В про­тивном случае функция возвращает значение False:
x=True;y=False;z=True;Equivalent(x, y, z) # False.
1.2 . С о з д а н и е м н о г о ч л е н ов Ч е б ы ш е в а , Л е ж а н д р а и Э р м и т а
Библиотека SymPy поддерживает работу с многочленами Чебы­шева, Лежандра и Эрмита. Полиномы Чебышева применяются при ре­шении задач математики и физики. В частности, они используются для приближения функцией (рядом многочленов Чебышева) эксперимен­тальных данных. Многочлены применяются в физике, например, для расчета антенной решетки: мощность излучения каждой антенны рас­считывается с помощью многочленов Чебышева. Это позволяет управ­лять соотношением амплитуды основного и боковых лепестков. Мно­гочлены Чебышева первого рода Tn(x) могут быть определены с помо­щью рекуррентного соотношения:
20
0
1
11
( ) 1
( ) .
( ) 2 ( ) ( )
n n n
Tx T x x T x xT x T x
+−
=
=
 
=−
Так,
23
2 1 0 3 2 1
( ) 2 ( ) ( ) 2 1, ( ) 2 ( ) ( ) 4 3 .T x xT x T x х T x xT x T x х х= − = − = − = −
Для нахождения полиномов Чебышева применяют функцию chebyshevt_poly(). Выполнение приведенной программы дает полином Чебышева 5-й степени:
from sympy import *
chebyshevt_poly(5,polys=True)
󰨙󰇛      ℤ󰇜
При необходимости можно найти корни полиномов Чебышева с помощью функции chebyshevt_root(). Найти все три корня полинома Чебышева 3-й степени можно следующим образом:
from sympy import *
y=chebyshevt_poly(3)
y,chebyshevt_root(3,0),chebyshevt_root(3,1), \
chebyshevt_root(3,2) (4*_x**3 – 3*_x, sqrt(3)/2, 0, -sqrt(3)/2)
В результате получили кортеж, содержащий уравнение полинома и его корни с номерами 0, 1 и 2. Методом args можно получить список аргументов полинома в виде кортежа y.args # (-3*_x, 4*_x**3) или в виде отдельных слагаемых y.args[1] # 4x3.
Полиномы Лежандра Рn(x) имеют множество приложений как в математике, например, для разложения функции в ряды полиномов Лежандра, так и в физике, где уравнение Лежандра появляется при по­лучении решений уравнений Лапласа или Гельмгольца в сферических координатах. Вычислить Рn(x) можно с помощью рекуррентного соот­ношения:
0
1
11
( ) 1
( ) .
21
( ) ( ) ( )
11
n n n
Px P x x
nn
P x xP x P x
nn
+−
 
=
=
 
+
=−
++
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]