本章节介绍数值积分子包scipy.integrate与线性代数子包scipy.linalg
quad的一般形式是scipy.integrate.quad(f,a,b),其中’f’是要集成的函数的名称。然而,'a’和’b’分别是下限和上限。让我们看一下高斯函数的一个例子,它集成在0和1的范围内。
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)
这里函数返回两个值,其中第一个值是积分,第二个值是积分中的估计误差。
dblquad的一般形式是scipy.integrate.dblquad(func,a,b,gfun,hfun)。其中,func是要集成的函数的名称,'a’和’b’分别是x变量的下限和上限,而gfun和hfun是定义下限和上限的函数的名称的变量。
我们以下等式的双重积分
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)
大家可以看到上面的输出与前一个相同。
上面描述的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使用优化的ATLAS LAPACK和BLAS库构建,它具有非常快速的线性代数功能。所有这些线性代数函数都需要一个可以转换为二维数组的对象,这些函数的输出也是二维数组。
scipy.linalg包含numpy.linalg中的所有函数,scipy.linalg还有一些不在numpy.linalg中的其他高级函数。在numpy.linalg上使用scipy.linalg的另一个好处是它总是使用BLAS / LAPACK支持编译,而对于NumPy,这是可选的。因此,根据NumPy的安装方式,SciPy版本可能会更快。
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.]
方阵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
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.]]
特征值与特征向量问题是最常用的线性代数运算之一。通过考虑以下关系,我们可以找到方形矩阵(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]]
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)。