• Aucun résultat trouvé

Calcul matriciel et pivot de GAUSS

N/A
N/A
Protected

Academic year: 2022

Partager "Calcul matriciel et pivot de GAUSS "

Copied!
10
0
0

Texte intégral

(1)

(Partie I)

Calcul matriciel et pivot de GAUSS

Introduction et objectifs

Dans ce TD consacré à l’algèbre linéaire, nous revenons sur quelques thèmes classiques autour du calcul matriciel : opérations et calculs divers, opérations élémentaires, échelonnage d’une matrice et résolution d’un système linéaire par la méthode du pivot de GAUSS et celle de GAUSS-JORDAN.

On utilisera les matrices comme des tableaux (objets array) à deux dimensions de la bibliothèque numpy ainsi que le module linalg.

ATTENTION ! On rappelle que les indices des tableaux numpy obéissent aux mêmes règles que les indices des listes Python.

Constructions de matrices

Exercice N°1

Soit n un entier naturel non nul. On considère la matrice suivante de

M

n

( )

\ :

( )

( )

1 1

1 1

0

0

⎛ ⎞

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎝ ⎠

$

Ecrire une fonction mat1 qui reçoit en argument un entier non nul n et renvoie un tableau numpy correspondant à la matrice ci-dessus.

(2)

Exercice N°2

Soit n un entier naturel supérieur ou égal à 2. On considère la matrice tridiagonale suivante de

n

( )

\

M

:

( ) ( )

1 1

1 1 1

1

1

1 1 1

1 1

0

0

⎛ ⎞

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎝ ⎠

% %

% %

Ecrire une fonction mat2 qui reçoit en argument un entier non nul n et renvoie un tableau numpy correspondant à la matrice ci-dessus.

Exercice N°3

Soit n un entier naturel non nul. On considère la matrice suivante de

M

n

( )

\ :

1 2 3 4 5

1 1 2 3 4 1

1 1 1 2 3 2

1 1 1 1 2 3

1 1 1 1 1 2

1 1 1 1 1 1

n n n n

⎛ ⎞

⎜ − ⎟

⎜ ⎟

⎜ − ⎟

⎜ − ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎝ ⎠

"

"

"

%

# # # # % % #

%

"

Ecrire une fonction mat3 qui reçoit en argument un entier non nul n et renvoie un tableau numpy correspondant à la matrice ci-dessus.

Exercice N°4

Soit n un entier naturel non nul, u0 et r deux réels. On considère la matrice suivante de

n

( )

\

M

:

( )

( ) ( ) ( )

( ) ( ) ( )

( ) ( ( ) ) ( ( ) ) ( )

0 0 0 0

0 0 0 0

0 0 0 0

2

0 0 0 0

2 1

1 2 2 1

2 2 1 2 2 3 1

1 1 1 1 2 1

u u r u r u n r

u nr u n r u n r u n r

u nr u n r u n r u n r

u n n r u n n r u n n r u n r

⎛ + + + − ⎞

⎜ + + + + + + − ⎟

⎜ ⎟

⎜ + + + + + + − ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ + − + − + + − + + − ⎟

⎝ ⎠

"

"

"

# # # % #

"

(3)

flottants u0 et r, et renvoient un tableau numpy correspondant à la matrice ci-dessus : a. Une première fonction MatArith1 utilisera la fonction arange et la méthode

reshape.

b. Une seconde fonction MatArith2 utilisera la fonction arange et les sous-tableaux (pas d’utilisation de la méthode reshape).

c. Une troisième fonction MatArith3 n’utilisera ni la fonction arange, ni la méthode reshape, ni les sous-tableaux.

Décompositions en sommes

Exercice N°5

Toute matrice de

M

n

( )

\ est somme d’une matrice symétrique et d’une matrice antisymétrique. Cette décomposition est unique.

Ecrire une fonction SAS qui reçoit en argument un tableau carré M et renvoie un tuple de deux tableaux carrés de même dimension que celle de M, le premier étant symétrique et le second antisymétrique.

