
    YhH                     >    d dl mZmZmZmZmZ d dlmZ d
dZddZ	d	S )    )arangenewaxishstackprodarray)linalg   c                    | |dz   k     rt          d          | dz  dk    rt          d          | dz	  }t          | |dz             }|ddt          f         }|dz  }t          d|           D ]}t	          |||z  g          }t          t          d|dz             d	          t          j        |          |         z  }|S )
a  
    Return weights for an Np-point central derivative.

    Assumes equally-spaced function points.

    If weights are in the vector w, then
    derivative is w[0] * f(x-ho*dx) + ... + w[-1] * f(x+h0*dx)

    Parameters
    ----------
    Np : int
        Number of points for the central derivative.
    ndiv : int, optional
        Number of divisions. Default is 1.

    Returns
    -------
    w : ndarray
        Weights for an Np-point central derivative. Its size is `Np`.

    Notes
    -----
    Can be inaccurate for a large number of points.

    Examples
    --------
    We can calculate a derivative value of a function.

    >>> def f(x):
    ...     return 2 * x**2 + 3
    >>> x = 3.0 # derivative point
    >>> h = 0.1 # differential step
    >>> Np = 3 # point number for central derivative
    >>> weights = _central_diff_weights(Np) # weights for first derivative
    >>> vals = [f(x + (i - Np/2) * h) for i in range(Np)]
    >>> sum(w * v for (w, v) in zip(weights, vals))/h
    11.79999999999998

    This value is close to the analytical solution:
    f'(x) = 4x, so f'(3) = 12

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Finite_difference

    r	   z;Number of points must be at least the derivative order + 1.   r   z!The number of points must be odd.      ?N        axis)
ValueErrorr   r   ranger   r   r   inv)NpndivhoxXkws          q/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/scipy/stats/_finite_differences.py_central_diff_weightsr      s    ^ 
D1H}}I
 
 	
 
Av{{<===	qBsBHA	!!!W*A	3A1b\\  Aq!t9VAtax  q)))FJqMM$,??AH    r       c                 &   ||dz   k     rt          d          |dz  dk    rt          d          |dk    r}|dk    rt          g d          dz  }n|d	k    rt          g d
          dz  }n|dk    rt          g d          dz  }n|dk    rt          g d          dz  }nt          |d          }n|dk    rz|dk    rt          g d          }nr|d	k    rt          g d          dz  }nW|dk    rt          g d          dz  }n<|dk    rt          g d          dz  }n!t          |d          }nt          ||          }d}|dz	  }t          |          D ] }	|||	          | ||	|z
  |z  z   g|R  z  z  }!|t	          |f|z  d          z  S )a
  
    Find the nth derivative of a function at a point.

    Given a function, use a central difference formula with spacing `dx` to
    compute the nth derivative at `x0`.

    Parameters
    ----------
    func : function
        Input function.
    x0 : float
        The point at which the nth derivative is found.
    dx : float, optional
        Spacing.
    n : int, optional
        Order of the derivative. Default is 1.
    args : tuple, optional
        Arguments
    order : int, optional
        Number of points to use, must be odd.

    Notes
    -----
    Decreasing the step size too small can result in round-off error.

    Examples
    --------
    >>> def f(x):
    ...     return x**3 + x**2
    >>> _derivative(f, 1.0, dx=1e-6)
    4.9999999999217337

    r	   zm'order' (the number of points used to compute the derivative), must be at least the derivative order 'n' + 1.r   r   zJ'order' (the number of points used to compute the derivative) must be odd.r   )r   r	   g       @   )r	   ir      r    g      (@   )r    	   ir   -   r	   g      N@r$   )	r   i   i`r   i  iX    g     @@)r	   g       r	   )r       ir*   r    )r     ir,   r+   r   g     f@)	r&        ir/   r.   r-   r&   g     @r   r   )r   r   r   r   r   )
funcx0dxnargsorderweightsvalr   r   s
             r   _derivativer8   E   s&   D q1u}}=
 
 	
 qyA~~
 
 	

 	AvvA::JJJ''#-GGaZZ---..5GGaZZ66677$>GGaZZEEEFFNGG+E155GG	
aA::LLL))GGaZZ11122T9GGaZZ<<<==EGGaZZJJJKK G
 ,E155GG'q11
C	!B5\\ < <wqzDDq2vm!3;d;;;;;reaia(((((r   N)r	   )r   r	   r   r   )
numpyr   r   r   r   r   scipyr   r   r8   r   r   r   <module>r;      sz    6 6 6 6 6 6 6 6 6 6 6 6 6 6      = = = =@L) L) L) L) L) L)r   