B
    }]{                 @   s  d dl mZmZmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZ d dlmZ d dlmZ ddd	d
ddddgZdd ZeeZejrejdde_G dd deZdd Ze e_dddZdddZdd!dZd"d# Zdd&dZd'd( Zdd*dZ dd+dZ!d,d- Z"d.d/ Z#d0d1 Z$dd4d	Z%d d5d d gd%d6fd d7d d8d gd%d9fd7d:d d7d7d gd;d<fd5d=d>d?d6d?d>gd@dAfddBdCdDdddDdCgdEdFfd dGdHdIdJdKdJdIdHgdLdMfd>dNdOdPdQdRdRdQdPdOgdSdTfd8dUdVdWdXdYdZdYdXdWdVg	d[d\fd]d^d_d`dadbdcdcdbdad`d_g
dddefddfdgdhdidjdkdldkdjdidhdggdmdnfdodpdqdrdsdtdudvdvdudtdsdrdqgdwdxfd dydzd{d|d}d~dddd~d}d|d{dzgddfddddddddddddddddgddfd>ddddddddddddddddgddfdZ&dddZ'dS )    )divisionprint_functionabsolute_importN)trapz)roots_legendre)gammaln)xrange
fixed_quad
quadraturerombergr   simpsrombcumtrapznewton_cotesc             C   s6   t j| j| j| j| j| jd}t|| }| j	|_	|S )zBBased on http://stackoverflow.com/a/6528148/190597 (Glenn Maynard))nameZargdefsZclosure)
typesFunctionType__code____globals____name____defaults____closure__	functoolsupdate_wrapper__kwdefaults__)fg r   f/home/fristb/BIRCH/lib-linux-x86_64/python/lib64/python3.7/site-packages/scipy/integrate/quadrature.py
_copy_func   s
    r   zsum, cumsumznumpy.cumsumc               @   s   e Zd ZdS )AccuracyWarningN)r   
__module____qualname__r   r   r   r   r    $   s   r    c             C   s,   | t jkrt j|  S t| t j| < t j|  S )zX
    Cache roots_legendre results to speed up calls of the fixed_quad
    function.
    )_cached_roots_legendrecacher   )nr   r   r   r#   (   s    

r#   r      c             C   sv   t |\}}t|}t|s*t|r2td|| |d  d | }|| d tj|| |f|  dd dfS )a  
    Compute a definite integral using fixed-order Gaussian quadrature.

    Integrate `func` from `a` to `b` using Gaussian quadrature of
    order `n`.

    Parameters
    ----------
    func : callable
        A Python function or method to integrate (must accept vector inputs).
        If integrating a vector-valued function, the returned array must have
        shape ``(..., len(x))``.
    a : float
        Lower limit of integration.
    b : float
        Upper limit of integration.
    args : tuple, optional
        Extra arguments to pass to function, if any.
    n : int, optional
        Order of quadrature integration. Default is 5.

    Returns
    -------
    val : float
        Gaussian quadrature approximation to the integral
    none : None
        Statically returned value of None


    See Also
    --------
    quad : adaptive quadrature using QUADPACK
    dblquad : double integrals
    tplquad : triple integrals
    romberg : adaptive Romberg quadrature
    quadrature : adaptive Gaussian quadrature
    romb : integrators for sampled data
    simps : integrators for sampled data
    cumtrapz : cumulative integration for sampled data
    ode : ODE integrator
    odeint : ODE integrator

    Examples
    --------
    >>> from scipy import integrate
    >>> f = lambda x: x**8
    >>> integrate.fixed_quad(f, 0.0, 1.0, n=4)
    (0.1110884353741496, None)
    >>> integrate.fixed_quad(f, 0.0, 1.0, n=5)
    (0.11111111111111102, None)
    >>> print(1/9.0)  # analytical result
    0.1111111111111111

    >>> integrate.fixed_quad(np.cos, 0.0, np.pi/2, n=4)
    (0.9999999771971152, None)
    >>> integrate.fixed_quad(np.cos, 0.0, np.pi/2, n=5)
    (1.000000000039565, None)
    >>> np.sin(np.pi/2)-np.sin(0)  # analytical result
    1.0

    z8Gaussian quadrature is only available for finite limits.   g       @)axisN)r#   nprealisinf
