我可以實現錯誤函數,erf,我自己,但我不想。是否有一個沒有外部依賴的Python包,包含這個函數的實現?我發現this,但這似乎是一些更大的包的一部分(甚至不清楚哪一個!)。是否有一個Python的erf()的簡單實現?
回答
自v.2.7以來。標準數學模塊包含erf函數。這應該是最簡單的方法。
我建議你下載numpy(在python中有效矩陣)和scipy(Matlab工具箱替代品,它使用numpy)。 erf的功能在於scipy。
>>>from scipy.special import erf
>>>help(erf)
您還可以使用在pylab定義的ERF的功能,但是這是更打算在密謀你numpy的和SciPy的計算事物的結果。如果您想要安裝這些軟件的一體機 ,則可以直接使用Python Enthought distribution。
我推薦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。
要回答我的問題,我已經結束了使用下面的代碼,改編自一個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
純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
也與錯誤函數有關。
我有一個10^5 erf調用的函數。在我的機器上...
scipy.special.erf使它在6時間。1S
數學函數的ERF手冊需要8.3s
ERF數字食譜6.2需要9.5s
(三運行平均值,代碼從上方海報截取)。
一注爲那些瞄準了更高的性能:矢量化,如果可能的話。
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
- 1. 實現一個簡單的IFindSaga
- 2. 實現一個簡單的shell
- 3. 實現一個簡單的線程池
- 4. 實現一個簡單的COM對象
- 5. 實現一個簡單的日曆
- 6. 實現OAuth2.0的一個簡單例子
- 7. socket.io實現一個簡單的聊天
- 8. 是否有更簡單的方法來實現openid?
- 9. Python簡單實現doc2vec?
- 10. python中是否有libjpeg的實現?
- 11. 是否有MurmurHash的純Python實現?
- 12. Django 1.8&Django Crispy Forms:是否有一個簡單,簡單的方法來實現Date Picker?
- 13. 在C中實現一個簡單的python函數很簡單嗎?
- 14. 實現一個簡單的數學函數 - Python
- 15. Dictionary.Equals()是否有一個實現?
- 16. PHP是否有一個stringprep實現?
- 17. 是否有一個dojo實現jSignature
- 18. 是否有一個有效的\簡單的方法在Direct3D
- 19. 是否有一個庫在python中實現RangeDict?
- 20. 是否有一個窗口實現python libsvn?
- 21. 如何簡單地實現一個KeyListener?
- 22. 是否有一個簡單的postMessage使用沙箱頁面的簡單示例?
- 23. 是否有SqlGeometryBuilder的實現?
- 24. 是否有一個簡單的基於進程的python平行映射?
- 25. 是否有與Python和Django一起使用的HAML實現
- 26. 什麼是async.series的簡單實現?
- 27. 什麼是簡單的ParentAdapter實現?
- 28. 什麼是IDynamicMetaObjectProvider最簡單的實現?
- 29. 是否有一個Queue(PriorityQueue)實現也是一個Set?
- 30. 有一個簡單的實現在一個通用的F#查詢
SciPy的是Python的數值計算軟件的motherload。但是開始使用它可能有點困難。首先看http://www.scipy.org/ – 2009-01-19 13:06:45
我不得不說,我完全沒有安裝它。有一個原因,我要求一個沒有外部依賴的軟件包。 Numpy不是唯一的一個。 UMFPack是另一個。編寫我自己的erf()會更容易! – rog 2009-01-19 13:35:08
正如我提到的那樣嘗試Python Enthought,他們已經捆綁了你需要的一切。 – Mapad 2009-01-19 13:51:47