Adloun

Décider la liberté d'une famille avec al.rank

Exercice d'entraînement · niveau 2 · mathématiques approfondies (ECG 1re année), chapitre 11 — Informatique et algorithmique · Matrices et rang

Énoncé

Écrire une fonction qui, recevant une matrice dont les colonnes sont les vecteurs d'une famille, dit si cette famille est libre. La tester sur puis sur . Expliquer enfin pourquoi le verdict n'est pas fiable sur des flottants quelconques.

Corrigé

Ce qu'on montre. Que « libre » se traduit par « rang nombre de vecteurs », et que ce critère numérique a une limite qu'il faut nommer.

Le critère. Une famille de vecteurs engendre un sous-espace de dimension , et le cours donne : la famille est libre si et seulement si . Le rang de la matrice dont les colonnes sont ces vecteurs est précisément la dimension du sous-espace engendré.

Le programme.

import numpy as np
import numpy.linalg as al

def est_libre(M):
    """M : les vecteurs de la famille sont les COLONNES."""
    nb_vecteurs = np.shape(M)[1]
    return al.rank(M) == nb_vecteurs

F1 = np.array([[1., 2., 3.],
               [0., 1., 1.],
               [1., 3., 4.]])
F2 = np.array([[1., 0., 1.],
               [0., 1., 1.],
               [1., 1., 0.]])
print(al.rank(F1), est_libre(F1))   # 2 False
print(al.rank(F2), est_libre(F2))   # 3 True

Le contrôle à la main. Pour la première famille, on observe donc le troisième vecteur est combinaison des deux premiers : la famille est liée, et son rang vaut puisque les deux premiers vecteurs ne sont pas proportionnels. Pour la seconde, une combinaison nulle donne , , , d'où puis : la famille est libre, de rang . Le programme confirme les deux verdicts.

La limite du critère. al.rank ne peut pas décider d'une nullité exacte sur des flottants : il compte les directions dont la « taille » dépasse une tolérance. Le piège se manifeste déjà à la saisie :

print(1 + 1e-16 == 1)     # True

Le réel n'est pas représentable en double précision : il est arrondi à . La famille , mathématiquement libre, entre dans la machine sous la forme , et al.rank renvoie . Le verdict est faux, et aucune amélioration de l'algorithme n'y changerait rien : c'est la donnée qui a été altérée avant tout calcul.

Ce qu'il faut en conclure. Sur des coefficients entiers de taille modeste, al.rank est fiable et pratique. Dès que les coefficients proviennent d'un calcul flottant, son résultat est une conjecture : la liberté d'une famille se démontre à la main, la machine ne fait que la suggérer.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.