Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие
.pdf
31
from sympy.matrices import Matrix
m=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
m=m.row_insert(0,Matrix([[-4, 3, 0]]));m
Результат:
4 3 0
1 2 3
2 3 1
3 0.6 7
−
−
Матрицы можно складывать, вычитать, умножать в соответствии
с правилами работы с матрицами:
from sympy.matrices import Matrix
A=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
B=Matrix([[-2, 4, 8], [12, 13, -1],[0, 3.6, 2]])
A+B
A*B
2*A
f = lambda x: x**2;A.applyfunc(f)
Результат:
Некоторые полезные функции при работе с матрицами:
from sympy import *
v1 = Matrix([4,1,3])
v2 = Matrix([4,-1,2])
# перекрестное произведение двух векторов
v3 = v1.cross(v2) # [1*2-3*(-1),-4*2+3*4,4*(-1)-1*4]'=[5 4 -8]'
# скалярное произведение двух векторов
v1.dot(v2) # 4*4+1*(-1)+3*2=21
v2.dot(v3) # 0
d=Matrix(3, 2, [1,2,3,4,5,6])
d.row_swap(1,0);d # переставляет 0 и 1 строки матрицы
d=Matrix(3, 2, [1,2,3,4,5,6])
g=Matrix(3, 1, [0,0,0])
g1=Matrix(1, 2, [9,8])
d.row_swap(1,0);d # переставляет 0 и 1 строки матрицы
d.row_join(g) # добавляет к матрице d матрицу g

32
# (Столбец в нашем примере) Исходная матрица не меняется
d.col_join(g1)
Еще одна полезная прикладная функция для всей матрицы – это
функция подстановки:
from sympy.matrices import Matrix
from sympy.abc import *
z=Matrix([[1, x, y], [2, n, 1],[-3, m, 7]])
z.subs({x:4,n:2,m:sin(h)})
Определитель матрицы А можно вычислить следующим образом:
from sympy import *
A=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
det(A) # 17.0
Функция minor() позволяет вычислить определитель матрицы,
удалив из нее указанную строку и столбец:
from sympy.matrices import Matrix
from sympy.abc import *
A = Matrix([ [2, -3, 4], [1, -4, 1], [-1, 6, -5] ])
A.minor(1,1)# -6
Функция rank возвращает ранг матрицы:
from sympy.matrices import Matrix
from sympy.abc import *
A = Matrix([ [2, -3, 4], [1, -4, 1], [-1, 6, -5] ])
A.rank() # 3
Транспонировать матрицу можно с помощью функции transpose()
или метода T:
from sympy.matrices import *
from sympy import *
m=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
p=m.T;# или p=transpose(m)
p

33
Результат:
1 2 3
2 3 0.6
3 1 7
−
Сопряженную матрицу можно создать с помощью метода H или
функции adjoint(m):
from sympy.matrices import *
from sympy import *
m=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
adjoint(m)
m.H
Поскольку в данном примере матрица состоит из действительных
чисел, сопряженная к ней будет транспонированная матрица.
След матрицы, т. е. сумму диагональных элементов, вычисляют
с помощью функции trace():
from sympy.matrices import *
from sympy import *
m=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
trace(m) # 11
Еще один пример, когда среди элементов матрицы есть символьные переменные:
from sympy.matrices import *
from sympy import *
from sympy.abc import *
m=Matrix([[x**2, 2, 3], [2, 3*x, 1],[-3, .6, 7]])
trace(m)
Обратную матрицу можно вычислить с помощью функции
inv_quick():
from sympy.matrices import *
from sympy import *
from sympy.abc import *
m=Matrix([[1, 2, 3], [2, 3, 1],[-3, .6, 7]])
inv_quick(m)

34
Результат:
Проверим правильность результата:
Очевидно, что обратную матрицу можно было вычислить как m**(-1).
SymPy предоставляет множество специальных типов классов матриц.
Некоторые из них: identity, eye, zeroes, ones, diag. Примеры:
from sympy.matrices import *
a=identity(3)
b=eye(2)
c=zeros(2, 3)
d=ones(3,4)
e=diag(1,6,3)
Первая из них (а) имеет тип numpy.ndarray. Это матрица
3 3,
по
диагонали которой стоят 1.0, остальные элементы – нули. Остальные
приведенные в коде матрицы относятся к классу SymPy Matrix
(sympy.matrices.dense.MutableDenseMatrix). Их значения:
C помощью функции charpoly() можно найти уравнение характе-
ристического полинома для квадратной матрицы. Вспомним, как строится характеристический полином для матрицы А размерности
.nn
Наряду с матрицей
11 12 13 1
21 22 23 2
31 32 33 3
1 2 3
...
...
...
..........................
...
n
n
n
n n n nn
a a a a
a a a a
A a a a a
a a a a
=
рассмотрим матрицу

