Adloun

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.