bundles / scipy 1.18.0 / scipy / integrate / _lebedev / lebedev_rule
function
scipy.integrate._lebedev:lebedev_rule
Signature
def lebedev_rule(n)Summary
Lebedev quadrature.
Extended Summary
Compute the sample points and weights for Lebedev quadrature [1] for integration of a function over the surface of a unit sphere.
Parameters
n: intQuadrature order. See Notes for supported values.
Returns
x: ndarray of shape ``(3, m)``Sample points on the unit sphere in Cartesian coordinates.
mis the "degree" corresponding with the specified order; see Notes.w: ndarray of shape ``(m,)``Weights
Notes
Implemented by translating the Matlab code of [2] to Python.
The available orders (argument n) are
3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 35, 41, 47, 53, 59, 65, 71, 77, 83, 89, 95, 101, 107, 113, 119, 125, 131
The corresponding degrees m are
6, 14, 26, 38, 50, 74, 86, 110, 146, 170, 194, 230, 266, 302, 350, 434, 590, 770, 974, 1202, 1454, 1730, 2030, 2354, 2702, 3074, 3470, 3890, 4334, 4802, 5294, 5810
Examples
An example given in [3]_ is integration of :math:`f(x, y, z) = \exp(x)` over a sphere of radius :math:`1`; the reference there is ``14.7680137457653``. Show the convergence to the expected result as the order increases:import matplotlib.pyplot as plt import numpy as np from scipy.integrate import lebedev_rule def f(x): return np.exp(x[0]) res = [] orders = np.arange(3, 20, 2) for n in orders: x, w = lebedev_rule(n) res.append(w @ f(x)) ref = np.full_like(res, 14.7680137457653) err = abs(res - ref)/abs(ref)✓
plt.semilogy(orders, err) plt.xlabel('order $n$') plt.ylabel('relative error') plt.title(r'Convergence for $f(x, y, z) = \exp(x)$')✗
Text(0.5, 1.0, 'Convergence for $f(x, y, z) = \\exp(x)$')
plt.show()
✓
Aliases
scipy.integrate.lebedev_rule