TD #9 : manipulation d`espace vectoriels

publicité
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
Téléchargement