我想从scipy.integrate中重复计算一个使用dblquad的二维复数积分.由于评估次数相当高,我希望提高我的代码的评估速度.

Dblquad似乎无法处理复杂的被积函数.因此,我将复数被积函分为实部和虚部:

def integrand_real(x,y):
    R1=sqrt(x**2 + (y-y0)**2 + z**2)
    R2=sqrt(x**2 + y**2 + zxP**2)
    return real(exp(1j*k*(R1-R2)) * (-1j*z/lam/R2/R1**2) * (1+1j/k/R1))

def integrand_imag(x,y):
    R1=sqrt(x**2 + (y-y0)**2 + z**2)
    R2=sqrt(x**2 + y**2 + zxP**2)
    return imag(exp(1j*k*(R1-R2)) * (-1j*z/lam/R2/R1**2) * (1+1j/k/R1))

y0,z,zxp,k和lam是事先确定的变量.要评估半径为圆的区域的积分,我使用以下命令:

from __future__ import division
from scipy.integrate import dblquad
from pylab import *

def ymax(x):
    return sqrt(ra**2-x**2)

lam = 0.000532
zxp = 5.
z = 4.94
k = 2*pi/lam
ra = 1.0

res_real = dblquad(integrand_real,-ra,ra,lambda x: -ymax(x),lambda x: ymax(x))
res_imag = dblquad(integrand_imag,lambda x: ymax(x))
res = res_real[0]+ 1j*res_imag[0]

根据剖析器,两个被积函数被评估约35000次.总计算大约需要一秒钟,这对我应用程序来说太长了.

我是使用Python和Scipy进行科学计算的初学者,对于提出评估速度的评论意见很高兴.有没有办法重写integrand_real和integrand_complex函数中的命令,这些功能可能会导致速度提升?

使用Cython等工具编译这些函数是否有意义?如果是的:哪个工具最适合这个应用程序?

解决方法

使用Cython可以获得10倍的速度,如下所示:
In [87]: %timeit cythonmodule.doit(lam=lam,y0=y0,zxp=zxp,z=z,k=k,ra=ra)
1 loops,best of 3: 501 ms per loop
In [85]: %timeit doit()
1 loops,best of 3: 4.97 s per loop

这可能还不够,坏消息是这可能是
相当接近(可能是最多2个因素)到C / Fortran速度
—如果使用相同的算法进行自适应集成. (scipy.integrate.quad
本身已经在Fortran了.)

要进一步,你需要考虑不同的方法来做
积分.这需要一些思考 – 不能提供太多的东西
我的头顶上现在.

或者,您可以减少积分的容差
被评估.

# Do in Python
#
# >>> import pyximport; pyximport.install(reload_support=True)
# >>> import cythonmodule

cimport numpy as np
cimport cython

cdef extern from "complex.h":
    double complex csqrt(double complex z) nogil
    double complex cexp(double complex z) nogil
    double creal(double complex z) nogil
    double cimag(double complex z) nogil

from libc.math cimport sqrt

from scipy.integrate import dblquad

cdef class Params:
    cdef public double lam,y0,k,ra

    def __init__(self,lam,ra):
        self.lam = lam
        self.y0 = y0
        self.k = k
        self.zxp = zxp
        self.z = z
        self.ra = ra

@cython.cdivision(True)
def integrand_real(double x,double y,Params p):
    R1 = sqrt(x**2 + (y-p.y0)**2 + p.z**2)
    R2 = sqrt(x**2 + y**2 + p.zxP**2)
    return creal(cexp(1j*p.k*(R1-R2)) * (-1j*p.z/p.lam/R2/R1**2) * (1+1j/p.k/R1))

@cython.cdivision(True)
def integrand_imag(double x,Params p):
    R1 = sqrt(x**2 + (y-p.y0)**2 + p.z**2)
    R2 = sqrt(x**2 + y**2 + p.zxP**2)
    return cimag(cexp(1j*p.k*(R1-R2)) * (-1j*p.z/p.lam/R2/R1**2) * (1+1j/p.k/R1))

