RESOLUTION DE SYSTEMES LINEAIRES : METHODE DU PIVOT DE GAUSS But : Mettre en place la résolution d’un système linéaire par la méthode du pivot de Gauss (ou Gauss-Jordan). Nous nous contenterons de résoudre des systèmes admettant une unique solution. (de tels systèmes sont appelés systèmes de Cramer, mais ce mot est hors-programme) PREMIERE PARTIE : RESOLUTION A LA MAIN –x1 – 2x2 – x3 = –1 1) On considère le système (S1) suivant : 2 x1 + x2 + x3= –4 4 x1 + 2 x2 – 5 x3 = –8 a) Résoudre ce système en utilisant la méthode du pivot de Gauss en notant soigneusement les opérations élémentaires utilisées. x1 b) Si on pose X = x2 , le système(S1) est équivalent à AX = B avec : A = x3 et B = c) Les opérations élémentaires ont en fait été effectuées sur la matrice M1 appelée …………………… M1 = 2) 2x + y – z + t = 12 8x +4 y + 2z – 3t = 27 On considère le système (S ) suivant : –6x – y + 5z + 4t = –17 2x + 5y + 2z – t = 2 2 a) La matrice M2 correspondant à ce système est : M2 = b) Résoudre ce système en utilisant la méthode du pivot de Gauss en notant soigneusement les opérations élémentaires utilisées. c) Dans quels cas a-t-on eu besoin de permuter des lignes ? 3) a) Quelles sont les deux grandes étapes de ces résolutions de système ? b) Quelles opérations élémentaires ont été utilisées dans ces deux grandes étapes ? DEUXIEME PARTIE : RAPPELS SUR L’UTILISATION DES LISTES 2D En Python, une matrice est simplement une liste de liste. Par exemple, la matrice : 4 3 -1 5 N = -8 4 5 6 sera codé : N = [ [4 , 3 , –1 , 5] , [–8 , 4 , 5 , 6] , [1 , 6 ,–3 , 5]] 1 6 -3 5 Sans utiliser votre ordinateur, écrire les réponses renvoiées dans la console pour les requêtes suivantes : >>>> N[2][1] …………………………………………………………………………………………………………… >>>> N[0] …………………………………………………………………………………………………………… >>>> N …………………………………………………………………………………………………………… >>>> len(N) ……………………………………………………………………………………………………………. Comment récupérer le nombre de colonnes de la matrice ? >>>> [0] × len(N) ………………………………………………….. ……………………………………………………………………………………………………………. On définit la fonction affiche ainsi : On obtient l’affichage suivant sur la console def affiche(matrice): >>>>affiche(N) ……………………………. nbLignes=len(matrice) ……………………………. for i in range(nbLignes): ……………………………. print(matrice[i]) TROISIEME PARTIE : MISE EN PLACE DE L’ALGORITHME DU PIVOT DE GAUSS I. CAS D’UN SYSTEME TRIANGULAIRE 1) On considère un système triangulaire : Ecrire la matrice augmentée M (avec les coefficients M= diagonaux non nuls) On a alors : xn = ……… xn–1 = …………………………………. De manière générale, pour xn–2 = ……………………………………………………… xi = ………………………………………………..…………………… , 2) a) Compléter la fonction suivante qui prend en argument une matrice M qui en pratique correspondra à un système triangulaire, et qui renvoie le vecteur X solution de ce système : def remonter (M) : nbLignes=……………………… X=………………………………………… on crée un vecteur ligne X de la bonne taille ne contenant que des zéros X[nbLignes-1]= ……………………… for i in range (nbLignes–2, ………… , …………) : i désignera un numéro de LIGNE X[i]= ……………………… for j in range (………………………………) : j désignera un numéro de COLONNE X[i] =……………………… X[i]=X[i]/M[i][i] return(……) b) Créer un programme nommé Gauss_VotreNom et y écrire cette fonction. Tester votre programme avec le système (S3) suivant dont l’unique solution est (1 ; –1 ; 2 ; 4) 3x 1 – x2 + 2 x3 – x4 = 4 x2+ x3 – 5 x4= –19 –2 x3 – x4= –8 x4 = 4 (on notera M3 la matrice augmentée associée) II. TRIANGULARISATION DU SYSTEME 1) LES OPERATIONS ELEMENTAIRES a) Dans la première partie, pour « triangulariser » le système, on a utilisé deux types d’opération élémentaires : les transpositions (échanges de lignes) et les transvections. b) Compléter l’en-tête (variable) de deux fonctions correspondantes. (Attention : Ces fonctions ne renvoient rien mais modifient la matrice M) def transposition(…………………………………………….) def transvection(…………………………………………….) c) Ecrire dans votre programme le corps des deux fonctions dont vous avez écrit l’en-tête Vous testerez évidemment vos fonctions, avec la matrice M3 par exemple. 2) TRIANGULARISATION SANS ECHANGE a) On suppose pour l’instant que pour le système que l’on cherche à résoudre, aucune permutation de ligne n’est nécessaire pour triangulariser le système. Dans le même programme, écrire une fonction triangulariserSansEchange qui prend en paramètre une matrice M correspondant à un système, et qui la transforme en une matrice correspondant à un système triangulaire équivalent. Tester votre fonction avec le système (S1) de la première partie. b) SANS UTILISER L’ORDINATEUR, dire ce qui va se passer si vous testez votre fonction avec le système (S2) de la première partie ? ……………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………… 3) TRIANGULARISATION AVEC ECHANGE a) Écrire une fonction lignePivot(M , c) qui recherche un pivot non nul dans la matrice M sur la colonne d’indice c. Cette fonction doit renvoyer le numéro de la ligne du premier pivot non nul. Il s’agit donc de renvoyer le premier numéro de ligne supérieur ou égal au numéro de la colonne tel que M[numLigne][numColonne] 0. 40 30 Ex : Si M = 0 6 07 -1 5 -3 5 5 6 5 -2 lignePivot (M,1) doit renvoyer ……… b) Ecrire une fonction triangulariser qui prend en paramètre une matrice M correspondant à un système, et qui la transforme en une matrice correspondant à un système triangulaire équivalent. Cette fonction doit gérer les cas où des échanges sont nécessaires. III. RESOLUTION DU SYSTEME Ecrire une fonction pivotGauss qui prend en argument une matrice M correspondant à un système dit « de Cramer » et qui renvoie l’unique vecteur X solution de ce système. Tester votre fonction avec les deux systèmes (S1) et (S2) de la première partie et vérifier que vous retrouvez bien les mêmes solutions qu’à la main. IV. APPLICATION : RESEAU EN ELECTROCINETIQUE On considère le circuit suivant où les trois lois des mailles et deux lois des nœuds s’écrivent : E = R1 i1 +R2 i2 R2 i2 = R3 i3 +R4 i4 R4 i4 = R5 i5 +R6 i5 i1 = i2 +i3 i3 = i4 +i5 Les valeurs des paramètres E et R sont respectivement : E = 5V, R1 = 100 , R2 = R3 = 220 , et R4 = R5 = R6 = 100 . Déterminer la valeur des cinq courants. QUATRIEME PARTIE : CHOIX DU PIVOT 10–17x + y = 1 1) Tester votre fonction pivotGauss sur le système (S4) suivant : x + y = 2 On obtient ……………………………………………………………………………………………………………………. Le résultat obtenu est-il bien solution du système ? ................................................................................ Tachons de comprendre ce résultat surprenant : 10–4x + y = 1 2) Considérons le système (S4) : x + y = 2 a) Résoudre ce système de manière exacte (à la main) en suivant l’algorithme programmé dans le III. b) On considère dans cette question que les calculs se font avec 4 chiffres significatifs (les suivants étant tronqués). Exécuter de nouveau à la main les étapes de l’algorithme avec cette nouvelle information. Que constatez-vous ? x + y = 2 3) Considérons le système équivalent à (S4) suivant : –4 10 x+y=1 a) Avec la même précision qu’au 2)b), exécuter de nouveau à la main les étapes de l’algorithme sur ce nouveau système. b) Que remarquez-vous comme différences avec le 2)? Pour minimiser les erreurs d’arrondi (inhérentes au type float), il faut, pour chaque colonne, choisir un pivot maximal en valeur absolue. Cette méthode s’appelle la méthode du pivot partiel. 4) a) Ouvrir un nouveau programme nommé pivotGaussOptimise_VotreNom. b) Copier votre ancien programme dans ce nouveau programme. c) Faire les modifications nécessaires pour tenir compte de cette recherche du pivot maximal. d) Le résultat obtenu pour le système donné en 1) est-il moins surprenant cette fois ? CINQUIEME PARTIE : COMPLEXITE DE CET ALGORITHME On note n le nombre de lignes du système étudié. 1) On considère le système échelonné suivant : Voici un algorithme permettant de résoudre ce système par la méthode du pivot de Gauss, en prenant en compte le décalage d’indice en Python : Pour i descendant de n-1 à 0 faire : Pour j descendant de n-1 à i+1 yi ← yi – ai,jxj Fin Pour y xi ← a i i,i Fin Pour Déterminer le nombre d'additions (ou soustractions) puis le nombre de multiplications (ou divisions) nécessaires à cette résolution en fonction du nombre n de lignes du système. 2) Voici l'algorithme obtenu pour triangulariser un système par la méthode du pivot maximal : a) Déterminer, toujours en fonction de n, le nombre de comparaison nécessaires afin de trouver les pivots maximaux. b) Déterminer ensuite, en fonction de n, le nombre d'additions puis le nombre de multiplications nécessaires pour triangulariser un système par la méthode du pivot maximal. 3) Justifier alors que la complexité de la résolution d'un système linéaire par la méthode du pivot maximal est équivalente à n3. Qu'est-ce que cela signifie ? 4) a) Il existe un algorithme de résolution de tels système différent (algorithme de Strassen) dont la complexité est de l’ordre de n2,807 . Sachant que mon processeur peut effectuer 4,6×109 opérations par seconde, compléter le tableau suivant. Taille des données (nombre de lignes de la matrice) Ordre de grandeur du temps d’exécution avec l’algorithme que vous avez programmé Ordre de grandeur du temps d’exécution avec l’algorithme de Strassen 1000 10 000 100 000 c) La « petite » différence de complexité entre ces deux algorithmes a-t-elle une incidence notable ? SIXIEME PARTIE : VU EN CONCOURS ! EXTRAIT CCP 2015 (i=0) ANNEXE :