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提供了一些列不同类型的求积函数,例如 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 提供了两种方式来求解常微分方程:基于函数 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 *:加载