scipy.special.

roots_legendre#

scipy.special.roots_legendre(n, mu=False)[源代码]#

高斯-勒让德求积。

计算高斯-勒让德求积的采样点和权重 [GL]。采样点是 n 次勒让德多项式 \(P_n(x)\) 的根。这些采样点和权重可以正确地积分区间 \([-1, 1]\) 上次数为 \(2n - 1\) 或更小的多项式,权重函数为 \(w(x) = 1\)。有关更多详细信息,请参见 [AS] 中的 2.2.10。

参数:
nint

求积阶数

mubool, 可选

如果为 True,则返回权重之和,可选。

返回:
xndarray

采样点

wndarray

权重

mufloat

权重之和

参考文献

[AS]

Milton Abramowitz 和 Irene A. Stegun 编辑。《数学函数手册,包含公式、图表和数学表格》。纽约:Dover,1972 年。

[GL] (1,2)

高斯-勒让德求积,维基百科,https://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_quadrature

示例

>>> import numpy as np
>>> from scipy.special import roots_legendre, eval_legendre
>>> roots, weights = roots_legendre(9)

roots 保存根,weights 保存高斯-勒让德求积的权重。

>>> roots
array([-0.96816024, -0.83603111, -0.61337143, -0.32425342,  0.        ,
        0.32425342,  0.61337143,  0.83603111,  0.96816024])
>>> weights
array([0.08127439, 0.18064816, 0.2606107 , 0.31234708, 0.33023936,
       0.31234708, 0.2606107 , 0.18064816, 0.08127439])

通过在 roots 处评估 9 次勒让德多项式,验证我们是否得到了根。所有值都近似为零

>>> eval_legendre(9, roots)
array([-8.88178420e-16, -2.22044605e-16,  1.11022302e-16,  1.11022302e-16,
        0.00000000e+00, -5.55111512e-17, -1.94289029e-16,  1.38777878e-16,
       -8.32667268e-17])

这里我们将展示如何使用高斯-勒让德求积 [GL] 来估计 f(t) = t + 1/t 从 1 到 2 的积分。首先定义函数和积分限。

>>> def f(t):
...    return t + 1/t
...
>>> a = 1
>>> b = 2

我们将使用 integral(f(t), t=a, t=b) 来表示 f 从 t=a 到 t=b 的定积分。roots 中的采样点来自区间 [-1, 1],因此我们将通过简单的变量更改来重写积分

x = 2/(b - a) * t - (a + b)/(b - a)

逆变换为

t = (b - a)/2 * x + (a + b)/2

那么

integral(f(t), a, b) =
    (b - a)/2 * integral(f((b-a)/2*x + (a+b)/2), x=-1, x=1)

我们可以用 roots_legendre 返回的值来近似后者的积分。

将上面计算的根从 [-1, 1] 映射到 [a, b]。

>>> t = (b - a)/2 * roots + (a + b)/2

将积分近似为函数值的加权和。

>>> (b - a)/2 * f(t).dot(weights)
2.1931471805599276

将其与精确结果进行比较,精确结果为 3/2 + log(2)

>>> 1.5 + np.log(2)
2.1931471805599454