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