Aller au contenu

Bibliothèque butinfom

Cette bibliothèque Python propose des outils pour l’enseignement des mathématiques en BUT d’informatique. Les fonctionnalités d’affichage des expressions mathématiques sont prévues pour l’environnement Jupyter Notebook.

Installation de la bibliothèque

Depuis la console système

pip install butinfom

Exécuter la commande ci-dessous pour être sûr d’avoir la version la plus récente :

pip install --upgrade butinfom

Depuis une cellule de cahier Jupyter

%pip install butinfom

Exécuter la commande ci-dessous pour être sûr d’avoir la version la plus récente :

%pip install --upgrade butinfom

Remarque

Ces deux dernières commandes fonctionnent dans les Jupyter Notebooks ouverts avec Google Colab et Visual Studio Code.

Module pivotgauss

Ce module permet d’afficher les étapes de l’algorithme du pivot de Gauss pour :

  • la résolution d’un système d’équations linéraires ;
  • l’inversion d’une matrice carrée.

Ce module s’appuie principalement sur le module sympy.

Résolution d’un système d’équations linéaires

Exemple. Soit le système d’équations linéaires suivant à trois inconnues :

\begin{align*} \begin{cases} x - 2y - 3z = 0 \\ 3x - 6y - z = -8 \\ x - 4z = 5 \\ \end{cases} \\ \end{align*}

On peut représenter le système précédent par le tableau de nombres suivant :

\begin{align*} \begin{array}{|c|c|c|c|} \hline 1 & -2 & -3 & 0 \\ \hline 3 & -6 & -1 & -8 \\ \hline 1 & 0 & -4 & 5 \\ \hline \end{array} \end{align*}

Pour obtenir la représentation des étapes de résolution du système, exécuter les instructions suivantes dans la cellule d’un cahier Jupyter :

from butinfom import PivotGaussSysteme

piv1 = PivotGaussSysteme([
    [1, -2, -3,  0],
    [3, -6, -1, -8],
    [1,  0, -4,  5]
])

piv1 # à placer en dernière ligne de cellule pour obtenir l'affichage naturel
Affichage obtenu
\begin{align*} \begin{cases} x - 2y - 3z = 0 \\ 3x - 6y - z = -8 \\ x - 4z = 5 \\ \end{cases} \\ \begin{array}{l|ccc|c|} \hline L_{1} & 1 & -2 & -3 & 0 \\ L_{2} & 3 & -6 & -1 & -8 \\ L_{3} & 1 & 0 & -4 & 5 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & -2 & -3 & 0 \\ L_{2} \leftarrow L_{2} - 3L_{1} & 0 & 0 & 8 & -8 \\ L_{3} \leftarrow L_{3} - L_{1} & 0 & 2 & -1 & 5 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & -2 & -3 & 0 \\ L_{2} \leftarrow L_{3} & 0 & 2 & -1 & 5 \\ L_{3} \leftarrow L_{2} & 0 & 0 & 8 & -8 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & -2 & -3 & 0 \\ L_{2} \leftarrow \frac{1}{2}L_{2} & 0 & 1 & - \frac{1}{2} & \frac{5}{2} \\ L_{3} \leftarrow L_{3} & 0 & 0 & 8 & -8 \\ \hline \hline L_{1} \leftarrow L_{1} + 2L_{2} & 1 & 0 & -4 & 5 \\ L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{1}{2} & \frac{5}{2} \\ L_{3} \leftarrow L_{3} & 0 & 0 & 8 & -8 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & 0 & -4 & 5 \\ L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{1}{2} & \frac{5}{2} \\ L_{3} \leftarrow \frac{1}{8}L_{3} & 0 & 0 & 1 & -1 \\ \hline \hline L_{1} \leftarrow L_{1} + 4L_{3} & 1 & 0 & 0 & 1 \\ L_{2} \leftarrow L_{2} + \frac{1}{2}L_{3} & 0 & 1 & 0 & 2 \\ L_{3} \leftarrow L_{3} & 0 & 0 & 1 & -1 \\ \hline \end{array} \\ \begin{cases} x = 1 \\ y = 2 \\ z = -1 \\ \end{cases} \\ \end{align*}
Remarque. Types de nombres du tableau 2D

