Pignons et plateaux

Je ne suis pas du tout un spécialiste du vélo et donc les lignes qui vont suivre ne s'adresseront qu'aux incultes du cyclisme comme moi. Je passe évidemment sur les détails du fonctionnement de base d'un vélo pour me concentrer uniquement sur le fonctionnement des vitesses (parce qu'il y a un intérêt mathématique).

Le braquet

Le braquet est le rapport entre le nombre de dents du plateau situé sur le pédalier et le nombre de dents du pignon situé à l’arrière. C'est ce rapport qui indique la démultiplication qu'il existe entre les deux. Un braquet de 2 indique qu'un tour de pédalier engendrera 2 tours du pignon et donc deux tours de la roue arrière. Gros novice que je suis, je me demandais comment s’organisait le choix du nombre de dents sur les pignons et les plateaux. Mon esprit mathématique tordu pensait qu'il serait plus optimal de proposer des nombres de dents sur les pignons qui soient par exemple des nombres premiers afin qu'aucun braquet n'ai la même valeur.
Après être retourné auprès de ma bicyclette afin d'en vérifier les caractéristiques je vous livre ici les résultats correspondant donc à mon modèle. Cette formidable machine Décathlon possède donc à l'avant trois plateaux de 42, 34 et 24 dents respectivement et de 7 pignons à l'arrière de 14, 16, 18, 20, 22, 24 et 28 dents (c'est quand même ballot de ne pas avoir mis un pignon à 26 dents, la série aurait été plus harmonieuse).
On constate donc que mon idée géniale de ne mettre que des nombres premiers dans les pignons ne semble pas faire l'unanimité et que c'est certainement un technicien, amateur des nombres pairs, qui a crée le design final de ce vélo.

Si vous avez déjà fait du vélo, vous aurez surement constaté de vous même qu'il existe des braquets plus ou moins en double selon les réglages. En effet, rouler sur le grand plateau et avec un pignon assez petit semble similaire au fait de rouler sur le plateau intermédiaire avec un pignon assez grand. Nous pouvons constater cela avec le graphique suivant, qui représente le braquet obtenu selon le pignon utilisé et ce, en fonction des trois plateaux disponibles.
 


On constate en effet des répétitions dans les braquets disponibles. Par exemple le pignon central du grand plateau (ligne bleue) offre un braquet de 42/20 = 2.1 et le second pignon du plateau intermédiaire (en gris) donne un braquet de 34/16 = 2.125. Ce n'est effectivement pas exactement la même valeur mais il faut reconnaitre qu'elles sont quand même très similaires. Il existe aussi des égalités vraiment parfaites (par exemple entre le braquet 42/28 et 24/16 par exemple). Tous ces résultats sont détaillés dans le tableau suivant :


Grand PlateauPlateau intermédiairePetit Plateau
Pignon 143,002,431,71
Pignon 162,632,131,50
Pignon 182,331,891,33
Pignon 202,101,701,20
Pignon 221,911,551,09
Pignon 241,751,421,00
Pignon 281,501,210,86

On notera aussi la combinaison petit plateau et pignon 24 qui est la seule à créer un braquet de 1. Dans cette configuration, un tour de pédalier engendre donc exactement un tour de roue, ce qui est cocasse n'est-il pas? En effet, puisque cela correspond au braquet du vélocipède crée en 1861 et ancêtre du vélo qui ne disposait pas de chaîne et où les pédales étaient reliées à la roue avant et offraient donc, par définition, un braquet de 1. Je vais donc m'empresser de tester ce braquet afin de retrouver les sensations ressenties par nos ancêtres.

Vélocipède Michaux
Pour en revenir à notre tableau, on constate quand même beaucoup de redondance dans les braquets disponibles. Cette redondance m'a toujours semblé étonnante. En effet, il semblerait plus logique que le braquet obtenu sur le pignon à 28 dents et le grand plateau soit légèrement plus grand que le braquet obtenu sur le pignon à 14 dents associé au plateau intermédiaire afin d'obtenir une suite de braquets entièrement décroissante. D'ailleurs, dans le cas présenté ci-dessus, le plateau intermédiaire n'a pas d'utilité puisque les braquets obtenus grâce aux petit et grand plateaux couvrent la palette totale des braquets de 0.86 à 3 et ce, sans hiatus. Le petit plateau permettant de déployer des braquets allant jusqu’à 1.71 et le grand plateau pouvant descendre jusqu'à des braquets de 1.5.

Doit-on supprimer le plateau intermédiaire?

