<!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>Problèmes fréquents concernant les fonctions — Tutoriel Sage v5.9</title> <link rel="stylesheet" href="_static/sage.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '', VERSION: '5.9', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/translations.js"></script> <link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="top" title="Tutoriel Sage v5.9" href="index.html" /> <link rel="up" title="Visite guidée" href="tour.html" /> <link rel="next" title="Anneaux de base" href="tour_rings.html" /> <link rel="prev" title="Graphiques" href="tour_plotting.html" /> <link rel="icon" href="_static/sageicon.png" type="image/x-icon" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="Index général" accesskey="I">index</a></li> <li class="right" > <a href="py-modindex.html" title="Index des modules Python" >modules</a> |</li> <li class="right" > <a href="tour_rings.html" title="Anneaux de base" accesskey="N">suivant</a> |</li> <li class="right" > <a href="tour_plotting.html" title="Graphiques" accesskey="P">précédent</a> |</li> <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a> <li><a href="index.html">Tutoriel Sage v5.9</a> »</li> <li><a href="tour.html" accesskey="U">Visite guidée</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="problemes-frequents-concernant-les-fonctions"> <span id="section-functions-issues"></span><h1>Problèmes fréquents concernant les fonctions<a class="headerlink" href="#problemes-frequents-concernant-les-fonctions" title="Lien permanent vers ce titre">¶</a></h1> <p>La définition de fonctions, par exemple pour calculer leurs dérivées ou tracer leurs courbes représentatives, donne lieu à un certain nombre de confusions. Le but de cette section est de clarifier quelques points à l’origine de ces confusions.</p> <p>Il y a plusieurs façons de définir un objet que l’on peut légitimement appeler « fonction ».</p> <p>1. Définir une fonction Python, comme expliqué dans la section <a class="reference internal" href="tour_help.html#section-functions"><em>Fonctions, indentation et itération</em></a>. Les fonctions Python peuvent être utilisées pour tracer des courbes, mais pas dérivées ou intégrées symboliquement:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: def f(z): return z^2</span> <span class="go">sage: type(f)</span> <span class="go"><type 'function'></span> <span class="go">sage: f(3)</span> <span class="go">9</span> <span class="go">sage: plot(f, 0, 2)</span> </pre></div> </div> <p>Remarquez la syntaxe de la dernière ligne. Écrire plutôt <tt class="docutils literal"><span class="pre">plot(f(z),</span> <span class="pre">0,</span> <span class="pre">2)</span></tt> provoquerait une erreur : en effet, le <tt class="docutils literal"><span class="pre">z</span></tt> qui apparaît dans la définition de <tt class="docutils literal"><span class="pre">f</span></tt> est une variable muette qui n’a pas de sens en-dehors de la définition. Un simple <tt class="docutils literal"><span class="pre">f(z)</span></tt> déclenche la même erreur. En l’occurrence, faire de <tt class="docutils literal"><span class="pre">z</span></tt> une variable symbolique comme dans l’exemple ci-dessous fonctionne, mais cette façon de faire soulève d’autres problèmes (voir le point 4 ci-dessous), et il vaut mieux s’abstenir de l’utiliser</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: var('z') # on définit z comme variable symbolique</span> <span class="go">z</span> <span class="go">sage: f(z)</span> <span class="go">z^2</span> <span class="go">sage: plot(f(z), 0, 2)</span> </pre></div> </div> <p>L’appel de fonction <tt class="docutils literal"><span class="pre">f(z)</span></tt> renvoie ici l’expression symbolique <tt class="docutils literal"><span class="pre">z^2</span></tt>, qui est alors utilisée par la fonction <tt class="docutils literal"><span class="pre">plot</span></tt>.</p> <p>2. Définir une expression symbolique fonctionnelle (« appelable »). Une telle expression représente une fonction dont on peut tracer le graphe, et que l’on peut aussi dériver ou intégrer symboliquement</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: g(x) = x^2</span> <span class="go">sage: g # g envoie x sur x^2</span> <span class="go">x |--> x^2</span> <span class="go">sage: g(3)</span> <span class="go">9</span> <span class="go">sage: Dg = g.derivative(); Dg</span> <span class="go">x |--> 2*x</span> <span class="go">sage: Dg(3)</span> <span class="go">6</span> <span class="go">sage: type(g)</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> <span class="go">sage: plot(g, 0, 2)</span> </pre></div> </div> <p>Notez que, si <tt class="docutils literal"><span class="pre">g</span></tt> est une expression symbolique fonctionnelle (<tt class="docutils literal"><span class="pre">x</span> <span class="pre">|--></span> <span class="pre">x^2</span></tt>), l’objet <tt class="docutils literal"><span class="pre">g(x)</span></tt> (<tt class="docutils literal"><span class="pre">x^2</span></tt>) est d’une nature un peu différente. Les expressions comme <tt class="docutils literal"><span class="pre">g(x)</span></tt> peuvent aussi être tracées, dérivées, intégrées, etc., avec cependant quelques difficultés illustrées dans le point 5 ci-dessous.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: g(x)</span> <span class="go">x^2</span> <span class="go">sage: type(g(x))</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> <span class="go">sage: g(x).derivative()</span> <span class="go">2*x</span> <span class="go">sage: plot(g(x), 0, 2)</span> </pre></div> </div> <p>3. Utiliser une fonction usuelle prédéfinie de Sage. Celles-ci peuvent servir à tracer des courbes, et, indirectement, être dérivées ou intégrées</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: type(sin)</span> <span class="go"><class 'sage.functions.trig.Function_sin'></span> <span class="go">sage: plot(sin, 0, 2)</span> <span class="go">sage: type(sin(x))</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> <span class="go">sage: plot(sin(x), 0, 2)</span> </pre></div> </div> <p>Il n’est pas possible de dériver la fonction <tt class="docutils literal"><span class="pre">sin</span></tt> tout court pour obtenir <tt class="docutils literal"><span class="pre">cos</span></tt></p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f = sin</span> <span class="go">sage: f.derivative()</span> <span class="gt">Traceback (most recent call last):</span> <span class="c">...</span> <span class="gr">AttributeError</span>: <span class="n">...</span> </pre></div> </div> <p>Une possibilité est de remplacer <tt class="docutils literal"><span class="pre">f</span> <span class="pre">=</span> <span class="pre">sin</span></tt> par <tt class="docutils literal"><span class="pre">f</span> <span class="pre">=</span> <span class="pre">sin(x)</span></tt>, mais il est généralement préférable de définir une expression symbolique fonctionnelle <tt class="docutils literal"><span class="pre">f(x)</span> <span class="pre">=</span> <span class="pre">sin(x)</span></tt></p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: S(x) = sin(x)</span> <span class="go">sage: S.derivative()</span> <span class="go">x |--> cos(x)</span> </pre></div> </div> <p>Examinons maintenant quelques problèmes fréquents.</p> <p>4. Évaluation accidentelle</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: def h(x):</span> <span class="gp">... </span> <span class="k">if</span> <span class="n">x</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span> <span class="gp">... </span> <span class="k">return</span> <span class="mi">0</span> <span class="gp">... </span> <span class="k">else</span><span class="p">:</span> <span class="gp">... </span> <span class="k">return</span> <span class="n">x</span><span class="o">-</span><span class="mi">2</span> </pre></div> </div> <p>Problème : <tt class="docutils literal"><span class="pre">plot(h(x),</span> <span class="pre">0,</span> <span class="pre">4)</span></tt> trace la droite <img class="math" src="_images/math/9c36931fc180e3596ce6d7b1fb1aa3da65686661.png" alt="y = x - 2"/>, et non pas la fonction affine par morceaux définie par <tt class="docutils literal"><span class="pre">h</span></tt>. Pourquoi ? Lors de l’exécution, <tt class="docutils literal"><span class="pre">plot(h(x),</span> <span class="pre">0,</span> <span class="pre">4)</span></tt> évalue d’abord <tt class="docutils literal"><span class="pre">h(x)</span></tt> : la fonction Python <tt class="docutils literal"><span class="pre">h</span></tt> est appelée avec le paramètre <tt class="docutils literal"><span class="pre">x</span></tt>, et la condition <tt class="docutils literal"><span class="pre">x</span> <span class="pre"><</span> <span class="pre">2</span></tt> est donc évaluée.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: type(x < 2)</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> </pre></div> </div> <p>Or, l’évaluation d’une inégalité symbolique renvoie False quand la condition n’est pas clairement vraie. Ainsi, <tt class="docutils literal"><span class="pre">h(x)</span></tt> s’évalue en <tt class="docutils literal"><span class="pre">x</span> <span class="pre">-</span> <span class="pre">2</span></tt>, et c’est cette expression-là qui est finalement tracée.</p> <p>Solution : Il ne faut pas utiliser <tt class="docutils literal"><span class="pre">plot(h(x),</span> <span class="pre">0,</span> <span class="pre">4)</span></tt>, mais plutôt</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: def h(x):</span> <span class="gp">... </span> <span class="k">if</span> <span class="n">x</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span> <span class="gp">... </span> <span class="k">return</span> <span class="mi">0</span> <span class="gp">... </span> <span class="k">else</span><span class="p">:</span> <span class="gp">... </span> <span class="k">return</span> <span class="n">x</span><span class="o">-</span><span class="mi">2</span> <span class="go">sage: plot(h, 0, 4)</span> </pre></div> </div> <p>5. Constante plutôt que fonction</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f = x</span> <span class="go">sage: g = f.derivative()</span> <span class="go">sage: g</span> <span class="go">1</span> </pre></div> </div> <p>Problème : <tt class="docutils literal"><span class="pre">g(3)</span></tt> déclenche une erreur avec le message « ValueError: the number of arguments must be less than or equal to 0 ».</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: type(f)</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> <span class="go">sage: type(g)</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> </pre></div> </div> <p>En effet, <tt class="docutils literal"><span class="pre">g</span></tt> n’est pas une fonction, mais une constante, sans variable en laquelle on peut l’évaluer.</p> <p>Solution : il y a plusieurs possibilités.</p> <ul> <li><p class="first">Définir <tt class="docutils literal"><span class="pre">f</span></tt> comme une expression symbolique fonctionnelle</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f(x) = x # au lieu de 'f = x'</span> <span class="go">sage: g = f.derivative()</span> <span class="go">sage: g</span> <span class="go">x |--> 1</span> <span class="go">sage: g(3)</span> <span class="go">1</span> <span class="go">sage: type(g)</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> </pre></div> </div> </li> <li><p class="first">Ou, sans changer la définition de <tt class="docutils literal"><span class="pre">f</span></tt>, définir <tt class="docutils literal"><span class="pre">g</span></tt> comme une expression symbolique fonctionnelle</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f = x</span> <span class="go">sage: g(x) = f.derivative() # au lieu de 'g = f.derivative()'</span> <span class="go">sage: g</span> <span class="go">x |--> 1</span> <span class="go">sage: g(3)</span> <span class="go">1</span> <span class="go">sage: type(g)</span> <span class="go"><type 'sage.symbolic.expression.Expression'></span> </pre></div> </div> </li> <li><p class="first">Ou encore, avec <tt class="docutils literal"><span class="pre">f</span></tt> et <tt class="docutils literal"><span class="pre">g</span></tt> définies comme dans l’exemple de départ, donner explicitement la variable à remplacer par sa valeur</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f = x</span> <span class="go">sage: g = f.derivative()</span> <span class="go">sage: g</span> <span class="go">1</span> <span class="go">sage: g(x=3) # au lieu de 'g(3)'</span> <span class="go">1</span> </pre></div> </div> </li> </ul> <p>Nous terminons en mettant encore une fois en évidence la différence entre les dérivées des expressions <tt class="docutils literal"><span class="pre">f</span></tt> définies par <tt class="docutils literal"><span class="pre">f</span> <span class="pre">=</span> <span class="pre">x</span></tt> et par <tt class="docutils literal"><span class="pre">f(x)</span> <span class="pre">=</span> <span class="pre">x</span></tt></p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f(x) = x</span> <span class="go">sage: g = f.derivative()</span> <span class="go">sage: g.variables() # variables apparaissant dans g</span> <span class="go">()</span> <span class="go">sage: g.arguments() # paramètres auxquels on peut donner une valeur dans g</span> <span class="go">(x,)</span> <span class="go">sage: f = x</span> <span class="go">sage: h = f.derivative()</span> <span class="go">sage: h.variables()</span> <span class="go">()</span> <span class="go">sage: h.arguments()</span> <span class="go">()</span> </pre></div> </div> <p>Comme l’illustre cet exemple, <tt class="docutils literal"><span class="pre">h</span></tt> n’accepte pas de paramètres. C’est pour cela que <tt class="docutils literal"><span class="pre">h(3)</span></tt> déclenche une erreur.</p> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h4>Sujet précédent</h4> <p class="topless"><a href="tour_plotting.html" title="Chapitre précédent">Graphiques</a></p> <h4>Sujet suivant</h4> <p class="topless"><a href="tour_rings.html" title="Chapitre suivant">Anneaux de base</a></p> <h3>Cette page</h3> <ul class="this-page-menu"> <li><a href="_sources/tour_functions.txt" rel="nofollow">Montrer la source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Recherche rapide</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" size="18" /> <!-- The shading of the "Go" button should be consistent --> <!-- with the colour of the header and footer. See the file --> <!-- doc/common/themes/sage/theme.conf for colours used by --> <!-- the Sage theme. --> <input type="submit" style="background-color: #B8B9F6" 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%"> Saisissez un mot clef ou un nom de module, classe ou fonction. </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="Index général" >index</a></li> <li class="right" > <a href="py-modindex.html" title="Index des modules Python" >modules</a> |</li> <li class="right" > <a href="tour_rings.html" title="Anneaux de base" >suivant</a> |</li> <li class="right" > <a href="tour_plotting.html" title="Graphiques" >précédent</a> |</li> <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a> <li><a href="index.html">Tutoriel Sage v5.9</a> »</li> <li><a href="tour.html" >Visite guidée</a> »</li> </ul> </div> <div class="footer"> © Copyright 2005--2011, The Sage Development Team. Créé avec <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> <script type="text/javascript"> /*global jQuery, window */ /* Sphinx sidebar toggle. Putting this code at the end of the body * enables the toggle for the live, static, and offline docs. Note: * sage.misc.html.math_parse() eats jQuery's dollar-sign shortcut. */ var jq = jQuery; jq(document).ready(function () { var bar, bod, bg, fg, key, tog, wid_old, wid_new, resize, get_state, set_state; bod = jq('div.bodywrapper'); bar = jq('div.sphinxsidebar'); tog = jq('<div class="sphinxsidebartoggle"></div>'); /* Delayed resize helper. Not perfect but good enough. */ resize = function () { setTimeout(function () { tog.height(bod.height()); }, 100); }; jq(window).resize(function () { resize(); }); /* Setup and add the toggle. See Sphinx v0.5.1 default.css. */ fg = jq('div.sphinxsidebar p a').css('color') || 'rgb(152, 219, 204)'; bg = jq('div.document').css('background-color') || 'rgb(28, 78, 99)'; wid_old = '230px'; wid_new = '5px'; tog.css('background-color', bg) .css('border-width', '0px') .css('border-right', wid_new + ' ridge ' + bg) .css('cursor', 'pointer') .css('position', 'absolute') .css('left', '-' + wid_new) .css('top', '0px') .css('width', wid_new); bod.css('position', 'relative'); bod.prepend(tog); resize(); /* Cookie helpers. */ key = 'sphinxsidebar='; set_state = function (s) { var date = new Date(); /* Expiry in 7 days. */ date.setTime(date.getTime() + (7 * 24 * 3600 * 1000)); document.cookie = key + encodeURIComponent(s) + '; expires=' + date.toUTCString() + '; path=/'; }; get_state = function () { var i, c, crumbs = document.cookie.split(';'); for (i = 0; i < crumbs.length; i += 1) { c = crumbs[i].replace(/^\s+/, ''); if (c.indexOf(key) === 0) { return decodeURIComponent(c.substring(key.length, c.length)); } } return null; }; /* Event handlers. */ tog.mouseover(function (ev) { tog.css('border-right-color', fg); }).mouseout(function (ev) { tog.css('border-right-color', bg); }).click(function (ev) { if (bod.hasClass('wide')) { bod.removeClass('wide'); bod.css('margin-left', wid_old); bar.css('width', wid_old); bar.show(); set_state('visible'); } else { set_state('hidden'); bar.hide(); bar.css('width', '0px'); bod.css('margin-left', wid_new); bod.addClass('wide'); } resize(); }); /* Hide the normally visible sidebar? */ if (get_state() === 'hidden') { tog.trigger('click'); } else { set_state('visible'); } }); </script> </body> </html>