TP Python – Calcul matriciel en Python
BTS SIO SISR 1re année – Mathématiques pour l'informatique – S13
Note
Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.
Une matrice est une liste de listes : [[1, 2], [3, 4]] a 2 lignes et 2 colonnes ; a[i][j] est le coefficient de la ligne i et de la colonne j (indices à partir de 0).
Exercice A – Somme et produit par un réel
Écris somme(a, b) (matrices de même taille) et produit_reel(k, a). Les fonctions renvoient de nouvelles matrices.
J'anticipe. Quelle est la matrice de somme([[1, 2]], [[3, 4]]) ?
def somme(a, b):bksl-nl resultat = []bksl-nl for i in range(len(a)):bksl-nl ligne = []bksl-nl for j in range(len(a[0])):bksl-nl # À compléter : ajouter a[i][j] + b[i][j]bksl-nl passbksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nldef produitpy-undreel(k, a):bksl-nl resultat = []bksl-nl for i in range(len(a)):bksl-nl ligne = []bksl-nl for j in range(len(a[0])):bksl-nl # À compléter : ajouter k py-str a[i][j]bksl-nl passbksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nl
Exercice B – Produit
Écris produit(a, b) qui renvoie le produit des matrices a et b, ou None si les tailles sont incompatibles (colonnes de a différent des lignes de b).
Je comprends. Combien de boucles imbriquées faut-il ? Que représente la boucle la plus intérieure ?
def produit(a, b):bksl-nl """Produit de a (m x n) par b (n x p), ou None si les tailles sont incompatibles."""bksl-nl if len(a[0]) != len(b):bksl-nl return Nonebksl-nl resultat = []bksl-nl for i in range(len(a)):bksl-nl ligne = []bksl-nl for j in range(len(b[0])):bksl-nl s = 0bksl-nl for k in range(len(b)):bksl-nl # À compléter : ajouter a[i][k] py-str b[k][j] à sbksl-nl passbksl-nl ligne.append(s)bksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nl
Exercice C – Identité et puissance
Écris identite(n) et puissance(a, p) (matrice carrée a, entier p ≥ 0, puissance(a, 0) est l'identité). Utilise produit (recopié dans l'éditeur).
def produit(a, b):bksl-nl resultat = []bksl-nl for i in range(len(a)):bksl-nl ligne = []bksl-nl for j in range(len(b[0])):bksl-nl s = 0bksl-nl for k in range(len(b)):bksl-nl s = s + a[i][k] py-str b[k][j]bksl-nl ligne.append(s)bksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nldef identite(n):bksl-nl m = []bksl-nl for i in range(n):bksl-nl ligne = []bksl-nl for j in range(n):bksl-nl # À compléter : 1 sur la diagonale (i == j), 0 ailleursbksl-nl ligne.append(0)bksl-nl m.append(ligne)bksl-nl return mbksl-nlbksl-nldef puissance(a, p):bksl-nl r = identite(len(a))bksl-nl for py-und in range(p):bksl-nl # À compléter : multiplier r par abksl-nl passbksl-nl return rbksl-nlbksl-nl
Exercice D – Fibonacci par les matrices
Écris fibonacci(n) (\(n \ge 1\)) qui renvoie \(F_n\) en lisant un coefficient de \(\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}^n\). fibonacci(10) doit donner 55.
def produit(a, b):bksl-nl resultat = []bksl-nl for i in range(len(a)):bksl-nl ligne = []bksl-nl for j in range(len(b[0])):bksl-nl s = 0bksl-nl for k in range(len(b)):bksl-nl s = s + a[i][k] py-str b[k][j]bksl-nl ligne.append(s)bksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nldef fibonacci(n):bksl-nl """F(n) avec F(1) = F(2) = 1, par la puissance n de [[1, 1], [1, 0]]."""bksl-nl r = [[1, 0], [0, 1]]bksl-nl for py-und in range(n):bksl-nl # À compléter : multiplier r par [[1, 1], [1, 0]]bksl-nl passbksl-nl return 0 # À compléter : un coefficient de rbksl-nlbksl-nl
Exercice E – Coût des configurations
Écris couts(quantites, prix) qui renvoie la liste des coûts de chaque configuration (quantites : matrice des quantités, prix : liste des prix unitaires).
def couts(quantites, prix):bksl-nl resultat = []bksl-nl for ligne in quantites:bksl-nl total = 0bksl-nl for k in range(len(prix)):bksl-nl # À compléter : ajouter ligne[k] py-str prix[k]bksl-nl passbksl-nl resultat.append(total)bksl-nl return resultatbksl-nlbksl-nl