Le concept de fonction est visiblement très abstrait pour les élèves du lycée, alors quand on leur apprend à dériver ou intégrer la fonction, ils ne savent pas très bien quoi dériver ou intégrer. En fait, la notion d’expression même est abstraite, et les élèves confondent souvent les deux notions de fonction et d’expression (et le prof les y encourage parfois en demandant de factoriser la fonction après l’avoir dérivée...)
Sur la définition de l’engagement direct, voir sa génèse et son apparition dans un contexte différent.
Contrairement à GeoGebra, CaRMetal n’a que des repères orthonormés, ce qui le rend parfaitement adapté à la géométrie euclidienne (dans GeoGebra, parfois, les cercles ressemblent à des ellipses) mais pas trop adapté à l’étude expérimentale de fonctions. Voire...
Les deux logiciels permettent de jongler entre
Et, de surcroît, ils permettent l’engagement direct, entre autres par le biais de leurs curseurs.
Dans CaRMetal, une expression peut être stockée dans une "boîte d’entrée numérique", théoriquement destinée à caser des nombres modifiables dans la figure, mais en réalité on peut aussi y mettre du texte, un peu comme les cellules d’un tableur.
Si on décide d’appeler y la fameuse boîte, on se souviendra désormais qu’il s’agit d’y caser l’expression de la fonction f :
Dans tout l’article, on va prendre pour exemple la fonction $f(x)=\frac{x^3}{25}-x$ définie sur [-5 ;5]. C’est donc l’expression qu’on peut entrer dans y. Pour rendre un peu plus concrète cette expression, on peut la tester avec plusieurs valeurs de x, qui seront entrées comme valeurs numériques ("expressions" dans le vocabulaire de CaRMetal) dont le nom doit absolument être x pour que y le reconnaisse. Par exemple, on crée une expression x qu’on cursorise :
Enfin, il suffit de créer une nouvelle expression (E4 ci-dessous) et de lui donner y comme valeur :
On voit que l’image de -5 par la fonction est 0, mais en manipulant le curseur, on peut voir des images d’autres nombres par cette fonction : Engagement direct [1]...
Des exemples d’exerciciels en ligne utilisant cette technique sont visibles ici et là.
On peut également étendre la technique à des fonctions de plusieurs variables (entrer la taille avec un point décimal au lieu de la virgule, la version de CaRMetal servant de plugin à ce site ayant semble-t-il quelques caprices) :
Cet exemple montre bien l’avance de CaRMetal en terme d’engagement direct : Pendant qu’on modifie la taille ou la masse, l’IMC se met à jour au fur et à mesure.
Pour entrer un tableau de valeurs, il faut commencer par créer une fonction ; CaRMetal offre le choix entre une "user function" qui est juste une fonction (de 1, 2 ou 3 variables) non représentée graphiquement, et une "représentation graphique" qui est associée à une fonction ayant le même nom qu’elle. On en profite pour déterminer les bornes de son domaine de définition et le pas de la représentation graphique (facultatif) :
Pour aller vers un tableau de valeurs, on peut attacher un point à la représentation graphique [2] et afficher ses coordonnées ; le pas est réglable avec l’incrément du point :
En bougeant ce point , on lit sur la figure des couples de valeurs à placer dans le tableau.
GeoGebra possédant un tableur, il est possible de remplir automatiquement celui-ci par le mouvement du point A attaché à la courbe [3] :
On va voir ci-dessous qu’on peut faire de même avec CaRMetal, mais en JavaScript plutôt qu’avec un tableur [4].
Pour ça on va plutôt attacher un point au segment [-5,5] pour servir de pilote à M (le point de la courbe). Ce point s’appelle P et on peut lui donner un incrément de 0,01 par exemple :
Ce nom peut être récupéré dans JavaScript, et on peut créer un point M dont l’abscisse est celle de P et l’ordonnée, l’image de son abscisse par f ; ensuite, dans une boucle, on fait bouger P et on lit les coordonnées de M qu’on place dans un tableau :
Une petite variante consiste à placer une pause dans le script ce qui permet de voir comment il fonctionne, et de voir le tableau se construire au fur et à mesure :
Une autre variante consiste à construire le point M dans la figure, en lui donnant directement les coordonnées x(P) et f(x(P)), puis à n’écrire comme script, que celui créant une ligne du tableau :
Dans ce cas, pour avoir plusieurs lignes du tableau, on peut transformer ce script en CaRAScript, en l’attachant aux mouvements du point P :
L’hypersensibilité du script crée des lignes multiples qui n’existent pas dans le tableur de GeoGebra :
On peut détourner les scripts précédents pour qu’au lieu d’afficher un pseudo-tableau de valeurs dans la console de sortie, on crée un véritable tableau JavaScript ; par exemple, un tableau de tableaux, dont chaque entrée est un tableau [x,y] :
Une dernière variante consiste à créer dans JavaScript même un miroir de la fonction f, qui sera une vraie fonction JavaScript, en utilisant les possibilités d’introspection de CaRMetal :
Le script donnant le tableau de valeurs est plus léger que la version précédente :
En Seconde, on n’a pas de dérivée (voir l’onglet suivant) pour chercher le maximum d’une fonction sur un intervalle. Alors l’algorithme que découvrent spontanément les élèves avec un tableur [5] consiste tout simplement à chercher le plus grand des nombres du tableau de valeurs (voir l’onglet précédent pour voir comment on construit ce dernier).
Pour aider CaRMetal à placer le point sur courbe le plus haut possible (dont l’ordonnée sera donc le maximum), on peut simuler un de ces thermomètres à maxima : Créer un point Max dont l’ordonnée est le maximum entre elle-même et celle de M :
Après quelques coups de Monkey, on a la valeur du maximum à 4 décimales :
JavaScript possède également une fonction maximum ayant un nombre indéterminé de variables ; on peut la "mapper" sur un tableau (de valeurs) comme la fonction max de Python (langage) qu’on peut appliquer à une liste. En JavaScript, c’est "apply" qu’on invoque, en cherchant la méthode max de l’objet Math et en l’appliquant à un tableau (les lignes 1 à 6 et 12 à 15 sont expliquées dans l’onglet précédent) :
Pour avoir le maximum avec une meilleure précision, on peut changer l’intervalle de définition et le pas dans la ligne 13.
À titre de comparaison, voici la version Python3 (qui arrondit mieux que JavaScript) :
Une variante de cette méthode consiste à trier le tableau de valeurs dans l’ordre croissant et lire son dernier élément (qui est donc le plus grand de tous) :
Mais cette méthode, bien que basée sur l’algorithme de tri rapide, est plus lente que celle de la recherche de maximum vue précédemment.
CaRMetal possède son propre algorithme de recherche de maximum, qui cherche en fait, non le maximum, mais la valeur de x pour laquelle ce maximum est atteint [6]. Si on cherche le maximum sur l’intervalle [-4,-2], on crée une expression :
Pour avoir la valeur du maximum, il suffit donc de calculer l’image par f de l’expression précédente :
Bien entendu, JavaScript étant capable de piloter CaRMetal, on peut écrire un script en JavaScript qui utilise cette fonction max pour calculer le maximum (cela consiste en quelque sorte à faire sous-traiter le travail par CaRMetal, ce qui est intéressant compte-tenu de la précision de ce dernier) ; pour avoir l’abscisse du maximum (et en profiter pour conjecturer sa valeur exacte) :
Puis pour avoir le maximum lui-même :
Exemple : Bac STG CGRH métropole Réunion septembre 2007
Une entreprise produit des appareils électroménagers. Le coût horaire de production de x appareils est donné en euros par :
C (x) = x² + 50x + 100 pour x appartenant à [5 ; 40].(...)
Le coût moyen de production d’un objet est égal à f (x) =C(x)/x pour x appartenant à [5 ; 40].
(...)
Pour quelle valeur de x le coût moyen est-il minimal ? Préciser alors sa
valeur.
L’algorithme se décrit ainsi :
À part le fait qu’il faut un nombre entier d’appareils, cet algorithme marche plutôt bien, malgré le fait que la représentation graphique soit peu visible en repère orthonormé :
Coefficient directeur de la tangente
On peut définir le nombre dérivé de f en x comme le coefficient directeur de la tangente à la représentation graphique de f en x. Pour explorer cette notion, on peut utiliser la macro tangente qui construit cette tangente en un point de la courbe. Comme, pour CaRMetal, les coordonnées d’une droite sont celles d’un de ses vecteurs directeurs, il suffit de donner à la tangente t un "alias" égal au quotient de ces coordonnées pour afficher le nombre dérivé :
Dans la fenêtre de l’"historique", on a également accès à l’équation cartésienne de la droite :
ce qui permet de calculer aussi le nombre dérivé.
Cette méthode permet aussi d’introduire la notion de fonction dérivée, avec la trace d’un point dont l’ordonnée est le nombre dérivé en x (qui est son abscisse) :
En fait, la macro tangente utilise le calcul numérique (avec assez grande précision) du nombre dérivé que permet CaRMetal. La notation est diff. Par exemple, pour calculer le nombre dérivé en 2 :
Et pour représenter graphiquement la fonction dérivée, on peut utiliser ce script, qui explore, en la représentant graphiquement, la dérivée de la fonction cosinus (en radians) :
(le point de coordonnées (x ;f’(x)) est rouge, petit et laisse une trace sur l’écran). On peut aussi représenter graphiquement la fonction dérivée de f avec
Notation différentielle
On peut également définir la dérivée comme quotient d’une petite variation de y par une petite variation de x. Ça tombe bien, CaRMetal possède une fonction d qui calcule ces petites différences.
On suppose donc qu’un point M est attaché à la représentation graphique de f, alors la petite [7] variation de l’abscisse est une expression égale à d(x(M)) (ou d(x(P)), ça revient au même) :
De même, on crée une expression E2 égale à d(y(P)) :
Après ça, il suffit de créer une nouvelle expression égale à E2/E1, et on a une approximation de la dérivée, avec une précision correcte tant que la dérivée n’est pas trop proche de 0.
Le résultat est visible en tête du diaporama téléchargeable en bas de l’article.
Cette activité a le mérite d’expliquer la notation $\frac{df}{dx}$ parfois utilisée pour la dérivée.
Fonctionnelle
La dérivée est une fonctionnelle, c’est-à-dire une fonction portant sur des fonctions (en effet, la dérivée d’une fonction est une fonction). Bien que ce concept soit encore plus abstrait que les fonctions numériques, il est très utile en analyse, la primitive, les transformées de Fourier et de Laplace étant elles aussi des fonctionnelles. Or JavaScript sait gérer des fonctionnelles, il suffit de définir une fonction dont la variable est une fonction, et qui retourne une fonction :
La première fonction est la fonction cube, comme son nom l’indique (une fonction numérique donc). La seconde est la dérivée d’une fonction f quelconque (calculée numériquement, mais c’est une fonctionnelle). Le script affiche un tableau de valeurs de la dérivée de la fonction cube, ce qui aide à conjecturer la forme de cette dérivée.
Cette fonctionnelle, ou un analogue, est implémentée dans JSXGraph ; voir à ce sujet le dernier onglet.
Avec notations différentielles
Dans l’onglet précédent, on avait divisé dy par dx pour avoir le nombre dérivé. Si, au contraire, on multiplie dx par f(x), on obtient l’aire d’un rectangle très fin, de largeur dx, et de hauteur f(x), comme ceux qu’on additionne dans les sommes de Riemann. Si on a donc les expressions suivantes dans la figure :
alors E4 est proche de l’intégrale de f entre -5 et x(P) (à condition de l’annuler lorsque P est tout à gauche). On voit l’effet produit dans la seconde figure du diaporama téléchargeable en bas de page. On constate que l’approximation devient de pire en pire au fur et à mesure que P se déplace vers la droite : Avec beaucoup d’additions, les erreurs d’addition s’accumulent.
Néanmoins cette activité montre plutôt mieux que les sommes de Riemann, l’origine de la notation $\int f(x) dx$, en particulier le pourquoi de cet encombrant dx...
La technique est numériquement plus stable en dimension 2 (diapo numéro 13 ; mais c’est avec les nombres complexes).
Calcul d’intégrale par Romberg
Pour calculer l’intégrale de f entre -5 et 0, on crée une expression CaRMetal égale à
Si f est une fonction existant sur la figure (représentée ou non), une primitive de f est donc bien approchée par
Ce calcul numérique de primitive sera exploité dans l’onglet suivant, avec des fonctions de répartition.
Intégrateur en ligne
La figure ci-dessous est vide, elle ne contient que ce script :
Elle permet de calculer l’intégrale d’une fonction entre deux bornes :
La syntaxe est celle de CaRMetal, la liste de fonctions disponibles est décrite ici :
Les intégrales dépendant de leur borne supérieure permettent à CaRMetal de faire comme le calculateur de probabilité de GeoGebra, mais sans le superflu [8]. Voici des fichiers en ligne calculant et illustrant ces probabilités, avec leur procédé de fabrication (pour les détails, voir le diaporama téléchargeable en bas de page ; cliquer droit sur un objet pour voir comment il est fait) :
Loi exponentielle
Loi normale
Théorème central limite
Grâce à un CaRAScript, la dernière figure du diaporama ci-dessous dessine la densité de la somme de n variables aléatoires uniformes [9], n étant cursorisé. Cette densité approche assez vite d’une courbe en cloche, ce qui illustre le théorème central limite. JavaScript est utilisé pour modifier l’expression de f(x), en construisant une chaîne de caractères ; cette figure est donc une synthèse de tout l’article.
Qui dit JavaScript, dit JSXGraph. Il est donc naturel de voir comment ce logiciel gère les fonctions et leurs représentations graphiques.
Représentation graphique
Pour la représentation graphique, il suffit d’utiliser functiongraph avec les bornes de l’intervalle :
Tout d’abord, on doit placer dans la page un lien vers l’exécutable de JSXGraph (à l’intérieur du code html) :
<link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css"/>
<script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore-0.92.js">
</script>
Ensuite, on crée (toujours dans le html) une division de type jxgbox (le fichier css de JSXGraph se charge de détailler son style) ; et dans un script (en JavaScript donc), on crée une figure avec des axes et un cadre :
<div id="box" class="jxgbox" style="width:400px; height:300px;"></div>
<script type="text/javascript">
var figure = JXG.JSXGraph.initBoard('box',{axis:true, boundingbox:[-5,3,5,-3]});
</script>
Enfin, on crée (toujours dans le script) une fonction f et sa représentation graphique :
Voici le résultat (qu’on peut zoomer en ligne) :
Point sur courbe
En rajoutant un glider, on a aussi un point sur la courbe (le bouger pour voir ses coordonnées) :
<div id="box" class="jxgbox" style="width:400px; height:300px;"></div>
<script type="text/javascript">
var figure = JXG.JSXGraph.initBoard('box',{axis:true, boundingbox:[-5,3,5,-3]});
var f=function(x){return x*x*x/25-x;}
var graphe=figure.create('functiongraph',[f,-5,5],{strokeColor:'blue'});
var mobile=figure.create('glider',[graphe]);
</script>
Ce qui donne ceci :
Calcul différentiel et intégral
Voici quelques exemples :
Probabilités
JSXGraph possède des fonctions qui n’existent pas nativement en JavaScript et qui peuvent être intéressantes pour la classe (au moins au TBI) :
L’avantage de l’intégration de JSXGraph dans html, c’est qu’on peut utiliser JavaScript pour faire un tableau html ; ici ça donne
<div id='tableau'>
<script type="text/javascript">
function f(x){
return x*x*x/25-x;
}
var tabvaleurs='<table border="5"><tr><th>x</th><th>f(x)</th></tr>';
for(x=-5;x<=5;x=x+0.4){
tabvaleurs+='<tr><td>'+x+'</td><td>'+f(x)+'</td></tr>';
}
tabvaleurs+='</table>';
document.getElementById('tableau').innerHTML=tabvaleurs;
</script>
</div>
qui produit l’effet suivant :
Figures à télécharger :
Bibliographie : fondements pour un enseignement de l’analyse en termes d’ordre de grandeur de R. Lutz, A. Makhlouf, E. Meyer, en particulier le chapitre sur les fonctions.
Webographie :
[1] La manip équivalente est plus rapide avec GeoGebra, en n’utilisant que la fenêtre algèbre - bien que GeoGebra ait aussi des "champs texte" - en entrant simplement f(x)=x^3/25-x puis en créant un curseur a et en entrant b=f(a). Mais cette simplicité mène au risque de confusion entre la fonction et sa représentation graphique, à moins de penser à ne pas afficher la fenêtre graphique.
[2] il suffit pour cela de cliquer quelque part sur la courbe au moment de la création du point
[3] clic droit sur A, puis "enregistrer dans tableur"
[4] le tableur de GeoGebra a été créé sous JavaScript...
[5] nonobstant la lecture graphique, plus rapide et moins précise
[6] GeoGebra a aussi une instruction Max qui, appliquée à une fonction, crée un point, ce qui permet d’obtenir à la fois la valeur du maximum et l’endroit où celui-ci est atteint (avec une précision remarquable). Au risque que les élèves confondent le maximum avec le point.
[7] petite à condition de ne pas bouger trop vite le point pilote P, et que son incrément ne soit pas trop grand ; ce sont ces contraintes qui ont mené au titre de cet article, l’élève étant en engagement direct avec les variations qu’il lui appartient de rendre le plus infinitésimales possibles
[8] Que tous ceux qui utilisent les lois de Pascal, Student, Khi², Fisher, Cauchy, Weibull, Gamma, LogNormale, logistique et hypergéométrique dans leur cours de lycée lèvent le doigt !
[9] la loi Irwin-Hall