9 NumPy求解线性方程

线性代数是数学的一个重要分支。numpy.linalg模块包含线性代数的函数。使用这个模块,我们可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。

9.1 数学概念

根据矩阵的乘法,可以将线性方程组写成矩阵形式。

1). n元齐次线性方程组 $A_{m\times n}x_n = 0$

2). n元非齐次线性方程组 $A_{m\times n}x_n = b$

3).A为方程组的系数矩阵,B=(Ab)为非齐次线性方程组的增广矩阵

9. 1.1 判定方程有解没解的定理

定理1n元齐次线性方程组 $A_{m\times n}x_n = 0$有非零解的充分必要条件的系数矩阵A的秩即R(A)<n,当R(A) = n时有0解。

定理2n元非齐次线性方程组 $A_{m\times n}x_n = b$有解的充分必要条件的系数矩阵A的秩等于增广矩阵B=(Ab)的秩, R(A) = R(A, b) = n有唯一解,R(A) = R(A, b) < n有无穷个解。

9.1.2 NumPy里求秩序函数

Numpy的linalg模块里的matrix_rank函数可以求得矩阵的秩。

import numpy as np
c = np.eye(2, dtype=int)
print c, '# c'
print 'rank->', np.linalg.matrix_rank(c)

程序执行结果:

[[1 0]
 [0 1]]# c
rank-> 2

9.2 求方程组的解

9.2.1 solve函数

Numpy的numpy.linalg.solve可以求得线性方程组的解。

from numpy import *
import numpy as np
a = np.array([[8, -6, 2],[-4, 11, -7],[4, -7, 6]])
b = np.array([[28],[-40],[33]])
x = np.linalg.solve(a, b)
print x
print np.allclose(np.dot(a, x), b)

9.2.2 inv函数

inv函数可以求a矩阵的逆矩阵,方程组$Ax = b$的解$x = A^{-1}b$也可求得方程组的解。

from numpy import *
import numpy as np
a = np.array([[8, -6, 2],[-4, 11, -7],[4, -7, 6]])
b = np.array([[28],[-40],[33]])
at = np.linalg.inv(a)
print at.dot(b)

9.3 linalg里的其他函数

在numpy.linalg模块里还有很多有用的函数,例如det求行列式值、使用eig函数求解特征值和特征向量、eigvals函数可以计算矩阵的特征值、lstsq 函数可以计算Ax = b的最小二乘解、qr函数等。

另外svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵:U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。

感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!