4.3 数值积分与线性代数

本章节介绍数值积分子包scipy.integrate与线性代数子包scipy.linalg

数值积分scipy.integrate

1. 单积分

quad的一般形式是scipy.integrate.quad(f,a,b),其中’f’是要集成的函数的名称。然而,'a’和’b’分别是下限和上限。让我们看一下高斯函数的一个例子,它集成在0和1的范围内。

img

from scipy import integrate
# 设置f(x)函数
f = lambda x: x**2
# single与a = 0 & b = 1集成  
integration = integrate.quad(f, 0, 1)
print(integration)

输出:

(3.0, 9.657432734515774e-14)

这里函数返回两个值,其中第一个值是积分,第二个值是积分中的估计误差。

2. 双积分

dblquad的一般形式是scipy.integrate.dblquad(func,a,b,gfun,hfun)。其中,func是要集成的函数的名称,'a’和’b’分别是x变量的下限和上限,而gfun和hfun是定义下限和上限的函数的名称的变量。

我们以下等式的双重积分

img

from scipy import integrate import numpy as np # 导入math lib的平方根函数 from math import sqrt # 设置函数 f(x) f = lambda x, y: 64*x*y # 第二积分的下限 p = lambda x: 0 # 第一积分的上限 q = lambda y: sqrt(1 - 2*y**2) # 执行双重集成 integration = integrate.dblquad(f, 0, 2/4, p, q) print(integration)

输出:

(3.0, 9.657432734515774e-14)

大家可以看到上面的输出与前一个相同。

3. 其它

上面描述的quad和dblquad,将满足我们对数值积分的大部分需求。但是SciPy还有许多用于执行数值积分的例程,其中大多数都在同一个scipy.integrate库中找到。下表列出了一些常用功能。

编号 功能说明
1 quad单积分
2 dblquad双重积分
3 tplquad三重积分
4 nquad n倍多重积分
5 fixed_quad高斯正交,阶数n
6 quadrature高斯求积公差
7 romberg
8 trapz梯形规则
9 cumtrapz梯形规则累积计算积分
10 simps辛普森的统治
11 ROMB
12 polyint解析多项式积分(NumPy)
13 poly1dpolyint的辅助函数(NumPy)

线性代数scipy.linalg

SciPy使用优化的ATLAS LAPACKBLAS库构建,它具有非常快速的线性代数功能。所有这些线性代数函数都需要一个可以转换为二维数组的对象,这些函数的输出也是二维数组。

1. SciPy.linalg与NumPy.linalg

scipy.linalg包含numpy.linalg中的所有函数,scipy.linalg还有一些不在numpy.linalg中的其他高级函数。在numpy.linalg上使用scipy.linalg的另一个好处是它总是使用BLAS / LAPACK支持编译,而对于NumPy,这是可选的。因此,根据NumPy的安装方式,SciPy版本可能会更快。

2. 线性方程组

scipy.linalg.solve可以求解线性方程A*X + B*Y = Z,作为示例,假设期望解决以下联立方程。

3x + 2y = 2
2x - y = 4
5y + z = -1

为了求解x,y,z值的上述等式,我们可以使用矩阵求逆找到解向量。但是,最好使用linalg.solve命令,它可以更快,更稳定。

求解函数采用两个输入’a’和’b’,其中’a’表示系数,'b’表示相应的右边的值并返回解数组。

代码如下:

from scipy import linalg import numpy as np # 声明numpy数组 a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]]) b = np.array([2, 4, -1]) # 将值传递给求解函数 x = linalg.solve(a, b) print(x)

上述程序将生成以下输出。

[ 2. -2.  9.]

3. 计算行列式

方阵A的行列式通常表示为| A | 并且是线性代数中经常使用的。在SciPy中,这是使用**det()**函数计算的,它将矩阵作为输入并返回标量值。

让我们考虑以下示例。

from scipy import linalg import numpy as np # 声明numpy数组 A = np.array([[1,2],[3,4]]) # 将值传递给det函数求解行列式 x = linalg.det(A) print(x)

上述程序将生成以下输出。

-2.0

通过求解后的结果一致,即1*4 - 2*3 = -2

img

4. 逆矩阵

scipy.linalg.inv可以计算任何方阵的逆。看下面的代码:

from scipy import linalg import numpy as np # 定义numpy数组 two_d_array = np.array([[1, 2], [-1, -3]]) # 将值传递给inv()函数 res = linalg.inv(two_d_array) print(res)

输出:

[[ 3.  2.]
 [-1. -1.]]

5. 特征值和特征向量

特征值与特征向量问题是最常用的线性代数运算之一。通过考虑以下关系,我们可以找到方形矩阵(A)的特征值(λ)和相应的特征向量(v)。

Av =λv

scipy.linalg.eig根据普通或广义特征值问题计算特征值,该函数返回特征值和特征向量。

让我们考虑以下示例。

from scipy import linalg import numpy as np # 声明numpy数组 A = np.array([[1,2],[3,4]]) # 将值传递给特征函数 l, v = linalg.eig(A) # 打印结果的特征值 print("特征值:", l) # 打印结果的特征向量 print("特征向量:", v)

上述程序将生成以下输出。

特征值: [-0.37228132+0.j  5.37228132+0.j]
特征向量: [[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]

6. 特殊矩阵

SciPy和NumPy提供了几种用于创建工程和科学中常用的特殊矩阵的函数。

类型 功能 描述
块对角 scipy.linalg.block_diag 从提供的数组创建块对角矩阵。
循环 scipy.linalg.circulant 构建循环矩阵。
companion scipy.linalg.companion 创建一个companion矩阵。
Hadamard scipy.linalg.hadamard 构造一个Hadamard矩阵。
Hankel scipy.linalg.hankel 构造一个Hankel矩阵。
希尔伯特 scipy.linalg.hilbert 构造希尔伯特矩阵。
希尔伯特的逆 scipy.linalg.invhilbert 构造希尔伯特矩阵的逆。
Leslie scipy.linalg.leslie 创建一个Leslie矩阵。
Pascal scipy.linalg.pascal 创建一个Pascal矩阵。
Toeplitz scipy.linalg.toeplitz 构造Toeplitz矩阵。
vander numpy.vander 生成vander矩阵。

若有疑问,欢迎联系作者(微信:lixu1770105)。