ValueErrorsum)funcabargsr%   xwyr   r   r   r	   7   s    >
Fc                s&   |r fdd}n fdd}|S )ao  Vectorize the call to a function.

    This is an internal utility function used by `romberg` and
    `quadrature` to create a vectorized version of a function.

    If `vec_func` is True, the function `func` is assumed to take vector
    arguments.

    Parameters
    ----------
    func : callable
        User defined function.
    args : tuple, optional
        Extra arguments for the function.
    vec_func : bool, optional
        True if the function func takes vector arguments.

    Returns
    -------
    vfunc : callable
        A function that will take a vector argument and return the
        result.

    c                s   | f  S )Nr   )r3   )r2   r/   r   r   vfunc   s    zvectorize1.<locals>.vfuncc                s   t | r| f  S t | } | d f  }t| }t|dt|}t j|f|d}||d< x(td|D ]}| | f  ||< qpW |S )Nr   dtype)r7   r'   )r*   isscalarasarraylengetattrtypeemptyr   )r3   Zy0r%   r7   outputi)r2   r/   r   r   r6      s    

r   )r/   r2   vec_funcr6   r   )r2   r/   r   
vectorize1~   s    rA   "\O>2   Tr'   c	             C   s   t |ts|f}t| ||d}	tj}
tj}t|d |}xht||d D ]B}t|	||d|d }t||
 }|}
||k s||t|
 k rHP qHW t	
d||f t |
|fS )aw  
    Compute a definite integral using fixed-tolerance Gaussian quadrature.

    Integrate `func` from `a` to `b` using Gaussian quadrature
    with absolute tolerance `tol`.

    Parameters
    ----------
    func : function
        A Python function or method to integrate.
    a : float
        Lower limit of integration.
    b : float
        Upper limit of integration.
    args : tuple, optional
        Extra arguments to pass to function.
    tol, rtol : float, optional
        Iteration stops when error between last two iterates is less than
        `tol` OR the relative change is less than `rtol`.
    maxiter : int, optional
        Maximum order of Gaussian quadrature.
    vec_func : bool, optional
        True or False if func handles arrays as arguments (is
        a "vector" function). Default is True.
    miniter : int, optional
        Minimum order of Gaussian quadrature.

    Returns
    -------
    val : float
        Gaussian quadrature approximation (within tolerance) to integral.
    err : float
        Difference between last two estimates of the integral.

    See also
    --------
    romberg: adaptive Romberg quadrature
    fixed_quad: fixed-order Gaussian quadrature
    quad: adaptive quadrature using QUADPACK
    dblquad: double integrals
    tplquad: triple integrals
    romb: integrator for sampled data
    simps: integrator for sampled data
    cumtrapz: cumulative integration for sampled data
    ode: ODE integrator
    odeint: ODE integrator

    Examples
    --------
    >>> from scipy import integrate
    >>> f = lambda x: x**8
    >>> integrate.quadrature(f, 0.0, 1.0)
    (0.11111111111111106, 4.163336342344337e-17)
    >>> print(1/9.0)  # analytical result
    0.1111111111111111

    >>> integrate.quadrature(np.cos, 0.0, np.pi/2)
    (0.9999999999999536, 3.9611425250996035e-11)
    >>> np.sin(np.pi/2)-np.sin(0)  # analytical result
    1.0

    )r@   r'   r   r   z-maxiter (%d) exceeded. Latest difference = %e)
