Exemplo n.º 1
0
def test_derivative():

    from math import sin, cos, pi
    from ostap.math.derivative import derivative, iszero
    import random
    from ostap.stats.counters import SE
    from ostap.utils.timing import timing

    cnt = {}
    cntE = {}
    for I in range(1, 9):
        cnt[I] = SE()

    func = lambda x: sin(10 * x) + x
    deri = lambda x: 10 * cos(10 * x) + 1

    func = lambda x: sin(x) / x
    deri = lambda x: (cos(x) - sin(x) / x) / x

    ## func = lambda x :   x**9
    ## deri = lambda x : 9*x**8

    ## from math import sinh, cosh
    ## func = lambda x :    sinh(2*x)
    ## deri = lambda x :  2*cosh(2*x)

    ## from math import tanh,cosh
    ## func = lambda x :      tanh(3*x)
    ## deri = lambda x :  3./(cosh(3*x)**2)

    with timing():

        for i in range(50000):

            x = random.uniform(0, pi)

            d_true = deri(x)

            for I in range(1, 9):
                delta = derivative(func, x, I=I, err=True) - d_true
                ## delta = derivative ( sin , x , I = I ) - d_true
                ## cnt [I] += delta*1.e+10
                ## cnt [I] += abs(delta/d_true)*1.e+10
                if not iszero(delta.cov2()):
                    cnt[I] += abs(delta.value()) / delta.error()

    for I in range(1, 9):
        print I, cnt[I]
def test_derivative_2():

    logger = getLogger('test_derivative_2')

    cnt = {}
    cntE = {}
    for I in range(1, 9):
        cnt[I] = SE()

    func = lambda x: sin(10 * x) + x
    deri = lambda x: 10 * cos(10 * x) + 1

    with timing():

        for i in range(10000):

            x = random.uniform(0, pi)

            d_true = deri(x)

            for I in range(1, 9):
                delta = derivative(func, x, I=I) - d_true
                cnt[I] += delta

    rows = [('Order', '#', 'min', 'max')]
    for i in cnt:
        c = cnt[I]
        row = '%d' % i, '%d' % c.nEntries(), '%+.5g' % c.min(
        ), '%+.5g' % c.max()
        rows.append(row)

    table = T.table(rows,
                    title='Test numerical derivatives',
                    prefix='# ',
                    alignment='crll')

    logger.info('Test numerical derivatives\n%s' % table)