一个免费的开源python包,用于快速精确地逼近费米-狄拉克积分。
fdint的Python项目详细描述
费米-狄拉克积分(fdint)
fdint是一个免费的开源python包,它提供了快速的 费米-狄拉克近似(64位浮点)逼近 整数阶和半整数阶的积分,基于 福岛教授[1-3]。fdint主要用Cython编写,其中 通过中间C源编译为本机代码,从而 在C类表演中。
[1] | T. Fukushima, “Precise and fast computation of Fermi-Dirac integral of integer and half integer order by piecewise minimax rational approximation,” Applied Mathematics and Computation, vol. 259, pp. 708-729, May 2015. DOI: 10.1016/j.amc.2015.03.009 |
[2] | T. Fukushima, “Precise and fast computation of inverse Fermi-Dirac integral of order 1/2 by minimax rational function approximation,” Applied Mathematics and Computation, vol. 259, pp. 698-707, May 2015. DOI: 10.1016/j.amc.2015.03.015 |
[3] | T. Fukushima, “Precise and fast computation of generalized Fermi-Dirac integral by parameter polynomial approximation,” 2014. DOI: 10.13140/2.1.1094.6566 |
source code和documentation(即将到来)受到隆重的接待 由Github提供。
安装
为了使用fdint,必须有一个工作的Python分布 安装。Python3的支持还没有测试,所以Python2.7是 建议。在继续之前,您还需要安装Numpy。如果 您不熟悉python,可以考虑安装 Python distribution那是用numpy预先包装的。
来自Pypi
这是安装fdint的推荐方法。PyPi是Python 包索引,其中包含许多可以轻松安装的python包 只有一个命令。要从PyPi安装fdint,请打开一个命令 提示并运行以下命令:
pip install fdint
来自github
要从github安装最新版本的fdint,请转到 FDINT releases page,下载最新的.zip或.tar.gz 源包,提取其内容,然后运行python setup.py install 从提取的目录中。
测试
安装后,您可以运行以下命令来测试软件包:
python -m fdint.tests
如果安装了Matplotlib,还可以绘制 通过运行以下命令可使用的功能:
python -m fdint.examples.plot
教程
首先,从命令行启动一个交互式python shell:
$ python
接下来,从fdint包导入所有内容:
>>> from fdint import *
现在你可以方便地使用费米-狄拉克积分和导数了 函数,fdk和dfdk:
>>> fdk(k=0.5,phi=-10) 4.0233994366893939e-05 >>> fdk(0.5,-10) 4.0233994366893939e-05 >>> fdk(k=0.5,phi=5) 7.837976057293096 >>> fdk(k=0.5,phi=50) 235.81861512588432 >>> dfdk(k=0.5,phi=-10) # first derivative 4.0233348580568672e-05
也可以将numpy数组作为phi:
>>> import numpy >>> fdk(k=0.5,phi=numpy.linspace(-100,10,3)) array([ 3.29683149e-44, 2.53684104e-20, 2.13444715e+01])
如果您请求未实现的订单或衍生产品,则 引发了notimplementederror:
>>> fdk(1,0) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "fdint/__init__.py", line 50, in fdk raise NotImplementedError() NotImplementedError
对于半导体计算,parabolic,dparabolic,iparabolic, nonparabolic和dnonparabolic提供:
>>> parabolic(0) 0.7651470246254078 >>> dparabolic(0) 0.6048986434216304 >>> iparabolic(.7) -0.11156326391089397 >>> nonparabolic(0,0) 0.7651470705342294 >>> nonparabolic(0,0.07) # InAs 1.006986898726782 >>> dnonparabolic(0,0.07) # InAs 0.8190058991462952
基准
下面是一些基准测试运行。首先,numpy.exp:
$ python -m timeit -s "import numpy; from numpy import exp; x=numpy.linspace(-100,10,10000)" "exp(x)" 10000 loops, best of 3: 72.6 usec per loop
k=1/2,fdint.fd1h阶费米-狄拉克积分的相同参数, 只需要大约2.2倍的运行时间:
$ python -m timeit -s "from fdint import fd1h; import numpy; x=numpy.linspace(-100,10,10000)" "fd1h(x)" 10000 loops, best of 3: 158 usec per loop
类似地,k=1/2,fdint.ifd1h阶的逆费米-狄拉克积分, 只占用numpy.log:
的大约2.4倍运行时间$ python -m timeit -s "import numpy; from numpy import exp,log; x=numpy.linspace(-100,10,10000);y=exp(x)" "log(y)" 10000 loops, best of 3: 69.9 usec per loop $ python -m timeit -s "from fdint import fd1h,ifd1h; import numpy; x=numpy.linspace(-100,10,10000);y=fd1h(x)" "ifd1h(y)" 10000 loops, best of 3: 178 usec per loop
广义费米-狄拉克积分也相当快。为了秩序 k=1/2,非分解性为零,fdint.gfd1h只需要大约3.7倍的运行时间 零非分解性:
$ python -m timeit -s "from fdint import gfd1h; import numpy; x=numpy.linspace(-100,10,10000);b=numpy.zeros(10000);b.fill(0.)" "gfd1h(x,b)" 1000 loops, best of 3: 266 usec per loop
但是,如果存在显著的非分解性,fdint.gfd1h可以 最长约10倍于numpy.exp:
$ python -m timeit -s "from fdint import gfd1h; import numpy; x=numpy.linspace(-100,10,10000);b=numpy.zeros(10000);b.fill(0.1)" "gfd1h(x,b)" 1000 loops, best of 3: 467 usec per loop $ python -m timeit -s "from fdint import gfd1h; import numpy; x=numpy.linspace(-100,10,10000);b=numpy.zeros(10000);b.fill(0.3)" "gfd1h(x,b)" /usr/local/Cellar/python/2.7.8_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/timeit.py:6: RuntimeWarning: gfd1h: less than 24 bits of accuracy 1000 loops, best of 3: 696 usec per loop
非分解带的完整计算需要大约5-17倍于 numpy.exp,取决于非分解性的级别(注意:对于 由于某些原因,此命令的计时过高 从命令行。当在ipython内部计时时,它工作正常:
$ ipython In [1]: from fdint import * In [2]: import numpy In [3]: phi = numpy.linspace(-100,10,10000) In [4]: %timeit numpy.exp(phi) 10000 loops, best of 3: 72.9 µs per loop In [5]: %timeit parabolic(phi) 10000 loops, best of 3: 165 µs per loop In [6]: alpha = numpy.empty(10000); alpha.fill(0.0) # parabolic In [7]: %timeit nonparabolic(phi, alpha) 1000 loops, best of 3: 346 µs per loop In [8]: alpha = numpy.empty(10000); alpha.fill(0.07) # InAs In [9]: %timeit nonparabolic(phi, alpha) 1000 loops, best of 3: 695 µs per loop In [10]: alpha = numpy.empty(10000); alpha.fill(0.15) # InSb In [11]: %timeit nonparabolic(phi, alpha) /usr/local/bin/ipython:257: RuntimeWarning: nonparabolic: less than 24 bits of accuracy 1000 loops, best of 3: 1.26 ms per loop
文档
documentation(即将推出)由github优雅地主持。