TD #9 : manipulation d’espace vectoriels 6 mars 2009 Le but de ce TP est de fournir des méthodes de calcul (des algorithmes) pour répondre aux questions suivantes : une famille de vecteurs est-elle libre ? Comment calculer le rang d’une famille ? Un vecteur donné appartient-il à un certain sous-espace ? Comment extraire une base d’une famille génératrice ? Deux familles engendrent-elles le même sous-espace ? Comment obtenir une base du supplémentaire d’un sous-espace ? 1 Petits rappels P Dans tout ce TP, tous les espaces vectoriels seront de dimension finie. on va noter Span(v1 , . . . , vm ) = αi vi l’espace engendré par la famille de vecteurs (v1 , . . . , vm ). On suppose que tous ces vecteurs appartiennent à Rn , pour une certaine valeur de n. Span(v1 , . . . , vm ) est donc un sous-espace vectoriel de Rn . Si x est un vecteur de Rn , on note x[i] la i-ième coordonnée de x. On rappelle les résultats suivants : – dim Span(v1 , . . . , vm ) ≤ min(n, m). – Span(v1 , . . . , vi , . . . , vj , . . . , vm ) = Span(v1 , . . . , vj , . . . , vi , . . . , vm ) – Span(v1 , . . . , vi , . . . , vj , . . . , vm ) = Span(v1 , . . . , vi , . . . , vi + vj , . . . , vm ) – pour λ 6= 0, Span(v1 , . . . , vi , . . . , vm ) = Span(v1 , . . . , λvi , . . . , vm ) On rappelle qu’une base d’un sous-espace vectoriel est une famille libre qui engendre cet espace vectoriel. 2 De bonnes bases Pour résoudre les question posées dans l’introduction, on va en fait programmer une fonction qui à partir d’une famille génératrice d’un sous-espace en calcule une base. Cela va nous permettre de résoudre les problèmes posés facilement. Le procédé par lequel on obtient cette base, l’élimination de Gauss, est classique, mais n’est pas forcément très simple à programmer. L’algoritmhe fonctionne en plusieurs étapes, décrites ci-dessous. L’idée générale est qu’à chaque étape on utilise un vecteur de la famille d’entrée comme “pivot” pour annuler un certain nombre d’autres entrées de la base. 1. On initialise i := n et k := m 2. S’il existe un vecteur de la base actuelle bj tel que : – 1≤j≤k – la i-ième entrée de bj est non-nulle Alors on utilisera bj comme vecteur pivot et passe à l’étape 3, sinon on passe à l’étape 6. 3. Si j 6= k, échanger les vecteurs bj et bk 4. Remplacer bk par (1/bk [i]) × bk 5. Remplacer tous les vecteurs bl (1 ≤ l < k) par bl − bl [i] × bk 6. Faire i := i − 1, k := k − 1. Tant que i ≥ 1 et k ≥ 1, on retourne à l’étape 2 Pour vous familiariser avec cette technique, il faut l’éxecuter à la main sur des exemples, avant de la programmer. 1 – Donnez le résultat de l’algorithme sur les deux exemples suivants : 0 1 1 2 2 3 1 0 0 π 3 3 0 √0 √e , , 0 , 0 , 2 , 0 , 3 , 1 b = b= 4 5 2 42 0 π 2 /2 2 0 0 5 7 0 1 11 6 Vous pouvez vous convaincre qu’à chaque étape de l’algorithme, les (bi ) forment toujours une famille génératrice du même sous-espace. De plus, à la fin de l’exécution, les vecteurs non-nuls de la famille sont en fait libres (cela découle de leur caractère “triangulaire”). – Programmez l’algorithme en Maple 3 Utilisation de l’algorithme Une fois qu’on a programmé le pivot de Gauss, on peut faire plein de belles choses assez facilement ; – Utilisez cet algorithme pour déterminer si une famille est libre [indice : y’a-t-il des vecteurs nuls à la fin ?] – Programmez une fonction qui extrait une base d’une famille génératrice. – Programmez une fonction qui donne le rang d’une famille. – Programmez une fonction qui détermine si un vecteur appartient à un sous-espace donné [Indice : est-ce qu’ajouter ce vecteur à une base du sous-espace engenre un sous-espace plus gros ?]. – Programmez une fonction qui détermine si deux familles engendrent le même espace [Indice : test d’inclusions réciproques]. – Programmez une fonction qui donne une base d’un supplémentaire d’un sous-espace [Pas d’indice]. 2