Les nouvelles technologies pour l’enseignement des mathématiques
Intégration des TICE dans l’enseignement des mathématiques

MathémaTICE, première revue en ligne destinée à promouvoir les TICE à travers l’enseignement des mathématiques.

Spirolatères, serpentins et calcul différentiel
Article mis en ligne le 31 juillet 2017
dernière modification le 17 avril 2021

par Alain Busser, Patrice Debrabant

Cet article est un rebond de cet article consacré aux spirolatères.

L’objectif est de donner différentes interprétations des spirolatères, la plus importante étant celle de la géométrie différentielle, tout arc paramétré régulier fermé de courbure non nulle étant la limite d’une suite de spirolatères.

On définira aussi un nouvel objet mathématique que l’on appellera un serpentin.

Ce sera enfin l’occasion de comparer la programmation visuelle dynamique de DGPad, logiciel parfaitement adapté à ce contexte, avec la programmation textuelle de CaRMetal, Python et JSX-Graph.

serpentin pour $f(x)=4,368.x^2$

Cet article a une suite (3D), publiée sur carmetal2.free.fr

Cet article est placé sous licence libre CC-by-SA

Plan de l’article :

  1. Introduction : quelle définition adopter pour la notion de spirolatère ?
    1. Définitions historiques
    2. Définitions utilisées dans cet article
  2. Programmer un spirolatère
    1. Python et code génétique
    2. CaRMetal
    3. DGPad
  3. Spirolatère et courbure : notion de spirolatère, notion de serpentin
  4. Spirolatères
  5. Serpentins
  6. Théorèmes de densité
    1. Spirolatères
    2. Serpentins

I) Introduction : qu’est-ce qu’un spirolatère ?

« Ethymologiquement », un spirolatère est un polygone (= un quadrilatère au sens large ;) dont les côtés sont construits en spirales.

Cette description laisse le champ libre à différentes définitions strictes d’un spirolatère :

I. 1) Définitions historiques

Selon Frank C. Odds, le biochimiste anglais ayant inventé les spirolatères, un spirolatère est une ligne brisée vérifiant les conditions suivantes :

  • Le spirolatère est défini par un motif en géométrie de la tortue.
  • Dans ce motif, on tourne toujours d’un même angle, en général un diviseur entier du tour complet, mais le motif doit préciser pour chaque rotation si elle se fait à gauche ou à droite
  • Les longueurs des côtés de la ligne brisée sont 1, 2, 3, n.
  • La suite des longueurs des côtés est périodique.

n est appelé l’ordre du spirolatère.
Frank C. Odds a lui-même généralisé cette définition en enlevant la contrainte d’égalité d’angle.

Selon Krawczyk, un spirolatère est un polygone vérifiant les conditions suivantes :

  • Tous les côtés font le même angle entre eux, en général un diviseur entier du tour complet.
  • Les longueurs des côtés sont toutes des multiples entiers d’une longueur de base ;
  • La suite des longueurs des côtés est périodique.

Dans le cas particulier d’un angle de 90° et quand les rotations se font toujours à gauche, selon la définition originale de Odds on obtient ces spirolatères dans l’ordre croissant :

Voici un outil en ligne permettant d’explorer dynamiquement les spirolatères tels que créés par Frank C. Odds et publiés par Martin Gardner (cliquer-droit sur le dessin) :

Cette figure a été construite avec la tortue de JSX-Graph, légère et néanmoins puissante (le code est proche de celui de la tortue Python, mais on a la possibilité de créer des boucles dynamiques comme dans DGPad).

...

Pour la petite histoire

Odds est un biochimiste spécialiste des mycoses. On peut alors se poser la question suivante :
Les spirolatères sont-ils un modèle de développement pour Candida Albicans (la star des mycoses) ?!
La réponse est non (hélas). L’exploration des spirolatères est un violon d’Ingres de Odds.
Dommage. C’eût été magique. ;)

Le chat par Philippe Geluck

Selon Frank C. Odds, le seul point commun entre les spirolatères et les mycoses, est qu’il a mis au point les premiers alors qu’il rédigeait sa thèse sur les seconds. Voici son récit :

For two years as a teenager I kept a diary. A diary entry for Thursday 14th June, 1962, reads : “Back to school. Have ‘discovered’ today an unlimited series of geometrical designs based on a ‘square’ spiral pattern. The sides, perpendicular to one another in a clockwise direction ascend so far in arithmetical progression then repeat." Neither of the mathematics teachers I asked had seen them before. Clearly, I was filling in time by doodling on graph paper : I have no recollection of which lesson was so boring that I had the intellectual space to do this. With hindsight it seems remarkable that nobody had ever before uncovered the possibilities of square spiral designs.

I did nothing more about the figures for almost 10 years. In 1971, during a coffee break when I was doing postdoctoral research on fungal diseases, I happened to find a pad of triangular graph paper and revisited the “square spiral” figures. I swiftly realized that 60° turns worked as well as 90° turns, and that there was no need for turns to be in the same direction : they could turn right or left after each segment, by the chosen turn angle, and still create closed figures. Indeed, the greater freedom of turn angle and direction allowed generation of several really interesting and pretty geometric figures.

By 1971 I was a long-term fan of the author Martin Gardner and his monthly Mathematical Games column in Scientific American. So I wrote to Gardner, providing the details of the figures, which by now I’d decided to call ‘spirolaterals’. Gardner, one of the world’s most remarkable and generous individuals, replied that he’d like to write a column on spirolaterals, but that I should first formally publish the theory to ensure I retained attribution for the discovery. He recommended a journal called The Mathematics Teacher. So I wrote up and submitted a paper on spirolaterals ; I modified it in the light of referees’ comments, and the article appeared in a 1973 issue of the journal. Gardner followed up with a column soon after, which was reprinted in one of his later book collections of his columns. ‘Proper’ mathematicians swiftly solved obvious problems such as predicting the numbers of scaffold repeats and choosing turn angles that led to closed figures.

A google search on ‘spirolateral’ in 2015 produced about 2,300 hits. Today the number was up to 73,000 hits ! One person in particular, Robert J. Krawczyk at Chicago, took spirolaterals under his wing and worked out how to draw them with curved line segments. A South American architect, Luis Barrionuevo, published a paper on ‘Spirospaces in Architectural Design’, which shows how the straight and curved spirolaterals can be used as a basis for novel architectural structures.

I. 2) Définition utilisée dans cet article

On va considérer dans cet article qu’un spirolatère est une ligne brisée vérifiant les conditions suivantes :

  • Tous les côtés font le même angle entre eux, en général un diviseur entier du tour complet.
  • La suite des longueurs des côtés est périodique.

Par conséquent, un spirolatère peut être une ligne brisée fermée ou de longueur infinie.

Et on va définir un nouveau type de ligne brisée appelé un serpentin.
On appelle serpentin une ligne brisée vérifiant les conditions suivantes :

  • Tous les côtés font la même longueur.

Si la suite des angles entre les côtés est périodique, on dira que le serpentin est périodique.

D’autres généralisations

Ces variations sur le thème initial des spirolatères sont suggérées par leur auteur Frank Odds himself :

Tout d’abord, donner la possibilité au spirolatère de changer de sens de rotation à chaque pas (vers la gauche ou vers la droite selon la valeur du troisième curseur) :

Ensuite, associer à la liste des longueurs, une liste des angles. L’outil ci-dessous permet d’inventer ses propres spirolatères généralisés, en entrant dans les cadres adéquats une liste de longueurs (entières) et une liste d’angles (entre 0 et 360°) ; ne pas oublier de mettre ses listes entre crochets, et la direction cardinale décline toute responsabilité en cas de différence entre les longueurs des listes !

Voici l’outil en ligne, à ouvrir dans un autre onglet du navigateur :

Lien vers l’outil en ligne

Et enfin, tout récemment, l’idée de permettre à l’utilisateur de changer une par une les valeurs des angles, par des curseurs :