On utilisera la fonction transpose de la bibliothèque numpy.

Exercice N°6

Toute matrice de

M

n

( )

\ est somme de deux matrices inversibles. Cette décomposition n’est pas unique.

Ecrire une fonction INV2 qui reçoit en argument un tableau carré M et renvoie un tuple de deux tableaux carrés de même dimension que celle de M et inversibles.

Nature

Exercice N°7

Ecrire une fonction IsDiag qui reçoit en argument un tableau carré M et renvoie True s’il correspond à une matrice diagonale, False sinon.

(4)

Exercice N°8

Ecrire une fonction IsTriang qui reçoit en argument un tableau carré M et renvoie : a. Le tuple (False) si M ne correspond pas à une matrice triangulaire.

b. Le tuple (True,’U’) si M correspond à une matrice triangulaire supérieure.

c. Le tuple (True,’L’) si M correspond à une matrice triangulaire inférieure.

d. Le tuple (True,’D’) si M correspond à une matrice diagonale.

Opérations élémentaires sur les matrices

Transposition

On se donne une matrice M∈

M

n p,

( )

K avec K=\ ou ^ et n

2.

On rappelle que l’échange de deux lignes de M d’indices l1 et l2 (l1l2) peut s’effectuer en multipliant M à gauche par la matrice de transposition suivante de

M

n

( )

K :

( )

( )

( )

1 1 2 2 1 2 2 1

1 2

1

1 2 , , , ,

2

1

1

0 1

LS , I E E E E 1

1

1 0

1

1

0

0

n l l l l l l l l

l l

l l l

l

⎛ ⎞

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

= − − + + = ⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎝ ⎠

%

%

%

Exercice N°9 – Permutation de lignes avec produit matriciel

Ecrire une fonction Python LS_build qui recevra comme arguments trois entiers n, l1 et l2 et construira la matrice de transposition LS

(

l l1, 2

)

de

M

n

( )

K .

On utilisera la fonction identity de la bibliothèque numpy.

(5)

entiers l1 et l2 et renverra le produit matriciel de LS

(

l l1, 2

)

et M (nouveau tableau).

On utilisera la fonction dot de la bibliothèque numpy.

Exercice N°10 – Permutation de lignes sans produit matriciel

Ecrire une fonction Python LineSwap2 qui recevra comme arguments une matrice M et deux entiers l1 et l2 et effectuera la permutation SUR PLACE des lignes d’indices l1 et l2 sans utiliser le produit matriciel.

Affinité

On se donne une matrice M∈

M

n p,

( )

K avec K=\ ou ^.

On rappelle que la multiplication de la ligne d’indice l de M par un scalaire

λ

non nul peut s’effectuer en multipliant M à gauche par la matrice d’affinité suivante de

M

n

( )

K :

( ) ( )

( ) ( )

,

1

1

A , I + 1 E

1

1

0

0

n l l

l

l

λ λ

l

λ

⎛ ⎞

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

= − =

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎜ ⎟

⎝ ⎠

%

%

Exercice N°11 – Multiplication d’une ligne par un scalaire non nul avec produit matriciel Ecrire une fonction Python A_build qui recevra comme arguments trois entiers n, l et Lambda et construira la matrice d’affinité A ,

( )

l

λ

de

M

n

( )

K .

On utilisera la fonction identity de la bibliothèque numpy.

Ecrire une fonction Python LineMult qui recevra comme arguments une matrice M, un entier l et un scalaire Lambda et renverra le produit matriciel de A ,

( )

l

λ

et M.

On utilisera la fonction dot de la bibliothèque numpy.

 

(6)

Exercice N°12 – Multiplication d’une ligne par un scalaire non nul sans produit matriciel Ecrire une fonction Python LineMult2 qui recevra comme arguments une matrice M, un entier l et un scalaire Lambda et effectuera la multiplication SUR PLACE de la ligne d’indice l de M par le scalaire Lambda sans utiliser le produit matriciel.

