Exemple #1
0
def _dstable_sym_small(alpha, x, tolr):
    """
    A series expansion for small x due to Bergstrom. 
    Converges for x < 1.0 and in practice also for 
    somewhat larger x. 
    
    The function uses the Kahan summation procedure 
    (cf. Dahlquist, Bjorck & Anderson). 
    """

    summ = 0.0
    c = 0.0
    fact = -1.0
    xx = x * x
    xpart = 1.0
    k = 0
    zero2 = zero1 = False
    while True:
        k += 1
        summo = summ
        twokm1 = 2 * k - 1
        twokm1oa = float(twokm1) / alpha
        r = lngamma(twokm1oa) - lnfactorial(twokm1)
        term = twokm1 * exp(r) * xpart
        fact = -fact
        term *= fact
        y = term + c
        t = summ + y
        if fsign(y) == fsign(summ):
            f = (0.46 * t - t) + t
            c = ((summ - f) - (t - f)) + y
        else:
            c = (summ - t) + y
        summ = t
        if abs(summ - summo) < tolr * abs(summ) and abs(term) < tolr and zero2:
            break
        xpart *= xx
        if abs(term) < tolr:
            if zero1: zero2 = True
            else: zero1 = True
    summ += c
    pdf = summ / (PI * alpha)

    pdf = kept_within(0.0, pdf)
    return pdf
Exemple #2
0
def _dstable_sym_small(alpha, x, tolr):
    """
    A series expansion for small x due to Bergstrom. 
    Converges for x < 1.0 and in practice also for 
    somewhat larger x. 
    
    The function uses the Kahan summation procedure 
    (cf. Dahlquist, Bjorck & Anderson). 
    """

    summ   =  0.0
    c      =  0.0
    fact   = -1.0
    xx     =  x*x
    xpart  =  1.0
    k      =   0
    zero2  =  zero1  =  False
    while True:
        k       +=  1
        summo    =  summ
        twokm1   =  2*k - 1
        twokm1oa =  float(twokm1)/alpha
        r        =  lngamma(twokm1oa) - lnfactorial(twokm1)
        term     =  twokm1 * exp(r) * xpart
        fact     = - fact
        term    *=  fact
        y        =  term + c
        t        =  summ + y
        if fsign(y) == fsign(summ):
            f = (0.46*t-t) + t
            c = ((summ-f)-(t-f)) + y
        else:
            c = (summ-t) + y
        summ     =  t
        if abs(summ-summo) < tolr*abs(summ) and abs(term) < tolr and zero2:
            break
        xpart *=  xx
        if abs(term) < tolr:
            if zero1: zero2 = True
            else:     zero1 = True
    summ +=  c
    pdf   =  summ / (PI*alpha)

    pdf   =  kept_within(0.0, pdf)
    return pdf
Exemple #3
0
def _dstable_sym_big(alpha, x, tolr):
    """
    A series expansion for large x due to Bergstrom. 
    Converges for x > 1.0
    
    The function uses the Kahan summation procedure 
    (cf. Dahlquist, Bjorck & Anderson). 
    """

    summ = 0.0
    c = 0.0
    fact = 1.0
    k = 0
    zero2 = zero1 = False
    while True:
        k += 1
        summo = summ
        ak = alpha * k
        akh = 0.5 * ak
        r = lngamma(ak) - lnfactorial(k)
        term = -ak * exp(r) * sin(PIHALF * ak) / pow(x, ak + 1)
        fact = -fact
        term *= fact
        y = term + c
        t = summ + y
        if fsign(y) == fsign(summ):
            f = (0.46 * t - t) + t
            c = ((summ - f) - (t - f)) + y
        else:
            c = (summ - t) + y
        summ = t
        if abs(summ - summo) < tolr * abs(summ) and abs(term) < tolr and zero2:
            break
        if abs(term) < tolr:
            if zero1: zero2 = True
            else: zero1 = True
    summ += c
    #pdf   =  summ / PI
    pdf = PIINV * summ

    pdf = kept_within(0.0, pdf)
    return pdf
Exemple #4
0
def _dstable_sym_big(alpha, x, tolr):
    """
    A series expansion for large x due to Bergstrom. 
    Converges for x > 1.0
    
    The function uses the Kahan summation procedure 
    (cf. Dahlquist, Bjorck & Anderson). 
    """

    summ  = 0.0
    c     = 0.0
    fact  = 1.0
    k     =  0
    zero2 = zero1 = False
    while True:
        k     +=  1
        summo  =  summ
        ak     =  alpha * k
        akh    =  0.5 * ak
        r      =  lngamma(ak) - lnfactorial(k)
        term   = - ak * exp(r) * sin(PIHALF*ak) / pow(x, ak+1)
        fact   = - fact
        term  *=  fact
        y      =  term + c
        t      =  summ + y
        if fsign(y) == fsign(summ):
            f = (0.46*t-t) + t
            c = ((summ-f)-(t-f)) + y
        else:
            c = (summ-t) + y
        summ   =  t
        if abs(summ-summo) < tolr*abs(summ) and abs(term) < tolr and zero2:
            break
        if abs(term) < tolr:
            if zero1: zero2 = True
            else:     zero1 = True
    summ +=  c
    #pdf   =  summ / PI
    pdf   =  PIINV * summ

    pdf   =  kept_within(0.0, pdf)
    return pdf