Terminale · A1
terminale
Aller plus loin · Scripts

Les scripts et les figures du flocon

L'annexe Python prête à copier, les figures en haute résolution et le tracé animé du flocon.

La dernière page du DM promettait le tracé animé du flocon et les figures en haute résolution : les voici, accompagnés des programmes de l’annexe Python (Q31 à Q34), prêts à copier dans votre éditeur. Une règle du jeu, avant tout : les pointillés ... du document restent des pointillés ici. Les compléter, c’est l’exercice, et le DM n’a pas de corrigé. Seules les réponses du sommet (partie IV) sont publiées, sur leur page dédiée.

Le tracé animé

Les étapes 00 à 44 s’enchaînent en boucle, par fondu : le triangle, l’étoile, puis le bord qui se replie. L’animation est du CSS pur à l’intérieur du SVG, sans une ligne de JavaScript ; chaque étape reste affichée un peu moins de deux secondes, et le cycle complet dure dix secondes.

Regardez ce que l’animation montre et que la partie I démontrait : la figure ne grandit pas, elle reste enfermée dans le même hexagone (Q26). C’est son bord qui se replie de plus en plus finement, et c’est lui qui emporte le périmètre vers l’infini.

Les figures en haute résolution

Ces figures sont vectorielles : vous pouvez zoomer sans perte, aussi loin que votre écran le permet. Elles ont été engendrées par le programme de Q31, une fois complété, et leurs coordonnées ont été vérifiées par le calcul : à chaque rang nn, la longueur de la ligne obtenue sur un côté vaut (43)n\left(\frac43\right)^{n}, soit 3(43)n3\left(\frac43\right)^{n} pour le flocon entier, et l’aire du polygone, calculée par la formule du lacet, redonne exactement la formule de Q12 : An=A0[8535(49)n]A_n = A_0\left[\frac85 - \frac35\left(\frac49\right)^{n}\right].

Étape 0. Le triangle de départ, de côté 11 : périmètre P0=3P_0 = 3, aire A0A_0.

Étape 1. L’étoile : chaque côté a été remplacé par quatre côtés trois fois plus courts ; périmètre P1=4P_1 = 4.

Étape 2. Périmètre P2=1635,33P_2 = \frac{16}{3} \approx 5{,}33 : le bord commence à se replier.

Étape 3. Périmètre P3=6497,11P_3 = \frac{64}{9} \approx 7{,}11 ; les côtés mesurent 127\frac{1}{27} et l’œil commence à décrocher.

Étape 4. Périmètre P4=256279,48P_4 = \frac{256}{27} \approx 9{,}48. Le périmètre ne fait que commencer sa course ; l’aire, elle, s’est déjà presque immobilisée : c’est tout le paradoxe des parties I et II réuni dans une seule image.

Les programmes de l’annexe, prêts à copier

Les blocs ci-dessous sont fidèles au document, au caractère près. Dans toute l’annexe, on prend A=(0;0)A = (0\,;0) et B=(1;0)B = (1\,;0), c’est-à-dire a=1a = 1.

Q31 · Tracer le monstre

Trois passages en pointillés à compléter : le point P3P_3, et deux des quatre appels récursifs.

from math import cos, sin, pi

def koch(A, B, n):
    if n == 0:
        return [A]
    (ax, ay), (bx, by) = A, B
    dx, dy = (bx - ax)/3, (by - ay)/3
    P1 = (ax + dx, ay + dy)
    P3 = ...
    c, s = cos(-pi/3), sin(-pi/3)
    P2 = (P1[0] + dx*c - dy*s, P1[1] + dx*s + dy*c)
    return koch(A, P1, n-1) + ... + koch(P2, P3, n-1) + ...

Les repères de contrôle, déjà donnés par l’énoncé : le niveau 55 doit renvoyer 10241\,024 points (et le point BB n’y figure jamais, à vous d’expliquer pourquoi) ; après avoir ajouté BB à la liste, la longueur de la ligne brisée doit valoir (43)n\left(\frac43\right)^{n}. C’est la validation par la théorie : votre programme et votre partie I doivent tomber d’accord. Nos figures ci-dessus ont passé exactement ce test.

Q32 · Le seuil

Pas de squelette pour celle-ci : la fonction seuil(cible), qui renvoie le plus petit entier nn tel que Pn>cibleP_n > \texttt{cible} pour a=1a = 1 mètre, est à écrire entièrement. Vos réponses à la question Q6 vous fournissent ses valeurs de contrôle.

Q33 · L’encadrement à quatorze chiffres

Deux pointillés à compléter, et uniquement des entiers en jeu.

def encadrement(qmax):
    bas, haut = 0, 2
    for q in range(1, qmax + 1):
        for p in range(q, 2*q + 1):
            if 3**p < 4**q and p/q > bas:
                bas = ...
            if 3**p > 4**q and p/q < haut:
                haut = ...
    return bas, haut

En chemin, Python manipule de façon exacte 329=686303773648833^{29} = 68\,630\,377\,364\,883 et 423=703687441776644^{23} = 70\,368\,744\,177\,664, deux entiers à quatorze chiffres, recalculés et confirmés ici même. C’est toute la question Q33.b) : des entiers exacts, aussi grands soient-ils, prouvent ; des décimaux arrondis ne prouvent rien.

Q34 · Mesurer une dimension, vraiment

La fonction de comptage est fournie complète par le document :

def comptage(points, k):
    return len({(int(x*k), int(y*k)) for (x, y) in points})

Deux rappels de l’énoncé pour l’utiliser sans se piéger : la courbe de niveau 88 doit être complétée par le point BB, comme en Q31.b), sans quoi le premier rapport est faux d’une unité entière ; et les cinq rapports B(3k)B(k)\frac{B(3k)}{B(k)} obtenus pour k=3,9,27,81,243k = 3, 9, 27, 81, 243 sont voisins de 4,004{,}00 ; 4,504{,}50 ; 4,254{,}25 ; 4,194{,}19 et 3,933{,}93. Nous avons ré-exécuté le comptage : ces cinq valeurs sont exactes telles quelles. Expliquer pourquoi elles ne valent pas toutes 4,004{,}00, en revanche, reste votre question b).

Sources

  • DM1 A1, « Le monstre de 1904 », annexe « le laboratoire Python » : questions Q31 à Q34, dont les blocs de code ci-dessus sont la copie conforme.
  • Les figures et l’animation de cette page ont été engendrées par programme, puis vérifiées : longueur 3(43)n3\left(\frac43\right)^{n} et aire A0[8535(49)n]A_0\left[\frac85 - \frac35\left(\frac49\right)^{n}\right] retrouvées à chaque étape, en accord avec les parties I et II du DM.
← Retour au chapitre A1