
    -i!                     N    S SK JrJr  S SKJr  SSKJr  SSKJr   " S S\5      r	g)	    )	np_compatarray_namespace)cached_property   )NestedFixedRule)GaussLegendreQuadraturec                   B    \ rS rSrSrSS jr\S 5       r\S 5       r	Sr
g)	GaussKronrodQuadrature	   a	  
Gauss-Kronrod quadrature.

Gauss-Kronrod rules consist of two quadrature rules, one higher-order and one
lower-order. The higher-order rule is used as the estimate of the integral and the
difference between them is used as an estimate for the error.

Gauss-Kronrod is a 1D rule. To use it for multidimensional integrals, it will be
necessary to use ProductNestedFixed and multiple Gauss-Kronrod rules. See Examples.

For n-node Gauss-Kronrod, the lower-order rule has ``n//2`` nodes, which are the
ordinary Gauss-Legendre nodes with corresponding weights. The higher-order rule has
``n`` nodes, ``n//2`` of which are the same as the lower-order rule and the
remaining nodes are the Kronrod extension of those nodes.

Parameters
----------
npoints : int
    Number of nodes for the higher-order rule.

xp : array_namespace, optional
    The namespace for the node and weight arrays. Default is None, where NumPy is
    used.

Attributes
----------
lower : Rule
    Lower-order rule.

References
----------
.. [1] R. Piessens, E. de Doncker, Quadpack: A Subroutine Package for Automatic
    Integration, files: dqk21.f, dqk15.f (1983).

Examples
--------
Evaluate a 1D integral. Note in this example that ``f`` returns an array, so the
estimates will also be arrays, despite the fact that this is a 1D problem.

>>> import numpy as np
>>> from scipy.integrate import cubature
>>> from scipy.integrate._rules import GaussKronrodQuadrature
>>> def f(x):
...     return np.cos(x)
>>> rule = GaussKronrodQuadrature(21) # Use 21-point GaussKronrod
>>> a, b = np.array([0]), np.array([1])
>>> rule.estimate(f, a, b) # True value sin(1), approximately 0.84147
 array([0.84147098])
>>> rule.estimate_error(f, a, b)
 array([1.11022302e-16])

Evaluate a 2D integral. Note that in this example ``f`` returns a float, so the
estimates will also be floats.

>>> import numpy as np
>>> from scipy.integrate import cubature
>>> from scipy.integrate._rules import (
...     ProductNestedFixed, GaussKronrodQuadrature
... )
>>> def f(x):
...     # f(x) = cos(x_1) + cos(x_2)
...     return np.sum(np.cos(x), axis=-1)
>>> rule = ProductNestedFixed(
...     [GaussKronrodQuadrature(15), GaussKronrodQuadrature(15)]
... ) # Use 15-point Gauss-Kronrod
>>> a, b = np.array([0, 0]), np.array([1, 1])
>>> rule.estimate(f, a, b) # True value 2*sin(1), approximately 1.6829
 np.float64(1.682941969615793)
>>> rule.estimate_error(f, a, b)
 np.float64(2.220446049250313e-16)
Nc                     US:w  a  US:w  a  [        S5      eXl        Uc  [        n[        UR	                  S5      5      U l        [        US-  U R
                  S9U l        g )N      zFGauss-Kronrod quadrature is currently onlysupported for 15 or 21 nodesr      )xp)NotImplementedErrornpointsr   r   emptyr   r   gauss)selfr   r   s      X/var/www/html/venv/lib/python3.13/site-packages/scipy/integrate/_rules/_gauss_kronrod.py__init__GaussKronrodQuadrature.__init__R   sa     b=W]% 'E F F :B!"((1+.,WaZDGGD
    c                    U R                   S:X  ac  U R                  R                  / SQU R                  R                  S9nU R                  R                  / SQU R                  R                  S9nX4$ U R                   S:X  a`  U R                  R                  / SQU R                  R                  S9nU R                  R                  / SQU R                  R                  S9nWW4$ )Nr   )g*'il?g*>*?g?g^?gbltu?g"?g @?gj	?g7^)U?gzxP?r   gzxPÿg7^)Uҿgj	ۿg @g"gbltug^gg*>*g*'il)dtype)?[?B@v?碙?"75?牳׷?珁 ?-]+?Hi&>?la{F?o?g|+!?r%   r$   r#   r"   r!   r    r   r   r   r   r   )g	M ?g)b|_?g>'?g֡㛟?g$:?gb]?gw.?g        gw.ʿgb]ٿg$:g֡㛟g>'g)b|_g	M )ptg[|?a{&?HӺ?F ?\}f?ah]?؜*?g	O?r,   r+   r*   r)   r(   r'   r&   )r   r   asarrayfloat64)r   nodesweightss      r   nodes_and_weights(GaussKronrodQuadrature.nodes_and_weightsb   s     <<2GGOO. ggoo1 $ E6 ggoo. ggoo1 & GJ ~W \\RGGOO" ggoo% $ E* ggoo" ggoo% & G* g~r   c                 .    U R                   R                  $ N)r   r1   )r   s    r   lower_nodes_and_weights.GaussKronrodQuadrature.lower_nodes_and_weights   s    zz+++r   )r   r   r   r4   )__name__
__module____qualname____firstlineno____doc__r   r   r1   propertyr5   __static_attributes__ r   r   r
   r
   	   s:    FPE  c cJ , ,r   r
   N)
scipy._lib._array_apir   r   	functoolsr   _baser   _gauss_legendrer   r
   r>   r   r   <module>rC      s    < % " 4A,_ A,r   