Scipy在Numpy的基础上则加了众多的数学计算,科学计算以及工程计算中常用的模块,例如线性代数,常微分方程的数值求解,信号处理,图像处理,系数矩阵等。在本章中,将通过实例介绍Scipy中常用的的一些模块。为了方便读者理解,在示例程序中使用matplotlib,TVTK以及Mayavi等扩展绘制二维以及三维图表。

  Scipy的special模块是一个非常完整的函数库,其中包含了基本数学函数,特殊数学函数以及Numpy中出现的所有函数。

  伽马(gamma)函数γ时概率统计学中经常出现的一个函数,它计算公式如下:

  显然这样计算起来特别的麻烦,幸运的是。scipy.special中有内置的gamma模块。

  1. >>> import scipy.special as S
  2. >>> S.gamma(4)
  3. 6.0
  4. >>> S.gamma(0.5)
  5. 1.7724538509055159
  6. >>> S.gamma(1+1j)
  7. (0.4980156681183554-0.15494982830181081j)
  8. >>> S.gamma(1000)
  9. inf

  Γ(z)函数时结成函数在实数和复数系上的扩展,他的增长速度特别的块,1000的阶乘就超过了双精度浮点数的表示范围,因此结果就是无穷大。为了计算更大的范围可以使用gammaln()计算ln(|Γ(x)|)的只,它使用特殊的算法,能够直接计算Γ函数的对数值,因此可以表示更大的范围。

Scipy的constants模块中包含了众多的物理常数:

  1. >>> from scipy import constants as C
  2. >>> C.c # 真空中的光速
  3. 299792458.0
  4. >>> C.h #普朗克常数
  5. 6.62607004e-34

  special模块中的某些函数并不是数学意义上的特殊函数,例如log1p(x)计算log(1+x)的值。这是由于浮点数的精度有限,无法很精确的表示非常接近1 的常数。例如无法用浮点数表示1+1e-20的值,因此

  1. >>> import math
  2. >>> math.log(a)
  3. 0.0

,然而当使用log1p的时候,则可以很精确的计算。实际上当x非常小的时候,log1p(x)约等于x,这可以通过对log(1+x)进行泰勒级数展开进行证明。在后续的章节我们会学习如何使用符号计算库SymPy进行泰勒级数展开。

  这些特殊函数与NumPy中的一般函数一样,都是ufunc函数,支持数组的广播运算。例如elipj(u,m)计算雅克比矩阵,他有两个参数u和m,返回四个值sn = sinΦ,cn = cosΦ,dn = (1-msin2Θ)-1/2 由于ellipj()支持广播运算。因此下面的程序在调用他时传递的两个参数的形状分别为(200,1)和(1,5),于是得到的四个结果数组的形状都是(200,5),图3-1显示了这些曲线。


  Scipy的optimize模块提供了许多数值优化算法,本节对其中的非线性方程组求解,数据拟合,函数值等进行简单介绍

非线性方程组求解

  fsolve()可以对非线性方程组进行求解,他的基本调用格式为fsolve(func,x0).其中func是计算方程组误差的函数,他的参数x是一个数组,其值为方程组的一组可能的解func返回将x带入方程组之后得到的每个方程的误差x0为未知数的一组初始值,假设要对下面的方程组进行求解:

  f1(u1,u2,u3) = 0,f2(u1,u2,u3) = 0,f3(u1,u2,u3) = 0

  那么finc函数可以定义为:

  1. from math import sin,cos
  2. from scipy import optimize
  3.  
  4. def f(x):
  5. x0,x1,x2 = x.tolist()
  6.  
  7. return [5*x1+3,4*x0*x0-2*sin(x1*x2),x1*x2-1.5]
  8.  
  9. result = optimize.fsolve(f,[1,1,1])
  10. print(result)
  11. print(f(result))
  1. [-0.70622057 -0.6 -2.5 ]
  2. [0.0, -9.126033262418787e-14, 5.329070518200751e-15]

  f()时计算方程组的误差的函数,x参数是一组可能的解,fsolve()在调用f()时,传递给f()的参数是一个数组,先调用tolist,将其转化为标准浮点数列表,然后调用math函数中的模块进行计算。因为在进行单个数值的运算的时候,标准浮点类型比NumPy的浮点类型要快许多,所以把数值转化成标准浮点数类型,能缩短一些计算时间。调用fsolve()时,传递计算误差的函数f()以及未知数的初始值。

  在对方程组进行求解的时候,fsolve()会自动计算方程组在某点对各个未知数变量的偏导数,这些偏导数组成一个二维数组,数学上称之为雅克比矩阵。如果方程组的未知数很多,而与每个方程有关联的未知数较少,即雅克比矩阵比较稀疏的时候,将计算雅克比矩阵的函数作为参数传递给fsolve(),这样可以大幅度提高运算速度,逼着在一个模拟计算的程序中需要求解有50个未知数的非线性方程组每个方程平均与6个未知数相关,通过传递计算雅克比矩阵的函数时fsolve()的计算速度提高了4     倍。