35
11 12 13 1
21 22 23 2
31 32 33 3
1 2 3
...
...
...
................................................
...
n
n
n
n n n nn
a a a a
a a a a
A a a a a
a a a a
−
−
=−
−
. Определитель этой матрицы
() АЕ
= −
представляет многочлен степени n и называется харак-
теристическим многочленом матрицы А. В SymPy уравнение этого
многочлена находят с помощью функции charpoly().
Пример 1.10. Найти уравнение характеристического многочлена
для матрицы
2 7 12
3 5 18 .
9 6 4
−
Решение:
from sympy import Matrix
M = Matrix([[2, 7, -12], [3, 5, 18], [9, 6, 4]]);M.charpoly()
ℤ
Если нас интересует только часть выражения в скобках, напри-
мер только уравнение многочлена, его можно получить следующим образом:
M.charpoly().args[0].
Собственные значения матрицы находят, решив матричное
уравнение det(A-λE)=0. Для вычисления собственных значений матрицы применяют функцию eigenvals().
Пример 1.11. Найти собственные значения матрицы
2 2 1
3 5 1 .
3 6 4
−
Решение:
from sympy import Matrix
M = Matrix([[2, 2, -1], [3, 5, 1], [3, 6, 4]])
M.eigenvals() # {2 – sqrt(3): 1, sqrt(3) + 2: 1, 7:1}
Получить результат в виде списка можно таким образом:
list(M.eigenvals())
Вычисление собственных векторов. Собственный вектор матрицы – это вектор, умножение матрицы на который дает тот же вектор,

36
умноженный на некоторое число: AN=λN, где А – матрица, N – собственный вектор, λ – некоторое число.
Пример 1.12. Найти собственные векторы матрицы
16
.
26
−−
Решение:
from sympy import Matrix
M = Matrix([[-1, -6], [2, 6]]);M.eigenvects()
Пояснение. Первое значение (2) – собственное значение, 1 – крат-
ность,
2
1
−
– собственный вектор. То же для второго собственного вектора:
1 6 2 4 2
.2
2 6 1 2 1
− − − − −
==
,
3 9 3
16
.3
2 2 2
26
1 3 1
−−
− − −
==
.
Покажем, как в библиотеке SymPy можно привести матрицу
к жордановой форме.
Жордановой матрицей называется матрица вида
1
2
1
2
( ) 0 ... 0
0 ( ) ... 0
,
......................................
0 0 ... ( )
k
m
m
mk
J
J
J
J
=
где
( ), ( 1, )
i
mi
J i k
=
– жордановы клетки, а все остальные элементы мат-
рицы равны нулю. Жордановой клеткой порядка m называется квадрат-
ная матрица вида
1 0 0 ... 0
0 1 0 ... 0
( ) 0 0 1 ... 0 ,
............................
0 0 0 ...
m
J
=
в которой на главной диаго-
нали стоит одно и то же число λ, над главной диагональю – единицы,

37
а все остальные элементы равны нулю. λ является собственным числом
матрицы
( ).
m
J
Если существует такая невырожденная матрица Р, что J = P-1MP –
жорданова матрица, то матрица J называется жордановой формой матрицы М, а Р – матрицей, приводящей матрицу М к жордановой форме.
Для приведения матрицы к жордановой форме служит функция jordan_form (). Функция jordan_form (M) возвращает две матрицы P и J,
где J представляет собой блочную матрицу Жордана, а P – такая невырожденная матрица, что исходная матрица М = PJP-1. J = P-1MP.
Пример 1.13. Найти жорданову форму матрицы
13
31
M
−
=
−
и матрицу, приводящую матрицу М к жордановой форме.
Решение:
from sympy import Matrix
M = Matrix([[ 1, -3 ], [-3, 1]])
P, J = M.jordan_form()
P,J
Матрица, приводящая матрицу M к жордановой форме
11
,
11
Р
−
=
жорданова форма матрицы М – матрица
20
.
04
J
−
=
Здесь
две жордановых клетки:
( )
1
( 2) 2J − = −
и
( )
1
(4) 4 .J =
Числа -2 и 4 – корни
характеристического многочлена матрицы М (
2
( 1) 9 0
− − =
).
Проверка: P*J*P**(-1).
Результат:
13
31
−
−
.
Функция diff() позволяет вычислить производные от каждого
элемента матрицы по заданным переменным.
Пример 1.14. Вычислить производную каждого элемента мат-
рицы
2
log sin
xx
M
xx
=
по х.