Lien vers l’outil en ligne

On voit que la définition originale de Odds a subi un glissement vers une notion plus générale, axée sur la « courbure » d’une ligne brisée (ou d’un polygone).
C’est ce glissement qui permet, on le verra plus loin, de relier des travaux radicalement différents, à savoir l’approche créative de Odds sur les spirolatères et les recherches de Michel Mendès France et Frederik Michel Dekking sur les « curlicues » (que nous appellerons serpentins).

II) Programmer un spirolatère

Aux temps chtoniens avaient succédé les temps chéloniens [1], puis pythoniens : Des adorateurs serpentiformes rampant autour de statues représentant un canard ne cessaient de répéter « Tout est objet, tout est objet, tout est objet... ». R2D2 (descendant de la tortue de Papert) et C3PO, tout en roulant/marchant, devisaient à propos de ce comportement, et de l’invasion de l’empire galactique par ces nouveaux robots qu’étaient les spirolatères :

StarWars - Tatooine before The Force Awoke (by D. Moran)

II. 1) Python et code génétique

  • « Lorsque Seymour Papert a programmé mes ancêtres chéloniens », dit R2D2, « leur mémoire était essentiellement constituée de mots écrits en Logo (langage) et définis par les enfants utilisant les robots en question ».
  • « Oui », répondit C3PO, « mais l’usage de mots permettait même à des robots aussi rudimentaires que Toto de dessiner des motifs complexes ».
  • « Seulement il faut de gros mots pour faire des motifs vraiment complexes »
  • « C’est ça qui est surprenant : Ces spirolatères qui pullulent comme des mouches ont un tout petit cerveau et n’ont pas assez de mémoire pour stocker des gros mots : Où sont-ils mémorisés alors ces gros mots, vas-tu me demander ? »
    "Ils sont d’une certaine manière entassés dans le génotype du spirolatère, le dessin effectué par cette créature bionique étant la conséquence de leur phénotype.
  • « Quoi, tu veux dire que les spirolatères seraient vivants ? »
  • « Le dessin est la trace d’un être partiellement robotique mais dont le programme est stocké dans de l’ADN. En effet une légende court à propos des spirolatères, selon laquelle ce serait un biochimiste qui les aurait inventés : Frank Odds [2] ».
  • « Et comment cet ADN peut-il être câblé à la mémoire électronique alors ? »
  • « En fait la mémoire de l’ADN est lue, lettre par lettre, par un nanorobot appelé ribosome ; à la naissance du spirolatère, le ribosome est positionné à la première lettre de l’ADN ; ensuite chaque fois que le spirolatère prend un coup de vieux, le ribosome avance à la lettre suivante de l’ADN. Et quand le ribosome arrive au bout, il retourne automatiquement au départ. »

Un objet pouvant vieillir s’appelle un itérateur. La méthode de vieillissement se fait par à-coups, et s’appelle, en Python, « next » : Invoquer objet.next(), c’est donner un coup de vieux à l’objet. Il y a des itérateurs qui ne meurent jamais comme le célèbre ++ qui représente l’entier suivant (il y a un nombre infini d’entiers), et d’autres comme range dont la durée de vie est finie. Le robot spiro est composé d’une tortue et d’un itérateur. Celui-ci sera programmé en Python comme une fonction mais avec yield qui a un double effet :

  • renvoyer une valeur (comme le ferait return d’une fonction classique ; pour spiro c’est la chaîne d’ADN) ;
  • passer à l’étape suivante (le vieillissement)

Pour utiliser spiro (ou boucler dessus), on a besoin de deux variables de départ :

  1. l’ADN initial (une chaîne de caractères) ;
  2. l’âge maximal possible (une variable entière appelée canonique).

En plus, le premier caractère code[:1] de la chaîne d’ADN est rajouté après le reste code[1 :] pour permettre de cycler. Le ribosome est donc programmé ainsi :

  1. def spiro(ADN,canonique):
  2.          code = ADN
  3.          for age in range(canonique):
  4.                  yield code
  5.                  code = code[1:]+code[:1]