Transvection

On se donne une matrice M∈

M

n p,

( )

K avec K=\ ou ^.

On rappelle qu’on peut multiplier la ligne d’indice l2 de M par un scalaire

λ

et ajouter le résultat à la ligne d’indice l1l2 de M en multipliant M à gauche par la matrice de transvection suivante de

M

n

( )

K :

( )

1 2

2

1 2 , 1

1

TV , , I E

1

n l l

l

l l

λ λ

l

λ

⎛ ⎞

⎜ ⎟

= + = ⎜ ⎟

⎜ ⎟

⎜ ⎟

⎝ ⎠

%

%

Exercice N°13 – Transvection avec produit matriciel

Ecrire une fonction Python TV_build qui recevra comme arguments trois entiers n, l1 et l2 et un scalaire Lambda et construira la matrice de transvection TV

(

l l1, ,2

λ )

de

M

n

( )

K . On utilisera la fonction identity de la bibliothèque numpy.

Ecrire une fonction Python Transvec qui recevra comme arguments une matrice M, deux entiers l1 et l2 et un scalaire Lambda et renverra le produit matriciel de TV

(

l l1, ,2

λ )

et M.

On utilisera la fonction dot de la bibliothèque numpy.

Exercice N°14 – Transvection sans produit matriciel

Ecrire une fonction Python Transvec2 qui recevra comme arguments une matrice M, trois entiers n, l1 et l2 et un scalaire Lambda et effectuera SUR PLACE la multiplication de la ligne d’indice l2 de M par le scalaire Lambda suivi de l’ajout du résultat à la ligne d’indice l1. Le produit matriciel ne sera pas utilisé.

 

(7)

Généralités

Considérons le produit matriciel des deux matrices A et B carrées d’ordre 2 :

A B a b a b a b

c d c d c d

α β α γ β δ

γ δ α γ β δ

+ +

⎛ ⎞ ⎛ ⎞ ⎛ ⎞

× =⎜⎝ ⎟ ⎜⎠ ⎝× ⎟ ⎜⎠ ⎝= + + ⎟⎠

On doit donc effectuer 8 multiplications et 4 additions.

En ne retenant que les multiplications pour mesurer la complexité du calcul et en notant celle-ci c

( )

2 , on a donc : c

( )

2

=

8.

De façon générale, le produit de deux matrices carrées d’ordre n requiert un total de n3 multiplications puisque le calcul de chacun des n2 coefficients requiert n multiplications.

La méthode de Volker STRASSEN

Revenons au cas initial des matrices carrées d’ordre 2.

Le mathématicien allemand Volker STRASSEN (1936-) a proposé en 1969 d’effectuer la multiplication des matrices A et B de la façon suivante :

• Calculer : m1

= (

a d

+ ) ( × α δ + )

, m2

= + (

c d

) × α

, m3

= ×

a

( β δ − )

, m4

= × −

d

( γ α )

,

( )

m5

=

a b

+ × δ

, m6

= − × (

c a

) ( α β + )

et m7

= (

b d

− ) ( × + γ δ )

.

• Calculer alors :

1 4 5 7 3 5

2 4 1 2 3 6

A B a b m m m m m m

m m m m m m

c d

α β γ δ

+ − + +

⎛ ⎞

⎛ ⎞ ⎛ ⎞

× = ⎜ ⎝ ⎟ ⎜ ⎠ ⎝ × ⎟ ⎠ ⎝ = ⎜ + − + + ⎟ ⎠

On ne doit plus effectuer que 7 multiplications…

Si nous travaillons maintenant avec des matrices A et B carrées d’ordre 4, nous pouvons nous ramener à la situation précédente en effectuant une multiplication par blocs :

1 4 5 7 3 5

11 12 11 12

2 4 1 2 3 6

21 22 21 22

M M M M M M

A A B B

A B A A B B M M M M M M

+ − + +

⎛ ⎞