def ymax(double x,Params p):
    return sqrt(p.ra**2 + x**2)

def doit(lam,ra):
    p = Params(lam=lam,ra=ra)
    rr,err = dblquad(integrand_real,lambda x: -ymax(x,p),lambda x: ymax(x,args=(p,))
    ri,err = dblquad(integrand_imag,))
    return rr + 1j*ri

python – Scipy:加快2D复数积分的计算的更多相关文章

  1. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  2. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  3. Python使用scipy进行曲线拟合的方法实例

    这篇文章主要给大家介绍了关于Python使用scipy进行曲线拟合的相关资料,Scipy优化和拟合采用的是optimize模块,该模块提供了函数最小值(标量或多维)、曲线拟合和寻找等式的根的有用算法,需要的朋友可以参考下

  4. python数学建模(SciPy+ Numpy+Pandas)

    这篇文章主要介绍了python数学建模(SciPy+ Numpy+Pandas),文章基于python的相关资料紧接上一篇文章内容展开主题详情,需要的小伙伴可以参考一下

  5. Python+Scipy实现自定义任意的概率分布

    Scipy自带了多种常见的分布,如正态分布、均匀分布、二项分布、多项分布、伽马分布等等,还可以自定义任意的概率分布。本文将为大家介绍如何利用Scipy自定义任意的概率分布,感兴趣的可以了解下

  6. 使用scipy.solve_ivp错误解决偏转曲线:'所需步长小于数字之间的间距'

    当我使用大长度的梁(管道)时,我在使用scipy.solve_ivp解决偏转曲线时遇到了失败。当长度为10000mm时,可以给出正确的结果,如下图所示但当我将其更改为20000mm时,它失败并输出以下消息:,我读过关于solve_ivp错误的类似问题:“所需步长小于数字之间的间距。”我也尝试了不同的环礁价值,但无法解决这个问题。我为此奋斗了好几天。

  7. 可以选择()与Windows下的Python文件一起使用吗?

    我试图在Windows下运行以下python服务器:我收到错误消息(10038,’尝试对非套接字的操作’).这可能与python文档中的theremark有关,“Windows上的文件对象是不可接受的,但套接字是.在Windows上,底层的select()函数由WinSock库提供,并且不处理不具有的文件描述符来自WinSock.“在互联网上有很多关于这个主题的帖子,但它们对我来说太技术或者根本不

  8. Windows上的Python多处理RuntimeError

    我有一个类函数(让我们称之为“alpha.py”),它使用多处理(processes=2)来分叉一个进程,并且是我编写的Python包的一部分.在一个单独的Python脚本中(我们称之为“beta.py”),我从这个类中实例化了一个对象并调用了使用多处理的相应函数.最后,所有这些都包含在一个包装Python脚本(让我们称之为“gamma.py”)中,它处理许多不同的类对象和函数.实质上:>从命令行

  9. 在32位Windows 7计算机上安装Python 3.5中的scipy

    我一直在尝试使用预构建的二进制文件在我的Windows7机器上安装Scipy到我的Python3.5(32位)安装:http://www.lfd.uci.edu/~gohlke/pythonlibs我按顺序安装了以下库然后,当尝试使用已安装的软件包时,我得到以下错误但是,如果我按照Python3.4的相同过程替换安装程序:一切似乎都有效.是否有其他依赖项或安装包,我缺少Python3.5安装?请务

  10. 如何在没有pywin32的情况下使用python确定Windows上的文件所有者

    我正在编写一个脚本,需要确定Windows上文件所有者的用户名.虽然我发现了asolutionusingpywin32,但我对使用它犹豫不决,因为我不想添加模块依赖.该脚本将为python2.6编写,并且必须在32位和64位平台上运行.我想知道是否有不同的方法,可能有ctypes,来确定这些信息下面使用ctypes调用GetNamedSecurityInfo.最初它跟随问题中链接的codesnip

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部