Algorithmique - Introduction aux CarScripts de CaRMetal

mardi 15 septembre 2009
par  Yves MARTIN

L’éditeur de CarScripts de CaRMetal est un éditeur javascript, mais surtout un éditeur qui intègre les outils de géométrie dynamique du logiciel. Nous voyons ici quelques premières utilisations, rédigées à l’attention des enseignants, et utilisables pour des formations continues.


Note après la publication de la version 3.5

Cet article a été écrit en septembre 2009. Depuis avril 2010 et la version 3.5, les scripts peuvent être inclus dans la figure.

Le contenu de cet article présente les bases des CarScript, mais on profitera des classeurs et des scripts dans les figures en consultant aussi ce lien qui contient plus de 50 scripts dont ceux de cet article

Cet article est rédigé à la fois pour présenter les possibilités des CaRscripts de CarMetal, mais aussi pour être utilisée en parallèle avec le logiciel CaRMetal dans sa version 3.1.1 ou ultérieure. C’est la raison pour laquelle les premiers onglets ne contiennent aucun applet java mais seulement des copies d’écran. Les scripts sont présentés à la fois en copie d’écran et en code à copier-coller dans l’éditeur, en général dans un bloc dépliable à cliquer. Les derniers onglets proposent les résultats obtenus en manipulation directe.

Si des figures sont nécessaires à l’utilisation d’un script, elles sont téléchargeables en fin d’article. Les figures produites le sont aussi. L’article est structuré en onglets selon l’organisation suivante :


Introduction : Découverte de l’interface. Présentation de l’organisation possible de ses scripts. L’intérêt des Carscripts.
Construction : Sur l’exemple élémentaire de l’orthocentre d’un triangle, nous abordons l’utilisation des outils comme fonction ou comme procédure.
Tournesol : Une première boucle d’abord statique en javascript « pur » puis ensuite avec une dimension dynamique en CarScript. Premières explorations de la syntaxe.
Euler : Mise en place d’un algorithme universel pour la méthode d’Euler, avec une fonction CaRMetal comme paramètre. Second niveau d’exploration de la syntaxe.
Toile : La toile d’araignée des suites récurrentes. Application des connaissances développées aux deux onglets précédents. Nouvel exemple de script générique applicable à toutes les fonctions.
Syntaxe : Un premier bilan de ce qui a été fait jusqu’ici est résumé dans cet onglet. C’est aussi l’occasion de proposer d’autres explorations sur la syntaxe.
Manipulations : Les figures précédentes, finalisées dans des applets.

L’expérience en formation (PDF téléchargeable en fin d’article) montre que la réalisation à la main de toutes les figures de ces onglets prend un peu moins de 3 h. Le copier coller des scripts comme proposé ici fait largement gagner du temps. Mais se tromper sur la syntaxe fait réfléchir aussi ...

Introduction

1. Découverte de l’interface - Organisation des scripts

Dans le menu principal de CaRMetal si on clique sur Javascript/ ouvrir l’éditeur de script , on a à sa disposition l’interface suivante :

La fenêtre d’édition est surmontée d’une barre d’icones :

  • un premier groupe de trois icones pour l’ouverture et l’enregistrement de scripts
  • un deuxième groupe de 4 icones composé
    • d’un switch « commentaire » qui transforme un texte en commentaire ou l’inverse
    • d’un outil de formatage du script
    • d’une annulation (multiple) de l’exécution des scripts
    • d’un bouton de lancement du script
  • une dernière icone renvoie à l’aide en ligne, actuellement en anglais. Rappelons qu’à la page de présentation de ce dossier sur les CarScripts, Alain Busser propose un manuel de référence de 56 pages qui reprend l’aide en ligne largement illustrée d’exemples que l’on peut utiliser par copier coller.

Déjà les habitués du javascript apprécieront les points 3 et 4 du deuxième groupe d’icones.

La partie droite est divisées en trois parties. Bien entendu, toutes les fonctions de la bibliothèque mathématique sont disponibles ainsi que toutes les instructions usuelles du javascript, les boutons correspondent aux plus usuelles pour une utilisation au lycée.

Si on le souhaite on peut copier le code proposé ci-dessous pour l’exécuter. Mais, pour cet exemple, il est plus intéressant de cliquer soi-même sur les boutons de l’éditeur pour voir son fonctionnement. Nous laissons au lecteur le soin d’imaginer ce que fait le script avant de le lancer.

for (i=0; i<20; i++){
x=2*Math.cos(Math.PI*i/10);
y=2*Math.sin(Math.PI*i/10);
p=Point(x,y);SetHide(p,true);
c=FixedCircle(p,2);
SetColor(c,"green");
}

On note en particulier que les items disponibles proposent en général une interaction implicite avec la figure. Si vous cliquez sur les icones de l’éditeur, vous devez ajuster les variables. Par exemple l’item de cercle fixe (FixedCircle) propose par défaut un point (éventuel) de la figure comme centre.

Tout ceci sera largement détaillé à l’onglet suivant.

Organisation de ses scripts

Cette partie est réservée à une seconde lecture, lors d’une utilisation intensive des scripts. Il s’agit d’organiser ses scripts dans des dossiers. Pour cela on observe que tant que l’on n’a pas défini un dossier de script, le menu javascript est le suivant :

On peut alors préparer un dossier de script, dans lequel on peut ajouter des dossiers internes (modifiables ensuite comme on le souhaite bien entendu. Et une fois que ce dossier a été choisi, le menu javascript s’enrichit de ces dossiers, éventuellement imbriqués :

Construction

2. Un premier script géométrique - Approche fonctionnelle et procédurale

Commençons par construire, en script, l’orthocentre d’un triangle

a) Prendre trois points (en cliquant sur l’icône point). Ils se présentent sous la forme fonctionnelle :

c’est à dire que Point est une fonction qui renvoie une variable JavaScript de type chaine de caractère r dont le contenu est le point (pour une première représentation). Les coordonnées ne sont qu’une initialisation.

b) Renommer les variables a, b et c. Puis exécuter ce script. Vérifier que l’on peut déplacer les points produits et, par clic-droit sur les points, qu’ils ne se nomment pas du tout a, b, et c, ni A, B, et C, mais probablement P1, P2, P3 (nommage interne par défaut).

