Résoudre par le pivot, et détecter les trois cas
Exercice · niveau 3 (difficile) · mathématiques approfondies (ECG 1re année), chapitre 3 — Algèbre linéaire · Systèmes linéaires
Énoncé
Écrire une fonction Python qui résout par le pivot de Gauss, sans utiliser numpy.linalg. Faire renvoyer None quand le système n'a pas de solution unique, et tester les trois cas.
Corrigé
def resoudre(A, Y, tol=1e-12):
n = len(A)
# matrice augmentee, copiee pour ne pas modifier l'appelant
M = [A[i][:] + [Y[i]] for i in range(n)]
for c in range(n):
# pivot partiel : le plus grand coefficient disponible
p = max(range(c, n), key=lambda i: abs(M[i][c]))
if abs(M[p][c]) < tol:
return None # colonne sans pivot : pas unique
M[c], M[p] = M[p], M[c]
for i in range(n):
if i != c:
f = M[i][c] / M[c][c]
for j in range(c, n + 1):
M[i][j] = M[i][j] - f * M[c][j]
return [M[i][n] / M[i][i] for i in range(n)]
Les trois cas, sur le système , , :
Solution unique () : resoudre renvoie , conforme à .
Infinité de solutions () : les deux dernières lignes deviennent nulles, aucun pivot n'est trouvé en colonne , et la fonction renvoie None.
Aucune solution : sur , le même arrêt se produit et la fonction renvoie None.
La limite, à dire honnêtement. La fonction distingue « unique » de « pas unique », mais pas « aucune » de « une infinité » — dans les deux cas elle rend None. Les séparer demande de regarder si une ligne avec subsiste après élimination, ce qui est un ajout de quelques lignes.
Deux choix de calcul. Le pivot partiel (le plus grand coefficient) limite l'amplification des erreurs d'arrondi ; et le test remplace une comparaison à zéro, illusoire en flottants.
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.