Second degré Suites numériques Programmation Python
Calcul de Phi à partir de la définition qu'en fait Euclide, puis étude de la suite de Fibonacci. On réalisera quelques programmes en Python permettant d'aborder les listes et le tracé géométrique avec Turtle.
On appelle nombre d'or un rapport de proportionnalité considéré comme harmonieux tant par certains mathématiciens que par certains artistes. On retrouve cette proportion dans les bâtiments du Corbusier, dans des oeuvres musicales contemporaines, voire même dans des tableaux.
On retrouve aussi des manifestations liées au nombre d'or dans la nature, dans les écailles de la pomme de pin ou les graines du tournesol.
Si la dimension "divine" de ce nombre ou son omniprésence restent encore à prouver, nous allons nous concentrer sur les origines et curiosités mathématiques qui entourent ce nombre si particulier.
Euclide définit dans son ouvrage Les Eléments ce qu'il appelle la proportion d'or :
"Une droite est dite coupée en extrême et moyenne raison quand, comme elle est tout entière relativement au plus grand segment, ainsi est le plus grand relativement au plus petit."
Pour évoquer un découpage harmonieux d'une longueur, Euclide dit qu'elle est "coupée en extrême et moyenne raison". On note et les deux longueurs résultantes de ce découpage, avec .
Exprimer mathématiquement le rapport traduisant "[la longueur] tout entière relativement au plus grand segment" et équivalent au "plus grand relativement au plus petit".
On cherche à exprimer le rapport .
On peut aussi discuter avec les élèves du terme de "droite" utilisé dans cette citation !
On pose .
Montrer que, d'après la relation précédente, .
En posant , on obtient :
Résoudre l'équation et en déduire la valeur de . C'est ce qu'on appelle le nombre d'or.
On résout l'équation du second degré, dont on ne s'intéresse qu'à la racine positive, puisque est un rapport entre deux longueurs.
Euclide n'avait pas d'outils mathématiques pour calculer la racine d'une équation du second degré comme nous venons de le faire. L'algèbre n'existait pas encore. En revanche, la définition qu'il donne de cette proportion lui permet d'aboutir à une résolution géométrique, en construisant un "rectangle d'or" dont longueur et largeur vérifient la condition énoncée plus haut.
Avant de revenir sur la construction géométrique de ces rectangles, intéressons-nous au célèbre Fibonacci.
En 1202, un mathématicien italien du nom de Leonardo Fibonacci s'intéresse au problème de la croissance d'une population de lapins. Le problème est le suivant : un couple de lapins donne naissance à un autre couple de lapin aux bout du 2e mois après leur naissance. On part du principe que les lapins se reproduisent chaque mois dès qu'ils le peuvent (donc tous les mois, sauf celui qui a suivi leur naissance), et qu'ils ne meurent jamais. On note le nombre de couples dans l'enclos au bout de mois (avec entier naturel).
A l'état initial, on considère la naissance d'un seul couple de lapins dans l'enclos, soit . Au bout du premier mois, les lapins ne peuvent pas se reproduire, on compte toujours un couple : . Au bout du second, ils se sont reproduits et l'enclos compte maintenant deux couples de lapins : .
Combien l'enclos compte-t-il de lapins au bout du troisième mois ? Et du quatrième ?
Le troisième mois, le couple initial de lapin s'est encore reproduit. Le second, en revanche, ne le peut pas. On compte un couple de plus que les deux déjà présents : .
Le quatrième mois, on compte tous les lapins du mois précédent, auquel on ajoute les lapins du deuxième mois qui se sont reproduits : .
En déduire une relation entre les termes , et .
On appelle la suite la suite de Fibonacci. On souhaite générer en Python une liste des premiers nombres de cette suite à l'aide d'une fonction liste(n)
. On placera les valeurs calculées par l'algorithme dans une variable de type liste que l'on appellera fibonacci
.
Combien de valeurs initiales sont nécessaires pour calculer les termes de la suite de Fibonacci ? En déduire le nombre de valeurs nécessaires dans la liste fibonacci
à l'initialisation et écrire la ligne de code correspondante. On rappelle que les valeurs contenues dans une liste sont à indiquer entre crochets.
Il faut deux valeurs initiales et afin de calculer les termes de la suite de Fibonacci. Ces deux valeurs doivent se trouver dans la liste lors de l'intialisation. On écrira : fibonacci=[1,1]
.
On souhaite générer les premiers termes de la suite. Combien manque-t-il de valeurs dans fibonacci
après initialisation ? En déduire le nombre de boucles de calculs à répéter dans le programme.
A l'initialisation, on a deux valeurs dans la liste. Il en manque donc encore . C'est le nombre que l'on indiquera en argument dans la boucle for
.
Le calcul à répéter dans la boucle consiste à faire la somme de deux valeurs consécutives de la liste et ajouter cette somme à la suite de cette liste à l'aide de la commande fibonacci.append()
.
Pour désigner un terme de celle-ci, on écrira fibonacci[i]
avec i
le rang du terme dans la liste. Attention toutefois, car le premier terme est toujours désigné par le rang 0.
Compléter l'extrait d'algorithme suivant :
for i in range(...): u=fibonacci[...]+fibonacci[...] fibonacci.append(...)
A l'aide des questions précédentes, écrire la fonction liste(n)
qui renvoie la liste des premiers termes de la suite de Fibonacci.
def liste(n): fibonacci=[1,1] for i in range(n-2): u=fibonacci[i]+fibonacci[i+1] fibonacci.append(u) return fibonacci
On s'intéresse maintenant à la suite définie pour tout telle que .
On souhaite maintenant programmer une fonction quotient(n)
qui permettra d'afficher les premières valeurs de la suite . Compléter l'algorithme suivant :
def quotient(n): fibonacci=[... , ...] for i in range(n): u=fibonacci[...]+fibonacci[...] fibonacci.append(...) for k in range(...): print(fibonacci[...]/fibonacci[...])
def quotient(n): fibonacci=[1,1] for i in range(n): u=fibonacci[i]+fibonacci[i+1] ibonacci.append(u) for k in range(n): print(fibonacci[k+1]/fibonacci[k])
Exécuter quotient(10)
. Que constate-t-on ?
Les valeurs semblent converger vers un nombre approchant 1,618.
On admet que la suite est convergente et on note sa limite, telle que .
En utilisant la définition de la suite de Fibonacci, montrer que est solution de l'équation .
Or, on sait que d'où .
On a vu que d'où
Résoudre l'équation. Que peut-on dire sur la limite de ?
On a vu plus haut les solutions d'une telle équation. La suite tend vers le nombre d'or.
On appelle spirale d'or la construction géométrique d'une spirale logarithmique dont le facteur de croissance est égal au nombre d'or.
Soyons plus clairs : une spirale logarithmique se construit par quart de tour. Cependant, chaque quart de cercle tracé admet un rayon plus grand que le précédent selon un facteur de croissance donné. Ici, il s'agit de notre nombre d'or.
Nous allons tracer une spirale d'or en utilisant les nombres de la suite de Fibonacci comme rayon des cercles dont nous tracerons le quart. Simple, non ? Pas de panique ! Tout d'abord, nous allons créer un nouveau script et importer le module Turtle avec la commande from turtle import *
à insérer en tête du programme.
Dans un premier temps, nous allons chercher à tracer des rectangles dont les côtés sont des nombres de la suite de Fibonacci. Les rectangles seront positionnés en spirale, comme dans l'exemple ci-dessous.
Quelles sont les lignes de code à inscrire en début de programme afin de générer les sept premiers nombres de la suite de Fibonacci dans une liste fibonacci
?
Nous souhaitons maintenant piloter la tortue afin qu'elle trace des carrés de longueur proportionnelle à ces nombres.
On rappelle que la tortue avance de pixels avec la commande forward(x)
et tourne à droite de degrés avec la commande right(a)
D'après le modèle donné ci-contre, quelles sont les instructions à utiliser pour que la tortue trace un premier carré de longueur et se retrouve en position pour tracer le second (depuis la croix bleue jusqu'à la fin de la 6e étape) ? On pourra optimiser cette série d'instructions avec une boucle.
On peut parcourir chacun des éléments de la liste fibonacci
à l'aide d'une boucle for
avec ce type de commande : for number in fibonacci:
. Cela signifie qu'à chaque boucle, la variable number
équivaut tour à tour à chacun des termes de la liste.
Comment insérer cette commande avec le bloc d'instructions précédent pour que la longueur de chaque carré dessiné soit proportionnelle (de coefficient 5) à chaque élément de la liste ?
Vous disposez maintenant de tous les éléments pour réaliser votre programme. Pour mieux centrer le dessin, on pourra positionner le curseur de départ avec l'instruction goto(x,y)
, en prenant soin de lever le crayon avec penup()
avant le déplacement et en le repositionnant avec pendown()
.
Pour tracer la spirale, il suffit de retourner au point de départ et d'entrer les lignes de code suivantes :
setheading(0) for number in fibonacci: circle(-number*5,90) left(180)
A vous de jouer !
from math import * from turtle import * penup() goto(-50,-50) speed(0) pendown() fibonacci=[1,1] for u in range(7): fibonacci.append(fibonacci[u]+fibonacci[u+1]) for number in fibonacci: for i in range(5): forward(number*5) right(90) forward(number*5) penup() goto(-50,-50) pendown() pensize(2) setheading(0) for number in fibonacci: circle(-number*5,90) left(180)