isinstancetuplerA   r*   infmaxr   r	   abswarningswarnr    )r/   r0   r1   r2   tolrtolmaxiterr@   Zminiterr6   valerrr%   Znewvalr   r   r   r
      s     @

c             C   s   t | }|||< t|S )N)listrE   )tr?   valuelr   r   r   tupleset   s    rT         ?r(   c             C   sZ  t | } |dkr|}nt |}|jdkrVt |}dg| j }d||< ||}n,t|jt| jkrttdnt j||d}|j| | j| d krtdt| j}tt	df| |t	dd}tt	df| |t	dd}	t j
|| | | |	   d |d}
|dk	rVt |s$tdt|
j}d||< t jt j|||
jd	|
g|d}
|
S )
a  
    Cumulatively integrate y(x) using the composite trapezoidal rule.

    Parameters
    ----------
    y : array_like
        Values to integrate.
    x : array_like, optional
        The coordinate to integrate along.  If None (default), use spacing `dx`
        between consecutive elements in `y`.
    dx : float, optional
        Spacing between elements of `y`.  Only used if `x` is None.
    axis : int, optional
        Specifies the axis to cumulate.  Default is -1 (last axis).
    initial : scalar, optional
        If given, insert this value at the beginning of the returned result.
        Typically this value should be 0.  Default is None, which means no
        value at ``x[0]`` is returned and `res` has one element less than `y`
        along the axis of integration.

    Returns
    -------
    res : ndarray
        The result of cumulative integration of `y` along `axis`.
        If `initial` is None, the shape is such that the axis of integration
        has one less value than `y`.  If `initial` is given, the shape is equal
        to that of `y`.

    See Also
    --------
    numpy.cumsum, numpy.cumprod
    quad: adaptive quadrature using QUADPACK
    romberg: adaptive Romberg quadrature
    quadrature: adaptive Gaussian quadrature
    fixed_quad: fixed-order Gaussian quadrature
    dblquad: double integrals
    tplquad: triple integrals
    romb: integrators for sampled data
    ode: ODE integrators
    odeint: ODE integrators

    Examples
    --------
    >>> from scipy import integrate
    >>> import matplotlib.pyplot as plt

    >>> x = np.linspace(-2, 2, num=20)
    >>> y = x
    >>> y_int = integrate.cumtrapz(y, x, initial=0)
    >>> plt.plot(x, y_int, 'ro', x, y[0] + 0.5 * x**2, 'b-')
    >>> plt.show()

    Nr'   r(   z2If given, shape of x must be 1-d or the same as y.)r)   z7If given, length of x along axis must be the same as y.g       @z'`initial` parameter should be a scalar.)r7   )r*   r9   ndimdiffreshaper:   shaper-   rT   slicecumsumr8   rP   concatenatefullr7   )r5   r3   dxr)   initialdrY   ndslice1slice2resr   r   r   r     s4    6





"

c             C   sd  t | j}|d krd}d}td f| }t||t|||}	t||t|d |d |}
t||t|d |d |}|d krtj|d | |	 d| |
   | |   |d}ntj||d}t||t|||}t||t|d |d |}|| }|| }|| }|| }|| }|d | |	 dd|   | |
 | | |  | | d|    }tj||d}|S )	Nr      r'   g      @   )r)   g      @g      ?)r:   rY   rZ   rT   r*   r.   rW   )r5   startstopr3   r^   r)   ra   step	slice_allslice0rb   rc   resulthZsl0Zsl1Zh0Zh1ZhsumZhprodZh0divh1tmpr   r   r   _basic_simpsa  s0    
&
&ro   avgc             C   s&  t | } t| j}| j| }|}|}d}	|dk	rt |}t|jdkr|dg| }
|jd |
|< |j}d}	|t|
}nt|jt| jkrtd|j| |krtd|d dkrd}d}tdf| }tdf| }|dkrtd	|d
kr^t||d}t||d}|dk	r,|| ||  }|d| | | | |   7 }t	| d|d |||}|dkrt||d}t||d}|dk	r|t| |t|  }|d| | | | |   7 }|t	| d|d |||7 }|dkr|d }|d }|| }nt	| d|d |||}|	r"||}|S )a		  
    Integrate y(x) using samples along the given axis and the composite
    Simpson's rule.  If x is None, spacing of dx is assumed.

    If there are an even number of samples, N, then there are an odd
    number of intervals (N-1), but Simpson's rule requires an even number
    of intervals.  The parameter 'even' controls how this is handled.

    Parameters
    ----------
    y : array_like
        Array to be integrated.
    x : array_like, optional
        If given, the points at which `y` is sampled.
    dx : int, optional
        Spacing of integration points along axis of `y`. Only used when
        `x` is None. Default is 1.
    axis : int, optional
        Axis along which to integrate. Default is the last axis.
    even : str {'avg', 'first', 'last'}, optional
        'avg' : Average two results:1) use the first N-2 intervals with
                  a trapezoidal rule on the last interval and 2) use the last
                  N-2 intervals with a trapezoidal rule on the first interval.

        'first' : Use Simpson's rule for the first N-2 intervals with
                a trapezoidal rule on the last interval.

        'last' : Use Simpson's rule for the last N-2 intervals with a
               trapezoidal rule on the first interval.

    See Also
    --------
    quad: adaptive quadrature using QUADPACK
    romberg: adaptive Romberg quadrature
    quadrature: adaptive Gaussian quadrature
    fixed_quad: fixed-order Gaussian quadrature
    dblquad: double integrals
    tplquad: triple integrals
    romb: integrators for sampled data
    cumtrapz: cumulative integration for sampled data
    ode: ODE integrators
    odeint: ODE integrators

    Notes
    -----
    For an odd number of samples that are equally spaced the result is
    exact if the function is a polynomial of order 3 or less.  If
    the samples are not equally spaced, then the result is exact only
    if the function is a polynomial of order 2 or less.

    Examples
    --------
    >>> from scipy import integrate
    >>> x = np.arange(0, 10)
    >>> y = np.arange(0, 10)

    >>> integrate.simps(y, x)
    40.5

    >>> y = np.power(x, 3)
    >>> integrate.simps(y, x)
    1642.5
    >>> integrate.quad(lambda x: x**3, 0, 9)[0]
    1640.25

    >>> integrate.simps(y, x, even='first')
    1644.5

    r   Nr'   z2If given, shape of x must be 1-d or the same as y.z7If given, length of x along axis must be the same as y.re   g        )rp   lastfirstz3Parameter 'even' must be 'avg', 'last', or 'first'.)rp   rr   r(   g      ?   )rp   rq   rp   g       @)
r*   r9   r:   rY   rX   rE   r-   rZ   rT   ro   )r5   r3   r^   r)   evenra   NZlast_dxZfirst_dxZreturnshapeZshapexZ	saveshaperN   rl   rb   rc   r   r   r   r     s^    F











c          	   C   s  t | } t| j}| j| }|d }d}d}x||k rJ|dK }|d7 }q0W ||kr\tdi }	tdf| }
t|
|d}t|
|d}|t j|td }| | | |  d | |	d< |
}| } }}xtd|d D ]}|dL }t||t|||}|dL }d	|	|d df || | j	|d
   |	|df< x\td|d D ]J}|	||d f }|||	|d |d f  dd| > d   |	||f< q<W |d }qW |rt 
|	d std ny|d }W n ttfk
r   d}Y nX y|d }W n ttfk
r   d}Y nX d||f }d}td|ddddd xLt|d D ]<}x.t|d D ]}t||	||f  dd qVW t  qDW td t  |	||f S )a  
    Romberg integration using samples of a function.

    Parameters
    ----------
    y : array_like
        A vector of ``2**k + 1`` equally-spaced samples of a function.
    dx : float, optional
        The sample spacing. Default is 1.
    axis : int, optional
        The axis along which to integrate. Default is -1 (last axis).
    show : bool, optional
        When `y` is a single 1-D array, then if this argument is True
        print the table showing Richardson extrapolation from the
        samples. Default is False.

    Returns
    -------
    romb : ndarray
        The integrated result for `axis`.

    See also
    --------
    quad : adaptive quadrature using QUADPACK
    romberg : adaptive Romberg quadrature
    quadrature : adaptive Gaussian quadrature
    fixed_quad : fixed-order Gaussian quadrature
    dblquad : double integrals
    tplquad : triple integrals
    simps : integrators for sampled data
    cumtrapz : cumulative integration for sampled data
    ode : ODE integrators
    odeint : ODE integrators

    Examples
    --------
    >>> from scipy import integrate
    >>> x = np.arange(10, 14.25, 0.25)
    >>> y = np.arange(3, 12)

    >>> integrate.romb(y)
    56.0

    >>> y = np.sin(np.power(x, 2.5))
    >>> integrate.romb(y)
    -0.742561336672229

    >>> integrate.romb(y, show=True)
    Richardson Extrapolation Table for Romberg Integration
    ====================================================================
    -0.81576
    4.63862  6.45674
    -1.10581 -3.02062 -3.65245
    -2.57379 -3.06311 -3.06595 -3.05664
    -1.34093 -0.92997 -0.78776 -0.75160 -0.74256
    ====================================================================
    -0.742561336672229
    r'   r   z=Number of samples must be one plus a non-negative power of 2.Nr(   )r7   g       @)r   r   g      ?)r)   re   zE*** Printing table only supported for integrals of a single data set.r&      z%%%d.%dfz6Richardson Extrapolation Table for Romberg Integration D   zD====================================================================
)sepend )r|   )r*   r9   r:   rY   r-   rZ   rT   floatr   r.   r8   print	TypeError
IndexErrorcenter)r5   r^   r)   showra   ZNsampsZNintervr%   kRrj   rk   Zslicem1rm   Zslice_Rrg   rh   ri   r?   jprevZpreciswidthZformstrtitler   r   r   r     sb    ;



0:


c             C   s   |dkrt dn||dkr6d| |d | |d   S |d }t|d |d  | }|d d|  }||t|  }tj| |dd}|S dS )aX  
    Perform part of the trapezoidal rule to integrate a function.
    Assume that we had called difftrap with all lower powers-of-2
    starting with 1.  Calling difftrap only returns the summation
    of the new ordinates.  It does _not_ multiply by the width
    of the trapezoids.  This must be performed by the caller.
        'function' is the function to evaluate (must accept vector arguments).
        'interval' is a sequence with lower and upper limits
                   of integration.
        'numtraps' is the number of trapezoids to use (must be a
                   power-of-2).
    r   z#numtraps must be > 0 in difftrap().r'   g      ?re   )r)   N)r-   r~   r*   aranger.   )functionintervalZnumtrapsZnumtosumrm   ZloxZpointssr   r   r   	_difftrap}  s    
r   c             C   s   d| }|| |  |d  S )z
    Compute the differences for the Romberg quadrature corrections.
    See Forman Acton's "Real Computing Made Real," p 143.
    g      @g      ?r   )r1   cr   rn   r   r   r   _romberg_diff  s    r   c             C   s   d }}t dt| dd t d| t d t dd  xvtt|D ]f}t d	d