⎛ ⎞ ⎛ ⎞

× = ⎜ ⎝ ⎟ ⎜ ⎠ ⎝ × ⎟ ⎠ ⎝ = ⎜ + − + + ⎟ ⎠

où les Aij et les Bij sont des matrices carres d’ordre 2.

On doit donc effectuer 7 produits matriciels de matrices carrées d’ordre 2. Le nombre total de multiplications vaudra donc cette fois : c

( )

4

= ×

7 c

( )

2

= × =

7 7 49.

A chaque fois que l’on doublera l’ordre de la matrice, la complexité sera multipliée par 7. En d’autres termes : c

( )

2n

= ×

7 c n

( )

.

(8)

Pour une matrice d’ordre n=2p avec p≥1, on a classiquement :

( ) ( )

2p 7p1

( )

2 7p1 7 7p 7log2( )n 7lnln 2n ln 7 lnln 2n ln 7ln 2 2,807

c n

=

c

=

×

c

=

× = = = =

e ×

=

n n

Le gain peut ne pas sembler spectaculaire mais il est déterminant pour de grandes valeurs de n (il n’est pas rare que les calculs techniques mettent en œuvre des matrices carrées dont l’ordre de grandeur de n est 10 000, 100 000 voire plus).

Exercice N°15 – Mise en œuvre

Ecrire une fonction récursive MulStrassen permettant d’effectuer, selon la méthode décrite ci-dessus, la multiplication de deux matrices carrées d’ordre n=2p avec p≥1. La fonction MulStrassen s’assurera que les ordres des matrices passées en argument sont tous deux égaux à une même puissance entière de 2.

Echelonnage

On se donne une matrice M∈

M

n p,

( )

K avec K=\ ou ^.

On rappelle que l’on peut obtenir une matrice échelonnée en ligne E∈

M

n p,

( )

K associée à M en multipliant celle-ci à gauche successivement par des matrices de transposition ou de convection :

1 2 2 1

Matrices de transposition ou de transvection.

T T Tk k k ...T T M=E

Exercice N°16 – Echelonnage : code de base

Ecrire une fonction Python Echelon_base qui reçoit comme argument une matrice M et modifie en place la matrice M pour la transformer en une matrice échelonnée en ligne. Pour le pivot, on choisira la plus grande valeur en module.

Exercice N°17 – Echelonnage : code étendu

On peut compléter le code précédent en une fonction Echelon_Etendu qui pourra renvoyer, en plus de la matrice échelonnée en ligne :

• le produit T T Tk k1 k2...T T2 1.

• renvoyer un booléen selon que la matrice M est ou non inversible.

(9)

Exercice N°18 – Echelonnage réduit

Ecrire une fonction Python EchelonReduit_base qui reçoit comme argument une matrice M et modifie en place la matrice M pour la transformer en une matrice échelonnée réduite en ligne. Pour le pivot, on choisira la plus grande valeur en module.

Exercice N°19 – Echelonnage amélioré

Pourquoi nos fonctions de transvection (avec ou sans produit matriciel) ne sont-elles pas les plus appropriées pour effectuer l’échelonnage ?

Ecrire de nouveaux codes d’échelonnage tenant compte du fait que lorsque l’on met à 0 la sous-colonne courante (indice CC), on ne travaille qu’avec des coefficients d’indice de colonne supérieur ou égal à CC.

Pivot de Gauss

Rappelons que la méthode du pivot de GAUSS consiste à résoudre un système linéaire de la forme AX=B en transformant la matrice A∈

M

n p,

( )

K en une matrice échelonnée en ligne grâce à une suite finie de multiplications à gauche par des matrices de transposition ou de transvection, la matrice B étant transformée à l’aide des mêmes opérations.

Ici, on se limite à la situation où A est une matrice inversible d’ordre n. La matrice B doit alors comporter n lignes.

Exercice N°20 – Méthode du pivot de GAUSS

Ecrire une fonction Python PivotGAUSS qui recevra en argument deux matrices

