Exercice — matrices (5 points), dans l'esprit des sessions 2020–2026
Une ville gère trois stations de vélos en libre-service, numérotées 0, 1 et 2. Chaque nuit, les vélos sont redistribués : on note M[i, j] la proportion des vélos de la station i qui se retrouvent le lendemain à la station j. On obtient ainsi une matrice carrée M de dimension n × n (ici n = 3).
Une matrice carrée M de réels est dite stochastique lorsque chacun de ses éléments appartient à l'intervalle [0, 1] et que la somme des éléments de chaque ligne est égale à 1.
Si T[i] est le nombre de vélos de la station i un jour donné, le nombre de vélos de la station j le lendemain est P[j], où P est le produit du tableau T par la matrice M :
Le tableau T est dit stable pour M lorsque P = T : la répartition des vélos ne change plus d'un jour à l'autre.
Exemple : pour la matrice M et le tableau T suivants :
| i \ j | 0 | 1 | 2 |
|---|---|---|---|
| 0 | 0,7 | 0,2 | 0,1 |
| 1 | 0,1 | 0,7 | 0,2 |
| 2 | 0,3 | 0,2 | 0,5 |
| j | 0 | 1 | 2 |
|---|---|---|---|
| T[j] | 110 | 120 | 70 |
Travail demandé :
- Déclarer le type Mat d'une matrice carrée de 20 × 20 réels au plus et le type Tab d'un tableau de 20 réels.
- Écrire l'algorithme d'une fonction Stochastique(M, n) qui vérifie si M est stochastique. Le parcours doit s'arrêter dès qu'une condition n'est pas respectée.
- Écrire l'algorithme d'une procédure Produit(T, M, n, P) qui calcule le tableau P, produit de T par M.
- Écrire l'algorithme d'une fonction Egalite(P, T, n) qui vérifie si les tableaux P et T sont égaux, en s'arrêtant à la première différence.
- En faisant appel à Produit et à Egalite, écrire l'algorithme d'une fonction Stable(M, n, T) qui vérifie si T est stable pour M, la matrice M étant supposée stochastique.
- Traces d'exécution.
- Vérifier que la matrice M de l'exemple est stochastique, puis calculer P pour le tableau T de l'exemple. T est-il stable ?
- Calculer P pour T = (100, 100, 100). Ce tableau est-il stable ?
- On remplace M par la matrice M' dont les lignes sont (0,6 ; 0,3 ; 0,1), (0,4 ; 0,7 ; −0,1) et (0,2 ; 0,2 ; 0,6). Sur quelle ligne et pour quelle raison la fonction Stochastique s'arrête-t-elle ?
NB : M, n et T sont saisis dans le programme appelant. Chaque algorithme est accompagné du tableau de déclaration de ses objets locaux.
Voir la correction commentéeAprès avoir posé votre démarche
1.
| Nouveaux types |
|---|
| Mat = Tableau de 20 lignes et 20 colonnes de Réels |
| Tab = Tableau de 20 Réels |
2. Idée : une propriété « pour tous les éléments » se vérifie par un parcours qui s'arrête au premier contre-exemple : un booléen ok contrôle les deux boucles Tant que. La somme d'une ligne n'est testée qu'une fois la ligne entièrement parcourue.
Fonction Stochastique (M : Mat, n : Entier) : Booléen
DEBUT
ok ← Vrai
i ← 0
Tant que ok Et (i < n) Faire
s ← 0
j ← 0
Tant que ok Et (j < n) Faire
Si (M[i, j] < 0) Ou (M[i, j] > 1) Alors
ok ← Faux
Sinon
s ← s + M[i, j]
j ← j + 1
Fin Si
Fin Tant que
Si ok Et (Abs (s - 1) > 0.000001) Alors
ok ← Faux
Fin Si
i ← i + 1
Fin Tant que
Retourner ok
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| ok | Booléen | Vrai tant que aucune condition n'est violée |
| i, j | Entier | Indices de ligne et de colonne |
| s | Réel | Somme des éléments de la ligne i |
Le corrigé officiel de la session de contrôle 2022 écrit le test de la somme s = 1. En machine, les réels sont arrondis : avec des réels en virgule flottante, 0,7 + 0,2 + 0,1 donne 0,9999999999999999, et le test s = 1 rejetterait la première ligne de l'exemple. On compare donc à une précision fixée, Abs(s − 1) ≤ 10⁻⁶.
3. Idée : P[j] est une somme sur i ; l'accumulateur est remis à 0 pour chaque j, c'est-à-dire pour chaque case de P.
Procédure Produit (T : Tab, M : Mat, n : Entier, @ P : Tab)
DEBUT
Pour j de 0 à n - 1 Faire
x ← 0
Pour i de 0 à n - 1 Faire
x ← x + T[i] * M[i, j]
Fin Pour
P[j] ← x
Fin Pour
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| i, j | Entier | Indices |
| x | Réel | Somme en cours pour la case j |
4. Idée : même schéma d'arrêt anticipé : on avance tant que les éléments sont égaux, puis on retourne le test sur le dernier élément examiné.
Fonction Egalite (P, T : Tab, n : Entier) : Booléen
DEBUT
i ← 0
Tant que (i < n - 1) Et (Abs (P[i] - T[i]) ≤ 0.000001) Faire
i ← i + 1
Fin Tant que
Retourner Abs (P[i] - T[i]) ≤ 0.000001
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| i | Entier | Indice de parcours |
5. Idée : Stable ne recalcule rien elle-même ; elle enchaîne les deux modules. P est un objet local.
Fonction Stable (M : Mat, n : Entier, T : Tab) : Booléen
DEBUT
Produit (T, M, n, P)
Retourner Egalite (P, T, n)
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| P | Tab | Produit de T par M |
| Produit | Procédure | Calculer P |
| Egalite | Fonction | Comparer P et T |
6.a Idée : on vérifie ligne par ligne, puis on calcule P colonne par colonne de M. Tous les éléments de M sont dans [0, 1], et chaque ligne a pour somme 1 : 0,7 + 0,2 + 0,1 = 0,1 + 0,7 + 0,2 = 0,3 + 0,2 + 0,5 = 1. M est stochastique.
P[0] = 110 × 0,7 + 120 × 0,1 + 70 × 0,3 = 110
P[1] = 110 × 0,2 + 120 × 0,7 + 70 × 0,2 = 120
P[2] = 110 × 0,1 + 120 × 0,2 + 70 × 0,5 = 70
P = (110 ; 120 ; 70) = T : T est stable pour M. Les 300 vélos se redistribuent chaque nuit sans que le nombre de vélos de chaque station change.
6.b Avec T = (100, 100, 100), P[j] vaut 100 fois la somme de la colonne j de M : P = (110 ; 110 ; 80) ≠ T. Egalite s'arrête dès la première case (i = 0), puisque P[0] = 110 ≠ 100 : ce tableau n'est pas stable. Le nombre total de vélos reste 300, mais ils ne sont pas répartis de façon stable.
6.c La ligne 0 de M' est correcte : ses éléments sont dans [0, 1] et 0,6 + 0,3 + 0,1 = 1. Sur la ligne 1, l'élément M'[1, 2] = −0,1 est négatif : ok devient Faux et le parcours s'arrête, la ligne 2 n'étant jamais examinée. Pourtant 0,4 + 0,7 − 0,1 = 1 : tester seulement les sommes des lignes ne suffit pas.