Remarque de seconde lecture (au cas où vos points seraient nommés)

En fait le logiciel a beaucoup de fonctionnalités, dont le nommage automatique des objets. Il se peut que celui-ci soit activé par défaut. C’est le cas si on voit en haut à droite de l’onglet « Aspect et couleurs » une lettre comme ici le A :

alors bien entendu les points sont nommés, mais leur nom n’est pas affichés. C’est un choix naturel : en effet les scripts permettant de créer de centaines d’objets, ils sont a priori non nommés et leur noms non affichés. Il faut explicitement nommer les points, et explicitement demander l’affichage de leur nom.

c) Poursuivons en créant les côtés du triangle

Avant cela on peut annuler le lancement du premier script (mais on peut le faire juste avant de le lancer à nouveau par la suite). On utilise l’icône de segment qui produit une ligne comme

où E et K, entre guillemets, sont des noms de points éventuels de la figure, mis par défaut au hasard, sans rapport avec la figure. On modifie cette ligne en mettant à la place de ces noms de points , les variables JavaScript précédentes, sans guillemets, pour obtenir (utiliser le copier-coller) :

On peut à nouveau lancer le script (après avoir annulé l’effet du précédent) et vérifier qu’en déplaçant les points le segments se comportent comme attendu. Annuler à nouveau le script pour continuer.

d) construction des hauteurs et de l’orthocentre

On poursuit par l’utilisation de l’icône perpendiculaire. On remplace donc une expression générique de type

par les trois hauteurs, exprimées en fonction des variables JavaScript de la figure (indiquer d’abord la droite ou le segment, puis le point)

Et on termine par l’intersection en modifiant ce que donne l’icône d’intersection par

On a donc construit l’orthocentre d’un triangle en 10 étapes à partir d’une feuille blanche.

Lancer le script pour vérifier que l’on obtient ce qui était prévu et que la figure suit bien la manipulation directe sur les trois points de base. Vérifier ensuite que les perpendiculaires ont des noms internes au logiciel (perp1, etc).

Approche fonctionnelle et approche procédurale

On remarquera que ce script n’utilise que des variables JavaScript pour construire la figure. Les items utilisés sont alors des fonctions JavaScript qui renvoient un nom de variable (en fait toujours une chaine de caractère). On peut remarquer que l’on engage le même processus quand on écrit « soit d1 la parallèle à d passant par A » : on y sous entend que d1 est une droite et que A est un point, et l’on utilise le noms des objets pour les désigner.

La principale différence avec les textes des programmes de construction est que les points de la figure ne s’appellent pas a, b, c ni les droites hA, hB, hC. Ce type de script (fonctionnel) invite à une certaine distance par rapport aux objets qui sont tout de suite des variables. On peut considérer cela formateur, et aller dans ce sens, en favorisant ce type de scripts pour les constructions géométriques. On peut aussi juste n’y voir qu’une pratique naturelle d’un langage de programmation.

D’autres y trouveront un prétexte pour refuser cette approche, jugée assez éloignée d’une certaine pratique de classe. Il est alors intéressant de voir que les mêmes outils fonctionnels permettent d’avoir une approche uniquement procédurale, plus proche de la description des programmes de construction (de type chek list).

En effet les fonctions géométriques des Carscripts autorisent de nommer les objets. On peut donc travailler sur une figure géométrique dynamique où les points sont explicitement nommés. Par ailleurs il n’est pas nécessaire d’avoir cette approche fonctionnelle des objets géométriques (u=Point( …)). Les fonctions géométriques ajoutées au JavaScript se comportent aussi comme des procédures.

Reprenons le même script avec une approche purement procédurale :

Les points sont nommés : A, B et C sont les noms des points dans la figure, de même pour les segments. Ceux-ci sont définis directement par les noms des points.

On peut lancer ce premier script. A nouveau, les noms des points ne sont pas affichés, mais par un clic droit on peut vérifier qu’ils s’appellent bien A, B, et C. Pour voir les noms des points, il faudrait ajouter l’instruction


D’une manière générale, ce qui est entre guillemets se réfère directement à des objets de la figure.

Poursuivrons dans ce style procédural :

Les hauteurs s’appellent hA, hB, et hC comme on peut le vérifier en lançant le script (faire clic-droit sur les hauteurs pour voir les noms)

Dans cette approche les fonctions géométriques de JavaScript se comportent comme des procédures. On utilise alors les noms effectifs des objets produits par les outils antérieurs pour préciser sur quels objets s’opère la procédure. La démarche est de fait plus opérationnelle et la précédente clairement plus conceptuelle.

Bien-sûr, il est possible de mélanger les deux approches, par exemple une écriture comme u= Point(« A », 4, 2) est valide : on comprend bien que la rencontre des deux approches va permettre une souplesse particulièrement riche, surtout dans des boucles comme nous allons le voir dans le prochain onglet.

Premier exercice d’application

Ajouter au script précédent le cercle circonscrit au triangle (avec son centre) et le centre de gravité, puis tracer la droite d’Euler. Jouer avec les couleurs pour mettre les droites de type différent dans des couleurs différentes. Les couleurs de base sont par défaut « blue », « red », « green », « brown », « cyan », « black ».

Autre exercice d’application
éventuellement pour une seconde lecture ... même si le code est proposé.

Nous allons faire, dans un cas simple, une figure déjà construite à cette page dans un contexte un peu plus riche, pour illustrer que l’outil de cercle de rayon fixe est en fait un outil de cercle de rayon fonctionnel.

On se donne un cercle c_1 de centre O_1 et un point intérieur O_2. Par un point M appartenant au cercle c_1 on veut construire un triangle MNP dont c_1 est le cercle circonscrit et O_2 le centre du cercle inscrit. Autrement dit MNP est inscrit dans c_1 et circonscrit à c_2. La figure de départ est donc la suivante :

On noteras_1 le segment [O_1O_2] qui, même s’il n’est pas indispensable, est pratique pour avoir la distance entre les deux points : dans CaRMetal, le nom d’un segment est aussi une variable qui contient sa longueur.

Et le résultat, déjà utilisé pour présenter l’outil cercle fixe est rappelé en commentaire introductif de ce CarScript :

On remarquera que le cercle fixe a pour rayon une expression CaRMetal qui utilise à la fois les variables c_1 et s_1. On aurait pu aussi prendre une expression de CaRMetal pour calculer la distance entre les deux centres et utiliser cette expression. Les outils appelés sont ceux du logiciel ainsi on n’est pas surpris que la demi-droite d’origine M passant par I coupe le cercle c_1 en le point cherché (P) et non pas M, car c’est le comportement (« intelligent », ie qui correspond à l’engagement direct attendu) du logiciel.

Le CarScript donne la figure suivante :

Bien entendu, le script n’apporte rien de plus que les possibilités de constructions usuelles, dans le cas précis de cette figure, mais il montre comment prendre et traiter les données d’une figure.

Remarquons tout de même que ce script est, en fait, un programme de construction classique appliqué à des donnes qui correspondent aux hypothèses. Le langage étant élémentaire - même s’il est en anglais - on peut envisager de travailler parfois les programmes de constructions en classe avec cet outil, par exemple pour valider des productions d’élève lors d’un bilan d’activité.

Cliquer pour copier le script

// CercleFixe2

// Etant donné un cercle c1 de centre O1 et un point O2 intérieur à c1. Alors pour un point M du cercle c1, il existe un triangle inscrit à c1 et circonscrit à un cercle de centre O2 ssi le rayon du cercle de centre O2 vaut (R-d)(R+d)/2R avec d la distance entre les centre et R le rayon du cercle c1.

// On se propose de construire par carscript, d'abord ce cercle avec l'outil cercle fixe puis de finir la figure

// On sait que le nom d'un cercle est aussi une variable qui contient son rayon.

// Pour la distance d on a construit le segment [O1O2]. Il s'appelle s1.
// Le nom d'un segment est une variable qui contient sa longueur.

c2=FixedCircle("O2","(c1-s1)*(c1+s1)/(2*c1)");
SetRGBColor(c2,227,152,249);SetFilled(c2,true);
Shownames(); // instruction pour montrer tous les noms d'objet
i=MidPoint("O2","M");
c3=Circle(i,"M");SetColor(c3,"brown");
SetThickness(c3,"thin"); // c3 en pointillé
Intersection2("I","J",c2,c3);
Show("I,J", true);
r1=Ray("M","I");
a=Intersection("N",r1,"c1");Show(a,true);
r2=Ray("M","J");SetHide(r1+","+r2,true);
b=Intersection("P",r2,"c1");Show(b,true);
p=Polygon("M,N,P");>
SetRGBColor(p,194,235,122);SetFilled(p,true);;Show(p,true);

Fin du bloc dépliable



Tournesol

3. Une première boucle - Du statique au dynamique (a)

Utilisation des boutons de l’éditeur pour la bibliothèque Math de JavaScript

Dans cet onglet, nous allons faire tout d’abord un script que l’on peut qualifier d’une certaine façon de statique, puis le transformer en une figure réellement dynamique. Quitie à apprendre un outil, autant le faire en faisant de belles figures, ici nous allons faire le coeur d’un tournesol : on dessine une suite de points P_k en coordonnées polaire, avec un rayon r=c \sqrt(k) et un angle t=i \theta_0\theta_0=137,5°, angle de base (approximation de \frac{2\pi}{1+\Phi}) sur lequel nous allons mettre une variation bien entendu. On notera que c’est un vocabulaire (coordonnées polaires) et un contexte (suites) accessibles en 1°S. L’idée est de faire un travail sur les boucles qui a un résultat graphique attrayant. Par ailleurs, c’est un (micro-bout d’) algorithme utilisé dans les logiciels d’animation (on peut télécharger ce livre - abop.pdf 240 pages 17 Mo - et voir les pages du fichier pdf 112 et suivantes).

3.a. Version javascript

On utilise bien entendu les fonctionnalités de l’éditeur de script de CaRMetal, en particulier pour appeler les fonctions trigonométriques que nous n’avons pas à taper.

Ce qui donne le dessin suivant

déjà sympathique pour un premier essai.

Copier le script

// Selon la taille des points (de 3 à 6) et le zoom de
// la fenêtre, mettre c entre 0.1 et 0.15

c=0.12;
// angle de référence en degré. Nombre à modifier pour les tests
ang=137.5;
// sa valeur en en radian
ang=ang*Math.PI/180;
//Dessin de 500 points
for (i=1; i<500; i++){
        ru=c*Math.sqrt(i);
        xu=ru*Math.cos(i*ang);
        yu=ru*Math.sin(i*ang);
        u=Point(xu,yu);
        SetColor(u,"blue");
}


Remarquer que la sélection du pointeur fait surligner tous les points : chaque point produit est modifiable à la souris, on n’a fait que les initialiser à la position voulue. En particulier cliquer sur un point pour voir ses coordonnées : elles sont numériques. Nous avons fait un dessin. C’est en ce sens que l’on peut dire que la figure n’est pas dynamique car, même si on peut déplacer chaque point, on a pas produit une figure qui n’a d’autre cohérence d’ensemble que ce dessin produit. On se propose d’améliorer cela.

Mais avant quelques commentaire sur ce premier script :

La programmation en JS ressemble à celle d’une calculatrice, on utilise des variables, d’abord ru (pour éviter deux fois ce calcul), puis xu et yu, ce qui permet de placer un point. Il a fallu écrire l’angle en radian pour utiliser les lignes trigonométriques usuelles.

Après l’avoir annulé, on peut relancer le script en prenant d’autres valeurs pour l’angle de référence (137,6° ou 136,3°).

Dans une boucle, on évite de nommer le point de manière non indexée à l’indice (ie on évite d’écrire u=Point(« A »,xu,yu)) sinon le nom se duplique et CaRMetal produit des noms de points étoilés A, A*, A** etc ... ce qui devient vite ingérable comme dans l’exemple de ce bug (que chacun fait un jour) :


3.b. Version Carscript

