SciPy - 科学计算库(上)

时间:2023-01-09 22:52:32


SciPy 库建立在 Numpy 库之上,提供了大量科学算法,主要包括这些主题:

  • 特殊函数 (scipy.special)
  • 积分 (scipy.integrate)
  • 最优化 (scipy.optimize)
  • 插值 (scipy.interpolate)
  • 傅立叶变换 (scipy.fftpack)
  • 信号处理 (scipy.signal)
  • 线性代数 (scipy.linalg)
  • 稀疏特征值 (scipy.sparse)
  • 统计 (scipy.stats)
  • 多维图像处理 (scipy.ndimage)
  • 文件 IO (scipy.io)

导入必要的库
from numpy import *
from scipy import *

一、 特定函数

特殊函数是先验函数,常用的有:

贝塞尔函数,如scipy.special.jn()(整数n阶贝塞尔函数)
椭圆函数(scipy.special.ellipj()雅可比椭圆函数,……)
伽马函数:scipy.special.gamma(),还要注意scipy.special.gammaln,这个函数给出对数坐标的伽马函数,因此有更高的数值精度。

二、 积分

1. 数值积分: 求积

SciPy - 科学计算库(上)
Scipy提供了一些列不同类型的求积函数,例如 quad, dblquad ,tplquad 分别对应单积分,双重积分,三重积分。
from scipy.integrate import quad, dblquad, tplquad

  • quad
def f(x):# define a simple function for the integrand
return x

x_lower = 0 # the lower limit of x
x_upper = 1 # the upper limit of x

val, abserr = quad(f, x_lower, x_upper)

print "integral value =", val, ", absolute error =", abserr #结果和误差
=> integral value = 0.5 , absolute error = 5.55111512313e-15
val, abserr = quad(lambda x: exp(-x ** 2), -Inf, Inf)             #'Inf' 与 '-Inf' 可以表示数值极限。
print "numerical =", val, abserr

analytical = sqrt(pi) #解析解
print "analytical =", analytical

=> numerical = 1.77245385091 1.42026367809e-08
analytical = 1.77245385091

高阶积分用法类似:

def integrand(x, y):
return exp(-x**2-y**2)

x_lower = 0
x_upper = 10
y_lower = 0
y_upper = 10

val, abserr = dblquad(integrand, x_lower, x_upper, lambda x : y_lower, lambda x: y_upper) #为y积分的边界传参的方式这样写是因为y可能是关于x的函数。

print val, abserr
=> 0.785398163397 1.63822994214e-13

2. 常微分方程 (ODEs)

SciPy - 科学计算库(上)
SciPy 提供了两种方式来求解常微分方程:基于函数 odeint 的API与基于 ode 类的面相对象的API。
通常 odeint 更好上手一些,而 ode 类更灵活一些。
from scipy.integrate import odeint, ode

需要知道方程 f 与初始条件y(0)。高阶常微分方程常常写成引入新变量作为中间导数的形式。 一旦定义了函数 f 与数组 y_0可以使用 odeint 函数:y_t = odeint(f, y_0, t)

应用示例:双摆,阻尼谐震子

3. 傅立叶变换

from scipy.fftpack import *:加载