Télécharger

Avec for ribo in spiro(’abcd’,4) on a cet état initial (le ribosome est représenté par le cercle) :

Après le premier appel à yield la variable code devient égale à bcda puis on se retrouve dans cette situation :

Ensuite la variable code devient égale à cdab puis l’âge à 2 :

(l’âge est le nombre inscrit dans le cercle ; c’est aussi le nombre de fois que yield a été effectué). Enfin la variable code devient égale à dabc et on se retrouve dans cette situation :

Après ça, l’âge étant devenu canonique, l’objet spiro ne répondra plus aux sollicitations : Il s’est arrêté ! Pour vérifier les valeurs successives du code, on peut boucler sur spiro :

  1. for ribo in spiro('abcd',4):
  2.         print(ribo)

Télécharger

Mais aussi, plus simplement :

print(list(spiro('abcd',4)))

qui affiche ['abcd', 'bcda', 'cdab', 'dabc']

(Les appels à spiro ont été convertis en une liste qui est affichée).

Pour faire des dessins, on va utiliser, comme codes ADN, des chiffres. Ceux-ci, convertis en entiers, sont multipliés par 10 et la tortue avance de la longueur obtenue avant de tourner à droite :

  1. for ribo in spiro('12345',20):
  2.         forward(10*int(ribo[:1]))
  3.         right(90)

Télécharger

Ce spirolatère a été l’occasion de montrer l’utilisation d’un générateur en Python (la fonction avec yield). Ce générateur est un raccourci pour la construction d’un itérateur, évitant d’avoir à définir l’initialisation et le passage au suivant (next) ; en bref, le générateur permet de définir un itérateur par fonction et pas par objet. Son utilité n’en est qu’accrue, puisqu’il n’y a pas eu beaucoup de code à écrire pour cela.

II. 2) CaRMetal

Javascript dispose également de générateurs, mais pas la version utilisée dans CaRMetal (pour l’instant). Mais on peut s’en sortir très bien avec un itérateur. Voici la version CaRMetal, avec l’itérateur forEach de JavaScript sur les listes de nombres :

  1. FixTurtle("P1");
  2. spiro = [1,2,3,4,5];
  3. spiro.forEach(function(L){
  4.         MoveForward(L);
  5.         TurnRight(90)
  6.         });

Télécharger

JavaScript étant plus « fonctionnel » qu’« objet », l’itérateur est une fonction appliquée en séquence à chaque longueur L du tableau. Noter que depuis la version 4.2 de CaRMetal, l’essentiel du code de la fonction peut s’obtenir par de simples clics sur la partie « tortue » de la fenêtre des CaRScripts. Le tracé de la tortue est un début de spirale :

Du coup comme dans l’exemple de Python, il faut boucler plus que 5 fois, et comme 20=4×5, le script suivant donne le spirolatère complet :

  1. FixTurtle("P1");
  2. t = [1,2,3,4,5];
  3. for(n=0;n<4;n++){
  4.         t.forEach(function(L){MoveForward(L);TurnRight(90)});
  5. }

Télécharger

II. 3) DGPad

Nota Bene : Au moment de l’écriture de cet article, il y a un petit bug avec le mode radians de DGPad. Dans les figures DGPad présentées, il est possible que le code ait été adapté pour rester en mode degrés.

III) Spirolatère et courbure : notion de spirolatère, notion de serpentin

On considère un arc paramétré régulier fermé de courbure non nulle.
En tout point M de cet arc, il existe alors un repère de Frenet formé par le point de la courbe, le vecteur tangent $\vec{T}$ et le vecteur normal ayant des angles égaux.

On a :

$\dfrac{dM}{ds}=\vec{T}\quad$ et $\quad\dfrac{d}{ds}\vec{T}=c\vec{N}\quad$ avec $\quad c=\pm \dfrac{1}{R}$ où $c$ est la courbure et $R$ est le rayon de courbure (s’il existe).

Et si l’on appelle $\theta$ l’angle en radians que fait le vecteur $\vec{T}$ avec l’axe (Ox), on a alors :

