Python科学计算(第2版)
上QQ阅读APP看书,第一时间看更新

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)]