La question du plateau intermédiaire se pose donc. La justification de son utilité n'est pas mathématique mais elle est en fait mécanique. En effet, le décalage d'alignement entre certains plateaux et certains pignons implique que dans l'utilisation ces combinaisons engendre un décalage dans l'alignement de la chaîne et donc possiblement une usure prématurée de celle ci (du fait des efforts qui lui sont appliqué). La règle générale et que lorsque l'on se trouve sur les plateaux extrêmes (le grand plateau ou le petit plateau) il vaut mieux éviter d'utiliser la moitié des pignons situés à l'opposée. Le schéma suivant (pour le cas d'un vélo à 8 pignons) montre les combinaisons à éviter.


Dans le cas d'un vélo à sept pignons il convient donc d’éviter d'utiliser les les pignons 22, 24 et 28 avec le grand plateau, on peut aussi éviter d'utiliser les pignons extérieurs 14 et 28 avec le plateau central et pour le petit plateau il conviendra d’éviter d'y associer les pignons 14, 16 et 18. On peut alors mettre à jour notre graphique précédent pour en comprendre les implications : 


On constate alors qu'il y a beaucoup moins de superpositions dans les braquets utilisables. Le plateau intermédiaire trouve alors son utilité puisqu'il permet effectivement de faire harmonieusement la jonction entre les braquets du grand et du petit plateau.

Conclusion

En analysant les nombres de dents des plateaux et pignons afin de voir les braquets générés nous avons tout d'abord montré qu'il n'y avait pas de volonté de les rendre forcement uniques. Cette absence d'unicité s'expliquant par le fait que certaines combinaisons ne sont pas recommandées. Je me coucherais donc moins bête et la prochaine fois je ferais donc attention à ne pas utiliser certains braquets qui pourraient user de manière prématurée la chaîne ou les pignons.




Les nombres anacycliques

Introduction

Dans le monde des jeux de mots, existent les anagrammes. Il s'agit de couples de mots utilisant les mêmes lettres. Par exemple CASSER et SACRES. Chaque lettre est utilisée le même nombre de fois mais la signification du mot est bien évidemment différente. Une version plus avancée des anagrammes est constituée des palindromes. Ils s'agit de mots qui se lisent à l'endroit et à l'envers et qui ont le même sens (comme KAYAK). Entre ces deux types de mots se trouvent les anacycliques. Il s'agit de couple de mots qui utilisent les mêmes lettres mais qui n'ont pas le même sens selon qu'on les lise à l'endroit où à l'envers. Par exemple NOEL et LEON ou bien TRACE et ECART sont des anacycliques. Les anacycliques font donc eux aussi partie de la famille des anagrammes avec la condition supplémentaire que l'ordre des lettres doit être inversé (et non pas seulement mélangé).

Pour en revenir aux nombres, on constate évidemment que tous les nombres sont anacycliques par définition. Par exemple 123 et 321. Quand on lit un nombre en sens inverse du sens de lecture on obtient forcément un autre nombre qui a une signification. L’intérêt ne réside donc pas là. La subtilité des nombres anacycliques consiste à prendre un nombre dans une base (traditionnellement en base 10) et de l'exprimer ensuite dans une autre base (par exemple en base 16).

L'exemple classique est le nombre 53 (en base 10) qui s'écrit 35 en base 16. C'est donc un nombre anacyclique. Le problème consiste donc à trouver tous les nombres anacycliques. Hélas, il ne semble pas y avoir d'autre solution que de tester de manière exhaustive tous les nombres en base 10 un à un afin de vérifier si ils sont anacycliques. En effet, un nombre anacyclique (comme 834 qui s’écrit 438 en base 14). Cela signifie que l'on a l'égalité suivante:



Ce qui peut aussi s'écrire sous la forme :



On en conclura qu'un nombre en base b de la forme a2a1a0 en base 10 (ici a2=8, a1=3, a0=4) est anacyclique si il est solution de l'équation suivante :



Et donc par extension que tout nombre anacyclique de longueur n doit résoudre l'équation suivante:



Où b est la base dans laquelle on effectue le calcul. On obtient donc une équation à n inconnues (il faut trouver les différentes valeurs de ai). Attention cependant, il existe des nombres qui sont solution de cette équation mais qui ne sont pas anacycliques. Par contre si un nombre ne résout pas cette équation, on a la certitude qu'il n'est pas anacyclique.
Par exemple 13 (qui vaut 31 en base 4 et est donc un nombre anacyclique) est solution de cette équation mais 26 est aussi une solution (tout comme 39) alors que ces nombres ne sont pas anacycliques.