$\dfrac{d\theta}{ds}=c=\dfrac{1}{R}$

Remarque : en terme de tortue (que l’on peut associer au repère de Frénet), $\theta$ est l’angle de la tortue.

Soit R(s) l’équation intrinsèque de l’arc fermé. On a alors :

$\dfrac{ds}{d\theta}=R \quad$

Pour intégrer cet arc paramètre, on a deux possibilités :

  • intégrer en s
  • intégrer en $\theta$

Si on intègre géométriquement en $\theta$ par la méthode d’Euler [3] on obtient des spirolatères.

Si on intègre géométriquement en $s$ par la méthode d’Euler on obtient des serpentins.

IV) Spirolatères

On utilisera plus loin CaRMetal, puis DGPad, ce dernier étant parfaitement adapté aux spirolatères. Mais on va commencer avec Sofus et traiter un cas particulier pour son intérêt graphique.

On considère le script suivant en Sofus qui produit un spirolatère :

On obtient la figure suivante :

Quel est ce prodige ?

Dans la boucle principale, répétons N fois au lieu de 2 000 fois. On obtient alors :

C’est assez subtil, ici : le spirolatère est d’ordre N et la suite des longueurs est constituée des nombres impairs puis des nombre pairs tous inférieurs ou égaux à N.

Si on répète 2N fois, on obtient :

3N fois :

D’où l’effet graphique obtenu.

fichier Sofus carré bleu

Avec un angle de 300° :

Avec un angle de 340° :

On obtient une grande variété de figures.

Pour un angle de 170° :

Pour un angle de 125° :

couronne
pentagone spiralaire

Ou encore pour 150° :

couronne de fleurs

On peut aussi augmenter step de 3, autrement dit construire des sous-suites arithmétique de raison 3.

On obtient cette figure étonnante :

Autres figures :


étoile
couronne
galaxie

IV) Serpentins

Dans cet article MathémaTICE, les suites présentées par Pierre-Marc Mazat correspondent à des serpentins, bien que l’on soit en géométrie absolue. En redéfinissant par récurrence la fonction selon le point de vue de la tortue, on pourrait tracer les courbes comme des serpentins.

Ces courbes (définies de façon absolue) ont été étudiées par Michel Mendès France et Frederik Michel Dekking, qui ont tenté de leur donner une interprétation thermodynamique (leur attribuant par analogie une entropie, un volume, une température, ...).

Si $x_n$ est l’angle absolu (comme dans l’article de Pierre-Marc), l’angle tortue est $a_n=x_n-\sum_{j\leqslant n-1} a_j$.

Ainsi, le script suivant :

permet de retrouver la première figure de l’article :

serpentin défini par une fonction absolue

Obtenir une version avec des paramètres dynamiques n’est pas beaucoup plus compliqué. Le cas où f est une fonction parabolique $f(x)=e.x^2$ où e est un paramètre donne des courbes « intéressantes ».
Voici un script qui donne un serpentin dynamique en e :

Cela permet de faire une étude dynamique (=avec des fonctions à paramètres dynamiques) de ces serpentins étudiés par MM. Mendès France et Dekking.

serpentin dynamique absolu (fn parabolique)

Mais on peut également s’intéresser aux serpentins définis directement par $a_n=f(n)$, ce qui permet facilement de le faire avec des paramètres dynamiques.

Revenons au cas où f est une fonction parabolique $f(x)=e.x^2$ où e est un paramètre (mais dans le cas où f est cette fois la fonction relative qui donne la rotation de la tortue).

Le script est très simple :

Et on obtient des figures variées :

serpentin pour une fonction parabolique

VI) Théorèmes de densité

VI. 1) Spirolatères

Un cas très simple de spirolatère est celui du polygone régulier qui est un spirolatère de période 1.

Un cercle est la limite de tels spirolatères selon une interprétation classique en géométrie de la tortue.
Par exemple, le cercle de rayon 1 peut être approché ainsi :

