Существует ли легко доступная реализация erf () для Python?

49
задан ROMANIA_engineer 23 July 2017 в 03:44
поделиться

4 ответа

Я рекомендую 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)

алгоритм появляется от Руководство Математических функций , формула 7.1.26.

47
ответ дан Neil G 7 November 2019 в 11:17
поделиться

Я рекомендовал бы загрузить numpy (для имения эффективной матрицы в Python) и scipy (замена панели инструментов Matlab, которая использует numpy). erf функция находится в scipy.

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

можно также использовать erf функцию, определяемую в pylab, но это более предназначается при графическом изображении результатов вещей, которые Вы вычисляете с numpy и scipy. Если Вы хотите единую установку их программное обеспечение, можно использовать непосредственно распределение Python Enthought .

26
ответ дан Jens Nyman 7 November 2019 в 11:17
поделиться

Чистая реализация 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) подходы 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, который дает антипроизводную [1 110].

интегралы Френели: func: fresnels и: func: fresnelc также связаны с функцией ошибок.

8
ответ дан badp 7 November 2019 в 11:17
поделиться

Для ответа на мой собственный вопрос я закончил тем, что использовал следующий код, адаптированный от версии 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
6
ответ дан rog 7 November 2019 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: