Applications du pivot de Gauss 1 Complexité 2 Applications directes

publicité
Applications du pivot de Gauss
Vous avez étudié ou allez étudier en informatique l’algorithme du pivot de Gauss. Vous en trouverez une
implémentation en annexe. On se propose dans ce problème de l’utiliser pour effectuer les divers calculs
d’algèbre linéaire vus en maths.
On a fait le choix de ne pas utiliser la bibliothèque « numpy » afin de mieux voir et comprendre les
opérations effectuées.
! Une matrice sera représentée par un tableau (de type « list list » ). Par exemple la
1 2 3
matrice
sera obtenue par [[1,2,3], [4,5,6]].
4 5 6
La fonction gauss calcule la réduite de Gauss en lignes d’une matrice. Pour calculer la réduite en colonnes,
utilisez la fonction gaussCol.
On trouvera également une fonction afficheMatrice pour afficher une matrice de manière un peu plus
lisible.
Enfin, on rappelle qu’en Python les tableaux sont indicés à partir de 0. Ainsi, pour tout (n, p) ∈ (N∗ )2 ,
M ∈ Mn,p (K), i ∈ J1, nK, et j ∈ J1, pK, la case i, j de M sera obtenue par M[i-1][j-1].
1
Complexité
Calculons la complexité du pivot de Gauss. On va compter le nombre de multiplications. Pour simplifier,
on étudiera une matrice carrée et inversible.
Soit n ∈ N et A ∈ GLn (K).
1. Complexité des opérations élémentaires sur les lignes : Soit k ∈ K et (i1, i2) ∈ J0, n − 1K2 . Combien de
multiplications
sont
effectuées
lors
de
l’appel
de
echangeLigne(A,i1, i2),
de
multiplieLigne(A,i1, k),
et
de
transvection(A,i1,i2,k) ?
2. Soit (i0, j0) ∈ J0, n − 1K2 . En déduire le nombre de multiplications effectuées lors de l’appel de
annuleColonne(A,i0,j0).
3. Sachant que A est inversible, combien de pivots trouvera-t-on pendant l’application de l’algorithme du
pivot de Gauss ? Comment cela se traduit-il dans le programme principal ?
4. En déduire le nombre de multiplications pour effectuer gauss(A).
2
Applications directes de l’algorithme
On demande dans cette partie d’utiliser les fonctions Python fournies sur divers exemples. Vous ne
devez effectuer aucun calcul à la main. Á chaque fois, donnez la commande utilisée, le résultat renvoyé par
l’ordinateur, et l’interprétation que vous en faites.
2.1
Résolution de systèmes d’équations
Résoudre les systèmes suivants.






x
+
y
+
z
=
1

x + y + z = 1
(A) : x − y − 2z = 2
(B) : x − y − 2z = 2




2x + 3y − 7z = 6
x + 3y + 4z = 6
Indication : Utiliser la matrice augmentée.
1



x + y + z = 1
(C) : x − y − 2z = 2


x + 3y + 4z = 0
.
2.2
Calcul d’inverse


4 1 1 1


 3 1 −1 0
