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: 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
A, B = np.ones((size, size)), np.zeros((size, size))Deux grilles de 128 × 128 : la nourriture A partout, pas encore de B.
B[y : y + 8, x : x + 8] = 1.0Une goutte de B : un carré de 8 × 8 de la grille, rempli d’un coup par découpage.
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.
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.
reaction = A * B * BLa réaction, un A et deux B donnent trois B, pour chaque cellule d’un coup.
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.
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
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.
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.
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
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.
Tu as construit les neuf. Si le cours t’a été utile, la chaîne serait ravie de le savoir. Soutenir la chaîne →