scipy.special.

roots_legendre#

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

Gauss-Legendre 求积。

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

参数:
nint

求积顺序

mu布尔值,可选

如果为 True,返回权重的总和,可选。

返回:
xndarray

样本点

wndarray

权重

mu浮点数

权重总和

参考

[AS]

Milton Abramowitz 和 Irene A. Stegun,主编。带公式、图表和数学表格的数学函数手册。纽约:多佛,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 + 2)/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