
     hY                       d dl mZ d dlmZmZmZ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mZ d dlmZ d dlmZmZ d dlmZ g dZdrdZdrdZ G d de          Zerd dlmZ  G d de          ZneZdsdZed             Z e             e_!        dtdZ"dudZ#	 	 dvd Z$d! Z%dwd"Z&dwd#Z'd$ Z(dxd&Z)dxd'Z*dyd(Z+d) Z,d* Z-d+ Z.	 	 dzd.Z/dd/ddgd
d0fdd1g d2d
d3fd1d4g d5d6d7fd/d8g d9d:d;fdd<g d=d>d?fdd@g dAdBdCfdDdEg dFdGdHfdIdJg dKdLdMfdNdOg dPdQdRfddSg dTdUdVfdWdXg dYdZd[fdd\g d]d^d_fd`dag dbdcddfdDdeg dfdgdhfdiZ0d{djZ1dk Z2 edldmdng          Z3dod4ddddpdqZ4dS )|    )annotations)TYPE_CHECKINGCallableDictTupleAnycastN)
namedtuple)roots_legendre)gammaln	logsumexp)
_rng_spawn)
fixed_quad
quadraturerombergromb	trapezoidtrapzsimpssimpsoncumulative_trapezoidcumtrapznewton_cotesAccuracyWarning      ?c                    t          t          d          rt          j        | |||          S t          j        | |||          S )a  
    Integrate along the given axis using the composite trapezoidal rule.

    If `x` is provided, the integration happens in sequence along its
    elements - they are not sorted.

    Integrate `y` (`x`) along each 1d slice on the given axis, compute
    :math:`\int y(x) dx`.
    When `x` is specified, this integrates along the parametric curve,
    computing :math:`\int_t y(t) dt =
    \int_t y(t) \left.\frac{dx}{dt}\right|_{x=x(t)} dt`.

    Parameters
    ----------
    y : array_like
        Input array to integrate.
    x : array_like, optional
        The sample points corresponding to the `y` values. If `x` is None,
        the sample points are assumed to be evenly spaced `dx` apart. The
        default is None.
    dx : scalar, optional
        The spacing between sample points when `x` is None. The default is 1.
    axis : int, optional
        The axis along which to integrate.

    Returns
    -------
    trapezoid : float or ndarray
        Definite integral of `y` = n-dimensional array as approximated along
        a single axis by the trapezoidal rule. If `y` is a 1-dimensional array,
        then the result is a float. If `n` is greater than 1, then the result
        is an `n`-1 dimensional array.

    See Also
    --------
    cumulative_trapezoid, simpson, romb

    Notes
    -----
    Image [2]_ illustrates trapezoidal rule -- y-axis locations of points
    will be taken from `y` array, by default x-axis distances between
    points will be 1.0, alternatively they can be provided with `x` array
    or with `dx` scalar.  Return value will be equal to combined area under
    the red lines.

    References
    ----------
    .. [1] Wikipedia page: https://en.wikipedia.org/wiki/Trapezoidal_rule

    .. [2] Illustration image:
           https://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png

    Examples
    --------
    Use the trapezoidal rule on evenly spaced points:

    >>> import numpy as np
    >>> from scipy import integrate
    >>> integrate.trapezoid([1, 2, 3])
    4.0

    The spacing between sample points can be selected by either the
    ``x`` or ``dx`` arguments:

    >>> integrate.trapezoid([1, 2, 3], x=[4, 6, 8])
    8.0
    >>> integrate.trapezoid([1, 2, 3], dx=2)
    8.0

    Using a decreasing ``x`` corresponds to integrating in reverse:

    >>> integrate.trapezoid([1, 2, 3], x=[8, 6, 4])
    -8.0

    More generally ``x`` is used to integrate along a parametric curve. We can
    estimate the integral :math:`\int_0^1 x^2 = 1/3` using:

    >>> x = np.linspace(0, 1, num=50)
    >>> y = x**2
    >>> integrate.trapezoid(y, x)
    0.33340274885464394

    Or estimate the area of a circle, noting we repeat the sample which closes
    the curve:

    >>> theta = np.linspace(0, 2 * np.pi, num=1000, endpoint=True)
    >>> integrate.trapezoid(np.cos(theta), x=np.sin(theta))
    3.141571941375841

    ``trapezoid`` can be applied along a specified axis to do multiple
    computations in one call:

    >>> a = np.arange(6).reshape(2, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> integrate.trapezoid(a, axis=0)
    array([1.5, 2.5, 3.5])
    >>> integrate.trapezoid(a, axis=1)
    array([2.,  8.])
    r   xdxaxis)hasattrnpr   r   yr   r    r!   s       W/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/scipy/integrate/_quadrature.pyr   r      sI    P r; 2|Ar5555xQ2D1111    c                (    t          | |||          S )z}An alias of `trapezoid`.

    `trapz` is kept for backwards compatibility. For new code, prefer
    `trapezoid` instead.
    r   )r   r$   s       r&   r   r      s     Q!....r'   c                      e Zd ZdS )r   N)__name__
__module____qualname__ r'   r&   r   r      s        Dr'   r   )Protocolc                      e Zd ZU ded<   dS )CacheAttributeszDict[int, Tuple[Any, Any]]cacheN)r*   r+   r,   __annotations__r-   r'   r&   r0   r0      s         ))))))r'   r0   funcr   returnc                ,    t          t          |           S N)r	   r0   )r3   s    r&   cache_decoratorr7      s    &&&r'   c                    | t           j        v 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_legendrer1   r   )ns    r&   r9   r9      sE     	"(((%+A..&4Q&7&7 #!'**r'   r-      c                4   t          |          \  }}t          j        |          }t          j        |          st          j        |          rt	          d          ||z
  |dz   z  dz  |z   }||z
  dz  t          j        | | |g|R  z  d          z  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
    simpson : integrators for sampled data
    cumulative_trapezoid : cumulative integration for sampled data
    ode : ODE integrator
    odeint : ODE integrator

    Examples
    --------
    >>> from scipy import integrate
    >>> import numpy as np
    >>> 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.          @r   r!   N)r9   r#   realisinf
ValueErrorsum)r3   abargsr:   r   wr%   s           r&   r   r      s    | "!$$DAq


A	x{{ +bhqkk + * + + 	+	
1qsC!AaC9rvaQ.R8888$>>r'   Fc                (     |r fd}n f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                     | gR  S r6   r-   )r   rF   r3   s    r&   vfunczvectorize1.<locals>.vfunc  s    4>D>>>!r'   c                d   t          j        |           r	 | gR  S t          j        |           }  | d         gR  }t          |           }t	          |dt          |                    }t          j        |f|          }||d<   t          d|          D ]} | |         gR  ||<   |S )Nr   dtyperL   r=   )r#   isscalarasarraylengetattrtypeemptyrange)r   y0r:   rL   outputirF   r3   s         r&   rJ   zvectorize1.<locals>.vfunc  s    {1~~ &tA~~~~%
1Aad"T"""BAABb22EXqd%000FF1I1a[[ . . D1----q		Mr'   r-   )r3   rF   vec_funcrJ   s   ``  r&   
vectorize1rY      sV    2  	" 	" 	" 	" 	" 	" 	"	 	 	 	 	 	 Lr'   "\O>2   Tr=   c	                   t          |t                    s|f}t          | ||          }	t          j        }
t          j        }t          |dz   |          }t          ||dz             D ]M}t          |	||d|          d         }t          ||
z
            }|}
||k     s||t          |
          z  k     r n Nt          j
        d||fz  t                     |
|fS )a  
    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
    simpson : integrator for sampled data
    cumulative_trapezoid : cumulative integration for sampled data
    ode : ODE integrator
    odeint : ODE integrator

    Examples
    --------
    >>> from scipy import integrate
    >>> import numpy as np
    >>> 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

    rX   r=   r-   r   z-maxiter (%d) exceeded. Latest difference = %e)
isinstancetuplerY   r#   infmaxrT   r   abswarningswarnr   )r3   rD   rE   rF   tolrtolmaxiterrX   miniterrJ   valerrr:   newvals                 r&   r   r   %  s    B dE"" wtTH555E
&C
&C'!)W%%G7GAI&& 
 
E1aQ//2&*oo99d3s88m++E , 	;wnL	 	 	 8Or'   c                H    t          |           }|||<   t          |          S r6   )listr_   )trW   valuels       r&   tuplesetrq   z  s!    QAAaD88Or'   c                *    t          | ||||          S )zAn alias of `cumulative_trapezoid`.

    `cumtrapz` is kept for backwards compatibility. For new code, prefer
    `cumulative_trapezoid` instead.
    )r   r    r!   initial)r   )r%   r   r    r!   rs   s        r&   r   r     s      Q2D'JJJJr'   c                   t          j        |           } ||}nt          j        |          }|j        dk    r:t          j        |          }dg| j        z  }d||<   |                    |          }nOt          |j                  t          | j                  k    rt          d          t          j        ||          }|j        |         | j        |         dz
  k    rt          d          t          | j                  }t          t          d          f|z  |t          dd                    }t          t          d          f|z  |t          dd                    }	t          j
        || |         | |	         z   z  dz  |          }
|nt          j        |          st          d          t          |
j                  }d||<   t          j        t          j        |||
j        	          |
g|          }
|
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 numpy as np
    >>> import matplotlib.pyplot as plt

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

    Nr=   r   2If given, shape of x must be 1-D or the same as y.r?   7If given, length of x along axis must be the same as y.r>   z'`initial` parameter should be a scalar.rM   )r#   rO   ndimdiffreshaperP   shaperB   rq   slicecumsumrN   rm   concatenatefullrL   )r%   r   r    r!   rs   drz   ndslice1slice2ress              r&   r   r     s   n 	
1AyJqMM6Q;;

AC!&LEE$K		%  AA\\S\\)) * + + + %%%A74=AGDMA--- * + + + 
QWBuT{{nR'uQ~~>>FuT{{nR'uT2??F
)A6QvY./#5D
A
A
AC{7## 	HFGGGSYdnbgeWCIFFFL"&( ( ( Jr'   c                   t          | j                  }|d}d}t          d           f|z  }t          ||t          |||                    }	t          ||t          |dz   |dz   |                    }
t          ||t          |dz   |dz   |                    }|;t	          j        | |	         d| |
         z  z   | |         z   |          }||dz  z  }nht	          j        ||          }t          ||t          |||                    }t          ||t          |dz   |dz   |                    }t	          j        ||                   }t	          j        ||                   }||z   }||z  }t	          j        ||t	          j	        |          |dk              }|dz  | |	         d	t	          j        d
|t	          j	        |          |dk              z
  z  | |
         |t	          j        ||t	          j	        |          |dk              z  z  z   | |         d	|z
  z  z   z  }t	          j        ||          }|S )Nr      r=         @r?         @)outwhereg      @r>   r   )
rP   rz   r{   rq   r#   rC   rx   float64true_divide
zeros_like)r%   startstopr   r    r!   r   step	slice_allslice0r   r   resulthsl0sl1h0h1hsumhprodh0divh1tmps                         r&   _basic_simpsonr     s_   	QWB}Dtr!IiuUD$'?'?@@FiuU1Wd1fd'C'CDDFiuU1Wd1fd'C'CDDFy&	C&	M1AfI=DIII"s( GAD!!!y$eT4(@(@AAy$eAgtAvt(D(DEEZ#Z#BwR.RR]2->->bAgNNN3h!F)W46M'4J4J6=l"D "D "D DE F)t')~dE:<-:M:M<AQJ(H (H (H(H I	I F)sW}56 7 $'''Mr'   avgc                *    t          | ||||          S )zyAn alias of `simpson`.

    `simps` is kept for backwards compatibility. For new code, prefer
    `simpson` instead.
    )r   r    r!   even)r   )r%   r   r    r!   r   s        r&   r   r     s     1bt$7777r'   c           	        t          j        |           } t          | j                  }| j        |         }|}|}d}	|t          j        |          }t          |j                  dk    rBdg|z  }
|j        d         |
|<   |j        }d}	|                    t          |
                    }n9t          |j                  t          | j                  k    rt          d          |j        |         |k    rt          d          |dz  dk    rDd}d}t          d          f|z  }t          d          f|z  }|dvrt          d	          |d
v rft          ||d          }t          ||d          }|||         ||         z
  }|d|z  | |         | |         z   z  z  }t          | d|dz
  |||          }|dv rt          ||d          }t          ||d          }|+|t          |                   |t          |                   z
  }|d|z  | |         | |         z   z  z  }|t          | d|dz
  |||          z  }|dk    r
|dz  }|dz  }||z   }nt          | d|dz
  |||          }|	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 : float, optional
        Spacing of integration points along axis of `x`. 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.

    Returns
    -------
    float
        The estimated integral computed with the composite Simpson's rule.

    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
    cumulative_trapezoid : 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
    >>> import numpy as np
    >>> x = np.arange(0, 10)
    >>> y = np.arange(0, 10)

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

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

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

    r   Nr=   ru   rv   r   g        )r   lastfirstz3Parameter 'even' must be 'avg', 'last', or 'first'.)r   r   r         ?   )r   r   r   r>   )
r#   rO   rP   rz   ry   r_   rB   r{   rq   r   )r%   r   r    r!   r   r   Nlast_dxfirst_dxreturnshapeshapex	saveshaperi   r   r   r   s                   r&   r   r     s   X 	
1A	QWB	AGHK}JqMMqw<<1S2XF71:F4LIK		%--((AA\\S\\)) * + + +74=A * + + +1uzz++"++"/// : ; ; ; ###fdB//FfdB//F}F)ai/3w;&	!F) 344C#Aq!A#q"d;;F?""fdA..FfdA..F}U6]]+af.>>3x<61V9!455CnQ1Q32t<<<F5==3JCcMF#1ac1b$77 !IIi  Mr'   c           
        t          j        |           } t          | j                  }| j        |         }|dz
  }d}d}||k     r|dz  }|dz  }||k     ||k    rt	          d          i }	t          d          f|z  }
t          |
|d          }t          |
|d          }|t          j        |t                    z  }| |         | |         z   dz  |z  |	d<   |
}|x}x}}t          d|dz             D ]}|dz  }t          ||t          |||                    }|dz  }d	|	|dz
  df         || |         	                    |
          z  z   z  |	|df<   t          d|dz             D ]6}|	||dz
  f         }|||	|dz
  |dz
  f         z
  dd|z  z  dz
  z  z   |	||f<   7|dz  }|rt          j
        |	d                   st          d           n	 |d         }n# t          t          f$ r d}Y nw xY w	 |d         }n# t          t          f$ r d}Y nw xY wd||fz  }d}t          |dt          |          z  dd           t          |dz             D ]A}t          |dz             D ]}t          ||	||f         z  d           t                       Bt          dt          |          z             |	||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
    simpson : integrators for sampled data
    cumulative_trapezoid : cumulative integration for sampled data
    ode : ODE integrators
    odeint : ODE integrators

    Examples
    --------
    >>> from scipy import integrate
    >>> import numpy as np
    >>> 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  # may vary

    r=   r   z=Number of samples must be one plus a non-negative power of 2.Nr   rM   r>   )r   r   r   r?   r   zE*** Printing table only supported for integrals of a single data set.r;      z%%%d.%dfz6Richardson Extrapolation Table for Romberg Integration=
)sepend r   )r#   rO   rP   rz   rB   r{   rq   floatrT   rC   rN   print	TypeError
IndexError)r%   r    r!   showr   NsampsNintervr:   kRr   r   slicem1r   slice_Rr   r   r   rW   jprevpreciswidthformstrtitles                            r&   r   r     sl   z 	
1A	QWBWT]FQhG	A	A
g++	a	Q g++ 	G|| 4 5 5 	5 	At#Iiq))Fy$++G"*Ru----A6QwZ',Q.AfIG!!E!D41ac]]  !7D%tT*B*BCC
AaC8q7T)B)B'BBC1a&	q!A# 	G 	GAa1X;DQ!QqSz] 2ac
A~FFAq!fII	S ${1V9%% 	$ + , , , ,az*   Qz*    E6?2GLE%s5zz)t>>>>1Q3ZZ  qs 8 8A'Aq!fI-377777#E

"###aV9s$   G G21G26G? ?HHc                b   |dk    rt          d          |dk    r&d | |d                    | |d                   z   z  S |dz  }t          |d         |d         z
            |z  }|d         d|z  z   }||t          j        |          z  z   }t          j         | |          d          }|S )aU  
    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=   r   r   r?   )rB   r   r#   arangerC   )functionintervalnumtrapsnumtosumr   loxpointsss           r&   	_difftrapr     s     1}}>???	QHHXa[))((8A;*?*??@@A:(1+hqk)**83qkC!G#q29X....F88F##!,,,r'   c                (    d|z  }||z  | z
  |dz
  z  S )z
    Compute the differences for the Romberg quadrature corrections.
    See Forman Acton's "Real Computing Made Real," p 143.
    r   r   r-   )rE   cr   r   s       r&   _romberg_diffr   6  s$    
 q&C!GaK#)$$r'   c                x   dx}}t          dt          |           d           t          d|           t          d           t          ddz             t          t          |                    D ]t}t          d	d
|z  |d         |d         z
  d|z  z  fz  d           t          |dz             D ]"}t          d||         |         z  d           #t          d           ut          d           t          d||         |         d           t          dd
t          |          dz
  z  dz   d           d S )Nr   zRomberg integration ofr   r   from z%6s %9s %9s)StepsStepSizeResultsz%6d %9fr   r=   r>   z%9fzThe final result isafterzfunction evaluations.)r   reprrT   rP   )r   r   resmatrW   r   s        r&   _printresmatr   ?  sI   IA	
"DNN<<<<	&(	"III	-:
:;;;3v;;  i1a4(1+hqk"9BE!BCCMMMMqs 	3 	3A%6!9Q<(c22222b					"III	
137777	'1s6{{1}%a')@AAAAAr'   `sbO>
   c	           
         t          j        |          st          j        |          rt          d          t          | ||          }	d}
||g}||z
  }t	          |	||
          }||z  }|gg}t           j        }|d         }t          d|dz             D ]}|
dz  }
|t	          |	||
          z  }||z  |
z  g}t          |          D ]5}|                    t          ||         ||         |dz                        6||         }||dz
           }|r|                    |           t          ||z
            }||k     s||t          |          z  k     r n"|}t          j        d||fz  t                     |rt          |	||           |S )a
  
    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.
    simpson : Integrators for sampled data.
    cumulative_trapezoid : 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
    >>> import numpy as np
    >>> 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   r   z,divmax (%d) exceeded. Latest difference = %e)r#   rA   rB   rY   r   r`   rT   appendr   rb   rc   rd   r   r   )r   rD   rE   rF   re   rf   r   divmaxrX   rJ   r:   r   intrangeordsumr   r   rj   last_rowrW   rowr   
lastresults                         r&   r   r   P  s   j 
x{{ /bhqkk / . / / 	/x999E	A1vH1uHuh**FFhZF
&CayH1fQh  	Q)E8Q///& 1$%q 	@ 	@AJJ}Xa[#a&!A#>>????Qac]
 	MM#&:%&&99dS[[000E:fc]J	 	 	  .UHf---Mr'   r      r   )r=      r=   Z   r   )r=   r   r   r=   P   -   )       r   r   r   ii  i   )   K   r[   r[   r   r   ii@/     ))         i  r   r   r   iix  r   iC  )    +    r   r   r   r   i	i  r   i_7  )	     ` )  iDr   r   r   r   ii?# 	   i ^ )
)  }=  8  K    r  r   r   r   r   ii  ip )>  < sB( :ih r  r  r  r  r  iii0	   i 0)I"!  jmi r  r  r  r
  r	  r  l&	 l    7 iR0P ) @ 7@!!Nd7ipRr  r  r  r  r  r  i<ic]    l    `5]v)   v[O    =H/54 +w    "- Mp:    {> $MY( r  r  r  r  r  r  r  l`: l    @	Al   @d@* )i`p`*o   Fg! f    \a LR l   @` r"  r!  r   r  r  r  r  lx= l   7-)r=   r   r   r   r;      r   r   r   r   r  r   r     c                   	 t          |           dz
  }|rt          j        |dz             } n,t          j        t          j        |           dk              rd}n+# t
          $ r | }t          j        |dz             } d}Y nw xY w|rQ|t          v rHt          |         \  }}}}}|t          j        |t                    z  |z  }|t          |          |z  fS | d         dk    s| d         |k    rt          d          | t          |          z  }	d|	z  dz
  }
t          j        |dz             }|
|ddt          j
        f         z  }t          j                            |          }t          d          D ]0}d|z  |                    |                              |          z
  }1d|ddd         dz   z  }|dddddf                             |          |dz  z  }|dz  dk    r|r||d	z   z  }|dz   }n||dz   z  }|dz   }|t          j        |	|z  |          z
  }|dz   }|t          j        |          z  t#          |          z
  }t          j        |          }|||z  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.

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

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

    >>> from scipy.integrate import newton_cotes
    >>> import numpy as np
    >>> 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

    r=   rM   r   r   z1The sample positions must start at 0 and end at Nr   Nr>   r   )rP   r#   r   allrx   	Exception_builtincoeffsarrayr   rB   newaxislinalginvrT   dotmathlogr   exp)rnequalr   nadavinbdbanyitinvecCCinvrW   vecaiBNpowerp1facs                        r&   r   r     s   B	GGAI 	1Q3BBVBGBKK1$%% 	E   Yqs^^
   n$$+A.BB"(2U++++b0599R<
1

2! ) * * 	*	eAhhB	
R!B9QqS>>D
d111bj=!!A9==D1XX . .v---
ccc1
C	aaa1f		#		!b&	)B	A


"X!"X!	bfRY##	#B	qB

gbkk
)C
(3--Cr#v:s   AA %BBc           	         t          t          d          sddlm} |t          _        nt          j        }t	                     sd}t          |          t          j        |                                          }t          j        |                                          }t          j	        ||          \  }}|j
        d         }		   ||z   dz             n$# t          $ r}
d}t          |          |
d }
~
ww xY w	   t          j        ||g                      }n8# t          $ r+}
d|
 d}t          j        |d	
            fd}Y d }
~
nd }
~
ww xY wt          j        |          }||k    rd}t          |          t          j        |          }||k    rd}t          |          ||j                            |	          }n+t'          ||j        j                  sd}t          |          |j        |j
        d         k    rd}t          |          t-          |dd           }|j                            |          }|dvrd}t          |          |||||||||f	S )Nqmcr   )statsz`func` must be callable.r   z`func` must evaluate the integrand at points within the integration range; e.g. `func( (a + b) / 2)` must return the integrand at the centroid of the integration volume.zAException encountered when attempting vectorized call to `func`: z. `func` should accept two-dimensional array with shape `(n_points, len(a))` and return an array with the integrand value at each of the `n_points` for better performance.r   
stacklevelc                2    t          j        d|           S )Nr   )r!   arr)r#   apply_along_axis)r   r3   s    r&   rJ   z_qmc_quad_iv.<locals>.vfunc  s    &t"!<<<<r'   z`n_points` must be an integer.z!`n_estimates` must be an integer.z8`qrng` must be an instance of scipy.stats.qmc.QMCEngine.z`qrng` must be initialized with dimensionality equal to the number of variables in `a`, i.e., `qrng.random().shape[-1]` must equal `a.shape[0]`.rng_seed>   FTz*`log` must be boolean (`True` or `False`).)r"   	_qmc_quadscipyrF  callabler   r#   
atleast_1dcopybroadcast_arraysrz   r'  rB   r)  rc   rd   int64rE  Haltonr^   	QMCEnginer   rQ   _qmccheck_random_state)r3   rD   rE   n_pointsn_estimatesqrngr/  rF  messagedimerJ   n_points_intn_estimates_intrL  rngs   `               r&   _qmc_quad_ivra  s  s    9e$$  	D>> !,    	aA
aAq!$$DAq
'!*C)a!eq[ ) ) )) !!q()=RXq!f 	= 	= 	="" " "
 	g!,,,,	= 	= 	= 	= 	= 	= 	= 	= 	= 	=	= 8H%%L<2   h{++Oo%%5   |y$$ei122 !L   vH !!!tZ..H
*
'
'
1
1C
->   1ac3NNs0   C 
C;$C66C;?!D! !
E+!EEQMCQuadResultintegralstandard_errori   )rX  rY  rZ  r/  rF   c          	        t          | ||||||          }|\	  } }}}}}}}}	t          j        ||k              r7d}
t          j        |
d           t          |rt          j         ndd          S ||k     }d|                    d          z  }||         ||         c||<   ||<   t          j        ||z
            }||z  }t          j	        |          }t          |j        |          }t          |          D ]}|                    |          }|	j                            |||          } | |          }|r%t!          |          t          j        |          z   }nt          j        ||z            }|||<    t%          |          d	d||         i|j        }t          j        |          }|r|dk     r|t          j        dz  z   n||z  }|	                    |          }t          ||          S )
