Aller au contenu

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]]) ?

###
assert somme([[2, 1], [0, 3]], [[1, 4], [2, 5]]) == [[3, 5], [2, 8]]bksl-nlassert somme([[1, 2]], [[3, 4]]) == [[4, 6]]bksl-nlassert produitpy-undreel(3, [[2, 1], [0, 3]]) == [[6, 3], [0, 9]]bksl-nlassert produitpy-undreel(0, [[5, 6]]) == [[0, 0]]bksl-nlassert produitpy-undreel(-1, [[1, -2]]) == [[-1, 2]]bksl-nlbksl-nl ∞/∞

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 ?

###
assert produit([[2, 1], [0, 3]], [[1, 4], [2, 5]]) == [[4, 13], [6, 15]]bksl-nlassert produit([[1, 4], [2, 5]], [[2, 1], [0, 3]]) == [[2, 13], [4, 17]]bksl-nlassert produit([[1, 2, 0], [3, -1, 4]], [[2, 1], [0, 5], [-3, 2]]) == [[2, 11], [-6, 6]]bksl-nlassert produit([[1, 1], [1, 1]], [[1, -1], [-1, 1]]) == [[0, 0], [0, 0]]bksl-nlassert produit([[1, 2]], [[1, 2]]) is Nonebksl-nlassert produit([[1, 1, 1], [2, 1, 2], [4, 2, 2]], [[30], [60], [110]]) == [[200], [340], [460]]bksl-nlbksl-nl ∞/∞

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).

###
assert identite(3) == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]bksl-nlassert puissance([[1, 1], [0, 1]], 5) == [[1, 5], [0, 1]]bksl-nlassert puissance([[2, 0], [0, 3]], 4) == [[16, 0], [0, 81]]bksl-nlassert puissance([[1, 1], [1, 0]], 10) == [[89, 55], [55, 34]]bksl-nlassert puissance([[5, 7], [1, 2]], 0) == [[1, 0], [0, 1]]bksl-nlassert puissance([[2, 1], [0, 3]], 1) == [[2, 1], [0, 3]]bksl-nlbksl-nl ∞/∞

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.

###
assert fibonacci(1) == 1 and fibonacci(2) == 1 and fibonacci(3) == 2bksl-nlassert fibonacci(10) == 55bksl-nlassert fibonacci(20) == 6765bksl-nlassert [fibonacci(n) for n in range(1, 9)] == [1, 1, 2, 3, 5, 8, 13, 21]bksl-nlbksl-nl ∞/∞

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).

###
assert couts([[1, 1, 1], [2, 1, 2], [4, 2, 2]], [30, 60, 110]) == [200, 340, 460]bksl-nlassert couts([[1, 0], [0, 1]], [5, 7]) == [5, 7]bksl-nlassert couts([], [1, 2]) == []bksl-nlassert couts([[2, 3]], [10, 100]) == [320]bksl-nlbksl-nl ∞/∞

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