<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Differentiation — mpmath v0.17 documentation</title> <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '0.17', COLLAPSE_MODINDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <link rel="top" title="mpmath v0.17 documentation" href="../index.html" /> <link rel="up" title="Numerical calculus" href="index.html" /> <link rel="next" title="Numerical integration (quadrature)" href="integration.html" /> <link rel="prev" title="Sums, products, limits and extrapolation" href="sums_limits.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../modindex.html" title="Global Module Index" accesskey="M">modules</a> |</li> <li class="right" > <a href="integration.html" title="Numerical integration (quadrature)" accesskey="N">next</a> |</li> <li class="right" > <a href="sums_limits.html" title="Sums, products, limits and extrapolation" accesskey="P">previous</a> |</li> <li><a href="../index.html">mpmath v0.17 documentation</a> »</li> <li><a href="index.html" accesskey="U">Numerical calculus</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="differentiation"> <h1>Differentiation<a class="headerlink" href="#differentiation" title="Permalink to this headline">¶</a></h1> <div class="section" id="numerical-derivatives-diff-diffs"> <h2>Numerical derivatives (<tt class="docutils literal"><span class="pre">diff</span></tt>, <tt class="docutils literal"><span class="pre">diffs</span></tt>)<a class="headerlink" href="#numerical-derivatives-diff-diffs" title="Permalink to this headline">¶</a></h2> <dl class="function"> <dt id="mpmath.diff"> <tt class="descclassname">mpmath.</tt><tt class="descname">diff</tt><big>(</big><em>ctx</em>, <em>f</em>, <em>x</em>, <em>n=1</em>, <em>**options</em><big>)</big><a class="headerlink" href="#mpmath.diff" title="Permalink to this definition">¶</a></dt> <dd><p>Numerically computes the derivative of <img class="math" src="../_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/>, <img class="math" src="../_images/math/bbad379658bd32e9b6479bbd666b93a96e6b48ba.png" alt="f'(x)"/>, or generally for an integer <img class="math" src="../_images/math/e2c7d62172af0e738dd12f47f3f8ad8ef70cd65f.png" alt="n \ge 0"/>, the <img class="math" src="../_images/math/174fadd07fd54c9afe288e96558c92e0c1da733a.png" alt="n"/>-th derivative <img class="math" src="../_images/math/6aa62f84d8f61b6891e92197064bf60a07467b3a.png" alt="f^{(n)}(x)"/>. A few basic examples are:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">mpmath</span> <span class="kn">import</span> <span class="o">*</span> <span class="gp">>>> </span><span class="n">mp</span><span class="o">.</span><span class="n">dps</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> <span class="n">mp</span><span class="o">.</span><span class="n">pretty</span> <span class="o">=</span> <span class="bp">True</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)</span> <span class="go">3.0</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="go">2.0</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="go">0.0</span> <span class="gp">>>> </span><span class="n">nprint</span><span class="p">([</span><span class="n">diff</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">)])</span> <span class="c"># exp'(x) = exp(x)</span> <span class="go">[20.0855, 20.0855, 20.0855, 20.0855, 20.0855]</span> </pre></div> </div> <p>Even more generally, given a tuple of arguments <img class="math" src="../_images/math/93778a26d4babd6f939a46dfe451a497bb6c12a8.png" alt="(x_1, \ldots, x_k)"/> and order <img class="math" src="../_images/math/765e17a2d2e6d07cb48ba9b4a9226ee08d903ba5.png" alt="(n_1, \ldots, n_k)"/>, the partial derivative <img class="math" src="../_images/math/6bfc4fc58bdbb9c06434cd565c66b7de5b03ec32.png" alt="f^{(n_1,\ldots,n_k)}(x_1,\ldots,x_k)"/> is evaluated. For example:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="mi">3</span><span class="o">*</span><span class="n">x</span><span class="o">*</span><span class="n">y</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">y</span> <span class="o">-</span> <span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> <span class="go">2.75</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="mi">3</span><span class="o">*</span><span class="n">x</span><span class="o">*</span><span class="n">y</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">y</span> <span class="o">-</span> <span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> <span class="go">3.0</span> </pre></div> </div> <p><strong>Options</strong></p> <p>The following optional keyword arguments are recognized:</p> <dl class="docutils"> <dt><tt class="docutils literal"><span class="pre">method</span></tt></dt> <dd>Supported methods are <tt class="docutils literal"><span class="pre">'step'</span></tt> or <tt class="docutils literal"><span class="pre">'quad'</span></tt>: derivatives may be computed using either a finite difference with a small step size <img class="math" src="../_images/math/8189a5b5a0917b8c93350827be4038af1839139d.png" alt="h"/> (default), or numerical quadrature.</dd> <dt><tt class="docutils literal"><span class="pre">direction</span></tt></dt> <dd>Direction of finite difference: can be -1 for a left difference, 0 for a central difference (default), or +1 for a right difference; more generally can be any complex number.</dd> <dt><tt class="docutils literal"><span class="pre">addprec</span></tt></dt> <dd>Extra precision for <img class="math" src="../_images/math/8189a5b5a0917b8c93350827be4038af1839139d.png" alt="h"/> used to account for the function’s sensitivity to perturbations (default = 10).</dd> <dt><tt class="docutils literal"><span class="pre">relative</span></tt></dt> <dd>Choose <img class="math" src="../_images/math/8189a5b5a0917b8c93350827be4038af1839139d.png" alt="h"/> relative to the magnitude of <img class="math" src="../_images/math/26eeb5258ca5099acf8fe96b2a1049c48c89a5e6.png" alt="x"/>, rather than an absolute value; useful for large or tiny <img class="math" src="../_images/math/26eeb5258ca5099acf8fe96b2a1049c48c89a5e6.png" alt="x"/> (default = False).</dd> <dt><tt class="docutils literal"><span class="pre">h</span></tt></dt> <dd>As an alternative to <tt class="docutils literal"><span class="pre">addprec</span></tt> and <tt class="docutils literal"><span class="pre">relative</span></tt>, manually select the step size <img class="math" src="../_images/math/8189a5b5a0917b8c93350827be4038af1839139d.png" alt="h"/>.</dd> <dt><tt class="docutils literal"><span class="pre">singular</span></tt></dt> <dd>If True, evaluation exactly at the point <img class="math" src="../_images/math/26eeb5258ca5099acf8fe96b2a1049c48c89a5e6.png" alt="x"/> is avoided; this is useful for differentiating functions with removable singularities. Default = False.</dd> <dt><tt class="docutils literal"><span class="pre">radius</span></tt></dt> <dd>Radius of integration contour (with <tt class="docutils literal"><span class="pre">method</span> <span class="pre">=</span> <span class="pre">'quad'</span></tt>). Default = 0.25. A larger radius typically is faster and more accurate, but it must be chosen so that <img class="math" src="../_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/> has no singularities within the radius from the evaluation point.</dd> </dl> <p>A finite difference requires <img class="math" src="../_images/math/0e3efd9b14723a92c2ae891fe27780d5f8e2b215.png" alt="n+1"/> function evaluations and must be performed at <img class="math" src="../_images/math/99cb3f3a8b3bbfc702c5863d16602a06cded535d.png" alt="(n+1)"/> times the target precision. Accordingly, <img class="math" src="../_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/> must support fast evaluation at high precision.</p> <p>With integration, a larger number of function evaluations is required, but not much extra precision is required. For high order derivatives, this method may thus be faster if f is very expensive to evaluate at high precision.</p> <p><strong>Further examples</strong></p> <p>The direction option is useful for computing left- or right-sided derivatives of nonsmooth functions:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="nb">abs</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">direction</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="go">0.0</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="nb">abs</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">direction</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="go">1.0</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="nb">abs</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">direction</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span> <span class="go">-1.0</span> </pre></div> </div> <p>More generally, if the direction is nonzero, a right difference is computed where the step size is multiplied by sign(direction). For example, with direction=+j, the derivative from the positive imaginary direction will be computed:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="nb">abs</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">direction</span><span class="o">=</span><span class="n">j</span><span class="p">)</span> <span class="go">(0.0 - 1.0j)</span> </pre></div> </div> <p>With integration, the result may have a small imaginary part even even if the result is purely real:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="n">sqrt</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s">'quad'</span><span class="p">)</span> <span class="c"># doctest:+ELLIPSIS</span> <span class="go">(0.5 - 4.59...e-26j)</span> <span class="gp">>>> </span><span class="n">chop</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="go">0.5</span> </pre></div> </div> <p>Adding precision to obtain an accurate value:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span> <span class="mf">1e-30</span><span class="p">)</span> <span class="go">0.0</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span> <span class="mf">1e-30</span><span class="p">,</span> <span class="n">h</span><span class="o">=</span><span class="mf">0.0001</span><span class="p">)</span> <span class="go">-9.99999998328279e-31</span> <span class="gp">>>> </span><span class="n">diff</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span> <span class="mf">1e-30</span><span class="p">,</span> <span class="n">addprec</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span> <span class="go">-1.0e-30</span> </pre></div> </div> </dd></dl> <dl class="function"> <dt id="mpmath.diffs"> <tt class="descclassname">mpmath.</tt><tt class="descname">diffs</tt><big>(</big><em>ctx</em>, <em>f</em>, <em>x</em>, <em>n=None</em>, <em>**options</em><big>)</big><a class="headerlink" href="#mpmath.diffs" title="Permalink to this definition">¶</a></dt> <dd><p>Returns a generator that yields the sequence of derivatives</p> <div class="math"> <p><img src="../_images/math/3c0032274f8c788ae74a9e8bc21d0f3584b7d55c.png" alt="f(x), f'(x), f''(x), \ldots, f^{(k)}(x), \ldots" /></p> </div><p>With <tt class="docutils literal"><span class="pre">method='step'</span></tt>, <a title="mpmath.diffs" class="reference internal" href="#mpmath.diffs"><tt class="xref docutils literal"><span class="pre">diffs()</span></tt></a> uses only <img class="math" src="../_images/math/5a1380a26be4f09590e6a602879375d89631623a.png" alt="O(k)"/> function evaluations to generate the first <img class="math" src="../_images/math/8c325612684d41304b9751c175df7bcc0f61f64f.png" alt="k"/> derivatives, rather than the roughly <img class="math" src="../_images/math/7997d6cebe4296b1ac5139dce990c5eff08ec23b.png" alt="O(k^2)"/> evaluations required if one calls <a title="mpmath.diff" class="reference internal" href="#mpmath.diff"><tt class="xref docutils literal"><span class="pre">diff()</span></tt></a> <img class="math" src="../_images/math/8c325612684d41304b9751c175df7bcc0f61f64f.png" alt="k"/> separate times.</p> <p>With <img class="math" src="../_images/math/2d8bddb244f84c26228b4846d5c63730b5f3d9d5.png" alt="n < \infty"/>, the generator stops as soon as the <img class="math" src="../_images/math/174fadd07fd54c9afe288e96558c92e0c1da733a.png" alt="n"/>-th derivative has been generated. If the exact number of needed derivatives is known in advance, this is further slightly more efficient.</p> <p>Options are the same as for <a title="mpmath.diff" class="reference internal" href="#mpmath.diff"><tt class="xref docutils literal"><span class="pre">diff()</span></tt></a>.</p> <p><strong>Examples</strong></p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">mpmath</span> <span class="kn">import</span> <span class="o">*</span> <span class="gp">>>> </span><span class="n">mp</span><span class="o">.</span><span class="n">dps</span> <span class="o">=</span> <span class="mi">15</span> <span class="gp">>>> </span><span class="n">nprint</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">diffs</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">)))</span> <span class="go">[0.540302, -0.841471, -0.540302, 0.841471, 0.540302, -0.841471]</span> <span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">6</span><span class="p">),</span> <span class="n">diffs</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span> <span class="mi">1</span><span class="p">)):</span> <span class="gp">... </span> <span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">d</span><span class="p">))</span> <span class="gp">...</span> <span class="go">0 0.54030230586814</span> <span class="go">1 -0.841470984807897</span> <span class="go">2 -0.54030230586814</span> <span class="go">3 0.841470984807897</span> <span class="go">4 0.54030230586814</span> <span class="go">5 -0.841470984807897</span> </pre></div> </div> </dd></dl> </div> <div class="section" id="composition-of-derivatives-diffs-prod-diffs-exp"> <h2>Composition of derivatives (<tt class="docutils literal"><span class="pre">diffs_prod</span></tt>, <tt class="docutils literal"><span class="pre">diffs_exp</span></tt>)<a class="headerlink" href="#composition-of-derivatives-diffs-prod-diffs-exp" title="Permalink to this headline">¶</a></h2> <dl class="function"> <dt id="mpmath.diffs_prod"> <tt class="descclassname">mpmath.</tt><tt class="descname">diffs_prod</tt><big>(</big><em>ctx</em>, <em>factors</em><big>)</big><a class="headerlink" href="#mpmath.diffs_prod" title="Permalink to this definition">¶</a></dt> <dd><p>Given a list of <img class="math" src="../_images/math/fc97ef67268cd4e91bacdf12b8901d7036c9a056.png" alt="N"/> iterables or generators yielding <img class="math" src="../_images/math/1ecbc0edfd35a2c9616534ca23ba4b5e61c06da9.png" alt="f_k(x), f'_k(x), f''_k(x), \ldots"/> for <img class="math" src="../_images/math/c7c927d8ade4b3bb37ab8f3160422c53cb686bde.png" alt="k = 1, \ldots, N"/>, generate <img class="math" src="../_images/math/35335f5aa2da6f8f18cb9b63b7a80e5cc169b6e1.png" alt="g(x), g'(x), g''(x), \ldots"/> where <img class="math" src="../_images/math/94c00e05fa0172e4d6e514b793a7ba38aa0d1ccf.png" alt="g(x) = f_1(x) f_2(x) \cdots f_N(x)"/>.</p> <p>At high precision and for large orders, this is typically more efficient than numerical differentiation if the derivatives of each <img class="math" src="../_images/math/5adb41b6d0d7dec9195b2ce3dd1aa799dfcd0636.png" alt="f_k(x)"/> admit direct computation.</p> <p>Note: This function does not increase the working precision internally, so guard digits may have to be added externally for full accuracy.</p> <p><strong>Examples</strong></p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">mpmath</span> <span class="kn">import</span> <span class="o">*</span> <span class="gp">>>> </span><span class="n">mp</span><span class="o">.</span><span class="n">dps</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> <span class="n">mp</span><span class="o">.</span><span class="n">pretty</span> <span class="o">=</span> <span class="bp">True</span> <span class="gp">>>> </span><span class="n">f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">exp</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">u</span> <span class="o">=</span> <span class="n">diffs</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">v</span> <span class="o">=</span> <span class="n">mp</span><span class="o">.</span><span class="n">diffs_prod</span><span class="p">([</span><span class="n">diffs</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="n">diffs</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="n">diffs</span><span class="p">(</span><span class="n">sin</span><span class="p">,</span><span class="mi">1</span><span class="p">)])</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">1.23586333600241</span> <span class="go">1.23586333600241</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">0.104658952245596</span> <span class="go">0.104658952245596</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">-5.96999877552086</span> <span class="go">-5.96999877552086</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">-12.4632923122697</span> <span class="go">-12.4632923122697</span> </pre></div> </div> </dd></dl> <dl class="function"> <dt id="mpmath.diffs_exp"> <tt class="descclassname">mpmath.</tt><tt class="descname">diffs_exp</tt><big>(</big><em>ctx</em>, <em>fdiffs</em><big>)</big><a class="headerlink" href="#mpmath.diffs_exp" title="Permalink to this definition">¶</a></dt> <dd><p>Given an iterable or generator yielding <img class="math" src="../_images/math/6eaeec858cabeaf778756f042ae201eda0876509.png" alt="f(x), f'(x), f''(x), \ldots"/> generate <img class="math" src="../_images/math/35335f5aa2da6f8f18cb9b63b7a80e5cc169b6e1.png" alt="g(x), g'(x), g''(x), \ldots"/> where <img class="math" src="../_images/math/9ca600c38df28ae43abec44b4302583841bde3b4.png" alt="g(x) = \exp(f(x))"/>.</p> <p>At high precision and for large orders, this is typically more efficient than numerical differentiation if the derivatives of <img class="math" src="../_images/math/c96dd6ec1dc4ad7520fbdc78fcdbec9edd068d0c.png" alt="f(x)"/> admit direct computation.</p> <p>Note: This function does not increase the working precision internally, so guard digits may have to be added externally for full accuracy.</p> <p><strong>Examples</strong></p> <p>The derivatives of the gamma function can be computed using logarithmic differentiation:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">mpmath</span> <span class="kn">import</span> <span class="o">*</span> <span class="gp">>>> </span><span class="n">mp</span><span class="o">.</span><span class="n">dps</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> <span class="n">mp</span><span class="o">.</span><span class="n">pretty</span> <span class="o">=</span> <span class="bp">True</span> <span class="go">>>></span> <span class="gp">>>> </span><span class="k">def</span> <span class="nf">diffs_loggamma</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="gp">... </span> <span class="k">yield</span> <span class="n">loggamma</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="gp">... </span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="gp">... </span> <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> <span class="gp">... </span> <span class="k">yield</span> <span class="n">psi</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">x</span><span class="p">)</span> <span class="gp">... </span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="gp">...</span> <span class="gp">>>> </span><span class="n">u</span> <span class="o">=</span> <span class="n">diffs_exp</span><span class="p">(</span><span class="n">diffs_loggamma</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span> <span class="gp">>>> </span><span class="n">v</span> <span class="o">=</span> <span class="n">diffs</span><span class="p">(</span><span class="n">gamma</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">2.0</span> <span class="go">2.0</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">1.84556867019693</span> <span class="go">1.84556867019693</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">2.49292999190269</span> <span class="go">2.49292999190269</span> <span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">u</span><span class="p">);</span> <span class="nb">next</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="go">3.44996501352367</span> <span class="go">3.44996501352367</span> </pre></div> </div> </dd></dl> </div> <div class="section" id="fractional-derivatives-differintegration-differint"> <h2>Fractional derivatives / differintegration (<tt class="docutils literal"><span class="pre">differint</span></tt>)<a class="headerlink" href="#fractional-derivatives-differintegration-differint" title="Permalink to this headline">¶</a></h2> <dl class="function"> <dt id="mpmath.differint"> <tt class="descclassname">mpmath.</tt><tt class="descname">differint</tt><big>(</big><em>ctx</em>, <em>f</em>, <em>x</em>, <em>n=1</em>, <em>x0=0</em><big>)</big><a class="headerlink" href="#mpmath.differint" title="Permalink to this definition">¶</a></dt> <dd><p>Calculates the Riemann-Liouville differintegral, or fractional derivative, defined by</p> <div class="math"> <p><img src="../_images/math/cb3f8dd0c4965356179ff341ffe8b45834703dab.png" alt="\,_{x_0}{\mathbb{D}}^n_xf(x) \frac{1}{\Gamma(m-n)} \frac{d^m}{dx^m} \int_{x_0}^{x}(x-t)^{m-n-1}f(t)dt" /></p> </div><p>where <img class="math" src="../_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/> is a given (presumably well-behaved) function, <img class="math" src="../_images/math/26eeb5258ca5099acf8fe96b2a1049c48c89a5e6.png" alt="x"/> is the evaluation point, <img class="math" src="../_images/math/174fadd07fd54c9afe288e96558c92e0c1da733a.png" alt="n"/> is the order, and <img class="math" src="../_images/math/17f1249ad95b7682b8316ad21de8ce4ee9fdcf93.png" alt="x_0"/> is the reference point of integration (<img class="math" src="../_images/math/f5047d1e0cbb50ec208923a22cd517c55100fa7b.png" alt="m"/> is an arbitrary parameter selected automatically).</p> <p>With <img class="math" src="../_images/math/c766f9fce6070981e62f805a7cf7294baed4498e.png" alt="n = 1"/>, this is just the standard derivative <img class="math" src="../_images/math/bbad379658bd32e9b6479bbd666b93a96e6b48ba.png" alt="f'(x)"/>; with <img class="math" src="../_images/math/598a16d4b7dde3dec3a390109882d54bb0308ea5.png" alt="n = 2"/>, the second derivative <img class="math" src="../_images/math/85fbafec756a37f52333eb40e07673b92e85999b.png" alt="f''(x)"/>, etc. With <img class="math" src="../_images/math/56584f0779cf04f3f0d66161f78cb2175bd832c3.png" alt="n = -1"/>, it gives <img class="math" src="../_images/math/9a7ca706803ef77d2606f7199f6fabc9d7650017.png" alt="\int_{x_0}^x f(t) dt"/>, with <img class="math" src="../_images/math/7ef8073b3de4e6bb550c05a09a3852c9463a4a5d.png" alt="n = -2"/> it gives <img class="math" src="../_images/math/99e272575b108fb659eace5c6352ad4dfdbe600f.png" alt="\int_{x_0}^x \left( \int_{x_0}^t f(u) du \right) dt"/>, etc.</p> <p>As <img class="math" src="../_images/math/174fadd07fd54c9afe288e96558c92e0c1da733a.png" alt="n"/> is permitted to be any number, this operator generalizes iterated differentiation and iterated integration to a single operator with a continuous order parameter.</p> <p><strong>Examples</strong></p> <p>There is an exact formula for the fractional derivative of a monomial <img class="math" src="../_images/math/90954d0d6ad3d96701a5fbbd6e096d937f9ef43e.png" alt="x^p"/>, which may be used as a reference. For example, the following gives a half-derivative (order 0.5):</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">mpmath</span> <span class="kn">import</span> <span class="o">*</span> <span class="gp">>>> </span><span class="n">mp</span><span class="o">.</span><span class="n">dps</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> <span class="n">mp</span><span class="o">.</span><span class="n">pretty</span> <span class="o">=</span> <span class="bp">True</span> <span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="n">mpf</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">n</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="gp">>>> </span><span class="n">differint</span><span class="p">(</span><span class="k">lambda</span> <span class="n">t</span><span class="p">:</span> <span class="n">t</span><span class="o">**</span><span class="n">p</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="go">7.81764019044672</span> <span class="gp">>>> </span><span class="n">gamma</span><span class="p">(</span><span class="n">p</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">gamma</span><span class="p">(</span><span class="n">p</span><span class="o">-</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">x</span><span class="o">**</span><span class="p">(</span><span class="n">p</span><span class="o">-</span><span class="n">n</span><span class="p">)</span> <span class="go">7.81764019044672</span> </pre></div> </div> <p>Another useful test function is the exponential function, whose integration / differentiation formula easy generalizes to arbitrary order. Here we first compute a third derivative, and then a triply nested integral. (The reference point <img class="math" src="../_images/math/17f1249ad95b7682b8316ad21de8ce4ee9fdcf93.png" alt="x_0"/> is set to <img class="math" src="../_images/math/afac538740054d4786c170ef0123850adea5cdf9.png" alt="-\infty"/> to avoid nonzero endpoint terms.):</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">differint</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">exp</span><span class="p">(</span><span class="n">pi</span><span class="o">*</span><span class="n">x</span><span class="p">),</span> <span class="o">-</span><span class="mf">1.5</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="go">0.278538406900792</span> <span class="gp">>>> </span><span class="n">exp</span><span class="p">(</span><span class="n">pi</span><span class="o">*-</span><span class="mf">1.5</span><span class="p">)</span> <span class="o">*</span> <span class="n">pi</span><span class="o">**</span><span class="mi">3</span> <span class="go">0.278538406900792</span> <span class="gp">>>> </span><span class="n">differint</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">exp</span><span class="p">(</span><span class="n">pi</span><span class="o">*</span><span class="n">x</span><span class="p">),</span> <span class="mf">3.5</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="n">inf</span><span class="p">)</span> <span class="go">1922.50563031149</span> <span class="gp">>>> </span><span class="n">exp</span><span class="p">(</span><span class="n">pi</span><span class="o">*</span><span class="mf">3.5</span><span class="p">)</span> <span class="o">/</span> <span class="n">pi</span><span class="o">**</span><span class="mi">3</span> <span class="go">1922.50563031149</span> </pre></div> </div> <p>However, for noninteger <img class="math" src="../_images/math/174fadd07fd54c9afe288e96558c92e0c1da733a.png" alt="n"/>, the differentiation formula for the exponential function must be modified to give the same result as the Riemann-Liouville differintegral:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="n">mpf</span><span class="p">(</span><span class="mf">3.5</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">pi</span> <span class="gp">>>> </span><span class="n">n</span> <span class="o">=</span> <span class="mi">1</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">j</span> <span class="gp">>>> </span><span class="n">differint</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">exp</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">x</span><span class="p">),</span> <span class="n">x</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="go">(-123295.005390743 + 140955.117867654j)</span> <span class="gp">>>> </span><span class="n">x</span><span class="o">**</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">)</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="n">c</span><span class="p">)</span><span class="o">**</span><span class="n">x</span> <span class="o">*</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">c</span><span class="p">)</span><span class="o">**</span><span class="n">n</span> <span class="o">*</span> <span class="n">gammainc</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="o">*</span><span class="n">c</span><span class="p">)</span> <span class="o">/</span> <span class="n">gamma</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">)</span> <span class="go">(-123295.005390743 + 140955.117867654j)</span> </pre></div> </div> </dd></dl> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="../index.html">Table Of Contents</a></h3> <ul> <li><a class="reference external" href="#">Differentiation</a><ul> <li><a class="reference external" href="#numerical-derivatives-diff-diffs">Numerical derivatives (<tt class="docutils literal"><span class="pre">diff</span></tt>, <tt class="docutils literal"><span class="pre">diffs</span></tt>)</a></li> <li><a class="reference external" href="#composition-of-derivatives-diffs-prod-diffs-exp">Composition of derivatives (<tt class="docutils literal"><span class="pre">diffs_prod</span></tt>, <tt class="docutils literal"><span class="pre">diffs_exp</span></tt>)</a></li> <li><a class="reference external" href="#fractional-derivatives-differintegration-differint">Fractional derivatives / differintegration (<tt class="docutils literal"><span class="pre">differint</span></tt>)</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="sums_limits.html" title="previous chapter">Sums, products, limits and extrapolation</a></p> <h4>Next topic</h4> <p class="topless"><a href="integration.html" title="next chapter">Numerical integration (quadrature)</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../_sources/calculus/differentiation.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../modindex.html" title="Global Module Index" >modules</a> |</li> <li class="right" > <a href="integration.html" title="Numerical integration (quadrature)" >next</a> |</li> <li class="right" > <a href="sums_limits.html" title="Sums, products, limits and extrapolation" >previous</a> |</li> <li><a href="../index.html">mpmath v0.17 documentation</a> »</li> <li><a href="index.html" >Numerical calculus</a> »</li> </ul> </div> <div class="footer"> © Copyright 2010, Fredrik Johansson. Last updated on Feb 06, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.6. </div> </body> </html>