38
Решение:
from sympy import *
from sympy.abc import *
M = Matrix([[x, x**2], [log(x), sin(x)]])
M.diff(x)
Результат:
Пример 1.15. В условиях примера 1.14 найти определитель полу-
чившейся матрицы и вычислить его значение при х = 2.
Решение. Добавляем к коду примера 1.14 строку
det(M.diff(x)).subs({x:2}).n(5) # −2.4161
Вторую производную от всех элементов матрицы М можно вычислить как M.diff(x,2), так и M.diff(x,x).
Пример 1.16. Продифференцировать все элементы матрицы
2 ln
tan cos sin(2 )
x
x
xy y
M
e y y x
=
сначала по x, а затем по y.
Решение:
from sympy import *
from sympy.abc import x, y
M = Matrix([[x*y, 2**x*log(y)], [exp(x)*tan(y), cos(y)*sin(2*x)]])
M.diff(x,y)
Результат:
Продифференцировать элементы матрицы М дважды по х, а затем по y можно следующим образом: M.diff(x,2,y).
Функция integrate() позволяет проинтегрировать каждый элемент
матрицы.
Пример 1.17. Проинтегрировать каждый элемент матрицы
2
log sin
xx
M
xx
=
.

39
Решение:
from sympy import *
from sympy.abc import *
M = Matrix([[x, x**2], [log(x), sin(x)]])
M.integrate((x, ))
Результат:
Если нужно вычислить определенный интеграл, например от 1 до
5, нужно исправить последнюю строчку кода: M.integrate((x, 1, 5)). Методом n() можно получить элементы матрицы в виде десятичной дроби:
M.integrate((x, 1, 5)).n(5).
Можно вычислить предел каждого элемента в матрице М с помощью функции limit(). Пример записи: M.limit(x, 2).
Матрицу
34
из случайных целых чисел, принадлежащих ин-
тервалу [-6, 9], можно создать таким образом:
from sympy import *
from sympy.abc import *
randMatrix(3,4,-6,9)
Симметричную матрицу, состоящую из случайных чисел, можно
создать следующим образом:
from sympy import *
randMatrix(3, symmetric=True)
По умолчанию предполагается интервал от 0 до 99. Если не задано количество столбцов, матрица предполагается квадратной.

40
Многие другие функции для работы с матрицами можно найти
в документации по Sympy2.
1 . 7 . Р а з л о ж е н и е в ряд Т е й л о р а
Рядом Тейлора функции f(x) вещественной переменной х
в точке a называется разложение функции по положительным степеням
двучлена (х-а):
()
2
( ) ( )
( ) ( ) ( )( ) ( ) ... ( ) ...
2! !
n
n
f a f a
f x f a f a x a x a x a
n
= + − + − + + − +
Для разложения функции в ряд Тейлора в SymPy используется
функция series(var, point, order). Производится разложение функции
в ряд по переменной var в окрестности точки point с точностью до заданного порядка order. Рассмотрим работу функции на примере.
Пример 1.18. Разложить в ряд по степеням х в окрестностях нуля
функцию
2
x
ye=
.
Решение:
from sympy import *
from sympy.abc import *
y=exp(x**2).series(x,0,20);y
Результат:
В полученный ряд нельзя подставить численное значение переменной разложения. Для этого сначала нужно убрать последний
член О
х
превратив тем самым отрезок ряда в многочлен. Сделать
это можно с помощью метода removeO(). Затем можно вычислить
сумму: y.removeO().subs(x,0.1).n(8) # 1.0100502.
Проверим, насколько хорошо данная функция (y = e2x) аппроксимируется рядом Тейлора, когда в нем 3 и 4 слагаемых соответственно.
Для этого построим два графика. На одном из них построим график исходной функции и ее аппроксимацию тремя членами ряда, на другом –
четырьмя. Аппроксимацию проведем на отрезке [0, 1]:
2
Документация Sympy 1.12. URL: https://docs.sympy.org/latest/index.html.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