Malgré tout, nous voilà bien avancés puisqu'il faut tester toutes les combinaisons pour savoir si elles résolvent cette équation. Cependant, il ne sera pas obligatoire de tester tous les nombres de 1 à l'infini afin de trouver toutes les solutions.

Réduction de l'espace de recherche

En effet, il est possible de réduire l'espace de recherche puisque l'une des règles d'un nombre anacyclique est qu'il doit forcement avoir le même nombre de chiffre. Or, plus la base est petite (par exemple en binaire), plus le nombre de chiffres nécessaire pour représenter un nombre est grand. Par exemple en base 10, le nombre 99 s'écrit avec 2 chiffres. Mais en base 2, il s'écrit avec avec 9 chiffres : 1100011. Il est donc forcement impossible de trouver des anacycliques en base deux avec des nombres élevés, uniquement parce que le nombre de chiffres nécessaires pour les écrire n'est pas le même (il n'est donc même pas nécessaire de tester si la lecture dans un sens en base 10 correspond à la lecture dans l'autre sens en base 2)

Il est donc possible de trouver la limite haute des valeurs à tester pour chaque base. Le tableau suivant indique pour chaque base, le nombre de chiffres nécessaire pour écrire des nombres en base 10. Par exemple la troisième ligne du tableau correspond aux nombres à 3 chiffres en base 10 (c'est à dire les nombres de 100 à 999). Le tableau indique qu'en base 2, il faut entre 7 et 10 chiffres pour représenter ces nombres (en effet 100 s'écrit 1100100 et 999 s'écrit 1111100111). Ce qui rend impossible l'existence d'anacycliques dans cet intervalle. C'est pourquoi la case est colorée en bleu. Cela indique qu'il faut trop de chiffres pour espérer représenter ces nombres. De l'autre coté, en orange, se trouvent les cas où il faut moins de chiffres en base 10 que dans l'autre base, pour représenter les nombres. Il ne reste plus alors qu'à se limiter aux cases grises qui, elles, contiennent (au moins partiellement) des nombres ayant la même quantité de chiffres dans les deux bases (ce qui les rend éligibles au fait d'être anacycliques)


Résultats

Pour trouver les nombres anacycliques, la meilleure solution consiste à tester un à un chaque nombre dans chaque base (dans les limites définies par le tableau précédent). Cette technique à le mérite d'être fiable et relativement rapide tant que l'on ne doit pas tester des nombres à plus de dix chiffres. En revanche pour les bases 9 11 et 12, le nombre d'éléments à tester est grand voire même, incalculable.
En effet, la limite des nombres que peuvent stocker les machines se situe souvent autour de 2^64 ce qui correspond à un nombre à 22 chiffres. Dans notre cas, il faudra pourtant tester des nombres contenant jusqu'à 25 chiffres, ce qui n'est pas possible. Il existe des manières d'effectuer ces vérifications qui circonviennent à ces problèmes mais les temps de calcul qui en résultent sont encore trop longs.
Bon, en tout cas, la liste est correcte pour toutes les bases sauf pour 9, 11 et 12 donc. Dans ces derniers cas elle sera potentiellement incomplète pour les nombres à plus de 10 chiffres.

BaseNombres anacycliques (en base 10)
2
3
413
5
620532
723 - 46 - 2116 - 15226
81527465
9445 - 313725 - 3454446
10Beaucoup
11454003312
12315231
1343 - 86 - 774 - 956111321
14834
15
1653 - 371 - 5141 - 99481
17
18
1942 - 63 - 84
20
21551 - 912
2273 - 511
23
24
2583

Conclusion 

On constate aisément que le nombre d'anacycliques est très faible et avec des valeurs extrêmement aléatoires, ce qui incite à conclure que tout ceci est parfaitement inutile et sans aucune application concrète (j'ai beau chercher, je n'y vois strictement aucune utilité). 

Les courbes de Rose

Les courbes de Rose

Introduction

Je pourrais commencer en citant le grand Omar Sharif qui disait (je crois) "Les courbes, c'est ma grande passion". En effet, après un article précédent sur les courbes de Lissajous, on continue notre périple dans le monde merveilleux des trucs pas droit avec les courbes de Rose. Dans ce nouveau cas, le déplacement du point de dépend plus d'une double composante sinusoïdale mais suit les propriétés suivantes :

x=cos(kθ) cos(θ)
y=cos(kθ) sin(θ)

