• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Legendre (and Associated) Polynomials</title>
5<link rel="stylesheet" href="../../math.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../index.html" title="Math Toolkit 2.12.0">
8<link rel="up" href="../sf_poly.html" title="Polynomials">
9<link rel="prev" href="../sf_poly.html" title="Polynomials">
10<link rel="next" href="legendre_stieltjes.html" title="Legendre-Stieltjes Polynomials">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="../sf_poly.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../sf_poly.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="legendre_stieltjes.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h3 class="title">
27<a name="math_toolkit.sf_poly.legendre"></a><a class="link" href="legendre.html" title="Legendre (and Associated) Polynomials">Legendre (and Associated)
28      Polynomials</a>
29</h3></div></div></div>
30<h5>
31<a name="math_toolkit.sf_poly.legendre.h0"></a>
32        <span class="phrase"><a name="math_toolkit.sf_poly.legendre.synopsis"></a></span><a class="link" href="legendre.html#math_toolkit.sf_poly.legendre.synopsis">Synopsis</a>
33      </h5>
34<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">special_functions</span><span class="special">/</span><span class="identifier">legendre</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
35</pre>
36<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span>
37
38<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
39<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
40
41<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
42<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
43
44<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
45<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p_prime</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
46
47<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
48<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p_prime</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
49
50<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
51<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">legendre_p_zeros</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
52
53<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
54<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">legendre_p_zeros</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">);</span>
55
56<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
57<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
58
59<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
60<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
61
62<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
63<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_q</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
64
65<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
66<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_q</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
67
68<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T3</span><span class="special">&gt;</span>
69<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_next</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">T1</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">T2</span> <span class="identifier">Pl</span><span class="special">,</span> <span class="identifier">T3</span> <span class="identifier">Plm1</span><span class="special">);</span>
70
71<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T3</span><span class="special">&gt;</span>
72<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_next</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">T1</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">T2</span> <span class="identifier">Pl</span><span class="special">,</span> <span class="identifier">T3</span> <span class="identifier">Plm1</span><span class="special">);</span>
73
74
75<span class="special">}}</span> <span class="comment">// namespaces</span>
76</pre>
77<p>
78        The return type of these functions is computed using the <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>result
79        type calculation rules</em></span></a>: note than when there is a single
80        template argument the result is the same type as that argument or <code class="computeroutput"><span class="keyword">double</span></code> if the template argument is an integer
81        type.
82      </p>
83<p>
84        The final <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a> argument is optional and can
85        be used to control the behaviour of the function: how it handles errors,
86        what level of precision to use etc. Refer to the <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">policy
87        documentation for more details</a>.
88      </p>
89<h5>
90<a name="math_toolkit.sf_poly.legendre.h1"></a>
91        <span class="phrase"><a name="math_toolkit.sf_poly.legendre.description"></a></span><a class="link" href="legendre.html#math_toolkit.sf_poly.legendre.description">Description</a>
92      </h5>
93<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
94<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
95
96<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
97<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
98</pre>
99<p>
100        Returns the Legendre Polynomial of the first kind:
101      </p>
102<div class="blockquote"><blockquote class="blockquote"><p>
103          <span class="inlinemediaobject"><img src="../../../equations/legendre_0.svg"></span>
104
105        </p></blockquote></div>
106<p>
107        Requires -1 &lt;= x &lt;= 1, otherwise returns the result of <a class="link" href="../error_handling.html#math_toolkit.error_handling.domain_error">domain_error</a>.
108      </p>
109<p>
110        Negative orders are handled via the reflection formula:
111      </p>
112<div class="blockquote"><blockquote class="blockquote"><p>
113          P<sub>-l-1</sub>(x) = P<sub>l</sub>(x)
114        </p></blockquote></div>
115<p>
116        The following graph illustrates the behaviour of the first few Legendre Polynomials:
117      </p>
118<div class="blockquote"><blockquote class="blockquote"><p>
119          <span class="inlinemediaobject"><img src="../../../graphs/legendre_p.svg" align="middle"></span>
120
121        </p></blockquote></div>
122<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
123<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p_prime</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
124
125<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
126<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p_prime</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
127</pre>
128<p>
129        Returns the derivatives of the Legendre polynomials.
130      </p>
131<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
132<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">legendre_p_zeros</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
133
134<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
135<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">legendre_p_zeros</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">);</span>
136</pre>
137<p>
138        The zeros of the Legendre polynomials are calculated by Newton's method using
139        an initial guess given by Tricomi with root bracketing provided by Szego.
140      </p>
141<p>
142        Since the Legendre polynomials are alternatively even and odd, only the non-negative
143        zeros are returned. For the odd Legendre polynomials, the first zero is always
144        zero. The rest of the zeros are returned in increasing order.
145      </p>
146<p>
147        Note that the argument to the routine is an integer, and the output is a
148        floating-point type. Hence the template argument is mandatory. The time to
149        extract a single root is linear in <code class="computeroutput"><span class="identifier">l</span></code>
150        (this is scaling to evaluate the Legendre polynomials), so recovering all
151        roots is ��(<code class="computeroutput"><span class="identifier">l</span></code><sup>2</sup>). Algorithms
152        with linear scaling <a href="https://doi.org/10.1137/06067016X" target="_top">exist</a>
153        for recovering all roots, but requires tooling not currently built into boost.math.
154        This implementation proceeds under the assumption that calculating zeros
155        of these functions will not be a bottleneck for any workflow.
156      </p>
157<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
158<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
159
160<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
161<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_p</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
162</pre>
163<p>
164        Returns the associated Legendre polynomial of the first kind:
165      </p>
166<div class="blockquote"><blockquote class="blockquote"><p>
167          <span class="inlinemediaobject"><img src="../../../equations/legendre_1.svg"></span>
168
169        </p></blockquote></div>
170<p>
171        Requires -1 &lt;= x &lt;= 1, otherwise returns the result of <a class="link" href="../error_handling.html#math_toolkit.error_handling.domain_error">domain_error</a>.
172      </p>
173<p>
174        Negative values of <span class="emphasis"><em>l</em></span> and <span class="emphasis"><em>m</em></span> are
175        handled via the identity relations:
176      </p>
177<div class="blockquote"><blockquote class="blockquote"><p>
178          <span class="inlinemediaobject"><img src="../../../equations/legendre_3.svg"></span>
179
180        </p></blockquote></div>
181<div class="caution"><table border="0" summary="Caution">
182<tr>
183<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../doc/src/images/caution.png"></td>
184<th align="left">Caution</th>
185</tr>
186<tr><td align="left" valign="top">
187<p>
188          The definition of the associated Legendre polynomial used here includes
189          a leading Condon-Shortley phase term of (-1)<sup>m</sup>. This matches the definition
190          given by Abramowitz and Stegun (8.6.6) and that used by <a href="http://mathworld.wolfram.com/LegendrePolynomial.html" target="_top">Mathworld</a>
191          and <a href="http://documents.wolfram.com/mathematica/functions/LegendreP" target="_top">Mathematica's
192          LegendreP function</a>. However, uses in the literature do not always
193          include this phase term, and strangely the specification for the associated
194          Legendre function in the C++ TR1 (assoc_legendre) also omits it, in spite
195          of stating that it uses Abramowitz and Stegun as the final arbiter on these
196          matters.
197        </p>
198<p>
199          See:
200        </p>
201<p>
202          <a href="http://mathworld.wolfram.com/LegendrePolynomial.html" target="_top">Weisstein,
203          Eric W. "Legendre Polynomial." From MathWorld--A Wolfram Web
204          Resource</a>.
205        </p>
206<p>
207          Abramowitz, M. and Stegun, I. A. (Eds.). "Legendre Functions"
208          and "Orthogonal Polynomials." Ch. 22 in Chs. 8 and 22 in Handbook
209          of Mathematical Functions with Formulas, Graphs, and Mathematical Tables,
210          9th printing. New York: Dover, pp. 331-339 and 771-802, 1972.
211        </p>
212</td></tr>
213</table></div>
214<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
215<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_q</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">);</span>
216
217<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
218<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_q</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 21. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
219</pre>
220<p>
221        Returns the value of the Legendre polynomial that is the second solution
222        to the Legendre differential equation, for example:
223      </p>
224<div class="blockquote"><blockquote class="blockquote"><p>
225          <span class="inlinemediaobject"><img src="../../../equations/legendre_2.svg"></span>
226
227        </p></blockquote></div>
228<p>
229        Requires -1 &lt;= x &lt;= 1, otherwise <a class="link" href="../error_handling.html#math_toolkit.error_handling.domain_error">domain_error</a>
230        is called.
231      </p>
232<p>
233        The following graph illustrates the first few Legendre functions of the second
234        kind:
235      </p>
236<div class="blockquote"><blockquote class="blockquote"><p>
237          <span class="inlinemediaobject"><img src="../../../graphs/legendre_q.svg" align="middle"></span>
238
239        </p></blockquote></div>
240<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T3</span><span class="special">&gt;</span>
241<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_next</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">T1</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">T2</span> <span class="identifier">Pl</span><span class="special">,</span> <span class="identifier">T3</span> <span class="identifier">Plm1</span><span class="special">);</span>
242</pre>
243<p>
244        Implements the three term recurrence relation for the Legendre polynomials,
245        this function can be used to create a sequence of values evaluated at the
246        same <span class="emphasis"><em>x</em></span>, and for rising <span class="emphasis"><em>l</em></span>. This
247        recurrence relation holds for Legendre Polynomials of both the first and
248        second kinds.
249      </p>
250<div class="blockquote"><blockquote class="blockquote"><p>
251          <span class="inlinemediaobject"><img src="../../../equations/legendre_4.svg"></span>
252
253        </p></blockquote></div>
254<p>
255        For example we could produce a vector of the first 10 polynomial values using:
256      </p>
257<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">0.5</span><span class="special">;</span>  <span class="comment">// Abscissa value</span>
258<span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">;</span>
259<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">legendre_p</span><span class="special">(</span><span class="number">0</span><span class="special">,</span> <span class="identifier">x</span><span class="special">));</span>
260<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">legendre_p</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">x</span><span class="special">));</span>
261<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">l</span> <span class="special">&lt;</span> <span class="number">10</span><span class="special">;</span> <span class="special">++</span><span class="identifier">l</span><span class="special">)</span>
262   <span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">legendre_next</span><span class="special">(</span><span class="identifier">l</span><span class="special">,</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">v</span><span class="special">[</span><span class="identifier">l</span><span class="special">],</span> <span class="identifier">v</span><span class="special">[</span><span class="identifier">l</span><span class="special">-</span><span class="number">1</span><span class="special">]));</span>
263<span class="comment">// Double check values:</span>
264<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">l</span> <span class="special">&lt;</span> <span class="number">10</span><span class="special">;</span> <span class="special">++</span><span class="identifier">l</span><span class="special">)</span>
265   <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="identifier">l</span><span class="special">]</span> <span class="special">==</span> <span class="identifier">legendre_p</span><span class="special">(</span><span class="identifier">l</span><span class="special">,</span> <span class="identifier">x</span><span class="special">));</span>
266</pre>
267<p>
268        Formally the arguments are:
269      </p>
270<div class="variablelist">
271<p class="title"><b></b></p>
272<dl class="variablelist">
273<dt><span class="term">l</span></dt>
274<dd><p>
275              The degree of the last polynomial calculated.
276            </p></dd>
277<dt><span class="term">x</span></dt>
278<dd><p>
279              The abscissa value
280            </p></dd>
281<dt><span class="term">Pl</span></dt>
282<dd><p>
283              The value of the polynomial evaluated at degree <span class="emphasis"><em>l</em></span>.
284            </p></dd>
285<dt><span class="term">Plm1</span></dt>
286<dd><p>
287              The value of the polynomial evaluated at degree <span class="emphasis"><em>l-1</em></span>.
288            </p></dd>
289</dl>
290</div>
291<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T3</span><span class="special">&gt;</span>
292<a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">legendre_next</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">T1</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">T2</span> <span class="identifier">Pl</span><span class="special">,</span> <span class="identifier">T3</span> <span class="identifier">Plm1</span><span class="special">);</span>
293</pre>
294<p>
295        Implements the three term recurrence relation for the Associated Legendre
296        polynomials, this function can be used to create a sequence of values evaluated
297        at the same <span class="emphasis"><em>x</em></span>, and for rising <span class="emphasis"><em>l</em></span>.
298      </p>
299<div class="blockquote"><blockquote class="blockquote"><p>
300          <span class="inlinemediaobject"><img src="../../../equations/legendre_5.svg"></span>
301
302        </p></blockquote></div>
303<p>
304        For example we could produce a vector of the first m+10 polynomial values
305        using:
306      </p>
307<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">0.5</span><span class="special">;</span>  <span class="comment">// Abscissa value</span>
308<span class="keyword">int</span> <span class="identifier">m</span> <span class="special">=</span> <span class="number">10</span><span class="special">;</span>      <span class="comment">// order</span>
309<span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">;</span>
310<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">legendre_p</span><span class="special">(</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">x</span><span class="special">));</span>
311<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">legendre_p</span><span class="special">(</span><span class="number">1</span> <span class="special">+</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">x</span><span class="special">));</span>
312<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">l</span> <span class="special">&lt;</span> <span class="number">10</span><span class="special">;</span> <span class="special">++</span><span class="identifier">l</span><span class="special">)</span>
313   <span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">legendre_next</span><span class="special">(</span><span class="identifier">l</span> <span class="special">+</span> <span class="number">10</span><span class="special">,</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">v</span><span class="special">[</span><span class="identifier">l</span><span class="special">],</span> <span class="identifier">v</span><span class="special">[</span><span class="identifier">l</span><span class="special">-</span><span class="number">1</span><span class="special">]));</span>
314<span class="comment">// Double check values:</span>
315<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">l</span> <span class="special">&lt;</span> <span class="number">10</span><span class="special">;</span> <span class="special">++</span><span class="identifier">l</span><span class="special">)</span>
316   <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="identifier">l</span><span class="special">]</span> <span class="special">==</span> <span class="identifier">legendre_p</span><span class="special">(</span><span class="number">10</span> <span class="special">+</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">x</span><span class="special">));</span>
317</pre>
318<p>
319        Formally the arguments are:
320      </p>
321<div class="variablelist">
322<p class="title"><b></b></p>
323<dl class="variablelist">
324<dt><span class="term">l</span></dt>
325<dd><p>
326              The degree of the last polynomial calculated.
327            </p></dd>
328<dt><span class="term">m</span></dt>
329<dd><p>
330              The order of the Associated Polynomial.
331            </p></dd>
332<dt><span class="term">x</span></dt>
333<dd><p>
334              The abscissa value
335            </p></dd>
336<dt><span class="term">Pl</span></dt>
337<dd><p>
338              The value of the polynomial evaluated at degree <span class="emphasis"><em>l</em></span>.
339            </p></dd>
340<dt><span class="term">Plm1</span></dt>
341<dd><p>
342              The value of the polynomial evaluated at degree <span class="emphasis"><em>l-1</em></span>.
343            </p></dd>
344</dl>
345</div>
346<h5>
347<a name="math_toolkit.sf_poly.legendre.h2"></a>
348        <span class="phrase"><a name="math_toolkit.sf_poly.legendre.accuracy"></a></span><a class="link" href="legendre.html#math_toolkit.sf_poly.legendre.accuracy">Accuracy</a>
349      </h5>
350<p>
351        The following table shows peak errors (in units of epsilon) for various domains
352        of input arguments. Note that only results for the widest floating point
353        type on the system are given as narrower types have <a class="link" href="../relative_error.html#math_toolkit.relative_error.zero_error">effectively
354        zero error</a>.
355      </p>
356<div class="table">
357<a name="math_toolkit.sf_poly.legendre.table_legendre_p"></a><p class="title"><b>Table 8.32. Error rates for legendre_p</b></p>
358<div class="table-contents"><table class="table" summary="Error rates for legendre_p">
359<colgroup>
360<col>
361<col>
362<col>
363<col>
364<col>
365</colgroup>
366<thead><tr>
367<th>
368              </th>
369<th>
370                <p>
371                  GNU C++ version 7.1.0<br> linux<br> double
372                </p>
373              </th>
374<th>
375                <p>
376                  GNU C++ version 7.1.0<br> linux<br> long double
377                </p>
378              </th>
379<th>
380                <p>
381                  Sun compiler version 0x5150<br> Sun Solaris<br> long double
382                </p>
383              </th>
384<th>
385                <p>
386                  Microsoft Visual C++ version 14.1<br> Win32<br> double
387                </p>
388              </th>
389</tr></thead>
390<tbody>
391<tr>
392<td>
393                <p>
394                  Legendre Polynomials: Small Values
395                </p>
396              </td>
397<td>
398                <p>
399                  <span class="blue">Max = 0.732ε (Mean = 0.0619ε)</span><br>
400                  <br> (<span class="emphasis"><em>GSL 2.1:</em></span> Max = 211ε (Mean = 20.4ε))
401                </p>
402              </td>
403<td>
404                <p>
405                  <span class="blue">Max = 69.2ε (Mean = 9.58ε)</span><br> <br>
406                  (<span class="emphasis"><em>&lt;cmath&gt;:</em></span> Max = 124ε (Mean = 13.2ε))
407                </p>
408              </td>
409<td>
410                <p>
411                  <span class="blue">Max = 69.2ε (Mean = 9.58ε)</span>
412                </p>
413              </td>
414<td>
415                <p>
416                  <span class="blue">Max = 211ε (Mean = 20.4ε)</span>
417                </p>
418              </td>
419</tr>
420<tr>
421<td>
422                <p>
423                  Legendre Polynomials: Large Values
424                </p>
425              </td>
426<td>
427                <p>
428                  <span class="blue">Max = 0.632ε (Mean = 0.0693ε)</span><br>
429                  <br> (<span class="emphasis"><em>GSL 2.1:</em></span> Max = 300ε (Mean = 33.2ε))
430                </p>
431              </td>
432<td>
433                <p>
434                  <span class="blue">Max = 699ε (Mean = 59.6ε)</span><br> <br>
435                  (<span class="emphasis"><em>&lt;cmath&gt;:</em></span> Max = 343ε (Mean = 32.1ε))
436                </p>
437              </td>
438<td>
439                <p>
440                  <span class="blue">Max = 699ε (Mean = 59.6ε)</span>
441                </p>
442              </td>
443<td>
444                <p>
445                  <span class="blue">Max = 300ε (Mean = 33.2ε)</span>
446                </p>
447              </td>
448</tr>
449</tbody>
450</table></div>
451</div>
452<br class="table-break"><div class="table">
453<a name="math_toolkit.sf_poly.legendre.table_legendre_q"></a><p class="title"><b>Table 8.33. Error rates for legendre_q</b></p>
454<div class="table-contents"><table class="table" summary="Error rates for legendre_q">
455<colgroup>
456<col>
457<col>
458<col>
459<col>
460<col>
461</colgroup>
462<thead><tr>
463<th>
464              </th>
465<th>
466                <p>
467                  GNU C++ version 7.1.0<br> linux<br> double
468                </p>
469              </th>
470<th>
471                <p>
472                  GNU C++ version 7.1.0<br> linux<br> long double
473                </p>
474              </th>
475<th>
476                <p>
477                  Sun compiler version 0x5150<br> Sun Solaris<br> long double
478                </p>
479              </th>
480<th>
481                <p>
482                  Microsoft Visual C++ version 14.1<br> Win32<br> double
483                </p>
484              </th>
485</tr></thead>
486<tbody>
487<tr>
488<td>
489                <p>
490                  Legendre Polynomials: Small Values
491                </p>
492              </td>
493<td>
494                <p>
495                  <span class="blue">Max = 0.612ε (Mean = 0.0517ε)</span><br>
496                  <br> (<span class="emphasis"><em>GSL 2.1:</em></span> Max = 46.4ε (Mean = 7.46ε))
497                </p>
498              </td>
499<td>
500                <p>
501                  <span class="blue">Max = 50.9ε (Mean = 9ε)</span>
502                </p>
503              </td>
504<td>
505                <p>
506                  <span class="blue">Max = 50.9ε (Mean = 8.98ε)</span>
507                </p>
508              </td>
509<td>
510                <p>
511                  <span class="blue">Max = 46.4ε (Mean = 7.32ε)</span>
512                </p>
513              </td>
514</tr>
515<tr>
516<td>
517                <p>
518                  Legendre Polynomials: Large Values
519                </p>
520              </td>
521<td>
522                <p>
523                  <span class="blue">Max = 2.49ε (Mean = 0.202ε)</span><br> <br>
524                  (<span class="emphasis"><em>GSL 2.1:</em></span> Max = 4.6e+03ε (Mean = 366ε))
525                </p>
526              </td>
527<td>
528                <p>
529                  <span class="blue">Max = 5.98e+03ε (Mean = 478ε)</span>
530                </p>
531              </td>
532<td>
533                <p>
534                  <span class="blue">Max = 5.98e+03ε (Mean = 478ε)</span>
535                </p>
536              </td>
537<td>
538                <p>
539                  <span class="blue">Max = 4.6e+03ε (Mean = 366ε)</span>
540                </p>
541              </td>
542</tr>
543</tbody>
544</table></div>
545</div>
546<br class="table-break"><div class="table">
547<a name="math_toolkit.sf_poly.legendre.table_legendre_p_associated_"></a><p class="title"><b>Table 8.34. Error rates for legendre_p (associated)</b></p>
548<div class="table-contents"><table class="table" summary="Error rates for legendre_p (associated)">
549<colgroup>
550<col>
551<col>
552<col>
553<col>
554<col>
555</colgroup>
556<thead><tr>
557<th>
558              </th>
559<th>
560                <p>
561                  GNU C++ version 7.1.0<br> linux<br> double
562                </p>
563              </th>
564<th>
565                <p>
566                  GNU C++ version 7.1.0<br> linux<br> long double
567                </p>
568              </th>
569<th>
570                <p>
571                  Sun compiler version 0x5150<br> Sun Solaris<br> long double
572                </p>
573              </th>
574<th>
575                <p>
576                  Microsoft Visual C++ version 14.1<br> Win32<br> double
577                </p>
578              </th>
579</tr></thead>
580<tbody><tr>
581<td>
582                <p>
583                  Associated Legendre Polynomials: Small Values
584                </p>
585              </td>
586<td>
587                <p>
588                  <span class="blue">Max = 0.999ε (Mean = 0.05ε)</span><br> <br>
589                  (<span class="emphasis"><em>GSL 2.1:</em></span> Max = 121ε (Mean = 6.75ε) <a class="link" href="../logs_and_tables/logs.html#errors_GNU_C_version_7_1_0_linux_double_legendre_p_associated__GSL_2_1_Associated_Legendre_Polynomials_Small_Values">And
590                  other failures.</a>)
591                </p>
592              </td>
593<td>
594                <p>
595                  <span class="blue">Max = 175ε (Mean = 9.88ε)</span><br> <br>
596                  (<span class="emphasis"><em>&lt;cmath&gt;:</em></span> Max = 175ε (Mean = 9.36ε) <a class="link" href="../logs_and_tables/logs.html#errors_GNU_C_version_7_1_0_linux_long_double_legendre_p_associated___cmath__Associated_Legendre_Polynomials_Small_Values">And
597                  other failures.</a>)
598                </p>
599              </td>
600<td>
601                <p>
602                  <span class="blue">Max = 77.7ε (Mean = 5.59ε)</span>
603                </p>
604              </td>
605<td>
606                <p>
607                  <span class="blue">Max = 121ε (Mean = 7.14ε)</span>
608                </p>
609              </td>
610</tr></tbody>
611</table></div>
612</div>
613<br class="table-break"><p>
614        Note that the worst errors occur when the order increases, values greater
615        than ~120 are very unlikely to produce sensible results, especially in the
616        associated polynomial case when the degree is also large. Further the relative
617        errors are likely to grow arbitrarily large when the function is very close
618        to a root.
619      </p>
620<h5>
621<a name="math_toolkit.sf_poly.legendre.h3"></a>
622        <span class="phrase"><a name="math_toolkit.sf_poly.legendre.testing"></a></span><a class="link" href="legendre.html#math_toolkit.sf_poly.legendre.testing">Testing</a>
623      </h5>
624<p>
625        A mixture of spot tests of values calculated using functions.wolfram.com,
626        and randomly generated test data are used: the test data was computed using
627        <a href="http://shoup.net/ntl/doc/RR.txt" target="_top">NTL::RR</a> at 1000-bit
628        precision.
629      </p>
630<h5>
631<a name="math_toolkit.sf_poly.legendre.h4"></a>
632        <span class="phrase"><a name="math_toolkit.sf_poly.legendre.implementation"></a></span><a class="link" href="legendre.html#math_toolkit.sf_poly.legendre.implementation">Implementation</a>
633      </h5>
634<p>
635        These functions are implemented using the stable three term recurrence relations.
636        These relations guarantee low absolute error but cannot guarantee low relative
637        error near one of the roots of the polynomials.
638      </p>
639</div>
640<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
641<td align="left"></td>
642<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
643      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
644      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
645      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
646      Daryle Walker and Xiaogang Zhang<p>
647        Distributed under the Boost Software License, Version 1.0. (See accompanying
648        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
649      </p>
650</div></td>
651</tr></table>
652<hr>
653<div class="spirit-nav">
654<a accesskey="p" href="../sf_poly.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../sf_poly.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="legendre_stieltjes.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
655</div>
656</body>
657</html>
658