from sage.all import *
def legendre_p(n, x, a = -1, b = 1):
- """
+ r"""
Returns the ``n``th Legendre polynomial of the first kind over the
interval [a, b] with respect to ``x``.
sage: a = -pi
sage: b = pi
sage: def inner_product(v1, v2):
- ... return integrate(v1*v2, x, a, b)
- ...
+ ....: return integrate(v1*v2, x, a, b)
sage: def norm(v):
- ... return sqrt(inner_product(v,v))
- ...
+ ....: return sqrt(inner_product(v,v))
sage: def project(basis, v):
- ... return sum([ inner_product(v, b)*b/norm(b)**2
- ... for b in basis])
- ...
+ ....: return sum( inner_product(v, b)*b/norm(b)**2
+ ....: for b in basis)
sage: f = sin(x)
- sage: legendre_basis = [ legendre_p(k, x, a, b) for k in range(0,4) ]
+ sage: legendre_basis = [ legendre_p(k, x, a, b) for k in range(4) ]
sage: proj = project(legendre_basis, f)
sage: proj.simplify_trig()
5/2*(7*(pi^2 - 15)*x^3 - 3*(pi^4 - 21*pi^2)*x)/pi^6
We should agree with Maxima for all `n`::
sage: eq = lambda k: bool(legendre_p(k,x) == legendre_P(k,x))
- sage: all([eq(k) for k in range(0,20) ]) # long time
+ sage: all( eq(k) for k in range(20) ) # long time
True
We can evaluate the result of the zeroth polynomial::
# From Abramowitz & Stegun, (22.3.2) with alpha = beta = 0.
# Also massaged to support finite field elements.
- P = sum([ c(m)*g(m) for m in range(0,n+1) ])/(2**n)
+ P = sum( c(m)*g(m) for m in range(n+1) )/(2**n)
return P