
3.1 常数和特殊函数
与本节内容对应的Notebook为:03-scipy/scipy-100-intro.ipynb。
SciPy的constants模块包含了众多的物理常数:
from scipy import constants as C print C.c # 真空中的光速 print C.h # 普朗克常数 299792458.0 6.62606957e-34
在字典physical_constants中,以物理常量名为键,对应的值是一个含有三个元素的元组,分别为常数值、单位以及误差,例如下面的程序用来查看电子的质量:
C.physical_constants["electron mass"] (9.10938291e-31, 'kg', 4e-38)
除了物理常数之外,constants模块中还包括许多单位信息,它们是1单位的量转换成标准单位时的数值:
# 1英里等于多少米, 1英寸等于多少米, 1克等于多少千克, 1磅等于多少千克 C.mile C.inch C.gram C.pound ------------------ ------ ------ ------------------- 1609.3439999999998 0.0254 0.001 0.45359236999999997
SciPy的special模块是一个非常完整的函数库,其中包含了基本数学函数、特殊数学函数以及NumPy中出现的所有函数。由于函数数量众多,本节仅对其进行简要介绍。至于其具体所包含的函数列表,请读者参考SciPy的帮助文档。
伽玛(gamma)函数Γ是概率统计学中经常出现的一个特殊函数,它的计算公式如下:

显然,要通过此公式计算Γ(z)的值是比较麻烦的,可以用special模块中的gamma( )进行计算:
import scipy.special as S print S.gamma(4) print S.gamma(0.5) print S.gamma(1+1j) # gamma函数支持复数 print S.gamma(1000) 6.0 1.77245385091 (0.498015668118-0.154949828302j) inf
Γ(z)函数是阶乘函数在实数和复数系上的扩展,它的增长速度非常快,1000的阶乘已经超过了双精度浮点数的表示范围,因此结果是无穷大。为了计算更大的范围,可以使用gammaln( )计算ln(|Γ(x)|)的值,它使用特殊的算法,能直接计算Γ函数的对数值,因此可以表示更大的范围。
S.gammaln(1000) 5905.2204232091808
special模块中的某些函数并不是数学意义上的特殊函数,例如log1p(x)计算log(1+x)的值。这是由于浮点数的精度有限,无法很精确地表示非常接近1的实数。例如无法用浮点数表示1 + 1e-20的值,因此log(1+1e-20)的值为0,而当使用log1p( )时,则可以很精确地计算:
print 1 + 1e-20 print np.log(1+1e-20) print S.log1p(1e-20) 1.0 0.0 1e-20
实际上当x非常小时,log1p(x)约等于x,这可以通过对log(1+x)进行泰勒级数展开证明。在后续章节我们会学习如何用符号计算库SymPy进行泰勒级数展开。
这些特殊函数与NumPy中的一般数学函数一样,都是ufunc函数,支持数组的广播运算。例如ellipj(u, m)计算雅可比椭圆函数,它有两个参数u和m,返回4个值sn、cn、dn和ϕ,其中ϕ满足下面的椭圆积分,而。

由于ellipj( )支持广播运算,因此下面的程序在调用它时传递的两个参数的形状分别为(200, 1)和(1, 5),于是得到的4个结果数组的形状都为(200, 5),图3-1显示了这些曲线。

图3-1 使用广播计算得到的ellipj( )返回值
m = np.linspace(0.1, 0.9, 4) u = np.linspace(-10, 10, 200) results = S.ellipj(u[:, None], m[None, :]) print [y.shape for y in results] [(200, 4), (200, 4), (200, 4), (200, 4)]