Séance Python 3 : algèbre linéaire 1 Systèmes linéaires

PC 2016/2017
Séance Python 3 : algèbre linéaire
Pour manipuler les matrices, nous importerons le module numpy par import numpy as np. Ce module
permet de coder plus efficacement les matrices (ligne, colonne ou rectangulaire) que la structure classique
de liste par les contraintes plus fortes qui existent sur le type array :
un tableau est homogène (il ne contient que des entiers, ou que des flottants, ou que des booléens...) ;
un tableau n’est pas redimensionnable (contrairement à une liste, à laquelle on peut ajouter un élément
avec append).
Comme conséquence du premier point :
si, lors de le création d’un tableau, on mélange des flottants et des entiers, il y a conversion automatique
des entiers en flottants par exemple ;
si test un tableau d’entiers tel que t0,0= 1, la modification t[0,0] = t[0,0] / 2 ne remplace pas
cette valeur par 0.5mais par 0...
Copie
Comme pour les listes, la définition t1 = t ne crée pas une copie du tableau t, mais un deuxième nom
pour le même tableau. Ainsi, toute modification effectuée sur t1est aussi effectuée sur t: c’est le même
tableau ! Pour créer une copie du tableau, il faut écrire t1 = np.copy(t).
Slicing et vues
Si `est une liste, un peut en obtenir une tranche par la syntaxe l[1:4] : c’est la sous-liste formée
des éléments de `dont les indices appartiennent à l’ensemble [[1,4[[. Cette tranche est une copie de la
liste : si l’on définit une nouvelle liste par l1 = l[1:4], une modification de la liste l1 n’entraîne aucune
modification de la liste l(et inversement).
Pour les tableaux en revanche, la même syntaxe renvoie une vue sur le tableau : si l’on définit t1par
t1 = t[1:4],t1désigne une partie du tableau t. Par suite, toute modification effectuée sur t1se répercute
sur t(et inversement).
1 Systèmes linéaires
1. Écrire des fonctions transvecLigne(A,i,j,c),permutLigne(A,i,j) et dilatLigne(A,i,c) telles que
transvecLigne(A,i,j,c) modifie la matrice Apar l’opération LiLi+cLj(et des opérations similaires
pour les deux autres fonctions). Ces fonctions modifient la matrice passée en argument et ne renvoient
rien.
2. a) Écrire une fonction systLin(A,B) qui résout le système linéaire de matrice A(carrée et inversible) et
de second membre Bpar la méthode du pivot de Gauss. La fonction ne devra modifier ni la matrice A,
ni la matrice B(il faudra en faire des copies, sur lesquelles on fera les opérations).
La matrice Bne sera pas nécessairement une matrice colonne (quel format doit avoir l’inconnue X
lorsque Bapcolonnes ?). Quel est le résultat renvoyé lorsque l’on prend B=In?
b) Évaluer le nombre de multiplications (ou divisions) effectuées pour la résolution du système (dans le
cas où Best une matrice colonne).
3. Dans la pratique, on rencontre parfois un pivot nul sur la diagonale principale. Il faut alors permuter
la ligne correspondante avec une ligne située en-dessous pour retrouver un pivot non nul et poursuivre
l’algorithme. Cette opération de permutation est intéressante même lorsque le pivot diagonal n’est pas
nul : utiliser le plus grand (en valeur absolue) pivot possible permet de réduire l’effet des erreurs d’arrondi
résultant des divisions par le pivot.
a) Tester la fonction systLin sur le système linéaire
1020x+y= 1
x+y= 2
et comparer à la véritable solution (calculée à la main).
b) Écrire une fonction pivot(A,j) qui renvoie l’indice idu plus grand (en valeur absolue) des coefficients
Aj,j , . . . , An1,j (n: nombre le lignes de la matrice).
1
c) Écrire une fonction systLinPivot(A,B), spécifiée comme systLin, mais qui utilise la méthode du
pivot partiel.
Tester la fonction sur le système précédent.
4. Écrire une fonction determinant(A) qui calcule le déterminant d’une matrice.
2 Décomposition LU
2.1 Principe de la décomposition
Lorsque l’on a de nombreux systèmes linéaires à résoudre avec la même matrice A(inversible), il peut
être judicieux de trouver une décomposition de Asous la forme A=LU, où Lest triangulaire inférieure
(lower) et Utriangulaire supérieure (upper ). En introduisant l’inconnue Zdéfinie par Z=U Y , la
résolution du système linéaire AX =Yest alors ramenée à la résolution de deux systèmes plus simples
(car triangulaires) : LZ =Yet UX =Z.
L’algorithme pour trouver cette décomposition consiste à manipuler deux suites (Lk)ket (Uk)kde matrices
vérifiant LkUk=Apour tout k. On initialise avec L0=Inet U0=A. Puis on pratique l’algorithme du
pivot de Gauss sur la matrice Upour la transformer en matrice échelonnée en lignes (donc triangulaire
supérieure). Pour cela, on lui fait subir des opérations du type LiLi+λLj, avec i>j. Autrement
dit, on passe de la matrice Ukà la matrice Uk+1 par une opération du type Uk+1 =Ti,j,λUk(les valeurs
de i,jet λchangeant bien sûr à chaque étape). Pour conserver l’égalité Lk+1Uk+1 =A, il faut alors
poser Lk+1 =LkT1
i,j,λ =LkTi,j,λ,i.e. passer de la matrice LkàLk+1 par l’opération CjCjλCi.
À la fin de l’algorithme, la matrice Uest triangulaire supérieure, et la matrice Ltriangulaire inférieure,
ses coefficients diagonaux étant tous égaux à 1. En effet, par construction, la matrice Lest un produit
de matrices de transvections Ti,j,λavec à chaque fois i>j. Ces matrices sont toutes triangulaires
inférieures de coefficients diagonaux égaux à 1, donc il en est de même de leur produit.
1. Traiter à la main l’exemple de la matrice
A=
1 4 2
2 6 1
3 5 3
.
2. Écrire une fonction LU(A) qui renvoie le couple (L, U)de la décomposition A=LU. Vérifier que l’on
retrouve bien le résultat obtenu à la main sur l’exemple précédent.
2.2 Algorithme de Thomas
On suppose dans ce paragraphe que la matrice Aest tridiagonale :
A=
b0c0
a1b1c1
.........
......cn2
an1bn1
On démontre alors que les matrices Let Ude la décomposition A=LU sont bidiagonales :
L=
1
β11
......
βn21
et U=
α0γ0
α1
...
...γn2
αn1
.
3. Démontrer que, pour tout entier k[[0, n 2]], on a γk=ck.
4. Trouver les relations de récurrence vérifiées par les suites (αk)ket (βk)k. En déduire l’expression des zk
en fonction des yket des βk(Z: solution du système LZ =Y), puis des xken fonction des zket des αk
et ck(X: solution de UX =Z).
5. Écrire une fonction thomas(a,b,c,y) qui renvoie le tableau xdonnant la solution du système tridiagonal
(a,b,c,ysont quatre tableaux de taille n; seules les cases d’indice k[[1, n 1]] sont effectivement
utilisées pour le tableau apar exemple).
2
2.3 Le cas général : P A =LU
Dans la pratique, comme pour la résolution d’un système linéaire, il arrive que l’on rencontre un pivot
nul ; il faut alors permuter deux lignes de la matrice U,i.e. poser Uk+1 =Pi,j Uk(Pi,j : matrice de
permutation). Pour conserver l’égalité Lk+1Uk+1 =A, on doit poser Lk+1 =LkPi,j , ce qui détruit le
caractère triangulaire inférieur de la matrice L... Mais, en faisant une permutation des colonnes de Lk+1,
on retrouve une matrice triangulaire. Plus précisément, on vérifie que la matrice Pi,j Lk+1 est à nouveau
triangulaire.
On manipule donc trois suites de matrice (Pk)k,(Lk)ket (Uk)kvérifiant PkA=LkUk. La matrice Pk
est un produit de matrices de permutations. On utilise la méthode du pivot partiel pour échelonner la
matrice U. À la fin, on trouve une matrice P(produit de matrices de permutations, donc une matrice très
simple : elle contient un unique coefficient 1 par ligne et par colonne ; tous les autres sont nuls) et deux
matrices Let Utelles que P A =LU (la résolution du système AX =Béquivaut alors à la résolution de
LUX =P B ; la matrice P B s’obtenant à partir de Bpar permutation de lignes).
6. Écrire une fonction PLU(A) qui renvoie le triplet (P, L, U)tel que P A =LU.
3
1 / 3 100%

Séance Python 3 : algèbre linéaire 1 Systèmes linéaires

La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !