Next: Package pslq, Previous: Package opsubst [Contents][Index]
Next: Functions and Variables for orthogonal polynomials, Previous: Package orthopoly, Up: Package orthopoly [Contents][Index]
orthopoly
is a package for symbolic and numerical evaluation of
several kinds of orthogonal polynomials, including Chebyshev,
Laguerre, Hermite, Jacobi, Legendre, and ultraspherical (Gegenbauer)
polynomials. Additionally, orthopoly
includes support for the spherical Bessel,
spherical Hankel, and spherical harmonic functions.
For the most part, orthopoly
follows the conventions of Abramowitz and Stegun
Handbook of Mathematical Functions, Chapter 22 (10th printing, December 1972);
additionally, we use Gradshteyn and Ryzhik,
Table of Integrals, Series, and Products (1980 corrected and
enlarged edition), and Eugen Merzbacher Quantum Mechanics (2nd edition, 1970).
Barton Willis of the University of Nebraska at Kearney (UNK) wrote
the orthopoly
package and its documentation. The package
is released under the GNU General Public License (GPL).
orthopoly
load ("orthopoly")
loads the orthopoly
package.
To find the third-order Legendre polynomial,
(%i1) legendre_p (3, x); 3 2 5 (1 - x) 15 (1 - x) (%o1) - ---------- + ----------- - 6 (1 - x) + 1 2 2
To express this as a sum of powers of x, apply ratsimp or rat to the result.
(%i2) [ratsimp (%), rat (%)]; 3 3 5 x - 3 x 5 x - 3 x (%o2)/R/ [----------, ----------] 2 2
Alternatively, make the second argument to legendre_p
(its “main” variable)
a canonical rational expression (CRE).
(%i1) legendre_p (3, rat (x)); 3 5 x - 3 x (%o1)/R/ ---------- 2
For floating point evaluation, orthopoly
uses a running error analysis
to estimate an upper bound for the error. For example,
(%i1) jacobi_p (150, 2, 3, 0.2); (%o1) interval(- 0.062017037936715, 1.533267919277521E-11)
Intervals have the form interval (c, r)
, where c is the
center and r is the radius of the interval. Since Maxima
does not support arithmetic on intervals, in some situations, such
as graphics, you want to suppress the error and output only the
center of the interval. To do this, set the option
variable orthopoly_returns_intervals
to false
.
(%i1) orthopoly_returns_intervals : false; (%o1) false (%i2) jacobi_p (150, 2, 3, 0.2); (%o2) - 0.062017037936715
Refer to the section see Floating point Evaluation for more information.
Most functions in orthopoly
have a gradef
property; thus
(%i1) diff (hermite (n, x), x); (%o1) 2 n H (x) n - 1 (%i2) diff (gen_laguerre (n, a, x), x); (a) (a) n L (x) - (n + a) L (x) unit_step(n) n n - 1 (%o2) ------------------------------------------ x
The unit step function in the second example prevents an error that would otherwise arise by evaluating with n equal to 0.
(%i3) ev (%, n = 0); (%o3) 0
The gradef
property only applies to the “main” variable; derivatives with
respect other arguments usually result in an error message; for example
(%i1) diff (hermite (n, x), x); (%o1) 2 n H (x) n - 1 (%i2) diff (hermite (n, x), n); Maxima doesn't know the derivative of hermite with respect the first argument -- an error. Quitting. To debug this try debugmode(true);
Generally, functions in orthopoly
map over lists and matrices. For
the mapping to fully evaluate, the option variables
doallmxops
and listarith
must both be true
(the defaults).
To illustrate the mapping over matrices, consider
(%i1) hermite (2, x); 2 (%o1) - 2 (1 - 2 x ) (%i2) m : matrix ([0, x], [y, 0]); [ 0 x ] (%o2) [ ] [ y 0 ] (%i3) hermite (2, m); [ 2 ] [ - 2 - 2 (1 - 2 x ) ] (%o3) [ ] [ 2 ] [ - 2 (1 - 2 y ) - 2 ]
In the second example, the i, j
element of the value
is hermite (2, m[i,j])
; this is not the same as computing
-2 + 4 m . m
, as seen in the next example.
(%i4) -2 * matrix ([1, 0], [0, 1]) + 4 * m . m; [ 4 x y - 2 0 ] (%o4) [ ] [ 0 4 x y - 2 ]
If you evaluate a function at a point outside its domain, generally
orthopoly
returns the function unevaluated. For example,
(%i1) legendre_p (2/3, x); (%o1) P (x) 2/3
orthopoly
supports translation into TeX; it also does two-dimensional
output on a terminal.
(%i1) spherical_harmonic (l, m, theta, phi); m (%o1) Y (theta, phi) l (%i2) tex (%); $$Y_{l}^{m}\left(\vartheta,\varphi\right)$$ (%o2) false (%i3) jacobi_p (n, a, a - b, x/2); (a, a - b) x (%o3) P (-) n 2 (%i4) tex (%); $$P_{n}^{\left(a,a-b\right)}\left({{x}\over{2}}\right)$$ (%o4) false
When an expression involves several orthogonal polynomials with symbolic orders, it’s possible that the expression actually vanishes, yet Maxima is unable to simplify it to zero. If you divide by such a quantity, you’ll be in trouble. For example, the following expression vanishes for integers n greater than 1, yet Maxima is unable to simplify it to zero.
(%i1) (2*n - 1) * legendre_p (n - 1, x) * x - n * legendre_p (n, x) + (1 - n) * legendre_p (n - 2, x); (%o1) (2 n - 1) P (x) x - n P (x) + (1 - n) P (x) n - 1 n n - 2
For a specific n, we can reduce the expression to zero.
(%i2) ev (% ,n = 10, ratsimp); (%o2) 0
Generally, the polynomial form of an orthogonal polynomial is ill-suited for floating point evaluation. Here’s an example.
(%i1) p : jacobi_p (100, 2, 3, x)$ (%i2) subst (0.2, x, p); (%o2) 3.4442767023833592E+35 (%i3) jacobi_p (100, 2, 3, 0.2); (%o3) interval(0.18413609135169, 6.8990300925815987E-12) (%i4) float(jacobi_p (100, 2, 3, 2/10)); (%o4) 0.18413609135169
The true value is about 0.184; this calculation suffers from extreme subtractive cancellation error. Expanding the polynomial and then evaluating, gives a better result.
(%i5) p : expand(p)$ (%i6) subst (0.2, x, p); (%o6) 0.18413609766122982
This isn’t a general rule; expanding the polynomial does not always result in an expression that is better suited for numerical evaluation. By far, the best way to do numerical evaluation is to make one or more of the function arguments floating point numbers. By doing that, specialized floating point algorithms are used for evaluation.
Maxima’s float
function is somewhat indiscriminate; if you apply
float
to an expression involving an orthogonal polynomial with a
symbolic degree or order parameter, these parameters may be
converted into floats; after that, the expression will not evaluate
fully. Consider
(%i1) assoc_legendre_p (n, 1, x); 1 (%o1) P (x) n (%i2) float (%); 1.0 (%o2) P (x) n (%i3) ev (%, n=2, x=0.9); 1.0 (%o3) P (0.9) 2
The expression in (%o3) will not evaluate to a float; orthopoly
doesn’t
recognize floating point values where it requires an integer. Similarly,
numerical evaluation of the pochhammer
function for orders that
exceed pochhammer_max_index
can be troublesome; consider
(%i1) x : pochhammer (1, 10), pochhammer_max_index : 5; (%o1) (1) 10
Applying float
doesn’t evaluate x to a float
(%i2) float (x); (%o2) (1.0) 10.0
To evaluate x to a float, you’ll need to bind
pochhammer_max_index
to 11 or greater and apply float
to x.
(%i3) float (x), pochhammer_max_index : 11; (%o3) 3628800.0
The default value of pochhammer_max_index
is 100;
change its value after loading orthopoly
.
Finally, be aware that reference books vary on the definitions of the orthogonal polynomials; we’ve generally used the conventions of Abramowitz and Stegun.
Before you suspect a bug in orthopoly, check some special cases
to determine if your definitions match those used by orthopoly
.
Definitions often differ by a normalization; occasionally, authors
use “shifted” versions of the functions that makes the family
orthogonal on an interval other than (-1, 1). To define, for example,
a Legendre polynomial that is orthogonal on (0, 1), define
(%i1) shifted_legendre_p (n, x) := legendre_p (n, 2*x - 1)$ (%i2) shifted_legendre_p (2, rat (x)); 2 (%o2)/R/ 6 x - 6 x + 1 (%i3) legendre_p (2, rat (x)); 2 3 x - 1 (%o3)/R/ -------- 2
Most functions in orthopoly
use a running error analysis to
estimate the error in floating point evaluation; the
exceptions are the spherical Bessel functions and the associated Legendre
polynomials of the second kind. For numerical evaluation, the spherical
Bessel functions call SLATEC functions. No specialized method is used
for numerical evaluation of the associated Legendre polynomials of the
second kind.
The running error analysis ignores errors that are second or higher order in the machine epsilon (also known as unit roundoff). It also ignores a few other errors. It’s possible (although unlikely) that the actual error exceeds the estimate.
Intervals have the form interval (c, r)
, where c is the
center of the interval and r is its radius. The
center of an interval can be a complex number, and the radius is always a positive real number.
Here is an example.
(%i1) fpprec : 50$ (%i2) y0 : jacobi_p (100, 2, 3, 0.2); (%o2) interval(0.1841360913516871, 6.8990300925815987E-12) (%i3) y1 : bfloat (jacobi_p (100, 2, 3, 1/5)); (%o3) 1.8413609135168563091370224958913493690868904463668b-1
Let’s test that the actual error is smaller than the error estimate
(%i4) is (abs (part (y0, 1) - y1) < part (y0, 2)); (%o4) true
Indeed, for this example the error estimate is an upper bound for the true error.
Maxima does not support arithmetic on intervals.
(%i1) legendre_p (7, 0.1) + legendre_p (8, 0.1); (%o1) interval(0.18032072148437508, 3.1477135311021797E-15) + interval(- 0.19949294375000004, 3.3769353084291579E-15)
A user could define arithmetic operators that do interval math. To define interval addition, we can define
(%i1) infix ("@+")$ (%i2) "@+"(x,y) := interval (part (x, 1) + part (y, 1), part (x, 2) + part (y, 2))$ (%i3) legendre_p (7, 0.1) @+ legendre_p (8, 0.1); (%o3) interval(- 0.019172222265624955, 6.5246488395313372E-15)
The special floating point routines get called when the arguments are complex. For example,
(%i1) legendre_p (10, 2 + 3.0*%i); (%o1) interval(- 3.876378825E+7 %i - 6.0787748E+7, 1.2089173052721777E-6)
Let’s compare this to the true value.
(%i1) float (expand (legendre_p (10, 2 + 3*%i))); (%o1) - 3.876378825E+7 %i - 6.0787748E+7
Additionally, when the arguments are big floats, the special floating point routines get called; however, the big floats are converted into double floats and the final result is a double.
(%i1) ultraspherical (150, 0.5b0, 0.9b0); (%o1) interval(- 0.043009481257265, 3.3750051301228864E-14)
orthopoly
To plot expressions that involve the orthogonal polynomials, you must do two things:
orthopoly_returns_intervals
to false
,
orthopoly
functions.
If function calls aren’t quoted, Maxima evaluates them to polynomials before plotting; consequently, the specialized floating point code doesn’t get called. Here is an example of how to plot an expression that involves a Legendre polynomial.
(%i1) plot2d ('(legendre_p (5, x)), [x, 0, 1]), orthopoly_returns_intervals : false; (%o1)
The entire expression legendre_p (5, x)
is quoted; this is
different than just quoting the function name using 'legendre_p (5, x)
.
The orthopoly
package defines the
Pochhammer symbol and a unit step function. orthopoly
uses
the Kronecker delta function and the unit step function in
gradef
statements.
To convert Pochhammer symbols into quotients of gamma functions,
use makegamma
.
(%i1) makegamma (pochhammer (x, n)); gamma(x + n) (%o1) ------------ gamma(x) (%i2) makegamma (pochhammer (1/2, 1/2)); 1 (%o2) --------- sqrt(%pi)
Derivatives of the Pochhammer symbol are given in terms of the psi
function.
(%i1) diff (pochhammer (x, n), x); (%o1) (x) (psi (x + n) - psi (x)) n 0 0 (%i2) diff (pochhammer (x, n), n); (%o2) (x) psi (x + n) n 0
You need to be careful with the expression in (%o1); the difference of the
psi
functions has polynomials when x = -1, -2, .., -n
. These polynomials
cancel with factors in pochhammer (x, n)
making the derivative a degree
n - 1
polynomial when n is a positive integer.
The Pochhammer symbol is defined for negative orders through its representation as a quotient of gamma functions. Consider
(%i1) q : makegamma (pochhammer (x, n)); gamma(x + n) (%o1) ------------ gamma(x) (%i2) sublis ([x=11/3, n= -6], q); 729 (%o2) - ---- 2240
Alternatively, we can get this result directly.
(%i1) pochhammer (11/3, -6); 729 (%o1) - ---- 2240
The unit step function is left-continuous; thus
(%i1) [unit_step (-1/10), unit_step (0), unit_step (1/10)]; (%o1) [0, 0, 1]
If you need a unit step function that is neither left or right continuous
at zero, define your own using signum
; for example,
(%i1) xunit_step (x) := (1 + signum (x))/2$ (%i2) [xunit_step (-1/10), xunit_step (0), xunit_step (1/10)]; 1 (%o2) [0, -, 1] 2
Do not redefine unit_step
itself; some code in orthopoly
requires that the unit step function be left-continuous.
Generally, orthopoly
does symbolic evaluation by using a hypergeometic
representation of the orthogonal polynomials. The hypergeometic
functions are evaluated using the (undocumented) functions hypergeo11
and hypergeo21
. The exceptions are the half-integer Bessel functions
and the associated Legendre function of the second kind. The half-integer Bessel functions are
evaluated using an explicit representation, and the associated Legendre
function of the second kind is evaluated using recursion.
For floating point evaluation, we again convert most functions into a hypergeometic form; we evaluate the hypergeometic functions using forward recursion. Again, the exceptions are the half-integer Bessel functions and the associated Legendre function of the second kind. Numerically, the half-integer Bessel functions are evaluated using the SLATEC code.
Previous: Introduction to orthogonal polynomials, Up: Package orthopoly [Contents][Index]
The associated Legendre function of the first kind of degree n and order m, \(P_{n}^{m}(z),\) is a solution of the differential equation:
$$ (1-z^2){d^2 w\over dz^2} - 2z{dw\over dz} + \left[n(n+1)-{m^2\over 1-z^2}\right] w = 0 $$This is related to the Legendre polynomial, \(P_n(x)\) via
$$ P_n^m(x) = (-1)^m\left(1-x^2\right)^{m/2} {d^m\over dx^m} P_n(x) $$Reference: A&S eqn 22.5.37, A&S eqn 8.6.6, and A&S eqn 8.2.5.
Some examples:
(%i1) assoc_legendre_p(2,0,x); 2 3 (1 - x) (%o1) (- 3 (1 - x)) + ---------- + 1 2 (%i2) factor(%); 2 3 x - 1 (%o2) -------- 2 (%i3) factor(assoc_legendre_p(2,1,x)); 2 (%o3) - 3 x sqrt(1 - x ) (%i4) (-1)^1*(1-x^2)^(1/2)*diff(legendre_p(2,x),x); 2 (%o4) - (3 - 3 (1 - x)) sqrt(1 - x ) (%i5) factor(%); 2 (%o5) - 3 x sqrt(1 - x )
The associated Legendre function of the second kind of degree n and order m, \(Q_{n}^{m}(z),\) is a solution of the differential equation:
$$ (1-z^2){d^2 w\over dz^2} - 2z{dw\over dz} + \left[n(n+1)-{m^2\over 1-z^2}\right] w = 0 $$Reference: Abramowitz and Stegun, equation 8.5.3 and 8.1.8.
Some examples:
(%i1) assoc_legendre_q(0,0,x); x + 1 log(- -----) x - 1 (%o1) ------------ 2 (%i2) assoc_legendre_q(1,0,x); x + 1 log(- -----) x - 2 x - 1 (%o2)/R/ ------------------ 2 (%i3) assoc_legendre_q(1,1,x); (%o3)/R/ x + 1 2 2 2 x + 1 2 log(- -----) sqrt(1 - x ) x - 2 sqrt(1 - x ) x - log(- -----) sqrt(1 - x ) x - 1 x - 1 - --------------------------------------------------------------------------- 2 2 x - 2
The Chebyshev polynomial of the first kind of degree n, \(T_n(x).\)
Reference: A&S eqn 22.5.47.
The polynomials \(T_n(x)\) can be written in terms of a hypergeometric function:
$$ T_n(x) = {_{2}}F_{1}\left(-n, n; {1\over 2}; {1-x\over 2}\right) $$The polynomials can also be defined in terms of the sum
$$ T_n(x) = {n\over 2} \sum_{r=0}^{\lfloor {n/2}\rfloor} {(-1)^r\over n-r} {n-r\choose k}(2x)^{n-2r} $$or the Rodrigues formula
$$ T_n(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)(1-x^2)^n\right) $$where
$$ \eqalign{ w(x) &= 1/\sqrt{1-x^2} \cr \kappa_n &= (-2)^n\left(1\over 2\right)_n } $$Some examples:
(%i1) chebyshev_t(2,x); 2 (%o1) (- 4 (1 - x)) + 2 (1 - x) + 1 (%i2) factor(%); 2 (%o2) 2 x - 1 (%i3) factor(chebyshev_t(3,x)); 2 (%o3) x (4 x - 3) (%i4) factor(hgfred([-3,3],[1/2],(1-x)/2)); 2 (%o4) x (4 x - 3)
The Chebyshev polynomial of the second kind of degree n, \(U_n(x).\)
Reference: A&S eqn 22.5.48.
The polynomials \(U_n(x)\) can be written in terms of a hypergeometric function:
$$ U_n(x) = (n+1)\; {_{2}F_{1}}\left(-n, n+2; {3\over 2}; {1-x\over 2}\right) $$The polynomials can also be defined in terms of the sum
$$ U_n(x) = \sum_{r=0}^{\lfloor n/2 \rfloor} (-1)^r {n-r \choose r} (2x)^{n-2r} $$or the Rodrigues formula
$$ U_n(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)(1-x^2)^n\right) $$where
$$ \eqalign{ w(x) &= \sqrt{1-x^2} \cr \kappa_n &= {(-2)^n\left({3\over 2}\right)_n \over n+1} } $$.
(%i1) chebyshev_u(2,x); 2 8 (1 - x) 4 (1 - x) (%o1) 3 ((- ---------) + ---------- + 1) 3 3 (%i2) expand(%); 2 (%o2) 4 x - 1 (%i3) expand(chebyshev_u(3,x)); 3 (%o3) 8 x - 4 x (%i4) expand(4*hgfred([-3,5],[3/2],(1-x)/2)); 3 (%o4) 8 x - 4 x
The generalized Laguerre polynomial of degree n, \(L_n^{(\alpha)}(x).\)
These can be defined by
$$ L_n^{(\alpha)}(x) = {n+\alpha \choose n}\; {_1F_1}(-n; \alpha+1; x) $$The polynomials can also be defined by the sum
$$ L_n^{(\alpha)}(x) = \sum_{k=0}^n {(\alpha + k + 1)_{n-k} \over (n-k)! k!} (-x)^k $$or the Rodrigues formula
$$ L_n^{(\alpha)}(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)x^n\right) $$where
$$ \eqalign{ w(x) &= e^{-x}x^{\alpha} \cr \kappa_n &= n! } $$Reference: A&S eqn 22.5.54.
Some examples:
(%i1) gen_laguerre(1,k,x); x (%o1) (k + 1) (1 - -----) k + 1 (%i2) gen_laguerre(2,k,x); 2 x 2 x (k + 1) (k + 2) (--------------- - ----- + 1) (k + 1) (k + 2) k + 1 (%o2) --------------------------------------------- 2 (%i3) binomial(2+k,2)*hgfred([-2],[1+k],x); 2 x 2 x (k + 1) (k + 2) (--------------- - ----- + 1) (k + 1) (k + 2) k + 1 (%o3) --------------------------------------------- 2
The Hermite polynomial of degree n, \(H_n(x).\)
These polynomials may be defined by a hypergeometric function
$$ H_n(x) = (2x)^n\; {_2F_0}\left(-{1\over 2} n, -{1\over 2}n+{1\over 2};;-{1\over x^2}\right) $$or by the series
$$ H_n(x) = n! \sum_{k=0}^{\lfloor n/2 \rfloor} {(-1)^k(2x)^{n-2k} \over k! (n-2k)!} $$or the Rodrigues formula
$$ H_n(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)\right) $$where
$$ \eqalign{ w(x) &= e^{-{x^2/2}} \cr \kappa_n &= (-1)^n } $$Reference: A&S eqn 22.5.55.
Some examples:
(%i1) hermite(3,x); 2 2 x (%o1) - 12 x (1 - ----) 3 (%i2) expand(%); 3 (%o2) 8 x - 12 x (%i3) expand(hermite(4,x)); 4 2 (%o3) 16 x - 48 x + 12 (%i4) expand((2*x)^4*hgfred([-2,-2+1/2],[],-1/x^2)); 4 2 (%o4) 16 x - 48 x + 12 (%i5) expand(4!*sum((-1)^k*(2*x)^(4-2*k)/(k!*(4-2*k)!),k,0,floor(4/2))); 4 2 (%o5) 16 x - 48 x + 12
Return true
if the input is an interval and return false if it isn’t.
The Jacobi polynomial, \(P_n^{(a,b)}(x).\)
The Jacobi polynomials are actually defined for all a and b; however, the Jacobi polynomial weight (1 - x)^a (1 + x)^b isn’t integrable for \(a \le -1\) or \(b \le -1.\)
Reference: A&S eqn 22.5.42.
The polynomial may be defined in terms of hypergeometric functions:
$$ P_n^{(a,b)}(x) = {n+a\choose n} {_1F_2}\left(-n, n + a + b + 1; a+1; {1-x\over 2}\right) $$or the Rodrigues formula
$$ P_n^{(a, b)}(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)\left(1-x^2\right)^n\right) $$where
$$ \eqalign{ w(x) &= (1-x)^a(1-x)^b \cr \kappa_n &= (-2)^n n! } $$Some examples:
(%i1) jacobi_p(0,a,b,x); (%o1) 1 (%i2) jacobi_p(1,a,b,x); (b + a + 2) (1 - x) (%o2) (a + 1) (1 - -------------------) 2 (a + 1)
The Laguerre polynomial, \(L_n(x)\) of degree n.
Reference: A&S eqn 22.5.16 and A&S eqn 22.5.54.
These are related to the generalized Laguerre polynomial by
$$ L_n(x) = L_n^{(0)}(x) $$The polynomials are given by the sum
$$ L_n(x) = \sum_{k=0}^{n} {(-1)^k\over k!}{n \choose k} x^k $$Some examples:
(%i1) laguerre(1,x); (%o1) 1 - x (%i2) laguerre(2,x); 2 x (%o2) -- - 2 x + 1 2 (%i3) gen_laguerre(2,0,x); 2 x (%o3) -- - 2 x + 1 2 (%i4) sum((-1)^k/k!*binomial(2,k)*x^k,k,0,2); 2 x (%o4) -- - 2 x + 1 2
The Legendre polynomial of the first kind, \(P_n(x),\) of degree n.
Reference: A&S eqn 22.5.50 and A&S eqn 22.5.51.
The Legendre polynomial is related to the Jacobi polynomials by
$$ P_n(x) = P_n^{(0,0)}(x) $$or the Rodrigues formula
$$ P_n(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)\left(1-x^2\right)^n\right) $$where
$$ \eqalign{ w(x) &= 1 \cr \kappa_n &= (-2)^n n! } $$Some examples:
(%i1) legendre_p(1,x); (%o1) x (%i2) legendre_p(2,x); 2 3 (1 - x) (%o2) (- 3 (1 - x)) + ---------- + 1 2 (%i3) expand(%); 2 3 x 1 (%o3) ---- - - 2 2 (%i4) expand(legendre_p(3,x)); 3 5 x 3 x (%o4) ---- - --- 2 2 (%i5) expand(jacobi_p(3,0,0,x)); 3 5 x 3 x (%o5) ---- - --- 2 2
The Legendre function of the second kind, \(Q_n(x)\) of degree n.
Reference: Abramowitz and Stegun, equations 8.5.3 and 8.1.8.
These are related to \(Q_n^m(x)\) by
$$ Q_n(x) = Q_n^0(x) $$Some examples:
(%i1) legendre_q(0,x); x + 1 log(- -----) x - 1 (%o1) ------------ 2 (%i2) legendre_q(1,x); x + 1 log(- -----) x - 2 x - 1 (%o2)/R/ ------------------ 2 (%i3) assoc_legendre_q(1,0,x); x + 1 log(- -----) x - 2 x - 1 (%o3)/R/ ------------------ 2
Returns a recursion relation for the orthogonal function family f with arguments args. The recursion is with respect to the polynomial degree.
(%i1) orthopoly_recur (legendre_p, [n, x]); (2 n + 1) P (x) x - n P (x) n n - 1 (%o1) P (x) = ------------------------------- n + 1 n + 1
The second argument to orthopoly_recur
must be a list with the
correct number of arguments for the function f; if it isn’t,
Maxima signals an error.
(%i1) orthopoly_recur (jacobi_p, [n, x]); Function jacobi_p needs 4 arguments, instead it received 2 -- an error. Quitting. To debug this try debugmode(true);
Additionally, when f isn’t the name of one of the families of orthogonal polynomials, an error is signalled.
(%i1) orthopoly_recur (foo, [n, x]); A recursion relation for foo isn't known to Maxima -- an error. Quitting. To debug this try debugmode(true);
Default value: true
When orthopoly_returns_intervals
is true
, floating point results are returned in
the form interval (c, r)
, where c is the center of an interval
and r is its radius. The center can be a complex number; in that
case, the interval is a disk in the complex plane.
Returns a three element list; the first element is the formula of the weight for the orthogonal polynomial family f with arguments given by the list args; the second and third elements give the lower and upper endpoints of the interval of orthogonality. For example,
(%i1) w : orthopoly_weight (hermite, [n, x]); 2 - x (%o1) [%e , - inf, inf] (%i2) integrate(w[1]*hermite(3, x)*hermite(2, x), x, w[2], w[3]); (%o2) 0
The main variable of f must be a symbol; if it isn’t, Maxima signals an error.
The Pochhammer symbol, \((x)_n.\) (See A&S eqn 6.1.22 and DLMF 5.2.iii).
For nonnegative
integers n with n <= pochhammer_max_index
, the
expression
\((x)_n\)
evaluates to the
product
\(x(x+1)(x+2)\cdots(x+n-1)\)
when
\(n > 0\)
and
to 1 when n = 0.
For negative n,
\((x)_n\)
is
defined as
\((-1)^n/(1-x)_{-n}.\)
Thus
(%i1) pochhammer (x, 3); (%o1) x (x + 1) (x + 2) (%i2) pochhammer (x, -3); 1 (%o2) - ----------------------- (1 - x) (2 - x) (3 - x)
To convert a Pochhammer symbol into a quotient of gamma functions,
(see A&S eqn 6.1.22) use makegamma
; for example
(%i1) makegamma (pochhammer (x, n)); gamma(x + n) (%o1) ------------ gamma(x)
When n exceeds pochhammer_max_index
or when n
is symbolic, pochhammer
returns a noun form.
(%i1) pochhammer (x, n); (%o1) (x) n
Default value: 100
pochhammer (n, x)
expands to a product if and only if
n <= pochhammer_max_index
.
Examples:
(%i1) pochhammer (x, 3), pochhammer_max_index : 3; (%o1) x (x + 1) (x + 2) (%i2) pochhammer (x, 4), pochhammer_max_index : 3; (%o2) (x) 4
Reference: A&S eqn 6.1.16.
The spherical Bessel function of the first kind, \(j_n(x).\)
Reference: A&S eqn 10.1.8 and A&S eqn 10.1.15.
It is related to the Bessel function by
$$ j_n(x) = \sqrt{\pi\over 2x} J_{n+1/2}(x) $$Some examples:
(%i1) spherical_bessel_j(1,x); sin(x) ------ - cos(x) x (%o1) --------------- x (%i2) spherical_bessel_j(2,x); 3 3 cos(x) (- (1 - --) sin(x)) - -------- 2 x x (%o2) ------------------------------ x (%i3) expand(%); sin(x) 3 sin(x) 3 cos(x) (%o3) (- ------) + -------- - -------- x 3 2 x x (%i4) expand(sqrt(%pi/(2*x))*bessel_j(2+1/2,x)),besselexpand:true; sin(x) 3 sin(x) 3 cos(x) (%o4) (- ------) + -------- - -------- x 3 2 x x
The spherical Bessel function of the second kind, \(y_n(x).\)
Reference: A&S eqn 10.1.9 and A&S eqn 10.1.15.
It is related to the Bessel function by
$$ y_n(x) = \sqrt{\pi\over 2x} Y_{n+1/2}(x) $$(%i1) spherical_bessel_y(1,x); cos(x) (- sin(x)) - ------ x (%o1) ------------------- x (%i2) spherical_bessel_y(2,x); 3 sin(x) 3 -------- - (1 - --) cos(x) x 2 x (%o2) - -------------------------- x (%i3) expand(%); 3 sin(x) cos(x) 3 cos(x) (%o3) (- --------) + ------ - -------- 2 x 3 x x (%i4) expand(sqrt(%pi/(2*x))*bessel_y(2+1/2,x)),besselexpand:true; 3 sin(x) cos(x) 3 cos(x) (%o4) (- --------) + ------ - -------- 2 x 3 x x
The spherical Hankel function of the first kind, \(h_n^{(1)}(x).\)
Reference: A&S eqn 10.1.36.
This is defined by
$$ h_n^{(1)}(x) = j_n(x) + iy_n(x) $$The spherical Hankel function of the second kind, \(h_n^{(2)}(x).\)
Reference: A&S eqn 10.1.17.
This is defined by
$$ h_n^{(2)}(x) = j_n(x) + iy_n(x) $$The spherical harmonic function, \(Y_n^m(\theta, \phi).\)
Spherical harmonics satisfy the angular part of Laplace’s equation in spherical coordinates.
For integers n and m such that \(n \geq |m|\) and for \(\theta \in [0, \pi].\) Maxima’s spherical harmonic function can be defined by
$$ Y_n^m(\theta, \phi) = (-1)^m \sqrt{{2n+1\over 4\pi} {(n-m)!\over (n+m)!}} P_n^m(\cos\theta) e^{im\phi} $$Further, when \(n < |m|,\) the spherical harmonic function vanishes.
The factor (-1)^m, frequently used in Quantum mechanics, is called the Condon-Shortely phase. Some references, including NIST Digital Library of Mathematical Functions omit this factor; see http://dlmf.nist.gov/14.30.E1.
Reference: Merzbacher 9.64.
Some examples:
(%i1) spherical_harmonic(1,0,theta,phi); sqrt(3) cos(theta) (%o1) ------------------ 2 sqrt(%pi) (%i2) spherical_harmonic(1,1,theta,phi); %i phi sqrt(3) %e sin(theta) (%o2) --------------------------- 3/2 2 sqrt(%pi) (%i3) spherical_harmonic(1,-1,theta,phi); - %i phi sqrt(3) %e sin(theta) (%o3) - ----------------------------- 3/2 2 sqrt(%pi) (%i4) spherical_harmonic(2,0,theta,phi); 2 3 (1 - cos(theta)) sqrt(5) ((- 3 (1 - cos(theta))) + ------------------- + 1) 2 (%o4) ---------------------------------------------------------- 2 sqrt(%pi) (%i5) factor(%); 2 sqrt(5) (3 cos (theta) - 1) (%o5) --------------------------- 4 sqrt(%pi)
The left-continuous unit step function; thus
unit_step (x)
vanishes for x <= 0
and equals
1 for x > 0
.
If you want a unit step function that takes on the value 1/2 at zero,
use hstep
.
The ultraspherical polynomial, \(C_n^{(a)}(x)\) (also known as the Gegenbauer polynomial).
Reference: A&S eqn 22.5.46.
These polynomials can be given in terms of Jacobi polynomials:
$$ C_n^{(\alpha)}(x) = {\Gamma\left(\alpha + {1\over 2}\right) \over \Gamma(2\alpha)} {\Gamma(n+2\alpha) \over \Gamma\left(n+\alpha + {1\over 2}\right)} P_n^{(\alpha-1/2, \alpha-1/2)}(x) $$or the series
$$ C_n^{(\alpha)}(x) = \sum_{k=0}^{\lfloor n/2 \rfloor} {(-1)^k (\alpha)_{n-k} \over k! (n-2k)!}(2x)^{n-2k} $$or the Rodrigues formula
$$ C_n^{(\alpha)}(x) = {1\over \kappa_n w(x)} {d^n\over dx^n}\left(w(x)\left(1-x^2\right)^n\right) $$where
$$ \eqalign{ w(x) &= \left(1-x^2\right)^{\alpha-{1\over 2}} \cr \kappa_n &= {(-2)^n\left(\alpha + {1\over 2}\right)_n n!\over (2\alpha)_n} \cr } $$Some examples:
(%i1) ultraspherical(1,a,x); (2 a + 1) (1 - x) (%o1) 2 a (1 - -----------------) 1 2 (a + -) 2 (%i2) factor(%); (%o2) 2 a x (%i3) factor(ultraspherical(2,a,x)); 2 2 (%o3) a (2 a x + 2 x - 1)
Next: Package pslq, Previous: Package opsubst [Contents][Index]