a  
    Compute an integral in N-dimensions using Quasi-Monte Carlo quadrature.

    Parameters
    ----------
    func : callable
        The integrand. Must accept a single arguments `x`, an array which
        specifies the point at which to evaluate the integrand. For efficiency,
        the function should be vectorized to compute the integrand for each
        element an array of shape ``(n_points, n)``, where ``n`` is number of
        variables.
    a, b : array-like
        One-dimensional arrays specifying the lower and upper integration
        limits, respectively, of each of the ``n`` variables.
    n_points, n_estimates : int, optional
        One QMC sample of `n_points` (default: 256) points will be generated
        by `qrng`, and `n_estimates` (default: 8) statistically independent
        estimates of the integral will be produced. The total number of points
        at which the integrand `func` will be evaluated is
        ``n_points * n_estimates``. See Notes for details.
    qrng : `~scipy.stats.qmc.QMCEngine`, optional
        An instance of the QMCEngine from which to sample QMC points.
        The QMCEngine must be initialized to a number of dimensions
        corresponding with the number of variables ``x0, ..., xn`` passed to
        `func`.
        The provided QMCEngine is used to produce the first integral estimate.
        If `n_estimates` is greater than one, additional QMCEngines are
        spawned from the first (with scrambling enabled, if it is an option.)
        If a QMCEngine is not provided, the default `scipy.stats.qmc.Halton`
        will be initialized with the number of dimensions determine from
        `a`.
    log : boolean, default: False
        When set to True, `func` returns the log of the integrand, and
        the result object contains the log of the integral.

    Returns
    -------
    result : object
        A result object with attributes:

        integral : float
            The estimate of the integral.
        standard_error :
            The error estimate. See Notes for interpretation.

    Notes
    -----
    Values of the integrand at each of the `n_points` points of a QMC sample
    are used to produce an estimate of the integral. This estimate is drawn
    from a population of possible estimates of the integral, the value of
    which we obtain depends on the particular points at which the integral
    was evaluated. We perform this process `n_estimates` times, each time
    evaluating the integrand at different scrambled QMC points, effectively
    drawing i.i.d. random samples from the population of integral estimates.
    The sample mean :math:`m` of these integral estimates is an
    unbiased estimator of the true value of the integral, and the standard
    error of the mean :math:`s` of these estimates may be used to generate
    confidence intervals using the t distribution with ``n_estimates - 1``
    degrees of freedom. Perhaps counter-intuitively, increasing `n_points`
    while keeping the total number of function evaluation points
    ``n_points * n_estimates`` fixed tends to reduce the actual error, whereas
    increasing `n_estimates` tends to decrease the error estimate.

    Examples
    --------
    QMC quadrature is particularly useful for computing integrals in higher
    dimensions. An example integrand is the probability density function
    of a multivariate normal distribution.

    >>> import numpy as np
    >>> from scipy import stats
    >>> dim = 8
    >>> mean = np.zeros(dim)
    >>> cov = np.eye(dim)
    >>> def func(x):
    ...     return stats.multivariate_normal.pdf(x, mean, cov)

    To compute the integral over the unit hypercube:

    >>> from scipy.integrate import qmc_quad
    >>> a = np.zeros(dim)
    >>> b = np.ones(dim)
    >>> rng = np.random.default_rng()
    >>> qrng = stats.qmc.Halton(d=dim, seed=rng)
    >>> n_estimates = 8
    >>> res = qmc_quad(func, a, b, n_estimates=n_estimates, qrng=qrng)
    >>> res.integral, res.standard_error
    (0.00018441088533413305, 1.1255608140911588e-07)

    A two-sided, 99% confidence interval for the integral may be estimated
    as:

    >>> t = stats.t(df=n_estimates-1, loc=res.integral,
    ...             scale=res.standard_error)
    >>> t.interval(0.99)
    (0.00018401699720722663, 0.00018480477346103947)

    Indeed, the value reported by `scipy.stats.multivariate_normal` is
    within this range.

    >>> stats.multivariate_normal.cdf(b, mean, cov, lower_limit=a)
    0.00018430867675187443

    z^A lower limit was equal to an upper limit, so the value of the integral is zero by definition.r   rG  r   r   r?   seedy              ?r-   )ra  r#   anyrc   rd   rb  r`   rC   prodzerosr   r`  rT   randomrE  scaler   r/  rR   