( )

A

M

n K et B∈

M

n p,

( )

K , mettra en œuvre la méthode du pivot de GAUSS et renverra, lorsque la matrice A sera inversible, la matrice X∈

M

n p,

( )

K telle que : AX=B.

La fonction comportera trois parties principales : 1. Validation des dimensions des arguments.

2. Obtention d’un système triangulaire (descente).

3. Backsubstitution (remontée).

(10)

On testera la fonction avec les trois situations suivantes : 1ère situation.

1 2 3 A 4 6 8 11 20 56

⎛ ⎞

⎜ ⎟

= ⎜ ⎜ ⎝ ⎟ ⎟ ⎠

et

1

B 0

34

⎛ − ⎞

⎜ ⎟

= ⎜ ⎜ ⎝ − ⎟ ⎟ ⎠

. Solution :

2 X 0 1

⎛ ⎞ ⎜ ⎟

= ⎜ ⎟ ⎜ ⎟ ⎝ ⎠ −

.

2ème situation.

2 0 1 3

1 1 5 0

A 0 2 3 1

1 2 1 4

⎛ − ⎞

⎜− ⎟

⎜ ⎟

=⎜ ⎟

⎜ − ⎟

⎝ ⎠

et

5 B 16

5 5

⎛ − ⎞

⎜− ⎟

⎜ ⎟

=⎜ − ⎟

⎜ ⎟

⎝ ⎠

. Solution :

2 X 1

3 2

⎛ ⎞

⎜ ⎟

⎜ ⎟

=⎜− ⎟

⎜ ⎟

⎝ ⎠ .

3ème situation.

2 1 0

A 1 2 1

0 1 2

⎛ − ⎞

⎜ ⎟

= −⎜ − ⎟

⎜ − ⎟

⎝ ⎠

et

1 0 0

B 0 1 0

0 0 1

⎛ ⎞

⎜ ⎟

= ⎜ ⎟

⎜ ⎟

⎝ ⎠

. Solution :

0.75 0.5 0.25

B 0.5 1 0.5

0.25 0.5 0.75

⎛ ⎞

⎜ ⎟

= ⎜ ⎟

⎜ ⎟

⎝ ⎠

.

Exercice N°21 – Méthode de GAUSS‐JORDAN

Ecrire une fonction Python GAUSSJORDAN qui recevra en argument deux matrices

( )

A

M

n K et B∈

M

n p,

( )

K , mettra en œuvre la méthode de GAUSS-JORDAN et renverra, lorsque la matrice A sera inversible, la matrice X∈

M

n p,

( )

K telle que : AX=B. On rappelle que le codage efficace de cette méthode consiste simplement à concaténer les matrice A et B puis à effectuer un échelonnage réduit sur la matrice obtenue.

Références

Documents relatifs

Ce tableau ´etant public, on ne peut pas envoyer la matrice M , d´ecodable par tout le monde.. Calculer la

James Joseph Sylvester (1814-1897) est un mathématicien anglais qui a tra- vaillé avec Arthur Cayley sur les formes algébriques, particulièrement sur les formes quadratiques et

Montrer que u est diagonalisable si et seulement si la somme des dimensions de ses sous- espaces propres est égale à la dimension de

BTS DOMOTIQUE Calcul matriciel 2008-2010.

Le plus ancien traité sur les systèmes d’équations linéaires est le Chiu chang suan shu (Mathématiques en neuf livres). Chang Ts’ang regroupait les coefficients

On vient de voir que la multiplication des matrices encode aussi l’application d’une application lin´ eaire ` a un vecteur...

• Systèmes linéaires : vocabulaire (système incompatible, système de Cramer), écriture matri- cielle, lien avec l’inversibilité de la matrice du système, algorithme du pivot

CALCUL MATRICIEL ET APPLICATIONS AUX GRAPHES CALCUL MATRICIEL ET APPLICATIONS AUX GRAPHES. ACTIVITÉ D’INTRODUCTION