python科学计算_scipy_常数与优化

摘要:
3.非线性方程的求解优化模块中的fsolve()函数可以求解非线性方程。该函数被传递到一个函数中,用于计算方程的误差,以及deffunc等参数的初始值:u1,u2,u3=xrefurn[f1,f2,f3]result=fsolve。上述过程可以求解非线性方程:f1=0f2=0f3=0;

scipy在numpy的基础上提供了众多的数学、科学以及工程计算中常用的模块;是强大的数值计算库;

1. 常数和特殊函数

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

import scipy.constants as C
C.c  #真空中的光速
C.h  #普朗克常数
C.pi #圆周率 

在C.physical_constants字典中,通过物理常数的名称访问该物理常数,如:

C.physical_constants['speed of light in vacuum']

(299792458.0, 'm s^-1', 0.0)

C.physical_constants['Planck constant']

(6.62606957e-34, 'J s', 2.9e-41)

C.physical_constants['electron mass']

(9.10938291e-31, 'kg', 4e-38)

返回一个包含三个值的元组,分别表示常数值、单位、误差;

scipy的special模块包含基本的数学函数、特殊数学函数、以及numpy中的所有函数;

由于浮点数的精度限制,有些函数的无法精确地表示结果,如log(1+1e-20),1+1e-20非常接近1,得到的结果将是0,而不是精确的值;log1p(1e-20)则可以得到精确的值:

import math

import scipy.special as S

math.log(1+1e-20,10)

0.0

S.log1p(1e-20)

9.9999999999999995e-21

同时,查看文档可以了解到:log1p是一个ufunc;

2. 优化:optimize

scipy的optimize模块提供了许多数值优化算法;

1. 最小二乘拟合

optimize.leastsq()对数据进行最小二乘拟合计算。leastsq()使用时,需要传递计算误差的函数和待确定的参数的初始值p即可;

直线拟合:

def residuals(p):
    k, b = p
    return Y - (k*X - b)

X 、 Y 为两个一维数组,表示点的X轴和Y轴位置;

r = leastsq(residuals, [1,0])

leastsq()函数传入误差计算函数和初始值[1,0],该初始值将作为误差计算函数的第一个参数传入;

计算的结果r是一个包含两个元素的元组,第一个元素是一个数组,表示拟合后的参数k、b;第二个元素如果等于1、2、3、4中的其中一个整数,则拟合成功,否则将会返回mesg ;更多的返回值见文档;

其他函数拟合(以正弦波拟合为例):

def func(x,p):
    A,k,theta = p
    return A*np.sin(2*np.pi*k*x+theta)

def residuals(p,y,x):
    return y - func(x,p)

x = np.linspace(0,2*np.pi,100)
A, k, theta = 10, 0.34, np.pi/6   #真实参数
y0 = func(x,[A,k,theta])   #真实值
y1 = y0 + 2 * np.random.randn(len(x))  # 加入噪声
p0 = [10, 0.3, 0.5]  #猜测拟合参数,即初始值

plsq = leastsq(residuals, p0, args=(y1,x)) # 除了初始值之外,还调用了args参数,用于指定residuals中使用到的其他参数(直线拟合时直接使用了X,Y的全局变量),同样也返回一个元组,第一个元素为拟合后的参数数组;

import  pylab as pl
pl.plot(x,y0,label=u'真实数据')
pl.plot(x,y1,label=u'噪声数据')
pl.plot(x,func(x,plsq[0]),label=u'拟合结果')
pl.legend()
pl.show()

拟合的过程中,猜测的初始值非常重要,需要先将噪声数据画出来,然后大致估计相位和频率,推出估计的初始值,再进行拟合;

NewImage

2. 函数的最小值

optimize模块还提供了许多求函数最小值的算法:fmin、fmin_powell、fmin_cg、fmin_bfgs等,这些函数通过传入目标函数和初始值对最小值进行拟合,fmin*()这个类型的函数还提供一个fprime的参数,该参数为计算目标函数对各个自变量偏导数的函数。

3. 非线性方程组的求解

optimize模块中的fsolve()函数可以求解非线性方程组,该函数传入一个计算方程组误差的函数,和参数的初始值如:

def func(x):
    u1,u2,u3 = x
    return [f1(u1,u2,u3),f2(u1,u2,u3),f3(u1,u2,u3)]

result = fsolve(func,[1,1,1])

以上过程可以求:

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

的非线性方程组的解; 

免责声明:文章转载自《python科学计算_scipy_常数与优化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux Shell系列教程之(七)Shell输出Linux之iptables(五、firewall命令及配置)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python从入门到实践第十一章练习题

'''这是11-1和11-2的练习题用于接受城市名称的函数'''"""def get_ciy_name(city,country):#定义一个城市名称的函数有2个形参 city_name = city + ',' + country return city_name.title()#把值返回给函数,用title()的方法把每个单词的第一个字母转...

模块与包的导入

1.模块什么是模块: #常见的场景:一个模块就是一个包含了python定义和声明的文件(文件名就是模块名字加上.py的后缀),模块可以被导入使用。 #但其实import加载的模块分为四个通用类别:  使用python编写的.py文件 已被编译为共享库或DLL的C或C++扩展 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该...

python之读取文件的MD5码并重命名文件

由于自己的手机经常备份,备份后原来的图片视频没有删除,下次再备份的时候移动硬盘上又多了很多重复图片,于是想着能不能用提取MD5校验码的方式识别出重复的文件,然后处理下硬盘里已经重复的内容. 考虑到最近在学python,于是通过上网查资料和内容,借很多大牛的轮子来试了一下,搞了两个晚上,终于算是阶段性完成,能达到目标的方法.主要难点有三个: 获取文件的MD...

Python -扩展C++-Pytorch扩展

1.Python whl 文件和 egg 文件 可以执行和效率是两码事 setup.py用来编译和安装扩展模块。负责编译c++模块,封装成python可以调用的形式 所有能被整合或导入到其它python脚本的代码,都可以被称为扩展 Python调用C库比较简单,不经过任何封装打包成so,直接使用python的ctypes调用即可。 Pytho...

Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协...

【Python从入门到精通】(十)Python流程控制的关键字该怎么用呢?【收藏下来,常看常新】

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。这篇文章主要介绍Python中流程控制的关键字的使用,涉及到if else,for,while等关键字 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。 前言 有句话说程序就是由流程+数据结构组成。任何程序都是如此。前面花了好几个篇幅来介绍Python中的各种数据...