Le constructeur de la classe PivotGaussSysteme s’appelle avec un tableau 2D représenté par une instance du type prédéfini list comme dans l’exemple ci-dessus ou par une instance de la classe Matrix du module sympy.

Les éléments de ce tableau 2D sont :

  • des nombres des types prédéfinis (int, float) ou
  • des instances de la classe Fraction du module fractions ou
  • des instances de toute classe de nombres du module sympy ou
  • des instances de la classe Symbol de sympy

Voici un exemple montrant comment utiliser la classe Symbol de sympy.

Considérons le système suivant d’inconnues x, y et z avec a, b et c trois constantes réelles :

\begin{align*} \begin{cases} x + y + z = a \\ x - y - 2z = b \\ x + 5y + 7z = c \\ \end{cases} \end{align*}

Voilà comment résoudre ce système à l’aide du module pivot_gauss :

from butinfom import PivotGaussSysteme
from sympy import symbols # importation à ajouter

a, b, c = symbols('a b c') # déclaration des constantes a, b et c

piv1 = PivotGaussSysteme([
    [1,  1,  1,  a],
    [1, -1, -2,  b],
    [ 1,  5,  7,  c]
])

piv1 # à placer en dernière ligne pour obtenir l'affichage naturel
Affichage obtenu
\begin{align*} \begin{cases} x + y + z = a \\ x - y - 2z = b \\ x + 5y + 7z = c \\ \end{cases} \\ \begin{array}{l|ccc|c|} \hline L_{1} & 1 & 1 & 1 & a \\ L_{2} & 1 & -1 & -2 & b \\ L_{3} & 1 & 5 & 7 & c \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & 1 & 1 & a \\ L_{2} \leftarrow L_{2} - L_{1} & 0 & -2 & -3 & - a + b \\ L_{3} \leftarrow L_{3} - L_{1} & 0 & 4 & 6 & - a + c \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & 1 & 1 & a \\ L_{2} \leftarrow -\frac{1}{2}L_{2} & 0 & 1 & \frac{3}{2} & \frac{a}{2} - \frac{b}{2} \\ L_{3} \leftarrow L_{3} & 0 & 4 & 6 & - a + c \\ \hline \hline L_{1} \leftarrow L_{1} - L_{2} & 1 & 0 & - \frac{1}{2} & \frac{a}{2} + \frac{b}{2} \\ L_{2} \leftarrow L_{2} & 0 & 1 & \frac{3}{2} & \frac{a}{2} - \frac{b}{2} \\ L_{3} \leftarrow L_{3} - 4L_{2} & 0 & 0 & 0 & - 3 a + 2 b + c \\ \hline \end{array} \\ \begin{cases} x - \frac{1}{2}z = \frac{a}{2} + \frac{b}{2} \\ y + \frac{3}{2}z = \frac{a}{2} - \frac{b}{2} \\ 0 = - 3 a + 2 b + c \\ \end{cases} \\ \end{align*}

Pour obtenir le code \LaTeX correspondant, on réalise l’affichage avec la fonction print comme présenté ci-dessous :

from butinfom import PivotGaussSysteme

piv1 = PivotGaussSysteme([
    [1, -2, -3,  0],
    [3, -6, -1, -8],
    [1,  0, -4,  5]
])

print(piv1) # affichage du code LaTeX
Affichage obtenu
\begin{cases}
    x - 2y - 3z = 0 \\
    3x - 6y - z = -8 \\
    x - 4z = 5 \\
