• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Computing the Fifth Root</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="../root_finding_examples.html" title="Examples of Root-Finding (with and without derivatives)">
9<link rel="prev" href="lambda.html" title="Using C++11 Lambda's">
10<link rel="next" href="multiprecision_root.html" title="Root-finding using Boost.Multiprecision">
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="lambda.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../root_finding_examples.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="multiprecision_root.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.root_finding_examples.5th_root_eg"></a><a class="link" href="5th_root_eg.html" title="Computing the Fifth Root">Computing
28      the Fifth Root</a>
29</h3></div></div></div>
30<p>
31        Let's now suppose we want to find the <span class="bold"><strong>fifth root</strong></span>
32        of a number <span class="emphasis"><em>a</em></span>.
33      </p>
34<p>
35        The equation we want to solve is :
36      </p>
37<div class="blockquote"><blockquote class="blockquote"><p>
38          <span class="serif_italic"><span class="emphasis"><em>f</em></span>(x) = <span class="emphasis"><em>x<sup>5</sup> -a</em></span></span>
39        </p></blockquote></div>
40<p>
41        If your differentiation is a little rusty (or you are faced with an function
42        whose complexity makes differentiation daunting), then you can get help,
43        for example, from the invaluable <a href="http://www.wolframalpha.com/" target="_top">WolframAlpha
44        site.</a>
45      </p>
46<p>
47        For example, entering the command: <code class="computeroutput"><span class="identifier">differentiate</span>
48        <span class="identifier">x</span> <span class="special">^</span> <span class="number">5</span></code>
49      </p>
50<p>
51        or the Wolfram Language command: <code class="computeroutput"> <span class="identifier">D</span><span class="special">[</span><span class="identifier">x</span> <span class="special">^</span>
52        <span class="number">5</span><span class="special">,</span> <span class="identifier">x</span><span class="special">]</span></code>
53      </p>
54<p>
55        gives the output: <code class="computeroutput"><span class="identifier">d</span><span class="special">/</span><span class="identifier">dx</span><span class="special">(</span><span class="identifier">x</span>
56        <span class="special">^</span> <span class="number">5</span><span class="special">)</span> <span class="special">=</span> <span class="number">5</span>
57        <span class="identifier">x</span> <span class="special">^</span> <span class="number">4</span></code>
58      </p>
59<p>
60        and to get the second differential, enter: <code class="computeroutput"><span class="identifier">second</span>
61        <span class="identifier">differentiate</span> <span class="identifier">x</span>
62        <span class="special">^</span> <span class="number">5</span></code>
63      </p>
64<p>
65        or the Wolfram Language command: <code class="computeroutput"><span class="identifier">D</span><span class="special">[</span><span class="identifier">x</span> <span class="special">^</span>
66        <span class="number">5</span><span class="special">,</span> <span class="special">{</span> <span class="identifier">x</span><span class="special">,</span>
67        <span class="number">2</span> <span class="special">}]</span></code>
68      </p>
69<p>
70        to get the output: <code class="computeroutput"><span class="identifier">d</span> <span class="special">^</span>
71        <span class="number">2</span> <span class="special">/</span> <span class="identifier">dx</span> <span class="special">^</span> <span class="number">2</span><span class="special">(</span><span class="identifier">x</span> <span class="special">^</span>
72        <span class="number">5</span><span class="special">)</span> <span class="special">=</span> <span class="number">20</span> <span class="identifier">x</span>
73        <span class="special">^</span> <span class="number">3</span></code>
74      </p>
75<p>
76        To get a reference value, we can enter: <code class="literal">fifth root 3126</code>
77      </p>
78<p>
79        or: <code class="computeroutput"><span class="identifier">N</span><span class="special">[</span><span class="number">3126</span> <span class="special">^</span> <span class="special">(</span><span class="number">1</span> <span class="special">/</span> <span class="number">5</span><span class="special">),</span> <span class="number">50</span><span class="special">]</span></code>
80      </p>
81<p>
82        to get a result with a precision of 50 decimal digits:
83      </p>
84<p>
85        5.0003199590478625588206333405631053401128722314376
86      </p>
87<p>
88        (We could also get a reference value using <a class="link" href="multiprecision_root.html" title="Root-finding using Boost.Multiprecision">multiprecision
89        root</a>).
90      </p>
91<p>
92        The 1st and 2nd derivatives of <span class="emphasis"><em>x<sup>5</sup></em></span> are:
93      </p>
94<div class="blockquote"><blockquote class="blockquote"><p>
95          <span class="serif_italic"><span class="emphasis"><em>f'(x) = 5x<sup>4</sup></em></span></span>
96        </p></blockquote></div>
97<div class="blockquote"><blockquote class="blockquote"><p>
98          <span class="serif_italic"><span class="emphasis"><em>f''(x) = 20x<sup>3</sup></em></span></span>
99        </p></blockquote></div>
100<p>
101        Using these expressions for the derivatives, the functor is:
102      </p>
103<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>
104<span class="keyword">struct</span> <span class="identifier">fifth_functor_2deriv</span>
105<span class="special">{</span>
106  <span class="comment">// Functor returning both 1st and 2nd derivatives.</span>
107  <span class="identifier">fifth_functor_2deriv</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">to_find_root_of</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">a</span><span class="special">(</span><span class="identifier">to_find_root_of</span><span class="special">)</span>
108  <span class="special">{</span> <span class="comment">/* Constructor stores value a to find root of, for example: */</span> <span class="special">}</span>
109
110  <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span>
111  <span class="special">{</span>
112    <span class="comment">// Return both f(x) and f'(x) and f''(x).</span>
113    <span class="identifier">T</span> <span class="identifier">fx</span> <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">pow</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">a</span><span class="special">;</span>    <span class="comment">// Difference (estimate x^3 - value).</span>
114    <span class="identifier">T</span> <span class="identifier">dx</span> <span class="special">=</span> <span class="number">5</span> <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">pow</span><span class="special">&lt;</span><span class="number">4</span><span class="special">&gt;(</span><span class="identifier">x</span><span class="special">);</span>    <span class="comment">// 1st derivative = 5x^4.</span>
115    <span class="identifier">T</span> <span class="identifier">d2x</span> <span class="special">=</span> <span class="number">20</span> <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">pow</span><span class="special">&lt;</span><span class="number">3</span><span class="special">&gt;(</span><span class="identifier">x</span><span class="special">);</span>  <span class="comment">// 2nd derivative = 20 x^3</span>
116    <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">fx</span><span class="special">,</span> <span class="identifier">dx</span><span class="special">,</span> <span class="identifier">d2x</span><span class="special">);</span>  <span class="comment">// 'return' fx, dx and d2x.</span>
117  <span class="special">}</span>
118<span class="keyword">private</span><span class="special">:</span>
119  <span class="identifier">T</span> <span class="identifier">a</span><span class="special">;</span>                                    <span class="comment">// to be 'fifth_rooted'.</span>
120<span class="special">};</span> <span class="comment">// struct fifth_functor_2deriv</span>
121</pre>
122<p>
123        Our fifth-root function is now:
124      </p>
125<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>
126<span class="identifier">T</span> <span class="identifier">fifth_2deriv</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">x</span><span class="special">)</span>
127<span class="special">{</span>
128  <span class="comment">// return fifth root of x using 1st and 2nd derivatives and Halley.</span>
129  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>                  <span class="comment">// Help ADL of std functions.</span>
130  <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">tools</span><span class="special">;</span>   <span class="comment">// for halley_iterate.</span>
131
132  <span class="keyword">int</span> <span class="identifier">exponent</span><span class="special">;</span>
133  <span class="identifier">frexp</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">exponent</span><span class="special">);</span>                  <span class="comment">// Get exponent of z (ignore mantissa).</span>
134  <span class="identifier">T</span> <span class="identifier">guess</span> <span class="special">=</span> <span class="identifier">ldexp</span><span class="special">(</span><span class="number">1.</span><span class="special">,</span> <span class="identifier">exponent</span> <span class="special">/</span> <span class="number">5</span><span class="special">);</span>    <span class="comment">// Rough guess is to divide the exponent by five.</span>
135  <span class="identifier">T</span> <span class="identifier">min</span> <span class="special">=</span> <span class="identifier">ldexp</span><span class="special">(</span><span class="number">0.5</span><span class="special">,</span> <span class="identifier">exponent</span> <span class="special">/</span> <span class="number">5</span><span class="special">);</span>     <span class="comment">// Minimum possible value is half our guess.</span>
136  <span class="identifier">T</span> <span class="identifier">max</span> <span class="special">=</span> <span class="identifier">ldexp</span><span class="special">(</span><span class="number">2.</span><span class="special">,</span> <span class="identifier">exponent</span> <span class="special">/</span> <span class="number">5</span><span class="special">);</span>      <span class="comment">// Maximum possible value is twice our guess.</span>
137  <span class="comment">// Stop when slightly more than one of the digits are correct:</span>
138  <span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">digits</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">*</span> <span class="number">0.4</span><span class="special">);</span>
139  <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">uintmax_t</span> <span class="identifier">maxit</span> <span class="special">=</span> <span class="number">50</span><span class="special">;</span>
140  <span class="identifier">boost</span><span class="special">::</span><span class="identifier">uintmax_t</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">maxit</span><span class="special">;</span>
141  <span class="identifier">T</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">halley_iterate</span><span class="special">(</span><span class="identifier">fifth_functor_2deriv</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">x</span><span class="special">),</span> <span class="identifier">guess</span><span class="special">,</span> <span class="identifier">min</span><span class="special">,</span> <span class="identifier">max</span><span class="special">,</span> <span class="identifier">digits</span><span class="special">,</span> <span class="identifier">it</span><span class="special">);</span>
142  <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
143<span class="special">}</span>
144</pre>
145<p>
146        Full code of this example is at <a href="../../../../example/root_finding_example.cpp" target="_top">root_finding_example.cpp</a>
147        and <a href="../../../../example/root_finding_n_example.cpp" target="_top">root_finding_n_example.cpp</a>.
148      </p>
149</div>
150<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
151<td align="left"></td>
152<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
153      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
154      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
155      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
156      Daryle Walker and Xiaogang Zhang<p>
157        Distributed under the Boost Software License, Version 1.0. (See accompanying
158        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>)
159      </p>
160</div></td>
161</tr></table>
162<hr>
163<div class="spirit-nav">
164<a accesskey="p" href="lambda.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../root_finding_examples.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="multiprecision_root.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
165</div>
166</body>
167</html>
168