Avancé · Motifs de Turing

Leçon 9 : Grilles et diffusion

Construis en Python le motif « Motifs de Turing » et apprends en chemin :

  • des tableaux à 2 dimensions comme grille de cellules
  • np.roll pour les voisins, avec des bords qui se rejoignent
  • le laplacien : une cellule face à ses voisines
  • mettre à jour toute une grille en une ligne
  • afficher un tableau avec plt.imshow

Regarde-le d’abord

Lecture depuis YouTube après un clic.

turing-patterns.py
"""Turing patterns: the Gray-Scott reaction-diffusion rule on a 128 x 128 grid.
Run: python turing-patterns.py   (needs: pip install numpy matplotlib; takes a few seconds)
"""
import numpy as np
import matplotlib.pyplot as plt

plt.style.use("dark_background")

size, steps = 128, 6000
f, k = 0.0545, 0.062  # feed and kill rates: coral
DA, DB = 1.0, 0.5  # A spreads twice as fast as B

A, B = np.ones((size, size)), np.zeros((size, size))
rng = np.random.default_rng()
for y, x in rng.integers(10, size - 18, (6, 2)):
    B[y : y + 8, x : x + 8] = 1.0  # six drops of B


def laplacian(Z):
    """Each cell against its neighbours: 0.2 for the four sides, 0.05 for the corners (Karl Sims)"""
    sides = np.roll(Z, 1, 0) + np.roll(Z, -1, 0) + np.roll(Z, 1, 1) + np.roll(Z, -1, 1)
    corners = (np.roll(np.roll(Z, 1, 0), 1, 1) + np.roll(np.roll(Z, 1, 0), -1, 1)
               + np.roll(np.roll(Z, -1, 0), 1, 1) + np.roll(np.roll(Z, -1, 0), -1, 1))
    return 0.2 * sides + 0.05 * corners - Z


for _ in range(steps):
    reaction = A * B * B  # one A and two B make three B
    A += DA * laplacian(A) - reaction + f * (1 - A)
    B += DB * laplacian(B) + reaction - (f + k) * B

plt.figure(figsize=(6, 6))
plt.imshow(B, cmap="magma", vmin=0, vmax=0.5)
plt.axis("off")
plt.show()

# Try: f, k = 0.039, 0.058 (a cell net) or 0.034, 0.063 (spots) -> the same rule, another pattern

Pas de Python sur cet ordinateur ? Le notebook exécute le même script, les exercices et les réponses dans ton navigateur, sur Google Colab. Le notebook est en anglais.

Ligne par ligne

  1. A, B = np.ones((size, size)), np.zeros((size, size))

    Deux grilles de 128 × 128 : la nourriture A partout, pas encore de B.

  2. B[y : y + 8, x : x + 8] = 1.0

    Une goutte de B : un carré de 8 × 8 de la grille, rempli d’un coup par découpage.

  3. def laplacian(Z):

    À quel point une cellule diffère de ses voisines : positif là où les voisines en ont plus, donc la diffusion la remplit.

  4. sides = np.roll(Z, 1, 0) + np.roll(Z, -1, 0) + np.roll(Z, 1, 1) + np.roll(Z, -1, 1)

    np.roll décale toute la grille d’une cellule vers le haut, le bas, la gauche ou la droite ; les bords se rejoignent, donc la boîte n’a pas de bord.

  5. reaction = A * B * B

    La réaction, un A et deux B donnent trois B, pour chaque cellule d’un coup.

  6. A += DA * laplacian(A) - reaction + f * (1 - A)

    La règle de Gray–Scott pour A : il se répand, il est mangé, et il est réalimenté vers 1 au taux f.

  7. plt.imshow(B, cmap="magma", vmin=0, vmax=0.5)

    La grille de B sous forme d’image, un pixel par cellule.

À toi de jouer

  1. Essaie f, k = 0.034, 0.063.

    Indice

    Une ligne près du début.

    Réponse

    Des taches : des plaques rondes de B, espacées régulièrement, au lieu des lignes sinueuses du corail.

  2. Fais que B se répande aussi vite que A : DB = 1.0. Que se passe-t-il ?

    Indice

    DA, DB = 1.0, 1.0.

    Réponse

    Aucun motif : les gouttes s’effacent jusqu’à disparaître. Si A ne se répand pas plus vite que B, rien ne maintient les plaques séparées. C’est tout l’argument de Turing.

  3. Utilise une seule goutte au milieu au lieu de six.

    Indice

    Remplace la boucle par B[60:68, 60:68] = 1.0.

    Réponse

    Le corail pousse vers l’extérieur à partir de cette goutte unique, avec une symétrie d’ordre quatre qui reprend la goutte carrée : une seule graine donne un motif ordonné, six gouttes au hasard un motif d’allure naturelle.

Quiz

1. Que fait np.roll(Z, 1, 0) ?
2. Que mesure le laplacien d’une cellule ?
3. Pourquoi n’y a-t-il pas de boucle sur les cellules ?
4. Qu’a montré Turing en 1952 ?
5. Qu’est-ce qui change entre le corail et les taches ?

Cartes mémoire

Lis le recto, dis-toi le verso, puis retourne la carte.

  • np.roll(Z, shift, axis)

    Décale un tableau le long d’un axe ; ce qui sort par un bout revient par l’autre.

  • Laplacien

    Les voisines d’une cellule moins la cellule elle-même : là où la diffusion va la déplacer.

  • Gray–Scott

    A est apporté au taux f, B est retiré au taux f + k, et A + 2B → 3B.

  • Instabilité de Turing

    La diffusion casse un mélange homogène en un motif quand une substance se répand plus vite.

  • plt.imshow(grid)

    Affiche un tableau à 2 dimensions sous forme d’image, un pixel par cellule.

Ces cartes mémoire sur une page à part →

Tu as construit les neuf. Si le cours t’a été utile, la chaîne serait ravie de le savoir. Soutenir la chaîne →