_init_quadmeanpisem)r3   rD   rE   rX  rY  rZ  r/  rF   r`  rF  r[  i_swapsignAdA	estimatesrngsrW   sampler   
integrandsestimaterc  rd  s                           r&   rM  rM    s   T aHk4EED?C<D!Q+tS#u
 
va1f~~ 7<g!,,,,2bfWWA666UF&**"*%%&DV9aiAfIqy
AA	
XB%%Idh,,D; ; ;X&&IOOFAq))T!WW
 	/ ,,rvbzz9HHvj2o..H	! tDzz::tAw:$/::wy!!H'*Ktaxxx"%(""htmHYYy))N>222r'   )Nr   r   )r3   r   r4   r0   )r-   r;   )r-   F)r-   rZ   rZ   r[   Tr=   )Nr   r   N)Nr   r   r   )r   r   F)r-   r   r   Fr   F)r   )5
__future__r   typingr   r   r   r   r   r	   	functoolsnumpyr#   r.  typesrc   collectionsr
   scipy.specialr   r   r   scipy._lib._utilr   __all__r   r   Warningr   r.   r0   r7   r9   dictr1   r   rY   r   rq   r   r   r   r   r   r   r   r   r   r   r(  r   ra  rb  rM  r-   r'   r&   <module>r     s   " " " " " " B B B B B B B B B B B B B B B B            " " " " " " ( ( ( ( ( ( , , , , , , , , ' ' ' ' ' '  k2 k2 k2 k2`/ / / /	 	 	 	 	g 	 	 	    * * * * *( * * * * O' ' ' ' 	+ 	+ 	+  $tvv  D? D? D? D?N* * * *Z HJ&'R R R Rj  K K K KZ Z Z Zz" " "N8 8 8 8@ @ @ @Fs s s sB  4% % %B B B" FK %v v v vh 	
!QqE"R	!GGGBr	!IIIb	"^^^Bs#	#!!!$u-	#'''40	%777fE	%???f	%   #V-	
6 7 7 7	)	 
H ( ( ()4l	D 
G 0 0 016	@ 
\ 3 3 3 5@		 
J 8 8 8 :E			7   Fj j j jZGO GO GOT 
?Z9I,JKK '+dP3 P3 P3 P3 P3 P3 P3r'   