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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
21
Так,
2 2 3
2 3 2 1
3 1 5 2 5 3 1 2 5 3
( ) , ( ) ( ) ( ) .
2 3 3 3 2 3 2
х x х x х х
P x P x xP x P x
− − −
= = − = − =
Для нахождения полиномов Лежандра применяют функцию legendre_poly (). Выполнение кода дает полином Лежандра 6-й степени:
from sympy import *
legendre_poly(6)
6 4 2
231 315 105 5
16 16 16 16
x x x
− + −
Можно получить выражение полинома в виде одной дроби мето­дом together: legendre_poly(6).together(x).
Многочлены Эрмита Нn(x) – это определенного вида последова­тельность многочленов одной вещественной переменной. Многочлены Эрмита находят применение в теории вероятностей, в комбинаторике, физике. Вычислять значения Нn(x) можно с помощью рекуррентного соотношения:
0
1
11
( ) 1
( ) 2 .
( ) 2 ( ) 2 ( )
n n n
Нx
H x x H x xH x nH x
+−
=
=
 
=−
Так,
2
2 1 0
23
3 2 1
( ) 2 ( ) 2 ( ) 2 2 2 4 2,
( ) 2 ( ) 2 2 ( ) 2 (4 2) 4 2 8 12
H x xH x H x х х х H x xH x H x х х х х х
= − = − = −
= − = − − = −
.
Для нахождения полиномов Эрмита применяют функцию
hermite_poly(). Выполнение кода дает полином Эрмита 4-й степени:
from sympy import *
hermite_poly(4)
42
16 48 12xx−+
1.3 . В ы ч и с л е н и е п р о и з в о д н ы х
Для вычисления производных применяют функцию diff() или ме­тод .diff(). Синтаксис функции diff(): def diff(f, *symbols, **kwargs). Рас­смотрим ее работу на примерах.
22
Пример 1.1. Вычислить первую, вторую и четвертую производ- ную от функции w=xlnx+sin2x.
Решение:
from sympy import diff, sin,log
from sympy.abc import x
w = x*log(x) + sin(x)**2
c=diff(w,x) # или c=diff(w,x,1)
r=w.diff(x,2)
d=diff(w,x,4) # или d=diff(w,x,x,x,x)
В результате переменная c будет равна log(x)+2sin(x)cos(x)+1 (значение первой производной), значение второй производной (r) равно
22
1
2sin ( ) 2cos ( ) ,xx
x

− + +
 
значение четвертой производной (d) равно
22
3
1
2 4sin ( ) 4cos ( ) .xx
x

−+
 
Заметим, что е=diff(w,x,0) дает в результате
xln(x)+sin2(x).
Пример 1.2. Найти первую производную от функции
sin 2
sin
xa
w x x a= + +
по переменным х и а.
Решение:
from sympy import diff, sin,log
from sympy.abc import x, y, a
w = x**sin(x) + sin(x)**a+a**2
c=diff(w,x)
d=diff(w,a)
Переменные с и d примут значения
 󰇛󰇜 󰇛󰇜
󰇛󰇜

