Numpy线性代数-numpy.linalg.solve()&numpy.linalg.inv()&numpy.linalg.det()

592 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

前言

NumPyNumPy提供了线性代数函数库linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明。

函数内容
dot两数组的点积
vdot两向量的点积
inner两数组的内积
determinant数组的行列式
matmul两数组的矩阵积
inv求矩阵的逆
solve求解线性矩阵方程

相关函数介绍

numpy.dot()numpy.dot()

numpy.vdotnumpy.vdot()

numpy.inner()numpy.inner()

numpy.determinant()numpy.determinant()

numpy.matmul()numpy.matmul()

numpy.inv()numpy.inv()

numpy.solve()numpy.solve()

numpy.linalg.solve()

numpy.linalg.solve()函数用于求解矩阵形式的线性方程的解。

比如线性方程:

2x+2y+2z=52x + 2y + 2z = 5

2y+4z=32y + 4z = -3

2x+5y2z=262x + 5y - 2z = 26

可以使用矩阵进行表示: [222024252][xyz]=[5326]\begin{bmatrix} 2& 2& 2 \\0& 2 & 4 \\2& 5 &-2 \end{bmatrix} \begin{bmatrix} x \\y \\z \end{bmatrix} = \begin{bmatrix} 5 \\-3 \\26 \end{bmatrix}

AX=BX=A1BAX=B\rightarrow X=A^{-1}B

可以看到要使用numpy.linalg.solve()函数求解线性方程,必须先了解矩阵的逆。

numpy.linalg.inv()

numpy.linalg.inv()函数计算矩阵的乘法逆矩阵。

逆矩阵:设A是数域上的一个nn阶矩阵,若在相同数域上存在另一个nn阶矩阵B,使得: AB=BA=EAB=BA=E ,则我们称BA的逆矩阵,而A则被称为可逆矩阵。注:E为单位矩阵。

import numpy as np 
a=np.array([[1,2],[3,4]])
b=np.linalg.inv(a)
print("矩阵a:",'\n',a)
print("矩阵b:",'\n',b)
print(np.dot(a,b))
矩阵a: 
 [[1 2]
 [3 4]]
矩阵b: 
 [[-2.   1. ]
 [ 1.5 -0.5]]
[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

现在可以求解线性方程:

2x+2y+2z=52x + 2y + 2z = 5

2y+4z=32y + 4z = -3

2x+5y2z=262x + 5y - 2z = 26

A=np.array([[2,2,2],[0,2,4],[2,5,-2]])
B=np.array([[5],[-3],[26]])
X=np.linalg.solve(A,B)#先传入A(系数矩阵),B(结果矩阵),返回解矩阵X
print("线性方程组的解:\n",X)

a=np.linalg.inv(A)#A 的逆矩阵 
X=np.dot(a,B)#X=A^(-1) B
print("线性方程组的解:\n",X)
线性方程组的解:
 [[ 1.45]
 [ 3.6 ]
 [-2.55]]
线性方程组的解:
 [[ 1.45]
 [ 3.6 ]
 [-2.55]]

可以看出两种方法求出的结果是相同的。

numpy.linalg.det()

numpy.linalg.det()函数计算输入矩阵的行列式。

  • 对于2×22\times 2矩阵,它是左上和右下元素的乘积与其他两个的乘积的差.对于矩阵[[a,b],[c,d]],行列式计算为adbcad-bc.较大的方阵被认为是2×22\times 2矩阵的组合。

计算2×22\times 2矩阵的行列式

import numpy as np
a = np.array([[1,2], [3,4]]) 
ans = np.linalg.det(a) #1*4-2*3=-2
print(ans)
-2.0000000000000004

计算3×33\times 3矩阵的行列式

b = np.array([[6, 1, 1], [4, -2, 5], [2, 8, 7]])
ans = np.linalg.det(b)
print(ans)
print(6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2))

-306.0
-306