Les variations se font donc toujours en fonction d'un angle mais aussi d'un facteur k. Pour représenter en deux dimensions l'impact de ce facteur nous allons créer différentes valeurs en écrivant k=n/d et nous ferons varier les valeurs respectives de n et d entre 1 et 6. (Évidemment tout ceci est une fois de plus paramétrable). En premier lieu voici le résultat que l'on obtient.

Le résultat


Le code

On commence avec la fonction qui permettra de placer le point à chaque itération.
coord=function(x,y,theta,k=1,r=.4){
  return(c(x+r*cos(k*theta)*cos(theta),y+r*cos(k*theta)*sin(theta))) 
}
On poursuit en initialisant les valeur de N et D ainsi que les différentes valeurs de thêta et les arrays qui nous permettront de stocker a chaque itération la position des points.
S=seq(0,12*pi,by=pi/30)
N=D=1:6
COL=colorRampPalette(c("lightblue","orange"))(max(c(length(N),length(D))))
XX=YY=array(0,dim=c(length(N),length(D),length(S)))

Enfin, la partie centrale du code (qui ressemble fortement au code pour les courbes de Lissajous). Il y a principalement des différences d'ordre esthétique puisque le plus gros des différences de résultats vient de la fonction de calcul des coordonnées des points.
for(theta in S){
  n=match(theta,S)
  # Plot
  par(mar=c(0,0,0,0), bg="grey40");
  plot(0, type="n", xlim=c(.5,length(N)+.5), ylim=c(.5,length(D)+.5))
  for(i in 1:length(N)){
 for(j in 1:length(D)){
   # On calcule la position du point i j pour l'iteration s et on stocke
   yy = coord(i,length(D)-j+1,theta,k=N[i]/D[j])[2]
   xx = coord(i,length(D)-j+1,theta,k=N[i]/D[j])[1]
   XX[i,j,n]=xx
   YY[i,j,n]=yy
   # On affiche les points deja traces
   lines(XX[i,j,1:n],YY[i,j,1:n], col= meancol(COL[i],COL[j]), lwd=3)
          # On plot les elts
   points(x=XX[i,j,n],y=YY[i,j,n],col="white", pch=16, cex=2)
 }
  }
mtext(text=D,side=2,at=rev(1:length(D)), col="white", line=-1, font=2, las=1)
mtext(text=N,side=3,at=1:length(N), col="white", line=-1, font=2, las=1)
text(.5,length(D)+.5,labels="d/n", font=2, col="white")
}





Les courbes de Lissajous

Les courbes de Lissajous

Présentation

J'avoue que là je me suis honteusement inspiré d'un gif trouvé sur internet mais je le trouvais tellement beau que je me suis dit qu'il fallait absolument que je le refasse. (Attention, ce gif va consommer tout votre data)



Je ne connaissais pas ces éléments mais il s'agit apparemment de courbes de Lissajous. Une construction mathématique se basant sur la trajectoire d'un point dont les composantes rectangulaires ont un mouvement sinusoïdal.

Le code