da est un curseur entre 0 et 1. On suppose ici qu’on est en mode radians.

Le cercle est la limite de spirolatères dont certains seulement sont fermés, à savoir ceux pour lesquels da est rationnel.
Dans la figure dynamique DGPad ci-dessus, les spirolatères sont tracés partiellement, sauf quand da est de la forme $\dfrac{1}{n}$.

Version 3D du phénomène

Comme l’a montré Yves Martin dans son iBook sur la tortue de DGPad, le même phénomène peut s’observer en 3D lorsque l’on crée des rotations 3D à partir de palindromes.

Soit P = PivoterHaut(...) et T = TournerGauche(...)

Le palindrome PTP est une rotation d’angle $da3D = arccos(cos^2 (da2).cos(da) - sin^2(da2))$.

On peut alors créer une expression pour cet angle (ramené en fraction de l’angle plein) :

Et on peut tracer le spirolatère en ajustant le nombre d’itérations :

On obtient finalement cette figure dynamique.

On pourra remarquer que la « palindromisation » de da (da devient da3D) a toujours pour effet d’augmenter l’angle : da3D est toujours plus grand que da.

On va maintenant essayer d’approcher un arc paramétré fermé quelconque par une suite de spirolatères.

Commençons par un cas qui va nous échapper, à savoir celui d’un arc paramétré dont la courbure est parfois nulle.

Soit l’arc paramétré d’équation intrinsèque $c(s)=b.cos^2(s)$ , où c est la courbure et b un paramètre numérique.

On peut intégrer numériquement cette équation en $\theta$, et on obtient :

$\theta=\dfrac{b}{2}(\dfrac{sin(2s)}{2}+s)$

Cette équation est intéressante. Elle montre que l’on va obtenir des courbes fermées quand b est rationnel (et d’autant plus simple que b sera une fraction « simple »).

Comme la courbure s’annule, on ne peut l’intégrer géométriquement qu’en s.
Si on est en mode degré (un bug de DGPad nous impose ce mode au moment de l’écriture de cet article), un script possible est celui-là :

La courbe a l’allure suivante :

Cette courbe est approché par des lignes brisées, mais ce ne sont pas des spirolatères (ce sont des serpentins) :

Une première idée consiste à inverser les rôles de s et $\theta$, autrement dit de considérer la courbe d’équation $R(\theta)=b.cos^2(\theta)$

En intégrant numériquement, on obtient comme précédemment :

$s=\dfrac{b}{2}(\dfrac{sin(2\theta)}{2}+\theta)$

Pour tracer cette courbe, on peut utiliser le script suivant :

Et on obtient une courbe qui n’est pas sans évoquer celle du cercle :

b a le rôle d’un coefficient d’agrandissement/réduction.

Plus exactement, voici le script du spirolatère :

et la figure dynamique :

On peut alors faire afficher le T-cycle en créant une liste et en la faisant transiter dans une variable globale.

Voici le script de l’expression T-cycle qui retourne le T-cycle :

La structure conditionnelle (le si) est factice, c’est une astuce pour établir un lien de dépendance avec da (faute de quoi le T-cycle n’est pas dynamique).

On peut faire le même travail avec la courbe d’équation $R=b+cos(s)$

Voici le script :

et la figure dynamique :

VI. 2) Serpentins

De la même façon, on peut montrer que tout arc paramétré régulier fermé de rayon de courbure non nulle est la limite d’une suite de serpentins.

Dimension fractale

Un serpentin est un peu plus qu’une courbe, au sens où sa dimension de Minkovski-Bouligand peut dépasser 1. Voir ici par exemple. Ici on va tenter de mesurer la dimension d’une courbe de Michel Mendès-France. Celle-ci figure parmi les exemples fournis avec Sofus.

Voici le script :

et la courbe obtenue :

après avoir binarisé cette image, le logiciel ImageJ permet d’estimer sa dimension de Bouligand, et trouve environ 1,63 :

La suite de cet article, consacrée à la 3D (spirolaèdres) est publiée dans un article de carmetal2.free.fr.