SymPy矩阵运算

矩阵的建立

可以使用sympy.Matrix()建立矩阵,其中的参数可以是Python的列表,也可以是numpy的array

1
2
3
4
5
6
7
8
9
10
11
12
>>> a = [[1,1],[0,2]]
>>> b = np.array([[1,0],[1,1]])
>>> A = sympy.Matrix(a)
>>> B = sympy.Matrix(b)
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> B
Matrix([
[1, 0],
[1, 1]])

最常见的矩阵是单位矩阵,建立单位矩阵需要矩阵的参数,使用sympy.eye()建立单位矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> sympy.eye(3)
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
>>> sympy.eye(3,2)
Matrix([
[1, 0],
[0, 1],
[0, 0]])
>>> sympy.eye(2,3)
Matrix([
[1, 0, 0],
[0, 1, 0]])

另外还可以建立全零矩阵sympy.zeros()和全一矩阵sympy.ones()

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> sympy.ones(2)	# 只有一个参数的时候默认为方阵
Matrix([
[1, 1],
[1, 1]])
>>> sympy.ones(2,3)
Matrix([
[1, 1, 1],
[1, 1, 1]])
>>> sympy.zeros(3,2)
Matrix([
[0, 0],
[0, 0],
[0, 0]])

另外还可以建立对角矩阵sympy.diag()

1
2
3
4
5
>>> sympy.diag(1,1,2)
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 2]])

矩阵的运算

SymPy可以进行矩阵的加法、减法、乘法、求逆、转置、行列式。

使用之前建立的矩阵,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>> A+B
Matrix([
[2, 1],
[1, 3]])
>>> A-B
Matrix([
[ 0, 1],
[-1, 1]])
>>> A*B
Matrix([
[2, 1],
[2, 2]])
>>> A * B**-1
Matrix([
[ 0, 1],
[-2, 2]])
>>> B**-1
Matrix([
[ 1, 0],
[-1, 1]])
>>> A.T
Matrix([
[1, 0],
[1, 2]])
>>> A.det()
2

可以使用eigenvals(),eigenvects(),diagonalize()方法进行对角化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> A.eigenvals()
{2: 1, 1: 1}
>>> A.eigenvects()
[(1, 1, [Matrix([
[1],
[0]])]), (2, 1, [Matrix([
[1],
[1]])])]
>>> A.diagonalize()
(Matrix([
[1, 1],
[0, 1]]), Matrix([
[1, 0],
[0, 2]]))

eigenvals()返回的结果中,第一个表示特征值,第二个表示特征值的重数。

eigenvects()返回的列表中,第一列表示特征值,第二个表示特征值的重数,第三个表示特征向量。

diagnonalize()返回的结果中,第一个矩阵表示,第二个矩阵表示,其中

在线性代数中,可以使用矩阵解线性方程组,例如求解Ax=b,以为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> A = sympy.Matrix([[1,1],[0,2]])
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> b = sympy.Matrix([3,5])
>>> b
Matrix([
[3],
[5]])
>>> A**-1*b
Matrix([
[1/2],
[5/2]])
>>> sympy.linsolve((A,b))
{(1/2, 5/2)}