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