\end{cases} \\
\begin{array}{l|ccc|c|}
    \hline
    L_{1} & 1 & -2 & -3 & 0 \\
    L_{2} & 3 & -6 & -1 & -8 \\
    L_{3} & 1 & 0 & -4 & 5 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & -2 & -3 & 0 \\
    L_{2} \leftarrow L_{2} - 3L_{1} & 0 & 0 & 8 & -8 \\
    L_{3} \leftarrow L_{3} - L_{1} & 0 & 2 & -1 & 5 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & -2 & -3 & 0 \\
    L_{2} \leftarrow L_{3} & 0 & 2 & -1 & 5 \\
    L_{3} \leftarrow L_{2} & 0 & 0 & 8 & -8 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & -2 & -3 & 0 \\
    L_{2} \leftarrow \frac{1}{2}L_{2} & 0 & 1 & - \frac{1}{2} & \frac{5}{2} \\
    L_{3} \leftarrow L_{3} & 0 & 0 & 8 & -8 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} + 2L_{2} & 1 & 0 & -4 & 5 \\
    L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{1}{2} & \frac{5}{2} \\
    L_{3} \leftarrow L_{3} & 0 & 0 & 8 & -8 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & 0 & -4 & 5 \\
    L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{1}{2} & \frac{5}{2} \\
    L_{3} \leftarrow \frac{1}{8}L_{3} & 0 & 0 & 1 & -1 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} + 4L_{3} & 1 & 0 & 0 & 1 \\
    L_{2} \leftarrow L_{2} + \frac{1}{2}L_{3} & 0 & 1 & 0 & 2 \\
    L_{3} \leftarrow L_{3} & 0 & 0 & 1 & -1 \\
    \hline
\end{array} \\
\begin{cases}
    x = 1 \\
    y = 2 \\
    z = -1 \\
\end{cases} \\

Remarque

  • La classe PivotGaussSysteme prend en charge tous les systèmes linéaires en particulier ceux pour lesquels le nombre d’équations n’est pas égal au nombre d’inconnues.
  • Au dessus de trois inconnues, les inconnues sont nommées x_1, x_2, x_3, x_4 etc.

Inversion d’une matrice carrée

La classe PivotGaussInverseMatrice prend en charge toute matrice carré qu’elle soit inversible ou non. Si la matrice n’est pas inversible, l’algorithme du pivot n’aboutit pas mais les étapes avant le blocage sont tout de même affichées.

Exemple. Cas d’une matrice inversible

On considère la matrice inversible suivante :

\begin{align*} \begin{pmatrix} 1 & -1 & 0 \\ 0 & 3 & -2 \\ -1 & 2 & -1 \\ \end{pmatrix} \end{align*}

Pour obtenir la représentation des étapes d’inversion de la matrice, exécuter les instructions suivantes dans la cellule d’un cahier Jupyter :

from butinfom import PivotGaussInverseMatrice

piv2 = PivotGaussInverseMatrice([
    [ 1, -1,  0],
    [ 0,  3, -2],
    [-1,  2, -1]
])

piv2 # à placer en dernière ligne de cellule pour obtenir l'affichage naturel
Afffichage obtenu
\begin{align*} \begin{array}{l|ccc|ccc|} \hline L_{1} & 1 & -1 & 0 & 1 & 0 & 0 \\ L_{2} & 0 & 3 & -2 & 0 & 1 & 0 \\ L_{3} & -1 & 2 & -1 & 0 & 0 & 1 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & -1 & 0 & 1 & 0 & 0 \\ L_{2} \leftarrow L_{2} & 0 & 3 & -2 & 0 & 1 & 0 \\ L_{3} \leftarrow L_{3} + L_{1} & 0 & 1 & -1 & 1 & 0 & 1 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & -1 & 0 & 1 & 0 & 0 \\ L_{2} \leftarrow \frac{1}{3}L_{2} & 0 & 1 & - \frac{2}{3} & 0 & \frac{1}{3} & 0 \\ L_{3} \leftarrow L_{3} & 0 & 1 & -1 & 1 & 0 & 1 \\ \hline \hline L_{1} \leftarrow L_{1} + L_{2} & 1 & 0 & - \frac{2}{3} & 1 & \frac{1}{3} & 0 \\ L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{2}{3} & 0 & \frac{1}{3} & 0 \\ L_{3} \leftarrow L_{3} - L_{2} & 0 & 0 & - \frac{1}{3} & 1 & - \frac{1}{3} & 1 \\ \hline \hline L_{1} \leftarrow L_{1} & 1 & 0 & - \frac{2}{3} & 1 & \frac{1}{3} & 0 \\ L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{2}{3} & 0 & \frac{1}{3} & 0 \\ L_{3} \leftarrow -3L_{3} & 0 & 0 & 1 & -3 & 1 & -3 \\ \hline \hline L_{1} \leftarrow L_{1} + \frac{2}{3}L_{3} & 1 & 0 & 0 & -1 & 1 & -2 \\ L_{2} \leftarrow L_{2} + \frac{2}{3}L_{3} & 0 & 1 & 0 & -2 & 1 & -2 \\ L_{3} \leftarrow L_{3} & 0 & 0 & 1 & -3 & 1 & -3 \\ \hline \end{array} \\ \end{align*}

