2009-01-19 72 views

回答

24

我建議你下載numpy(在python中有效矩陣)和scipy(Matlab工具箱替代品,它使用numpy)。 erf的功能在於scipy。

>>>from scipy.special import erf 
>>>help(erf) 

您還可以使用在pylab定義的ERF的功能,但是這是更打算在密謀你numpy的和SciPy的計算事物的結果。如果您想要安裝這些軟件的一體機 ,則可以直接使用Python Enthought distribution

+0

SciPy的是Python的數值計算軟件的motherload。但是開始使用它可能有點困難。首先看http://www.scipy.org/ – 2009-01-19 13:06:45

+1

我不得不說,我完全沒有安裝它。有一個原因,我要求一個沒有外部依賴的軟件包。 Numpy不是唯一的一個。 UMFPack是另一個。編寫我自己的erf()會更容易! – rog 2009-01-19 13:35:08

+1

正如我提到的那樣嘗試Python Enthought,他們已經捆綁了你需要的一切。 – Mapad 2009-01-19 13:51:47

41

我推薦SciPy用於Python中的數值函數,但是如果你想要一些沒有依賴關係的東西,這裏有一個錯誤錯誤函數小於所有輸入的1.5 * 10 -7

def erf(x): 
    # save the sign of x 
    sign = 1 if x >= 0 else -1 
    x = abs(x) 

    # constants 
    a1 = 0.254829592 
    a2 = -0.284496736 
    a3 = 1.421413741 
    a4 = -1.453152027 
    a5 = 1.061405429 
    p = 0.3275911 

    # A&S formula 7.1.26 
    t = 1.0/(1.0 + p*x) 
    y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*math.exp(-x*x) 
    return sign*y # erf(-x) = -erf(x) 

該算法來自Handbook of Mathematical Functions,公式7.1.26。

6

要回答我的問題,我已經結束了使用下面的代碼,改編自一個Java版本,我發現在網絡上的其他地方:

# from: http://www.cs.princeton.edu/introcs/21function/ErrorFunction.java.html 
# Implements the Gauss error function. 
# erf(z) = 2/sqrt(pi) * integral(exp(-t*t), t = 0..z) 
# 
# fractional error in math formula less than 1.2 * 10^-7. 
# although subject to catastrophic cancellation when z in very close to 0 
# from Chebyshev fitting formula for erf(z) from Numerical Recipes, 6.2 
def erf(z): 
    t = 1.0/(1.0 + 0.5 * abs(z)) 
     # use Horner's method 
     ans = 1 - t * math.exp(-z*z - 1.26551223 + 
          t * (1.00002368 + 
          t * (0.37409196 + 
          t * (0.09678418 + 
          t * (-0.18628806 + 
          t * (0.27886807 + 
          t * (-1.13520398 + 
          t * (1.48851587 + 
          t * (-0.82215223 + 
          t * (0.17087277)))))))))) 
     if z >= 0.0: 
      return ans 
     else: 
      return -ans 
7

純Python實現可以在mpmath模塊中找到( http://code.google.com/p/mpmath/

從文檔字符串:

>>> from mpmath import * 
>>> mp.dps = 15 
>>> print erf(0) 
0.0 
>>> print erf(1) 
0.842700792949715 
>>> print erf(-1) 
-0.842700792949715 
>>> print erf(inf) 
1.0 
>>> print erf(-inf) 
-1.0 

對於大型房地產x\mathrm{erf}(x) approache第1條非常迅速 ::

>>> print erf(3) 
0.999977909503001 
>>> print erf(5) 
0.999999999998463 

誤差函數爲奇函數::

>>> nprint(chop(taylor(erf, 0, 5))) 
[0.0, 1.12838, 0.0, -0.376126, 0.0, 0.112838] 

:FUNC:erf實現任意精度評價和 支持複數::

>>> mp.dps = 50 
>>> print erf(0.5) 
0.52049987781304653768274665389196452873645157575796 
>>> mp.dps = 25 
>>> print erf(1+j) 
(1.316151281697947644880271 + 0.1904534692378346862841089j) 

相關功能

參見:FUNC:erfc,這是大x, ,更準確:FUNC:erfi賦予的 \exp(t^2)的反導。

菲涅耳積分:func:fresnels和:func:fresnelc 也與錯誤函數有關。

7

我有一個10^5 erf調用的函數。在我的機器上...

scipy.special.erf使它在6時間。1S

數學函數的ERF手冊需要8.3s

ERF數字食譜6.2需要9.5s

(三運行平均值,代碼從上方海報截取)。

4

一注爲那些瞄準了更高的性能:矢量化,如果可能的話。

import numpy as np 
from scipy.special import erf 

def vectorized(n): 
    x = np.random.randn(n) 
    return erf(x) 

def loopstyle(n): 
    x = np.random.randn(n) 
    return [erf(v) for v in x] 

%timeit vectorized(10e5) 
%timeit loopstyle(10e5) 

給出的結果

# vectorized 
10 loops, best of 3: 108 ms per loop 

# loops 
1 loops, best of 3: 2.34 s per loop 
相關問題