󰇛󰇜
󰇡󰇛󰇜󰇛󰇜 
󰇛󰇜
󰇢
и   󰇛󰇛󰇜󰇜󰇛󰇜 соответственно.
Пример 1.3. Продифференцировать выражение           сначала по x, а затем по y.
Решение:
from sympy import *
from sympy.abc import *
w = x*y + sin(x)*cos(y)+x**2
c=diff(w,x,1,y,1)
c # −sin(y)cos(x)+1
23
Для того чтобы не вычислять значение производной, а создать ее привычную математическую запись вида
( ( ))d f x
dx
(или
()fx
x
в случае
вычисления частной производной), используют класс Derivative. У него такой же синтаксис, как и функции diff(). Для вычисления производной достаточно использовать метод doit():
from sympy import Derivative, sin,log
from sympy.abc import x, a
w = x**sin(x) + sin(x)**a+a**2
t=x*log(x) + sin(x)**2
d=Derivative(t,x,2)
c=Derivative(w,x)
В результате получим: переменная d будет представлена в виде
( )
2
2
2
log( ) sin ( ) ,
d
x x x
dx
+
а переменная с – как
( )
2 sin( )
sin ( ) .
xa
a x x
x
++
Для нахождения производных к коду нужно добавить строки c.doit();d.doit(): d.doit() #
22
()
1
2 (2 ) .sin x cos x
x
− + +
Вычислить значение
производной в заданной точке можно с помощью методов evalf() и n(). Вычислим, например, значение производной из примера 1.3 при x = 2 и y = 3: w=c.evalf(5, subs={x: 2, y: 3}) # 1.0587.
С помощью функции diff() иногда удается решить задачу поиска экстремумов функции одной переменной y = f(x). Для этого нужно найти производную ′ от функции y, приравнять ее нулю и решить по­лучившееся уравнение. Последнее можно сделать с помощью функции nsolve() библиотеки SymPy. При этом нужно помнить, что условие ра­венства нулю производной есть необходимое, но недостаточное усло­вие экстремума у функции, дифференцируемой на интервале поиска экстремума.
Покажем, как можно решить задачу оптимизации для функции
22
sin 5ln 12.
x
y e x x x x= − − − −
Чтобы найти интервалы, на которых
находятся экстремумы этой функции, построим ее график с помощью несложного кода. Интервал поиска зададим равным [1, 6]. При необхо­димости его можно будет изменить. Код:
from sympy import *
from sympy.plotting import *
x=symbols('x')
24
y=exp(x)*sin(x)**2-x**2-x-5*log(x)-12
p=plot(y,(x,1,6),legend=True,line_color='r')
В результате получаем график (рис. 1.2).
Рис. 1.2. График функции
22
sin 5ln 12
x
y e x x x x= − − − −
Из графика видно, что на данном отрезке функция имеет мини­мум в окрестности точки х = 3 и максимум около точки х = 5. Найдем производную этой функции: t=diff(y). После вывода на экран перемен-
ной t, получим
2
5
2 sin 2 sin cos 1 .
xx
х e x e x x
x
− + + − −
Приравниваем
к нулю значение производной и решаем получившееся уравнение с по­мощью функции nsolve(), задавая в качестве начального приближения число 3 в случае поиска минимума и число 5 – в случае поиска макси­мума функции y. Далее приведен код программы, которая производит все указанные действия. На график с функцией у добавлен график про­изводной от этой функции:
from sympy import *
from sympy.plotting import *
x=symbols('x')
y=exp(x)*sin(x)**2-x**2-x-5*log(x)-12;t=diff(y);t
p1=plot(y,(x,1,6),legend=True,line_color='r',show=False)
p2=plot(t,(x,1,6),label="Производная",
legend=True,line_color='g',show=False)
p1.append(p2[0]);p1.show()
25
zmin=nsolve(t,x,3);zmax=nsolve(t,x,5)
print("Точка минимума %.6f\n\
Значение функции в точке минимума %.3f "
% (zmin,y.subs(x,zmin)))
print("Точка максимума %.6f\n\
Значение функции в точке максимума %.3f "
% (zmax,y.subs(x,zmax)))
Рис. 1.3. Графики функции
22
sin 5ln 12
x
y e x x x x= − − − −
и производной этой функции
y
Результат решения задач оптимизации:
Точка минимума 3.299908.
Значение функции в точке минимума -31.485.
Точка максимума 5.140766.
Значение функции в точке максимума 89.612.
Из рис. 1.3 видно, что нули производной соответствуют точкам экстремума.
1.4 . В ы ч и с л е н и е и н т е г р а л о в
Для вычисления интегралов, как неопределенных, так и опреде­ленных, в SymPy используют функцию integrate(). Покажем, как можно вычислить оба вида интегралов.
26
Пример 1.4. Вычислить неопределенный интеграл
2
2
x
e dx
−
. Решение: from sympy import *
from sympy.abc import * y=exp(-x**2/2) a=integrate(y) a
Интеграл неберущийся, поэтому ответ получаем в виде
2
2
2
,
2
x
erf
  
где
2
0
2
( ) .
z
t
erf z e dt
−
=
Пример 1.5. Вычислить несобственный интеграл
2
2
.
x
e dx
−
−
Код программы: from sympy import *
from sympy.abc import * y=exp(-x**2/2) a=integrate(y,(x,-oo,oo))
a #
2
Результат можно получить в виде числа, использовав метод .n():
a.n(5) # 2.5066 пять значащих цифр в ответе.
Как и при вычислении производных, можно вывести на экран ма-
тематическую запись интеграла с помощью объекта Integral() и вычис­лить интеграл методом doit():
from sympy import * from sympy.abc import * y=x**2*sin(x) a=Integral(y,x) a a.doit()
Вывод переменной а даст
2
sin( )x x dx
. Применив метод doit(),
получим −x2cos(x)+2xsin(x)+2cos(x).
В среде IDLE вывод переменной а даст Integral(x**2*sin(x), x).
27
Пример 1.6. Вычислить определенный интеграл
7
2
2
.
1
x
dx
xx++
Код программы: from sympy import *
from sympy.abc import * y=x/(x**2+x+1) u=integrate(y,(x,2,7)) u.n(7) # 0.9224125
1.5 . В ы ч и с л е н и е п р е д е л о в
Для вычисления пределов используют функцию limit(function,
variable, point). Работу с функцией рассмотрим на примерах.
Пример 1.7. Вычислить предел
( )
2
1
arccos
.
1
lim
x
x
x
→
−
Решение: from sympy import *
from sympy.abc import * f=(acos(x)**2)/(1-x) limit(f,x,1) # 2
Пример 1.8. Вычислить предел
1
1.
lim
x
xx→