On souhaite désormais transformer ce dessin en une figure dynamique où, par exemple, l’angle sera modifiable par un curseur. Cela veut dire que l’angle est un paramètre de chaque point et qu’il doit être conservé, comme variable, afin que chaque point réagisse au déplacement du curseur. Il faut donc une approche différente.

Comme on l’a laissé entendre un peu plus haut, à propos des noms de points, JavaScript communique avec CaRMetal par des chaines de caractères. Les paramètres dynamiques des objets (ici simplement les coordonnées des points) sont transmis au travers des chaines de caractères qui utilisent les fonctionnalités mathématiques du logiciel et les variables propres à la figure. C’est la gestion complexe de tout cet environnement qui apporte une véritable nouveauté en géométrie dynamique.

Il faut alors transmettre les variables JavaScript autrement. Elle seront transmises par leur contenu : si k est une variable (par exemple de boucle), pour la transmettre à CaRMetal on utilisera son contenu _k. Pour une variable de boucle _k est seulement sa valeur numérique, mais le contenu d’une variable peut être plus riche – et en particulier dynamique - c’est pour cela qu’on évite de parler de transmission de la valeur. Voyons ce que cela donne pour le tournesol dynamique.

Commencer par créer un curseur d’expression, nommé ang qui ira de 135 à 140 selon la démarche suivante (d’abord dans l’onglet « Construction » de la palette d’outils).

Puis on lui applique le script suivant (commenté plus bas) :

ce qui donne :

- les coordonnées du point construit sont passées dans deux chaines de caractères.
- les variables JavaScript c et i sont passée par contenu _c et _i dans les chaines.
- dans les chaines de caractères, nous sommes dans CaRMetal, et pas en JavaScript :
- les fonctions sont celles de CaRMetal : sqrt et pas Math.sqrt,
- cos et sin sur un angle en degré car c’est le fonctionnement de CaRMetal (ce serait rcos et rsin pour les angles en radian)
- la variable de la figure ang est utilisée comme telle, multipliée par _i.

Copier le script

c=0.12;
for (i=1; i<500; i++){        u=Point("_c*sqrt(_i)*cos(_i*ang)","_c*sqrt(_i)*sin(_i*ang)");
}


Clic-droit sur un point pour voir ses coordonnées : elles ne sont plus numériques mais bien algébriques, fonction de la variable ang.

On peut aussi choisir d’augmenter la taille des points, comme ici :

On a utilisé une approche fonctionnelle pour le point avec la variable u. Cela n’était pas nécessaire bien entendu. Mais c’est utile si on veut faire varier les couleurs des points sans avoir à les nommer : une fois le script précédent testé, rajouter dans la boucle cette ligne pour la couleur :

Ce qui donne ceci :

Remarque à propos du curseur système de l’illustration

Plus haut on a invité à l’utilisation d’un curseur d’expression plutôt qu’un controle système comme dans cette illustration. Il n’y a pas de différence, sauf un petit bug (pour le moment en 3.1.1 qu’il faut connaître : quand on utilise un curseur système il faut éviter d’interrompre inopinément un script long alors que c’est sans effet sur une expression. Quand on débute ; selon les machine, on peut ne pas voir que le script continue de s’exécuter et l’arreter avant la fin.

Les points ont tous la même taille mais la saturation jaune au centre donne un effet de flou gaussien qui modifie la vision et peut faire croire que les points au centre sont plus gros.

Copier le script

// Selon la taille des points (de 3 à 6) et le zoom de
// la feuille, mettre c de 0.1 à 0.15

c=0.12;
for (i=1; i<500; i++){        u=Point("_c*sqrt(_i)*cos(_i*ang)","_c*sqrt(_i)*sin(_i*ang)");
SetRGBColor(u,250-Math.round(i/5),250-Math.round(i/5),Math.round(i/4));
}


On peut s’essayer à d’autres variantes sur les couleurs entre respectant qu’elles doivent aller de 0 à 255 bien entendu.

Pour terminer avec tournesol, signalons un article (savant) sur la question de Xavier Caruso sur cette page (dans Autres articles (publié dans RMS)


Résumé de ce qui a été vu dans cet onglet

• Les informations dynamiques, dépendant des données de la figure, se transmettent toujours dans une chaine de caractère.
• À l’intérieur d’une chaine, la programmation utilise les expressions usuelles de CaRMetal.
• On passe les variables javascript par leur contenu (par exemple une valeur numérique dans le cas d’une boucle), on utilise une syntaxe spécifique : la variable k est utilisée dans une chaine par l’expression _k.
• Toutes les fonctions géométriques de CaRMetal rajoutées au javascript renvoient une chaine de caractère : le nom de l’objet.


Il reste encore une fonctionnalité importante à découvrir, ce que nous allons faire au travers d’une autre civité de 1°S : la primitivation par le méthode d’Euler

Euler

4. La méthode d’Euler

Mélange des coordonnées des points de la figure et des points variables de JavaScript


La méthode d’Euler consiste à remplacer la valeur f(x+h) par l’approximation affine f(x)+hf’(x) et à itérer le processus. En l’appliquant à une fonction g, cela permet de chercher une approximation de sa primitive.


Ayant la chance, dans mon académie de résidence, de pouvoir faire régulièrement des formations à CaRMetal, je ne manque pas de signaler - même si nous ne l’étudions pas à chaque formation - l’extraordinaire tutoriel de Monique Gironce sur le sujet.

Instants de nostalgie en 4 copies d’écran

a) Début de la construction classique, avec un pas h

b) Transformation de la figure en macro (on voit bien le h)

c) on passe à une autre méthode avec un intervalle et un nombre n d’étapes

Alors le pas devient p = (b-a)/n et Monique avait particulièrement bien fait sa macro précédente pour n’avoir qu’à modifier le nom du paramètre dans sa précédente macro pour qu’elle s’applique.

d) Résultat (et il y a d’autres perles dans ce diaporama)

Et même si on fait actuellement des CarScripts, on peut aussi - pour celles et ceux qui ne connaissent pas - revenir à quelques fondamentaux sur les tutoriaux de Monique.


Mais l’utilisation des scripts transforme les activités autour de thème car il est élémentaire de faire un script Euler. Merci à hesperionxxi (son flocon pour explorer l’interaction page web/Carscript) du forum de CaRMetal de m’avoir relancé sur ce thème. C’est grâce à lui que cet onglet existe.

