gauss_kronrod.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Gauss-Kronrod Quadrature</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.11.0">
  8. <link rel="up" href="../quadrature.html" title="Chapter&#160;13.&#160;Quadrature and Differentiation">
  9. <link rel="prev" href="gauss.html" title="Gauss-Legendre quadrature">
  10. <link rel="next" href="double_exponential.html" title="Double-exponential quadrature">
  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="gauss.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../quadrature.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="double_exponential.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="math_toolkit.gauss_kronrod"></a><a class="link" href="gauss_kronrod.html" title="Gauss-Kronrod Quadrature">Gauss-Kronrod Quadrature</a>
  28. </h2></div></div></div>
  29. <h4>
  30. <a name="math_toolkit.gauss_kronrod.h0"></a>
  31. <span class="phrase"><a name="math_toolkit.gauss_kronrod.overview"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.overview">Overview</a>
  32. </h4>
  33. <p>
  34. Gauss-Kronrod quadrature is an extension of Gaussian quadrature which provides
  35. an a posteriori error estimate for the integral.
  36. </p>
  37. <p>
  38. The idea behind Gaussian quadrature is to choose <span class="emphasis"><em>n</em></span> nodes
  39. and weights in such a way that polynomials of order <span class="emphasis"><em>2n-1</em></span>
  40. are integrated exactly. However, integration of polynomials is trivial, so
  41. it is rarely done via numerical methods. Instead, transcendental and numerically
  42. defined functions are integrated via Gaussian quadrature, and the defining
  43. problem becomes how to estimate the remainder. Gaussian quadrature alone (without
  44. some form of interval splitting) cannot answer this question.
  45. </p>
  46. <p>
  47. It is possible to compute a Gaussian quadrature of order <span class="emphasis"><em>n</em></span>
  48. and another of order (say) <span class="emphasis"><em>2n+1</em></span>, and use the difference
  49. as an error estimate. However, this is not optimal, as the zeros of the Legendre
  50. polynomials (nodes of the Gaussian quadrature) are never the same for different
  51. orders, so <span class="emphasis"><em>3n+1</em></span> function evaluations must be performed.
  52. Kronrod considered the problem of how to interleave nodes into a Gaussian quadrature
  53. in such a way that all previous function evaluations can be reused, while increasing
  54. the order of polynomials that can be integrated exactly. This allows an a posteriori
  55. error estimate to be provided while still preserving exponential convergence.
  56. Kronrod discovered that by adding <span class="emphasis"><em>n+1</em></span> nodes (computed
  57. from the zeros of the Legendre-Stieltjes polynomials) to a Gaussian quadrature
  58. of order <span class="emphasis"><em>n</em></span>, he could integrate polynomials of order <span class="emphasis"><em>3n+1</em></span>.
  59. </p>
  60. <p>
  61. The integration routines provided here will perform either adaptive or non-adaptive
  62. quadrature, they should be chosen for the integration of smooth functions with
  63. no end point singularities. For difficult functions, or those with end point
  64. singularities, please refer to the <a class="link" href="double_exponential.html" title="Double-exponential quadrature">double-exponential
  65. integration schemes</a>.
  66. </p>
  67. <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">quadrature</span><span class="special">/</span><span class="identifier">gauss_kronrod</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  68. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">N</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../policy.html" title="Chapter&#160;20.&#160;Policies: Controlling Precision, Error Handling etc">Policy</a> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">&lt;&gt;</span> <span class="special">&gt;</span>
  69. <span class="keyword">class</span> <span class="identifier">gauss_kronrod</span>
  70. <span class="special">{</span>
  71. <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">RandomAccessContainer</span><span class="special">&amp;</span> <span class="identifier">abscissa</span><span class="special">();</span>
  72. <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">RandomAccessContainer</span><span class="special">&amp;</span> <span class="identifier">weights</span><span class="special">();</span>
  73. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
  74. <span class="keyword">static</span> <span class="keyword">auto</span> <span class="identifier">integrate</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span>
  75. <span class="identifier">Real</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">Real</span> <span class="identifier">b</span><span class="special">,</span>
  76. <span class="keyword">unsigned</span> <span class="identifier">max_depth</span> <span class="special">=</span> <span class="number">15</span><span class="special">,</span>
  77. <span class="identifier">Real</span> <span class="identifier">tol</span> <span class="special">=</span> <span class="identifier">tools</span><span class="special">::</span><span class="identifier">root_epsilon</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;(),</span>
  78. <span class="identifier">Real</span><span class="special">*</span> <span class="identifier">error</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
  79. <span class="identifier">Real</span><span class="special">*</span> <span class="identifier">pL1</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)-&gt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">declval</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;()(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">declval</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;()));</span>
  80. <span class="special">};</span>
  81. </pre>
  82. <h4>
  83. <a name="math_toolkit.gauss_kronrod.h1"></a>
  84. <span class="phrase"><a name="math_toolkit.gauss_kronrod.description"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.description">Description</a>
  85. </h4>
  86. <pre class="programlisting"><span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">RandomAccessContainer</span><span class="special">&amp;</span> <span class="identifier">abscissa</span><span class="special">();</span>
  87. <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">RandomAccessContainer</span><span class="special">&amp;</span> <span class="identifier">weights</span><span class="special">();</span>
  88. </pre>
  89. <p>
  90. These functions provide direct access to the abscissa and weights used to perform
  91. the quadrature: the return type depends on the <span class="emphasis"><em>Points</em></span>
  92. template parameter, but is always a RandomAccessContainer type. Note that only
  93. positive (or zero) abscissa and weights are stored, and that they contain both
  94. the Gauss and Kronrod points.
  95. </p>
  96. <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
  97. <span class="keyword">static</span> <span class="keyword">auto</span> <span class="identifier">integrate</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span>
  98. <span class="identifier">Real</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">Real</span> <span class="identifier">b</span><span class="special">,</span>
  99. <span class="keyword">unsigned</span> <span class="identifier">max_depth</span> <span class="special">=</span> <span class="number">15</span><span class="special">,</span>
  100. <span class="identifier">Real</span> <span class="identifier">tol</span> <span class="special">=</span> <span class="identifier">tools</span><span class="special">::</span><span class="identifier">root_epsilon</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;(),</span>
  101. <span class="identifier">Real</span><span class="special">*</span> <span class="identifier">error</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
  102. <span class="identifier">Real</span><span class="special">*</span> <span class="identifier">pL1</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)-&gt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">declval</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;()(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">declval</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;()));</span>
  103. </pre>
  104. <p>
  105. Performs adaptive Gauss-Kronrod quadrature on function <span class="emphasis"><em>f</em></span>
  106. over the range (a,b).
  107. </p>
  108. <p>
  109. <span class="emphasis"><em>max_depth</em></span> sets the maximum number of interval splittings
  110. permitted before stopping. Set this to zero for non-adaptive quadrature. Note
  111. that the algorithm descends the tree depth first, so only "difficult"
  112. areas of the integral result in interval splitting.
  113. </p>
  114. <p>
  115. <span class="emphasis"><em>tol</em></span> Sets the maximum relative error in the result, this
  116. should not be set too close to machine epsilon or the function will simply
  117. thrash and probably not return accurate results. On the other hand the default
  118. may be overly-pressimistic.
  119. </p>
  120. <p>
  121. <span class="emphasis"><em>error</em></span> When non-null, <code class="computeroutput"><span class="special">*</span><span class="identifier">error</span></code> is set to the difference between the
  122. (N-1)/2 point Gauss approximation and the N-point Gauss-Kronrod approximation.
  123. </p>
  124. <p>
  125. <span class="emphasis"><em>pL1</em></span> When non-null, <code class="computeroutput"><span class="special">*</span><span class="identifier">pL1</span></code> is set to the L1 norm of the result,
  126. if there is a significant difference between this and the returned value, then
  127. the result is likely to be ill-conditioned.
  128. </p>
  129. <h4>
  130. <a name="math_toolkit.gauss_kronrod.h2"></a>
  131. <span class="phrase"><a name="math_toolkit.gauss_kronrod.choosing_the_number_of_points"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.choosing_the_number_of_points">Choosing
  132. the number of points</a>
  133. </h4>
  134. <p>
  135. The number of points specified in the <span class="emphasis"><em>Points</em></span> template
  136. parameter must be an odd number: giving a (N-1)/2 Gauss quadrature as the comparison
  137. for error estimation.
  138. </p>
  139. <p>
  140. Internally class <code class="computeroutput"><span class="identifier">gauss_kronrod</span></code>
  141. has pre-computed tables of abscissa and weights for 15, 31, 41, 51 and 61 Gauss-Kronrod
  142. points at up to 100-decimal digit precision. That means that using for example,
  143. <code class="computeroutput"><span class="identifier">gauss_kronrod</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="number">31</span><span class="special">&gt;::</span><span class="identifier">integrate</span></code>
  144. incurs absolutely zero set-up overhead from computing the abscissa/weight pairs.
  145. When using multiprecision types with less than 100 digits of precision, then
  146. there is a small initial one time cost, while the abscissa/weight pairs are
  147. constructed from strings.
  148. </p>
  149. <p>
  150. However, for types with higher precision, or numbers of points other than those
  151. given above, the abscissa/weight pairs are computed when first needed and then
  152. cached for future use, which does incur a noticeable overhead. If this is likely
  153. to be an issue, then:
  154. </p>
  155. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  156. <li class="listitem">
  157. Defining BOOST_MATH_GAUSS_NO_COMPUTE_ON_DEMAND will result in a compile-time
  158. error, whenever a combination of number type and number of points is used
  159. which does not have pre-computed values.
  160. </li>
  161. <li class="listitem">
  162. There is a program <a href="../../../tools/gauss_kronrod_constants.cpp" target="_top">gauss_kronrod_constants.cpp</a>
  163. which was used to provide the pre-computed values already in gauss_kronrod.hpp.
  164. The program can be trivially modified to generate code and constants for
  165. other precisions and numbers of points.
  166. </li>
  167. </ul></div>
  168. <h4>
  169. <a name="math_toolkit.gauss_kronrod.h3"></a>
  170. <span class="phrase"><a name="math_toolkit.gauss_kronrod.complex_quadrature"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.complex_quadrature">Complex
  171. Quadrature</a>
  172. </h4>
  173. <p>
  174. The Gauss-Kronrod quadrature support integrands defined on the real line and
  175. returning complex values. In this case, the template argument is the real type,
  176. and the complex type is deduced via the return type of the function.
  177. </p>
  178. <h4>
  179. <a name="math_toolkit.gauss_kronrod.h4"></a>
  180. <span class="phrase"><a name="math_toolkit.gauss_kronrod.examples"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.examples">Examples</a>
  181. </h4>
  182. <p>
  183. We'll begin by integrating exp(-t<sup>2</sup>/2) over (0,+&#8734;) using a 7 term Gauss rule
  184. and 15 term Kronrod rule, and begin by defining the function to integrate as
  185. a C++ lambda expression:
  186. </p>
  187. <pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quadrature</span><span class="special">;</span>
  188. <span class="keyword">auto</span> <span class="identifier">f1</span> <span class="special">=</span> <span class="special">[](</span><span class="keyword">double</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exp</span><span class="special">(-</span><span class="identifier">t</span><span class="special">*</span><span class="identifier">t</span> <span class="special">/</span> <span class="number">2</span><span class="special">);</span> <span class="special">};</span>
  189. </pre>
  190. <p>
  191. We'll start off with a one shot (ie non-adaptive) integration, and keep track
  192. of the estimated error:
  193. </p>
  194. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">error</span><span class="special">;</span>
  195. <span class="keyword">double</span> <span class="identifier">Q</span> <span class="special">=</span> <span class="identifier">gauss_kronrod</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="number">15</span><span class="special">&gt;::</span><span class="identifier">integrate</span><span class="special">(</span><span class="identifier">f1</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">infinity</span><span class="special">(),</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">error</span><span class="special">);</span>
  196. </pre>
  197. <p>
  198. This yields Q = 1.25348207361, which has an absolute error of 1e-4 compared
  199. to the estimated error of 5e-3: this is fairly typical, with the difference
  200. between Gauss and Gauss-Kronrod schemes being much higher than the actual error.
  201. Before moving on to adaptive quadrature, lets try again with more points, in
  202. fact with the largest Gauss-Kronrod scheme we have cached (30/61):
  203. </p>
  204. <pre class="programlisting"><span class="identifier">Q</span> <span class="special">=</span> <span class="identifier">gauss_kronrod</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="number">61</span><span class="special">&gt;::</span><span class="identifier">integrate</span><span class="special">(</span><span class="identifier">f1</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">infinity</span><span class="special">(),</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">error</span><span class="special">);</span>
  205. </pre>
  206. <p>
  207. This yields an absolute error of 3e-15 against an estimate of 1e-8, which is
  208. about as good as we're going to get at double precision
  209. </p>
  210. <p>
  211. However, instead of continuing with ever more points, lets switch to adaptive
  212. integration, and set the desired relative error to 1e-14 against a maximum
  213. depth of 5:
  214. </p>
  215. <pre class="programlisting"><span class="identifier">Q</span> <span class="special">=</span> <span class="identifier">gauss_kronrod</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="number">15</span><span class="special">&gt;::</span><span class="identifier">integrate</span><span class="special">(</span><span class="identifier">f1</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">infinity</span><span class="special">(),</span> <span class="number">5</span><span class="special">,</span> <span class="number">1e-14</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">error</span><span class="special">);</span>
  216. </pre>
  217. <p>
  218. This yields an actual error of zero, against an estimate of 4e-15. In fact
  219. in this case the requested tolerance was almost certainly set too low: as we've
  220. seen above, for smooth functions, the precision achieved is often double that
  221. of the estimate, so if we integrate with a tolerance of 1e-9:
  222. </p>
  223. <pre class="programlisting"><span class="identifier">Q</span> <span class="special">=</span> <span class="identifier">gauss_kronrod</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="number">15</span><span class="special">&gt;::</span><span class="identifier">integrate</span><span class="special">(</span><span class="identifier">f1</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">infinity</span><span class="special">(),</span> <span class="number">5</span><span class="special">,</span> <span class="number">1e-9</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">error</span><span class="special">);</span>
  224. </pre>
  225. <p>
  226. We still achieve 1e-15 precision, with an error estimate of 1e-10.
  227. </p>
  228. <h4>
  229. <a name="math_toolkit.gauss_kronrod.h5"></a>
  230. <span class="phrase"><a name="math_toolkit.gauss_kronrod.caveats"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.caveats">Caveats</a>
  231. </h4>
  232. <p>
  233. For essentially all analytic integrands bounded on the domain, the error estimates
  234. provided by the routine are woefully pessimistic. In fact, in this case the
  235. error is very nearly equal to the error of the Gaussian quadrature formula
  236. of order <code class="computeroutput"><span class="special">(</span><span class="identifier">N</span><span class="special">-</span><span class="number">1</span><span class="special">)/</span><span class="number">2</span></code>, whereas the Kronrod extension converges exponentially
  237. beyond the Gaussian estimate. Very sophisticated method exist to estimate the
  238. error, but all require the integrand to lie in a particular function space.
  239. A more sophisticated a posteriori error estimate for an element of a particular
  240. function space is left to the user.
  241. </p>
  242. <p>
  243. These routines are deliberately kept relatively simple: when they work, they
  244. work very well and very rapidly. However, no effort has been made to make these
  245. routines work well with end-point singularities or other "difficult"
  246. integrals. In such cases please use one of the <a class="link" href="double_exponential.html" title="Double-exponential quadrature">double-exponential
  247. integration schemes</a> which are generally much more robust.
  248. </p>
  249. <h4>
  250. <a name="math_toolkit.gauss_kronrod.h6"></a>
  251. <span class="phrase"><a name="math_toolkit.gauss_kronrod.references"></a></span><a class="link" href="gauss_kronrod.html#math_toolkit.gauss_kronrod.references">References</a>
  252. </h4>
  253. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  254. <li class="listitem">
  255. Kronrod, Aleksandr Semenovish (1965), <span class="emphasis"><em>Nodes and weights of quadrature
  256. formulas. Sixteen-place tables</em></span>, New York: Consultants Bureau
  257. </li>
  258. <li class="listitem">
  259. Dirk P. Laurie, <span class="emphasis"><em>Calculation of Gauss-Kronrod Quadrature Rules</em></span>,
  260. Mathematics of Computation, Volume 66, Number 219, 1997
  261. </li>
  262. <li class="listitem">
  263. Gonnet, Pedro, <span class="emphasis"><em>A Review of Error Estimation in Adaptive Quadrature</em></span>,
  264. https://arxiv.org/pdf/1003.4629.pdf
  265. </li>
  266. </ul></div>
  267. </div>
  268. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  269. <td align="left"></td>
  270. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2019 Nikhar
  271. Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
  272. Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
  273. R&#229;de, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
  274. Daryle Walker and Xiaogang Zhang<p>
  275. Distributed under the Boost Software License, Version 1.0. (See accompanying
  276. 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>)
  277. </p>
  278. </div></td>
  279. </tr></table>
  280. <hr>
  281. <div class="spirit-nav">
  282. <a accesskey="p" href="gauss.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../quadrature.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="double_exponential.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  283. </div>
  284. </body>
  285. </html>