最小二乘拟合

  假设有一组实验数据(xi,yj),我们实现知道他们应该满足某种函数关系yi = f(xi)。通过这些已知信息,需要确定函数f(x)的一些参数。例如函数f()时线性函数f(x) = kx+b那么参数k和b就是需要确定的值。如果用p表示函数中需要确定的参数,则目标是找到一组p使得函数S的值最小。

如果用p表示函数中需要确定的参数,则目标时找到一组p使得函数S的值最小:

  这种方法叫做最小二乘拟合。在optimize模块中,可以受用leastsq()对数据进行最小二乘拟合运算。leastsq()的用法非常的简单。只需要将计算误差的函数和待确定参数的初始值传递给它即可。

  1. import numpy as np
  2. from scipy import optimize
  3.  
  4. x = np.array([8.19 , 2.72 , 6.39 , 8.71 , 4.7 , 2.66 , 3.78])
  5. y = np.array([7.01 , 2.78 , 6.47 , 6.71 , 4.1 , 4.23 , 4.05])
  6.  
  7. def residuals(p):
  8. k,b = p
  9. return y - (k*x + b)
  10.  
  11. r = optimize.leastsq(residuals,[1,0])
  12.  
  13. k,b = r[0]
  14. print("k = ",k,"b = ",b)

接下来看一个对正弦波进行拟合的例子。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy import optimize
  4. #import pylab as pl
  5. def func(x,p):
  6. """
  7. 数据拟合用的函数
  8. """
  9. A , k , theta = p
  10. return A*np.sin(2*np.pi*k*x+theta) #对 周期,相位,峰值都有参数可以调
  11. def residuals(p,y,x):
  12. """
  13. 实验数据x,y和拟合数据之间的差,p为拟合需要找到的系数
  14. """
  15. return y - func(x,p)
  16.  
  17. x = np.linspace(0,2*np.pi,100)
  18. A , k , theta = 10 , 0.34 , np.pi/6 # 真实数据的函数参数
  19. y0 = func(x,[A , k , theta]) # 真实数据 广播运算
  20. np.random.seed(0)
  21. y1 = y0 + 2 * np.random.randn(len(x))
  22.  
  23. p0 = [7 , 0.4 , 0] # 第一次猜测的函数拟合参数
  24. plsq = optimize.leastsq(residuals , p0 , args = (y1,x))
  25. print("真实参数",[A,k,theta])
  26. print("拟合参数",plsq[0])#实验数据 拟合之后的参数
  27.  
  28. plt.plot(x , y1 , "o" , label = u"Noisy data")
  29. plt.plot(x , y0 , label = u'Real data' )
  30. plt.plot(x,func(x,plsq[0]),label = u'Fitting data')
  31. plt.legend(loc = 'best')
  32. plt.show()

真实参数 [10, 0.34, 0.5235987755982988]
拟合参数 [ 10.25218748   0.3423992    0.50817425]

  和上一个不同的是,这里的leatsq有一个args参数。因为residuals函数 有三个参数,所以这里调用的时候也需要将这三个参数传入,当然也可以改变一下采用上面没有args的写法。