4.a Version Javascript

Dans cette perspective comparative JS/CS déjà vue sur le tournesol, commençons par une version entièrement JS de cette méthode d’Euler (sur l’éternelle fonction f(x)=\frac{1}{1+x^2} des documents d’accompagnement des programmes).

Produit bien, en quelques lignes, les 100 points attendus.

Ce qui est un progrès important par rapport à l’élaboration de la macro mentionnée ci-dessus pour quelqu’un qui veut juste appliquer la méthode sans prendre du temps à la construire. On notera qu’on ne fait qu’appliquer la définition même de la méthode. Toutefois, il a fallu aller chercher la transformation de type parseFloat pour assurer que ce qui est pris est un nombre (bizarrement sinon en donnant le point (0, 0), le script bloque sur la construction du premier point.

Copier le script

x=Input("Abscisse du point de départ");
y=Input("Ordonnée du point de départ");
n=Input("Nombre d'itérations ?");
k=Input("Pas ?");
function f(x){
        return 1/(1+Math.pow(x,2)) ;
}
m = Point(x, y);
SetPointType(m,"point");
for (i=0; i<n; i++){
        y = parseFloat(y) + parseFloat(k*f(x));
        x = parseFloat(x) + parseFloat(k);
        m = Point(x, y);
        SetPointType(m,"point");
}


Ce script a pour lui l’avantage d’être autonome, et en particulier de pouvoir se lancer indépendamment de la page CaRMetal, mais il faut bien entendu modifier la fonction pour chaque utilisation. On aimerait avoir un script « générique » qui applique la méthode d’Euler. Il faut donc interfacer ce script avec une fonction de CaRMetal.

4.b Version CarScript

Puisque l’on veut construire un script qui s’applique à une page non vide, on y construit la fonction que l’on veut primitiver par la méthode d’Euler (dans la suite elle s’appelle Laf), et la condition initiale A.

Mais dans l’écriture a=Point(…), et m=« A », comme nous l’avons vu, ni m ni a ne sont des objets de CaRMetal, ce sont des variables javascript et donc des chaines de caractères dont le contenu est un point. Ainsi pour avoir accès dynamiquement à la variable javascript m il faut utiliser – dans les chaines de caractères - son contenu _m, et par exemple x(_m) pour son abscisse.

L’auteur des CarScripts a introduit la simplification syntaxique suivante x_m et y_m pour x(_m) et y(_m) … ce qui fait gagner presque la moitié des caractères utilisés.

ce qui donne (pour 50 itérations et un pas de 0.05)

Copier le script

// S'applique sur une figure qui contient une fonction nommée Laf
// et un point A qui désigne la condition initiale.

m="A";
n=Input("Nombre d'itérations ?");
k=Input("Pas ?");
for (i=0; i<n; i++){
        a = Point("x_m+_k","y_m+_k*Laf(x_m)");
        SetPointType(a,"point");
        m=a
}
SetPointType("A","cross");


Le script est quasiment le même à la différence fondamentale qu’il transmet des données algébriques à CarMetal et non plus seulement numériques comme dans le précédent. Les références à x_m et Laf(x_m) permettent de se référer algébriquement au point précédent comme on peut le vérifier en cliquant sur l’un des points produits (ci-dessous un point M est construit à partir du point L précédent avec le pas de 0.05) :

L’utilisation de la référence explicite à la fonction de la figure Laf permet de modifier celle-ci en temps réel :

C’est bien ce que nous voulions. Le script est générique en ce sens que, comme pour une macro à objets implicites, il faut que les variables aient les noms attendus (ici la fonction Laf et la condition initiale A) pour qu’il puisse s’appliquer.

2.c La fonction associée à la méthode d’Euler-Cauchy

Ce qui précède correspond à ce qui est proposé par les programmes officiels. Mais en fait ce n’est pas vraiment la méthode initiale d’Euler (imaginée par Cauchy). On s’est longtemps contenté de cette construction car techniquement, c’est la seule qui était à notre disposition. Mais en fait la géométrie dynamique permet de retrouver l’essence même de la méthode.

Voici ce qu’écrivait, déjà en 1994, Dominique Tournès

Lors de la mise en oeuvre de cette méthode - à l’époque avec Cabri Géomètre - dans la revue papier abraCAdaBRI :

Pour approcher une courbe intégrale sur tout un intervalle [x_0, x_1], la plupart des traités actuels proposent de construire la ligne polygonale issue d’un partage de l’intervalle[x_0, x_1] en n parties égales et obtiennent ainsi une fonction continue affine par morceaux, utilisée ensuite pour approcher la solution en tout point x de l’intervalle.
Ce n’est pourtant pas du tout cette idée que Cauchy avait à l’esprit en 1824, si on lit attentivement son Cours d’Analyse de l’Ecole Polytechnique. Pour Cauchy, la construction précédente ne doit pas seulement être effectuée pour l’extrémité x_1, mais bien en chaque point x. La courbe intégrale approchée n’est plus alors une simple ligne polygonale de classe C^1 par morceaux, mais une courbe parfaitement régulière de même classe que f (ici C^\infty ). On conçoit que par souci pratique d’économie, on se contente d’habitude d’un seul calcul numérique ou d’une seule construction graphique. Avec Cabri, cette limitation n’a plus de sens.
Prenons x point sur objet de l’axe des abscisses, et construisons comme ci-dessous la ligne polygonale issue de la condition initiale pour un partage en 16 de l’intervalle [x_0, x]. Effaçons la ligne polygonale à l’exception de son extrémité : il nous reste le point générique de la courbe intégrale approchée issue de la condition initiale. Demandons le lieu de ce point quand x décrit l’axe des abscisses. Nous obtenons la courbe intégrale approchée imaginée par Cauchy. N’ayons pas peur des mots :

Cabri permet de retrouver la vérité historique de la méthode d’Euler-Cauchy.


Appliquons donc la méthode d’Euler Cauchy. On se donne désormais, en plus de la fonction et de la condition initiale, un point B de l’axe des abscisse

et on demande un nombre d’étapes.

La valeur du pas doit être cette fois en fonction de A, B et seul le nombre d’étapes est une valeur numérique. On peut aussi préférer y ajouter les segment il suffirait de mettre un Segment(m,a) avant le m=a. Nous ne l’avons pas fait pour ne pas alourdir les illustrations. On notera que l’on a un peu peaufiné la sortie, en particulier le dernier point est rouge, c’est celui dont on va prendre le lieu

Copier le script

// S'applique à une figure qui contient une fonction nommée Laf
// un point A (la condition intiale) et un point B (en abscisse) qui est l'abcisse du point courant de la méthode d'Euler-Cauchy.

m="A";n="B";
n=Input("Nombre d'itérations ?");

for (i=0; i<n; i++){
        a = Point("x_m+abs(x(B)-x(A))/_n","y_m+(abs(x(B)-x(A))/_n)*Laf(x_m)");
        SetPointType(a,"cross");SetThickness(a,"thin");
        m=a
}
SetPointType("A","dcross");
SetColor(m,"red");


Le lieu de ce dernier point donne la courbe (de classe C^\infty et non plus affine par morceau comme on le voit dans les programmes de lycée).

Soit en zoomant, pour apprécier le lissage

Là encore on peut vérifier l’expression algébrique des points produits par le script :

Il n’y a que le pas (ici 50) qui soit numérique. Ce qui permet, comme précédemment, de changer l’expression de la fonction :

Pour terminer, revenons à la courbe précédente. On peut ajouter une comparaison avec l’intégration (numérique) produite par le logiciel :

Bilan de cet onglet

Nous avons vu l’introduction d’une variable javascript complexe à l’intérieur d’une chaine de caractère destinée à CaRMetal et l’écriture simplifiée x_m et y_m pour x(_m) et y(_m). Plus sur ce sujet sera abordé à l’onglet Résumé.

Cet exemple de la primitivation numérique d’une fonction par la méthode d’Euler a aussi été l’occasion d’un un retour au sens historique de la méthode grâce à l’utilisation de la géométrie dynamique.

Bien entendu la méthode permet de faire bien d’autres choses, comme ces exemples significatifs en physique.

Toile

5. Script de toile d’araignée u_{n+1} = f(u_n)

Dans cette partie, il n’y a pas de nouveauté conceptuelle, nous ne faisons qu’appliquer ce qui vient d’être vu dans les scripts précédents.

On se donne un curseur a – d’expression comme à la partie Tournesol - qui va de -2 à 2, un point S sur l’axe des ordonnées et on construit la courbe f(x) = y(S) - ax^2. On peut limiter son tracé de -10 à 10. Nommons encore Laf cette fonction. Tracer la droite y=x, puis prendre une condition initiale u_0 sur l’axe des abscisses. Nous allons utiliser ce script :

On peut illustrer différentes choses comme une convergence lente dans les deux cas suivants :

ou encore

mais aussi une divergence (en fait plusieurs valeurs d’adhérence)

et si on le voulait le concept de points répulsifs. Cet exemple est certainement plus riche que ce que l’on ferait en classe, avec ses possibilités d’agir sur le sommet de la parabole et son coefficient, mais cela permet d’avoir à portée de la main tous les cas possibles.

Copier le script

// Script "Toile d'araignée" (Web) sur une fonction LaF
// à partir d'un point u0 sur l'axe des abscisses
// fonctionne pour toute courbe nommée Laf avec u0
// Le script fait 50 "spirales"

u="u0";
a=Point("x_u","Laf(x_u)");
SetHide(a,true);
Segment(u,a);
for (i=0; i<100; i++){
        b=Point("y_a","y_a");SetHide(b,true);
        Segment(a,b);
        c=Point("x_b","Laf(x_b)");SetHide(c,true);
        Segment(b,c);
        a=Point("x_c","y_c");SetHide(a,true);
}


Le passage à la figure par contenu permet la construction dynamique que l’on observe : ci dessous, un point de type c, le point P275 :

Le plus intéressant est que ce script s’applique une autre figure. On peut tout aussi bien changer la définition de la fonction dans cette même figure. Et pour garder l’utilisation de S et de a, prenons par exemple cette fonction là (avec rsin pour le sinus d’un angle en radian). On a laissé à dessein le texte sur la parabole, illustrant que c’est bien sur le même fichier que l’on travaille :

et en agissant sur a et S, cette convergence

et même, en s’éloignant totalement des programmes actuels, mais pour illustrer dans d’autres cours, la notion de bassin de convergence, avec la fonction floor (partie entière) :

Pour obtenir cette précision, limiter la fonction sur l’intervalle -10, 10 et lui mettre un pas de 0,001.

Bien-sûr c’est intéressant de déplacer S et faire varier a pour avoir tous les cas possibles de points répulsifs ou attractifs.

Syntaxe

6. Complément d’exploration de la syntaxe

Sans que cet onglet propose des choses nouvelles, il explore, sur des scripts élémentaires, les éventuelles ambiguïtés que l’on peut rencontrer au début de sa pratique des carscripts.


Rappel des règles d’utilisation rencontrées lors des onglets précédents

- Les points créées ex-nihilo en javascript sont dynamiques. Les valeurs numériques ne sont que des initialisations.

- Les informations dynamiques, dépendant des données de la figure, se transmettent toujours dans une chaine de caractère.

- À l’intérieur d’une chaine, la programmation utilise les expressions usuelles de CaRMetal. (voir illustration plus bas)

- On passe les variables javascript par leur contenu (par exemple une valeur numérique dans le cas d’une boucle), on utilise une syntaxe spécifique : la variable k est utilisée dans une chaine par l’expression _k.

- Quand les variables javascript sont des points on passe le contenu algébrique de leurs abscisses et de leurs ordonnées par x(_m) et y(_m) qui se simplifie en x_m et y_m.

- Toutes les fonctions géométriques de CaRMetal rajoutées au javascript renvoient une chaine de caractère : le nom de l’objet.

Quelles sont les fonctions prédéfinies dans CaRMetal ?

Signalons que dans le logiciel, elles sont disponibles dans des popup à tous les endroits où on peut les utiliser :

x(A), X(a), x(_a) et x_a

Parmi les 4 écritures de ce titre de paragraphe, seule la seconde n’a jamais été rencontrée. X et Y sont des fonctions javascript qui permettent de prendre l’abscisse et l’ordonnée d’une variable javascript (puisque les fonctions CarMetal x et y ne peuvent s’appliquer à une variable).

Prenons le script suivant

u=Point(0,0);SetColor(u,"green");
xu=X(u);yu=Y(u);
d=Point(xu+1,yu+2);SetColor(d,"red");
a=Point("x_u+1","y_u-2");SetColor(a,"blue");
i=Point("_xu-2","_yu-1");SetColor(i,"brown");

Dans cet exemple les points ne sont pas nommés d’où les couleurs pour en parler. Même s’il est initialisé à (0, 0) le point u (vert) est manipulable à la souris, et alors le point a (bleu) le suit en translation (par coordonnées transmises de manière dynamique par rapport à u) mais pas le point d (rouge), dont les coordonnées ne sont que numériques, ni le point i (marron) qui a pour coordonnées (0-2, 0-1).

Voici d’autres exemple à tester. Ici on a fait l’effort de nommer les points. On notera que leurs noms ne sont pas affichés mais qu’ils apparaissent dans l’inspecteur d’objet quand on clic-droit sur eux.

l=Point("A",-4,2);
// les deux écritures suivantes sont valides et les points
// dynamiques (ils suivent le déplacement de A)
x=Point("B","x(A)+1","y(A)-1");
g=Point("C","2*x_l","y_l+1");
// Par contre ces deux écritures ne correspondent à rien
t=Point("D","x_A-1","y_A+2");
s=Point("G","x(l)+3","y(l)-2");

On retiendra que l’on peut prendre les fonction coordonnées x et y de CarMetal que sur les points de CaRMetal, les fonctions coordonnées X et Y de javascript sur les variables javascript . La syntaxe x_a ne s’applique qu’à un point nommé a comme variable javascript et pas à un point A de la figure. Réciproquement, pour les coordonnées de g, on a utilisé x_l et certainement pas x(l) qui provoquerait aussi une erreur de syntaxe (car ici I est une variable javascript qui représente le point A, c’est un peu tordu, c’est pour l’exemple).

Les fonctions x et y de CaRMetal s’appliquent aux points de CaRMetal désignés par leur nom, et pas à une variable javascript qui construit ce point : Pour s il aurait fallu écrire soit x(A) soit x_l.

Un autre exemple pour voir comment afficher les noms des objets, et bien vérifier que le contenu d’une variable n’est pas nécessairement une simple valeur numérique. Dans le script suivant :

l=Point("A",-2,2);
m=Point("B",-1,1);
n=Point("C",-1,2);
t=Angle("a2","A","B","C");
SetColor("A,B,C","bleu");SetColor("a2","green");
b=Point("D","-1+cos(_t)","2+sin(_t)");SetColor("D","red");
SetShowName("A,B,C,D","true");

On voit que les coordonnées de D sont algébriques : le cos(_t) correspond bien à cos(a2). (copie d’écran après avoir déplacé A).

La chaine « _a,_b,_c,_d » dans SetHide ou SetShowName

Supposons que dans un script on ait des variables javascript a, b, c qui correspondent à des objets réels de la figure, et d et qu’on veuille les cacher par exemple. On est amené à écrire 4 expressions du type SetHide(x,« true »). Si ces variables ne correspondent pas à un nom d’objet de CaRMetal, on ne peux pas écrire un SetHide(« X1, X2, X3, X4 », true) mais par contre, CaRMetal sait faire référence aux noms internes des objets associés aux variables, ces noms sont _a, _b, _c, et _d.

On peut donc écrire SetHide(« _a,_b,_c,_d », true) pour cacher ces objets sans même qu’ils aient été nommés.

Bien-sûr cette technique s’applique à différents autres utilisations.

Manip1

Le coeur du tournesol


Euler-Cauchy

Dans ces trois figures suivantes, on voit les points de la méthode d’Euler, le lieu - en marron - du dernier point (Méthode de Cauchy) et l’intégrale,en rouge.

On peut déplacer les point A et B, le repère (clic droit sur la figure) et zoomer (molette de la souris).

f(x)=\frac{1}{1+x^2}


La même figure avec un changement de fonction : f(x) = x-sin(x)


Un dernier exemple avec  f(x) = ln(x+3)


Manip2

Le script « Toile » sur les trois exemples de l’onglet précédent

Tout d’abord sur la parabole

f(x)=y(S)-ax^2


Puis avec une fonction sinus : f(x)= y(S) -a(x+sin(x))


Et juste pour jouer : f(x)= y(S) -a(E(x)-a\sqrt(x-E(x)))

Dans cet article de prise en main des CaRScripts nous avons vu les possibilités de simple construction géométrique, les possibilités d’interaction dynamique avec les éléments de la figure, les utilisation possibles en classe de première, que ce soit en simple JavaScript ou en CaRScript.

Pour une première expérimentation en classe de seconde, sur des exemples plus simples on peut se reporter aux articles de Alain Busser (11 TP disponibles) ou encore à quelques sujets sur le forum dédié au CaRScripts, en particulier ceux sur les statistiques.

Toujours pour une utilisation en seconde, cette démarche de géométrie repérée dynamique (onglets pour la seconde et pour la 1°S).

Un autre article aborde l’utilisation des CaRScripts pour travailler dans l’espace : il donne les clés d’une utilisation aisée et des exemples plus techniques.

Toutes les figures utiles pour appliquer les CaRScripts ou les figures finalisées sont téléchargeables.


Documents joints

ToileApplike
ToileApplike
Figure de la toile - sur la parabole - avec le script appliqué.
PourScriptToile
PourScriptToile
Pour appliquer le script de l’onglet Toile
PourScriptCercleFixe
PourScriptCercleFixe
Pour appliquer le script de l’onglet « Construction »
Toile Parabole
Toile Parabole
Toile Sinus
Toile Sinus
Toile Floor
Toile Floor
EulerCauchy1
EulerCauchy1
TournesolCoulCurs
TournesolCoulCurs
EulerCauchy2
EulerCauchy2
EulerCauchy3
EulerCauchy3
TP Apprentissage CarScripts
TP Apprentissage CarScripts
Reprend l’essentiel de cet article pour une utilisation en formation continue

Commentaires

Annonces

Prochains rendez-vous de l’IREM

Séminaire EDIM-IREM

- Mercredi 22 novembre 2017, 14h-18h, campus du Tampon, amphi 120 D
- Mercredi 7 février 2018, PTU, Saint-Denis, salle S23.6
- Mercredi 7 mars 2018, 14h-18h, campus du Tampon
- Mercredi 4 avril 2018, PTU, Saint-Denis, salle S23.6
- Mercredi 2 mai, 14h-18h, campus du Tampon
- Mardi 5 juin 2018, PTU, Saint-Denis, salle S23.6
- Mercredi 6 juin, 14h-18h, campus du Tampon

Fête de la science

Campus du Moufia, 16 et 17 novembre 2017.
Thème : « La recherche à l’heure du numérique »

Semaine des mathématiques

Du 26 au 31 mars 2018.
Thème : « Mathématiques et mouvement »


Brèves

Décès de Roger Mohr

mardi 27 juin

On sait bien que Nicolas Bourbaki n’était pas le nom d’une personne mais le pseudonyme d’un groupe. L’équivalent en informatique théorique est Claude Livercy, auteur de la théorie des programmes. Roger Mohr était un des membres de Claude Livercy.

À travers les labyrinthes : algorithmes et fourmis

dimanche 1er septembre 2013

Quand les chercheurs mettent au point des modèles d’optimisation et de recherche de plus court chemin qui s’inspirent du comportement de masse de colonies de fourmis...
À écouter : Sur les Épaules de Darwin, émission diffusée sur France Inter samedi 31 août 2013.

Rencontres Mondiales du Logiciel Libre à St-Joseph

mardi 20 août 2013

Les RMLLd se dérouleront pour la 2e fois à Saint-Joseph du 22 au 25 août.
C’est une opportunité pour les élèves qui suivent la spécialité ISN et les passionnés d’informatique.

Voici pour le samedi et le dimanche quelques interventions choisies :
- http://2013.d.rmll.info/Raspberry-votre-ordinateur-au-format-carte-de-credit?lang=fr
- http://2013.d.rmll.info/Materiel-libre-et-DIY?lang=fr
- http://2013.d.rmll.info/Arduino-de-l-electronique-libre?lang=fr

Noter aussi les conférences Art et Culture du dimanche, ainsi qu’une conférence plus engagée.

Le programme complet se trouve ici. Une radio sera ouverte pour l’occasion.
Des plaquettes à distribuer se trouvent ici.

Hyper-vidéos pour l’algorithmique au lycée

dimanche 19 août 2012

Olivier Roizès, à la demande de l’ADIREM, a réalisé une collection d’hyper-vidéos de présentation de logiciels et environnements de programmation. Ces hyper-vidéos, c’est-à-dire des vidéos contenant des éléments clicables, devraient être utiles aux enseignants désireux de se familiariser avec Python, CaRMetal, R, Rurple, Scilab ou Xcas.

Ouverture du SILO

mardi 1er novembre 2011

Le SILO (Science Informatique au Lycée : Oui !) est un espace collaboratif documentaire de partage et de formation collégiale, à destination des professeurs appelés à enseigner l’informatique au lycée.

Une initiative du CNDP, de l’INRIA et de Pasc@line, à laquelle se sont associés SPECIF, fuscia, EPI et ePrep.

Sur le Web : Site du SILO

Introduction à la science informatique

lundi 12 septembre 2011

Le CRDP de Paris publie le premier ouvrage destiné aux professeurs chargés d’enseigner la nouvelle spécialité « Informatique et sciences du numérique » en Terminale S à la rentrée 2012. Cet ouvrage a été coordonné par Gilles Dowek, directeur de recherche à l’INRIA.

Sur la création de la spécialité ISN, on pourra également consulter l’interview donnée au Café pédagogique par l’inspecteur général Robert Cabanne.

Sur le Web : CRDP de Paris

Deux publications sur l’algorithmique

samedi 17 octobre 2009

L’IREM d’Aix-Marseille publie une brochure de 73 pages, téléchargeable librement, intitulée Algorithmes et logique au lycée. Ces notions sont illustrées et déclinées sur des exercices du programme de spécialité mathématique en série L, mais sont adaptables aux programmes à venir.

Le hors série thématique n° 37 du magazine Tangente, disponible actuellement en kiosque, s’intitule « Les algorithmes. Au cœur du raisonnement structuré ». Extrait de l’éditorial : « La rédaction de Tangente a conçu la quasi-totalité de ce hors série thématique pour qu’il puisse être lu par des élèves de Seconde ».

Une carte mentale pour l’algorithmique

jeudi 10 septembre 2009

Sur son site, Jean-Jacques Dhénin a publié une carte mentale géante qui renvoie vers plus de 30 documents en ligne sur l’algorithmique. Tout ce qu’il faut — et même davantage — pour faire face au nouveau programme de Seconde !

Un catalogue libre d’algorithmes pour le lycée

dimanche 30 août 2009

Guillaume Connan, de l’IREM de Nantes, publie un catalogue libre de 119 pages d’algorithmes pour le lycée. Sur son site très riche, on trouvera d’autres documents en rapport avec l’algorithmique, notamment sur l’utilisation des langages fonctionnels au lycée et sur la comparaison programmation fonctionnelle/programmation impérative.

L’algorithmique à l’IREM de Lille

vendredi 26 juin 2009

Le groupe AMECMI de l’IREM de Lille vient de mettre en ligne des ressources importantes au service des professeurs de Seconde :

- Algorithmique et programmation (Emmanuel Ostenne)
- Bibliographie amoureuse de l’algorithmique (Alain Juhel)

Statistiques

Dernière mise à jour

dimanche 12 novembre 2017

Publication

773 Articles
Aucun album photo
133 Brèves
11 Sites Web
132 Auteurs

Visites

899 aujourd'hui
1252 hier
2163210 depuis le début
22 visiteurs actuellement connectés