scipy.special.

roots_legendre#

scipy.special.roots_legendre(n, mu=False)[источник]#

Квадратура Гаусса-Лежандра.

Вычисление точек выборки и весов для квадратуры Гаусса-Лежандра [GL]Точки выборки являются корнями полинома Лежандра n-й степени \(P_n(x)\). Эти точки выборки и веса корректно интегрируют полиномы степени \(2n - 1\) или меньше на интервале \([-1, 1]\) с весовой функцией \(w(x) = 1\). См. 2.2.10 в [AS] для получения дополнительной информации.

Параметры:
nint

порядок квадратуры

mubool, необязательно

Если True, возвращает сумму весов, опционально.

Возвращает:
xndarray

Точки выборки

wndarray

Веса

mufloat

Сумма весов

Ссылки

[AS]

Милтон Абрамовиц и Ирен А. Стегун, ред. Справочник по математическим функциям с формулами, графиками и математическими таблицами. Нью-Йорк: 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])

Проверить наличие корней, оценив полином Лежандра 9-й степени в roots. Все значения приблизительно равны нулю:

>>> 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])

Здесь мы покажем, как приведенные выше значения можно использовать для оценки интеграла от 1 до 2 функции f(t) = t + 1/t с квадратурой Гаусса-Лежандра [GL]. Сначала определите функцию и пределы интегрирования.

>>> 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