Scipy-数值计算库的更多相关文章

  1. C#环境下的数值计算库:MathNet

    下面用一个简单的例子来说明MathNet的使用方法: 1. 进入MathNet官网找到数值计算库Math.NET Iridium(Numerics)并下载: 2. 将下载的文件解压缩,在目录下的Bin ...

  2. windows下解决numpy, scipy等库安装失败的方法

    如果pip安装scipy库失败,可以参考以下方法: scipy官方上提供了这样的方法: Windows packages Windows does not have any package manag ...

  3. python 数值计算库

    pip install numpy pip install matplotlib pip install sklearn yum -y install tkinter pip install scip ...

  4. python开发应用笔记-SciPy扩展库使用

    SciPy https://www.scipy.org/ SciPy中的数据结构: 1.ndarray(n维数组) 2.Series(变长字典) 3.DataFrame(数据框) NumPy适合于线性 ...

  5. Python 数值计算库之-[Pandas](六)

  6. Python 数值计算库之-[NumPy](五)

  7. c++ 数值计算库Eigen

    http://eigen.tuxfamily.org/index.php?title=Main_Page

  8. Python_科学计算平台__pypi体系的numpy、scipy、pandas、matplotlib库简介

    1.numpy--基础,以矩阵为基础的数学计算模块,纯数学 存储和处理大型矩阵. 这个是很基础的扩展,其余的扩展都是以此为基础. 快速学习入口 https://docs.scipy.org/doc/n ...

  9. Python3科学计算库概况

    Python3科学计算常见库入门 Numpy快速数据处理库 参见我的博客 http://www.cnblogs.com/brightyuxl/p/8981294.html http://www.cnb ...

  10. Python之路-numpy模块

    这里是首先需要安装好Anaconda Anaconda的安装参考Python之路-初识python及环境搭建并测试 配置好环境之后开始使用Jupyter Notebook 1.打开cmd,输入 jup ...

随机推荐

  1. Redis实现分布式锁(Set和Lua)

    转载:https://www.cnblogs.com/linjiqin/p/8003838.html 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于Z ...

  2. sanic官方文档解析之静态文件和版本

    1,静态文件 就向图片文件一样,静态文件和指导性的文件,当通过Sanic服务端用app.static()方法注册的时候,这种方法采用端点url和文件名称获得.这样的文件的指定,将会通过指定的端点访问. ...

  3. HDU 6143 Killer Names DP+快速密

    Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human apprentice ...

  4. vmware 自动挂起

    用VMware跑虚拟机,经常会出现客户操作系统自己挂起的现象,怀疑是主机自己休眠的设置.设置之后,无效. 后来才发现不是主机休眠设置,还是应该设置客户操作系统中的休眠设置. 在客户机,控制面板  电源 ...

  5. MIPS 指令集将在近期开源,RISC-V 阵营慌吗?

    消息称,MIPS 指令集即将开源. eetimes 17 日报导,Wave Computing 公司表示,在明年第一季度发布最新 MIPS 指令集体系和 MIPS 最新内核 R6 的时候将开源 MIP ...

  6. mysql表分区 partition

    表分区 partition 当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低. 可不可以把表的数据分开在几张表上? 1: 从业务角度可以解决.. (分表,水平 ...

  7. JVM对象存活判断方法

    一.GC主要针对什么区域 1. 程序计数器.虚拟机栈.本地方法栈,3个部分随线程而生死.每个栈桢分配多少内存基本上是在类结构确定下来时就已确定,大体上可认为是 编译期可知. 2. 而 堆 和 方法区 ...

  8. POJ 2017 Speed Limit (直叙式的简单模拟 编程题目 动态属性很少,难度小)

                                                                                                      Sp ...

  9. MYSQL初级学习笔记八:MySQL中常用的函数!(视频序号:初级_45-50)

    知识点十:MySQL中的函数(45-50) 数学函数: 名称 描述 CEIL() 进一取整 FLOOR() 舍一取整 MOD 取余数(取摸) POWER() 幂运算 ROUND() 四舍五入 TRUN ...

  10. Redis和StackExchange.Redis

    redis有多个数据库1.redis 中的每一个数据库,都由一个 redisDb 的结构存储.其中,redisDb.id 存储着 redis 数据库以整数表示的号码.redisDb.dict 存储着该 ...