| |d |d  d|  f dd x,t|d D ]}t d|| |  dd qW t d qFW t d t d|| | dd t dd
t|d  d d d S )Nr   zRomberg integration ofr}   )r|   fromrx   z%6s %9s %9s)ZStepsZStepSizeZResultsz%6d %9fre   r'   g       @z%9fzThe final result isafterzfunction evaluations.)r   reprr   r:   )r   r   resmatr?   r   r   r   r   _printresmat  s    
,r   `sbO>
   c	          	   C   sP  t |st |rtdt| ||d}	d}
||g}|| }t|	||
}|| }|gg}t j}|d }xtd|d D ]}|
d9 }
|t|	||
7 }|| |
 g}x.t|D ]"}|t|| || |d  qW || }||d  }|r|| t	|| }||k s||t	| k rP |}qxW t
d||f t |rLt|	|| |S )ap
  
    Romberg integration of a callable function or method.

    Returns the integral of `function` (a function of one variable)
    over the interval (`a`, `b`).

    If `show` is 1, the triangular array of the intermediate results
    will be printed.  If `vec_func` is True (default is False), then
    `function` is assumed to support vector arguments.

    Parameters
    ----------
    function : callable
        Function to be integrated.
    a : float
        Lower limit of integration.
    b : float
        Upper limit of integration.

    Returns
    -------
    results  : float
        Result of the integration.

    Other Parameters
    ----------------
    args : tuple, optional
        Extra arguments to pass to function. Each element of `args` will
        be passed as a single argument to `func`. Default is to pass no
        extra arguments.
    tol, rtol : float, optional
        The desired absolute and relative tolerances. Defaults are 1.48e-8.
    show : bool, optional
        Whether to print the results. Default is False.
    divmax : int, optional
        Maximum order of extrapolation. Default is 10.
    vec_func : bool, optional
        Whether `func` handles arrays as arguments (i.e whether it is a
        "vector" function). Default is False.

    See Also
    --------
    fixed_quad : Fixed-order Gaussian quadrature.
    quad : Adaptive quadrature using QUADPACK.
    dblquad : Double integrals.
    tplquad : Triple integrals.
    romb : Integrators for sampled data.
    simps : Integrators for sampled data.
    cumtrapz : Cumulative integration for sampled data.
    ode : ODE integrator.
    odeint : ODE integrator.

    References
    ----------
    .. [1] 'Romberg's method' https://en.wikipedia.org/wiki/Romberg%27s_method

    Examples
    --------
    Integrate a gaussian from 0 to 1 and compare to the error function.

    >>> from scipy import integrate
    >>> from scipy.special import erf
    >>> gaussian = lambda x: 1/np.sqrt(np.pi) * np.exp(-x**2)
    >>> result = integrate.romberg(gaussian, 0, 1, show=True)
    Romberg integration of <function vfunc at ...> from [0, 1]

    ::

       Steps  StepSize  Results
           1  1.000000  0.385872
           2  0.500000  0.412631  0.421551
           4  0.250000  0.419184  0.421368  0.421356
           8  0.125000  0.420810  0.421352  0.421350  0.421350
          16  0.062500  0.421215  0.421350  0.421350  0.421350  0.421350
          32  0.031250  0.421317  0.421350  0.421350  0.421350  0.421350  0.421350

    The final result is 0.421350396475 after 33 function evaluations.

    >>> print("%g %g" % (2*result, erf(1)))
    0.842701 0.842701

    z5Romberg integration only available for finite limits.)r@   r'   r   re   z,divmax (%d) exceeded. Latest difference = %e)r*   r,   r-   rA   r   rF   r   appendr   rH   rI   rJ   r    r   )r   r0   r1   r2   rK   rL   r   Zdivmaxr@   r6   r%   r   ZintrangeZordsumrl   r   rO   Zlast_rowr?   rowr   Z
lastresultr   r   r   r     s>    T"

re      rt   rf   Z   rw   P   -          ii  i      K   ii@/     )         i  iix  iC  i  i  i+  i  i	i  i_7  i  i   i`i )  iDii?# 	   i ^ i)  i}=  i8  iK  i  ii  ip i>  i< isBi( i:ih iii0	   i 0iI"! i iiijmii l&	 l    7 iR0P i i@ i7i@!i!Nid7ipRi<ic]    l    `5]vl   v[O l   =H/54 l+w l   "- lMp: l   {> l$MY( l`: l    @	Al   @d@* ii`ip`*iol   Fg! lf l   \a lLR l   @` lx= l   7-)r'   re   rt   rf   r&      r   rw   r   r   r   r   r      c             C   s   y<t | d }|r"t|d } ntt| dkr:d}W n* tk
rf   | }t|d } d}Y nX |r|tkrt| \}}}}}|tj|td | }|t|| fS | d dks| d |krt	d| t| }	d|	 d }
t|d }|
|ddtj
f  }tj|}x*tdD ]}d| ||| }qW d|ddd d  }|dddddf ||d  }|d dkr|r||d	  }|d }n||d  }|d }|t|	| | }|d }|t| t| }t|}||| fS )
a  
    Return weights and error coefficient for Newton-Cotes integration.

    Suppose we have (N+1) samples of f at the positions
    x_0, x_1, ..., x_N.  Then an N-point Newton-Cotes formula for the
    integral between x_0 and x_N is:

    :math:`\int_{x_0}^{x_N} f(x)dx = \Delta x \sum_{i=0}^{N} a_i f(x_i)
    + B_N (\Delta x)^{N+2} f^{N+1} (\xi)`

    where :math:`\xi \in [x_0,x_N]`
    and :math:`\Delta x = \frac{x_N-x_0}{N}` is the average samples spacing.

    If the samples are equally-spaced and N is even, then the error
    term is :math:`B_N (\Delta x)^{N+3} f^{N+2}(\xi)`.

    Parameters
    ----------
    rn : int
        The integer order for equally-spaced data or the relative positions of
        the samples with the first sample at 0 and the last at N, where N+1 is
        the length of `rn`.  N is the order of the Newton-Cotes integration.
    equal : int, optional
        Set to 1 to enforce equally spaced data.

    Returns
    -------
    an : ndarray
        1-D array of weights to apply to the function at the provided sample
        positions.
    B : float
        Error coefficient.

    Examples
    --------
    Compute the integral of sin(x) in [0, :math:`\pi`]:

    >>> from scipy.integrate import newton_cotes
    >>> def f(x):
    ...     return np.sin(x)
    >>> a = 0
    >>> b = np.pi
    >>> exact = 2
    >>> for N in [2, 4, 6, 8, 10]:
    ...     x = np.linspace(a, b, N + 1)
    ...     an, B = newton_cotes(N, 1)
    ...     dx = (b - a) / N
    ...     quad = dx * np.sum(an * f(x))
    ...     error = abs(quad - exact)
    ...     print('{:2d}  {:10.9f}  {:.5e}'.format(N, quad, error))
    ...
     2   2.094395102   9.43951e-02
     4   1.998570732   1.42927e-03
     6   2.000017814   1.78136e-05
     8   1.999999835   1.64725e-07
    10   2.000000001   1.14677e-09

    Notes
    -----
    Normally, the Newton-Cotes rules are used on smaller integration
    regions and a composite rule is used to return the total integral.

    r'   )r7   r   r(   z1The sample positions must start at 0 and end at Nre   Ng       @g      @)r:   r*   r   allrW   	Exception_builtincoeffsarrayr~   r-   newaxislinalginvrangedotmathlogr   exp)rnequalrv   nadavinbdbanyiZtiZnvecCZCinvr?   vecaiZBNpowerp1facr   r   r   r   f  sF    @
$

)r   r&   )r   F)r   rB   rB   rC   Tr'   )NrU   r(   N)Nr'   r(   rp   )rU   r(   F)r   r   r   Fr   F)r   )(
__future__r   r   r   r   numpyr*   r   sysr   rI   r   Zscipy.specialr   r   scipy._lib.sixr   __all__r   __doc__replaceWarningr    r#   dictr$   r	   rA   r
   rT   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   	
G
- 
S
\
}
 	 
 