Comme je suis sympa (et que j'ai enfin trouvé comment intégrer du code dans le blog) je vais vous partager ma création/copie, réalisée en R. C'est finalement assez simple puisque chacune des trajectoires ne dépend que du mouvement indiqué par la position des points sur les cercles extérieurs. Il suffit alors de coder la trajectoire de manière générique pour ne pas avoir à faire 49 morceaux de codes différents. On commence par deux petites fonctions, la première qui permet de créer un dégradé dans les couleurs (en bricolant le rgb) et la seconde qui permet de calculer les coordonnées d'un point en fonction d'un angle.
meancol=function(col1,col2){
  col1=gsub("#","",col1)
  col2=gsub("#","",col2)
  res=c()
  for(i in seq(1,nchar(col1)-1,by=2)){
    c1=substring(col1,i,i+1)
    c2=substring(col2,i,i+1)
    s = round( (strtoi(sprintf("0x%s",tolower(c1))) + strtoi(sprintf("0x%s",tolower(c2))))/2)
    res=c(res,toupper(as.hexmode(s)))
  }
  res[nchar(res)==1]=sprintf("%s0",res[nchar(res)==1])
  return(sprintf("#%s",paste(res,sep="",collapse="")))
}

coord=function(x,y,s,k=1,r=.4){  return(c(x+r*cos(s/k),y+r*sin(s/k))) }

Et on enchaine avec le code de la fonction principale, la première étape consiste à initialiser les objets qui nous seront utiles par la suite. On crée les points à parcourir (de 0 à 14 pi par pas de pi/8). C'est cet angle qui décidera de la position de chaque point et donc de l'apparence de chaque image. Ensuite, on crée les 7 vitesses de parcours de cercles (Par défaut de 1 à 7 mais c'est paramétrable). Dans notre cas, quand le point dans le premier cercle fait un tour complet, le point du deuxième cercle en fait deux, celui du troisième cercle en fait trois, etc...

S=seq(0,14*pi,by=pi/8)
X=Y=7/(1:7)
COL=colorRampPalette(c("lightblue","orange"))(length(X));
XX=YY=array(0,dim=c(length(X),length(Y),length(S)));  


Et le gros du code, une boucle qui va remplir les 8 x 8 éléments de notre dessin. Si on est sur la première colonne ou la première ligne, on fait juste un cercle et on place un point en fonction de la valeur de l'angle de l’itération en cours.
Pour les autres éléments (qui ne sont pas forcement des cercles) on trace le parcours du point (que l'on stocke à chaque itération dans les arrays à 3 dimensions XX et YY pour pouvoir l'afficher à l’étape suivante)

for(s in S){
  k=match(s,S)
  # Plot
  par(mar=c(0,0,0,0), bg="grey40");
  plot(0, type="n", xlim=c(-.5,length(X)+.5), ylim=c(-.5,length(Y)+.5))
 
  # Iterations
  for(i in 0:length(X)){
    for(j in 0:length(Y)){
      if(i*j==0){
        # Cercle
        if(i+j>0){
          points(x=i,y=length(Y)-j, cex=14, col=COL[i+j], lwd=4)
          if(i>0) cc=coord(i,length(Y)-j,s,X[i]) else cc=coord(i,length(Y)-j,s,Y[j])
          points(x=cc[1],y=cc[2],  col="white", pch=16, cex=2)
        }
    
      }else{        
        # On calcule la position du point i j pour l'iteration s et on stocke
          yy = coord(i,length(Y)-j,s,Y[j])[2]
          xx = coord(i,length(Y)-j,s,X[i])[1]
          XX[i,j,k]=xx
          YY[i,j,k]=yy
        # On affiche les points deja traces
          lines(XX[i,j,1:k],YY[i,j,1:k], col= meancol(COL[i],COL[j]), lwd=4)
         # On plot les elts
          points(x=XX[i,j,k],y=YY[i,j,k],col="white", pch=16, cex=2)
      }
       
    }
  # On fait les abline
 for(n in 1:length(X)){
  abline(v=XX[n,1,k], lty=2 ,col="grey60")
  abline(h=YY[1,n,k], lty=2 ,col="grey60")
 }
  }
  # Sys.sleep(2)
}

J'avoue par contre que le code n'est pas nickel, un des souci est le tracé du cercle dans la première ligne et la première colonne. J'ai utilisé la fonction points avec pch=16 mais ce n'est pas la bonne méthode car la taille du cercle n'est pas définie de manière dynamique (normalement on souhaite qu'il fasse un rayon de 1)
Cette fonction va donc créer un graphique pour chaque itération, libre à vous ensuite de stocker ces résultats (dans un gif par exemple). Dans l'idéal il faut avancer par pas assez petit (pi/8 c'est le minimum, on constate d'ailleurs que le cercle en bas à droite n'est d'ailleurs pas très circulaire). Il semble aussi nécessaire d'avoir un parcours allant de 0 à 14 pi pour pouvoir observer les différents parcours dans leur intégralité. On a donc au moins 104 graphiques à réaliser.

Carte animée des autoroutes françaises


Carte des autoroutes


Un petite carte animée des différentes autoroutes françaises (uniquement les tronçons supérieurs à 50 km) et représentées dans l'ordre de leur numérotation. J'aurais aimé représenter les tracés en fonction de la chronologie, mais ça devient rapidement compliqué puisque certaines autoroutes ont été ouvertes à différentes dates selon les tronçons. Il est a noter que certaines autoroute n'existent pas (la A17 ou la A18 et pleins d'autres encore. La raison principale venant de projets qui furent abandonnés ou alors fusionnés. De même les autoroutes avec des chiffres élevés sont souvent des connections avec des autoroutes déjà existantes. Par exemple la A630 est connectée à la A63.

On obtient alors le résultat suivant :




 Et voici la version statique :

 Et enfin la version complète avec tous les tronçons (c'est un peu plus long)

Et pour finir la version statique avec tous les tronçons