Source code for shenfun.legendre.lobatto
"""
Module contains some useful methods for Legendre quadrature.
"""
import numpy as np
from numpy.polynomial import legendre as leg
[docs]
def legendre_lobatto_nodes_and_weights(N, tol=1e-16):
"""Return points and weights for Legendre-Lobatto quadrature
Parameters
----------
N : int
Number of quadrature points
"""
M = N//2
j = np.arange(1, M)
x = np.zeros(N)
x[0] = -1.
x[-1] = 1.
x[1:M] = -np.cos((j+0.25)*np.pi/N - 3./(8.*N*np.pi*(j+0.25)))
Ln = leg.Legendre.basis(N-1)
Ld = Ln.deriv(1)
Ld2 = Ln.deriv(2)
converged = False
dx = np.zeros_like(x[1:M])
y = x[1:M]
count = 0
prev = 1
while not converged and count < 10:
dx[:] = Ld(y)/Ld2(y)
y -= dx
error = np.linalg.norm(dx)
converged = (error < tol) or (abs(error - prev) < tol)
count += 1
prev = error
#print(count, error)
MM = M if N % 2 == 0 else M+1
x[MM:-1] = -x[1:M][::-1]
w = 2./(N*(N-1)*Ln(x)**2)
return x, w