Calculer l’inverse de la matrice M = 
.
−1 0 1 0
3 0 3 3
Indication : Utiliser la méthode de Gauss-Jordan. En appliquant la fonction gauss à une matrice bien
choisie, tout se fera automatiquement...
2.3
Lignes ou colonnes ?
On fournit une fonction transpose qui renvoie la transposée d’une matrice.
En déduire les fonctions echangeColonnes, multiplieColonnes, transvectionColonnes pour effectuer
les opérations élémentaires sur les colonnes d’une matrice.
Chacune de ces fonctions ne devra pas utiliser plus de trois instructions et aucune boucle.
Pour des raisons techniques, il sera plus simple d’écrire des fonctions qui renvoient une nouvelle matrice
(alors que les fonctions fournies pour les opérations sur les lignes modifient en place la matrice passée en
argument). 1
Remarque : En informatique, on appelle parfois « procédure » un programme qui modifie les données passées
en argument mais ne renvoie rien, et on réserve le terme « fonction » aux programmes qui renvoient une
valeur.
Cette distinction n’est pas si évidente puisqu’il est tout à fait possible qu’un programme modifie les
données passées en argument et renvoie une valeur. Par exemple la méthode « .pop » sur les tableaux
Python modifie le tableau (puisqu’elle supprime son dernier élément) et renvoie une valeur (la valeur de ce
dernier élément).
Indication : Songez que les colonnes de A deviennent les lignes de t A... Faites des dessins.
2.4
Applications linéaires
On définit les applications linéaires :
R3 [X] →
R [X] →
ϕ: 3
P 7→
R3
et ψ :
P (1), P 0 (1), P (2)
P
M
2 (R)
1
7
→
P
1
!
1  .
−1
Déterminer le rang de chacune de ces applications linéaires, préciser une base de leur image et de leur
noyau aussi simple que possible.
(***) Vérifier ces résultats sans l’aide de l’ordinateur.
Indication : Pour vérifier les résultats concernant Ker(ψ) et Im(ψ) : commencer par vérifier les inclusions
« · · · ⊂ Ker(ψ) » et « Im(ψ) ⊂ . . . », puis prouver les égalités grâce à la dimension.
2.5
Rang
Écrire une fonction pour calculer le rang d’une matrice. On pourra commencer par une fonction intermédiaire pour tester si une ligne est nulle.
1. La raison est qu’il est compliqué sous Python d’écrire une fonction qui transpose en place une matrice. On propose donc
une fonction qui renvoie la transposée. Il devient dès lors impossible de travailler complètement en place.
2
3
Dans la vraie vie : les erreurs d’arrondi
(
Pour tout ε ∈ R, on définit le système d’équations (Sε ) :
εx + y = 0,5
x + y = 1,0
d’inconnue (x, y) ∈ R2 .
1. Résoudre (Sε ) lorsque ε ∈ R+∗ . Préciser vers quelles limites tendent les solutions lorsque ε → 0. Cela
semble-t-il cohérent ?
2. À présent, résoudre (S) à l’aide de la fonction gauss pour des valeurs de ε proches de 0. Que remarquezvous ?
3. Écrire la matrice augmentée de (S), et suivre pas à pas la résolution par l’algorithme du pivot de Gauss.
Ne pas simplifier les formules obtenues afin de bien voir les opérations effectuées par l’ordinateur.
Expliquer ce qui s’est passé.
0, 5
1−
ε .
Indication : Le problème est lors du calcul de
1
1−
ε
4. On considère un ordinateur où les flottants sont représentés sur 64 bits comme d’ordinaire : 1 bit de
signe, 11 d’exposant, et 52 de mantisse.
Á partir de quelle valeur de ε observe-t-on ce comportement aberrant ?
5. (
À présent, on présente le système (Sε ) en échangeant les deux lignes :
x+y =1
.
εx + y = 0, 5
Suivre de nouveau l’application de l’algorithme. Quel résultat obtiendra-t-on lorsque ε est très proche
de 0 ? Commentaires ?
En résumé il est plus prudent de choisir le pivot le plus grand possible en valeur absolue pour éviter
de trop grosses erreurs d’arrondi comme dans l’exemple ci-dessus.
6. Modifier la fonction trouvePivot pour qu’elle renvoie l’indice du plus grand pivot possible.
4
Déterminant
4.1
Développement selon une colonne
Soit n ∈ N au moins égal à 2, et soit A ∈ Mn (K).
Pour tout (i, j) ∈ J1, nK2 , on notera ∆i,j (A) le mineur (i, j) de A, c’est-à-dire le déterminant de la matrice
obtenue en retirant la i-ème ligne et la j-ème colonne de A.
On rappelle la formule du développement selon la première colonne :
det(A) =
n
X
(−1)1+i Ai,1 ∆i,1 (A).
i=1
La fonction extrait fournie en annexe permet de renvoyer la matrice obtenue en retirant la i-ème ligne
et la j-ème colonne. Il ne reste plus qu’à prendre le déterminant pour obtenir le mineur. En tenant compte
du fait que dans Python l’indiçage des tableaux commence à 0, la formule du développement selon la première
colonne devient, si A est le tableau Python représentant la matrice A :
det(A) =
n−1
X
(−1)1+(i+1) × A[i][0] × det(extrait(A,i,0)),
i=0
ou encore :
3
det(A) =
n−1
X
(−1)i × A[i][0] × det(extrait(A,i,0)).
(1)
i=0
Dès lors on peut calculer le déterminant d’une matrice A ainsi :
• si A est de format 1 × 1, renvoyer son unique coefficient ;
• sinon appliquer la formule 1.
1. Programmer cette méthode de calcul de déterminant.
Remarque : La formule du développement selon une colonne permet d’exprimer le déterminant de A
(de format n × n) à l’aide de déterminants de matrices plus petites (de format (n − 1) × (n − 1)).
Au niveau de la programmation, le programme appelé sur A va donc se ré-appeler lui-même sur des
matrices plus petites. Cela ne doit pas vous étonner et ne pose aucune problème à Python 2 . Ce type de
fonction est appelé en informatique une fonction « récursive », vous étudierez Cela en seconde année.
2. Complexité : Pour tout n ∈ N∗ , on notera Cn le nombre de multiplications nécessaires pour calculer le
déterminant d’une matrice de format n × n par cette méthode. Pour simplifier, on négligera le calcul
du (−1)i .
(a) Préciser la valeur de C1 .
(b) Montrer que pour tout n ∈ N∗ :
Cn = 2n + nCn−1 .
(c) Démontrer que pour tout n ∈ N∗ , Cn > n!. Commentaires ?
4.2
Par le pivot de Gauss
1. (cours) Rappeler l’effet sur le déterminant de chacune des opérations élémentaires sur les lignes d’une
matrice.
2. Si dans une des colonnes on n’a pas trouvé de pivot, c’est-à-dire si la fonction trouvePivot a renvoyé
None, que vaut le déterminant ?
3. En déduire une fonction pour calculer le déterminant d’une matrice. On partira d’un copier-coller de
la fonction gauss. On introduira une variable d qu’on initialisera à 1, que l’on modifiera au fur et à
mesure en suivant les résultats rappelés aux deux questions précédentes, et qui contiendra à la fin le
déterminant cherché.
4. Quelle est la complexité de cette nouvelle fonction ? Comparer avec la méthode du développement selon
une colonne.
5. Il est possible de diviser par deux le nombre de multiplications. Voyez-vous comment ?
2. tant que les matrices sont de format au plus 997 en fait.
4
Téléchargement