Le rang par un pivot
Exercice · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 7 — L'espace des n-uplets réels, sous-espaces vectoriels et applications linéaires · Rang d'une matrice
Énoncé
Écrire une fonction Python qui, à partir d'une matrice donnée comme liste de listes, effectue un pivot de Gauss et renvoie le nombre de pivots non nuls. Comparer avec np.linalg.matrix_rank.
Corrigé
def rang(M, tol=1e-9):
A = [ligne[:] for ligne in M] # on ne modifie pas l'appelant
n, p = len(A), len(A[0])
r = 0 # ligne du pivot courant
for c in range(p):
# cherche le plus grand pivot de la colonne c, sous la ligne r
piv = max(range(r, n), key=lambda i: abs(A[i][c]), default=None)
if piv is None or abs(A[piv][c]) < tol:
continue # colonne sans pivot : on passe
A[r], A[piv] = A[piv], A[r]
for i in range(r + 1, n):
f = A[i][c] / A[r][c]
for j in range(c, p):
A[i][j] = A[i][j] - f * A[r][j]
r = r + 1
if r == n:
break
return r
Sur la matrice , dont la troisième ligne est la première moins la deuxième, la fonction renvoie , comme np.linalg.matrix_rank(M).
Deux choix qui comptent. On prend le plus grand pivot disponible en valeur absolue : c'est le pivot partiel, et il limite l'amplification des erreurs d'arrondi. Et l'on compare à une tolérance plutôt qu'à zéro — en flottants, un pivot théoriquement nul vaut souvent , et le tester par == 0 ferait compter un pivot de plus.
Ce qui reste fragile. Le rang est une notion discontinue : une matrice de rang devient de rang sous une perturbation arbitrairement petite. Aucun seuil ne peut donc être le bon dans tous les cas — numpy en choisit un lié à la taille et à la plus grande valeur singulière, ce qui est plus fin que notre tol fixe.
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.