+
 
Решение: from sympy import *
from sympy.abc import * f=(1+1/x)**x limit(f,x,oo).n(5) # Число е 2.7183
Пример 1.9. Вычислить пределы слева и справа от функции
1
arctgx
x−
:
00
и .
11
lim lim
xx
arctgx arctgx
xx
→− →+
 
−−
Решение: from sympy import *
from sympy.abc import * f=atan(1/(1-x))
28
a=limit(f,x,1,"-") b=limit(f,x,1,"+") a, b # (pi/2, -pi/2)
С помощью пределов можно проверить правильность вычисле-
ния производных. Например, первая производная от lnx в соответствии с определением производной есть
0
ln( ) ln( )
.
lim
xx
→
+  −
 

Вычислим этот
предел и производную от функции lnx и сравним результаты:
from sympy import * from sympy.abc import * c=diff(log(x),x) v=limit((log(x+delta)-log(x))/delta,delta,0) c,v
Результат: (1/x, 1/x).
1 . 6 . Ра б о т а с к л а с с о м M a t r i x
Модуль matrices в SymPy предназначен для работы с матрицами.
Для задания матриц в нем есть класс Matrix. Для выполнения операций над матрицами нужно импортировать модуль matrices: from sympy.ma­trices import Matrix. Задать матрицу можно так же, как и двумерный массив в Python:
from sympy.matrices import Matrix ma=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]]) ma
Как обычно, в Python нумерация строк и столбцов идет с нуля. Помимо создания матрицы из списка списков, SymPy также под-
держивает более продвинутые методы создания матриц:
from sympy import * Matrix(2, 3, [1, -2, 8, 3, sqrt(2), 6])
29
С помощью метода n() можно представить элементы матрицы
в виде десятичных чисел.
Более интересной (и полезной) является возможность использо-
вать функцию с двумя переменными (или лямбда-функцию) для созда­ния матрицы. Создадим функцию, элементы которой вычисляются по
правилу
,
( , ) ,
,
i i j
a i j
j i j
=
а затем используем ее для создания матрицы
размером
3 4:
from sympy import * def a(i,j): if i >= j: return i else: return j Matrix(3, 4, a)
Таким образом с помощью лямбда-функции можно создать мат-
рицу, элементы которой равны 1, если сумма их индексов четна, и 0 – в противном случае: Matrix(3, 4, lambda i,j: (i+j) % 2)
Результат:
Доступ к элементам матрицы возможен как по одному, так и по
двум индексам. Для выбора элементов матрицы можно использовать срезы:
from sympy import * d=Matrix(3, 2, [1,2,3,4,5,6]) d[4] # 5 d[2,1] # 6
d[0:2, 1] #
2 4
 

Матрица – это изменяемый объект. Можно присвоить элементам
матрицы другие значения:
30
from sympy import * d=Matrix(3, 2, [1,2,3,4,5,6]) d[2,1] = d[0,0] = 0
d #
02 34 50
   

Для получения неизменяемой матрицы в модуле есть класс
ImmutableMatrix.
В качестве элементов матрицы можно использовать символьные
переменные:
from sympy.matrices import Matrix from sympy.abc import * z=Matrix([[1, x, y], [2, n, 1],[-3, m, 7]]) z
Рассмотрим некоторые свойства и методы класса Matrix. Свой­ство shape возвращает размер матрицы, методы row() и col() возвра­щают колонку или строку:
z.shape # Результат (3, 3)
z.row(0) # Результат [1 x y]
z.col(2) # Результат
1
7
y
   

У класса Matrix есть методы row_del() и col_del(), которые уда­ляют из выбранной матрицы указанные строку/столбец:
z.row(0)[:2] # [1, 2]
z.col_del(2);z #
1
2
3
x
n m
   
−

C помощью методов row_insert() и col_insert() можно добавить строки и столбцы в указанное место:
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]