Remarque. Types de nombre pris en charge

Le constructeur de la classe PivotGaussInverseMatrice s’appelle avec un tableau 2D représenté par une instance du type prédéfini list comme dans l’exemple ci-dessus ou par une instance de la classe Matrix du module sympy.

Les éléments de ce tableau 2D sont des nombres :

  • des types prédéfinis (int, float) ou
  • des instances de la classe Fraction du module fractions ou
  • de toute classe de nombres du module sympy.

Pour obtenir le code \LaTeX correspondant, on réalise l’affichage avec la fonction print comme présenté ci-dessous :

from butinfom import PivotGaussInverseMatrice

piv2 = PivotGaussInverseMatrice([
    [ 1, -1,  0],
    [ 0,  3, -2],
    [-1,  2, -1]
])

print(piv2) # affichage du code LaTeX
Affichage obtenu
\begin{array}{l|ccc|ccc|}
    \hline
    L_{1} & 1 & -1 & 0 & 1 & 0 & 0 \\
    L_{2} & 0 & 3 & -2 & 0 & 1 & 0 \\
    L_{3} & -1 & 2 & -1 & 0 & 0 & 1 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & -1 & 0 & 1 & 0 & 0 \\
    L_{2} \leftarrow L_{2} & 0 & 3 & -2 & 0 & 1 & 0 \\
    L_{3} \leftarrow L_{3} + L_{1} & 0 & 1 & -1 & 1 & 0 & 1 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & -1 & 0 & 1 & 0 & 0 \\
    L_{2} \leftarrow \frac{1}{3}L_{2} & 0 & 1 & - \frac{2}{3} & 0 & \frac{1}{3} & 0 \\
    L_{3} \leftarrow L_{3} & 0 & 1 & -1 & 1 & 0 & 1 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} + L_{2} & 1 & 0 & - \frac{2}{3} & 1 & \frac{1}{3} & 0 \\
    L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{2}{3} & 0 & \frac{1}{3} & 0 \\
    L_{3} \leftarrow L_{3} - L_{2} & 0 & 0 & - \frac{1}{3} & 1 & - \frac{1}{3} & 1 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} & 1 & 0 & - \frac{2}{3} & 1 & \frac{1}{3} & 0 \\
    L_{2} \leftarrow L_{2} & 0 & 1 & - \frac{2}{3} & 0 & \frac{1}{3} & 0 \\
    L_{3} \leftarrow -3L_{3} & 0 & 0 & 1 & -3 & 1 & -3 \\
    \hline
    \hline
    L_{1} \leftarrow L_{1} + \frac{2}{3}L_{3} & 1 & 0 & 0 & -1 & 1 & -2 \\
    L_{2} \leftarrow L_{2} + \frac{2}{3}L_{3} & 0 & 1 & 0 & -2 & 1 & -2 \\
    L_{3} \leftarrow L_{3} & 0 & 0 & 1 & -3 & 1 & -3 \\
    \hline
\end{array} \\