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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
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 называется жордановой формой мат­рицы М, а Р – матрицей, приводящей матрицу М к жордановой форме. Для приведения матрицы к жордановой форме служит функция jor­dan_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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]