mathématiques approfondies (ECG 1re année) · Chapitre 11 · Exercice
Deux produits qui n'en sont pas un
Informatique et algorithmique · Matrices et systèmes linéaires · niveau 1 (application)
Énoncé
Comparer M * M et np.dot(M, M) pour . Expliquer.
Corrigé
import numpy as np
M = np.array([[1, 1], [0, 1]])
print(M * M) # [[1, 1], [0, 1]]
print(np.dot(M, M)) # [[1, 2], [0, 1]]
print(M @ M) # [[1, 2], [0, 1]] -- meme chose, mais np.dot
# est la seule syntaxe exigible
Ils diffèrent, et ce n'est pas un défaut de numpy.
M * M est le produit terme à terme (dit de Hadamard) : chaque coefficient est élevé au carré. D'où .
np.dot(M, M) — ou M @ M — est le produit matriciel du cours, . D'où , ce que le calcul à la main confirme : le coefficient vaut .
L'erreur est silencieuse, et c'est ce qui la rend dangereuse : les deux résultats ont la même taille, aucun message n'est émis, et le programme continue avec des nombres faux. La règle : dans numpy, * est toujours terme à terme ; pour le produit matriciel, écrire @.
Un contrôle utile : . Si le coefficient en haut à droite ne croît pas, c'est qu'on n'a pas fait le bon produit.
Exercices semblables
- Résoudre, et vérifier corrigé
- Une puissance de matrice, conjecturée puis démontrée corrigé
- Approcher corrigé
- L'escalier de la suite de Héron corrigé
- L'ordre de convergence des rectangles corrigé