Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие
.pdf
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.matrices 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() можно добавить
строки и столбцы в указанное место:
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
