Cet article explique comment résoudre un système linéaire et effectuer les opérations nécessaires sur les matrices sur une calculette HP-15C. On traite la question sur l'exemple de la résolution du système suivant :
⎧ 4x + 2y + 3z = 4
⎨ 5x − y + 4z = 6
⎩−3x + 2y − z = 0.
Ce qui revient à résoudre l'équation matricielle AX=B :
⎧ 4 2 3⎫⎧x⎫ ⎧4⎫ | 5 −1 4||y|=|6| ⎩−3 2 −1⎭⎩z⎭ ⎩0⎭.
Il faut commencer par réserver les espaces mémoires nécessaires pour les matrices A et B en plaçant leurs dimensions dans la pile puis en lançant la commande f DIM étiquette
:
3 ENTER 3 f DIM A 3 ENTER 1 f DIM B
On peut vérifier cette information à tout moment avec, par exemple, RCL MATRIX B
, qui affichera :
b 3 1
Il faut évidemment stocker les nombres données dans les éléments de la matrice. Par exemple, on veut stocker −3 dans a₃₁ (on note, as usual, aᵢⱼ les éléments de la matrice A, etc.). Les indices de l'élément de la matrice sur lequel on travaille sont toujours stockés dans les registres Rₒ et R₁ : la ligne dans Rₒ et la colonne dans R₁. Ainsi en tapant :
3 STO 0 1 STO 1 3 CHS STO A
on stocke 3 dans le registre Rₒ et 1 le registre R₁, indiquant ainsi qu'on travaille désormais sur le terme a₃₁. Quand ensuite on stocke −3 dans la matrice A, il l'est à la bonne place. La procédure est semblable pour rappeler un élément de la matrice dans la pile :
3 STO 0 1 STO 1 RCL A
Un autre méthode, un peu plus rapide mais plus ésotérique, existe. On doit placer dans la pile, successivement :
puis appeler la commande STO g A
, qui stockera la valeur à la bonne place :
3 ENTER 1 ENTER 3 CHS STO g A
On peut de même rappeler cet élément dans la pile avec :
3 ENTER 1 RCL g A
Noter la cohérence de l'utilisation du préfixe bleu g
avec l'étiquette... jaune de la matrice A !
USER
et le stockage et lecture en série des éléments d'une matrice Les méthodes précédentes sont évidemment relativement lentes pour entrer les 12 nombres du système linéaire. La HP-15C met donc à disposition une nouvelle méthode : le mode USER
. Quand on active celui-ci avec les touches f USER
, toute utilisation de STO A
ou RCL A
provoque la mise à jour automatique des registres Rₒ et R₁, qui se positionnent sur l'élément suivant. Autrement dit, s'il y a au départ 1 dans les deux registres Rₒ et R₁, la première utilisation de STO A
ou RCL A
affectera a₁₁, la deuxième a₁₂, puis a₁₃, a₂₁, ..., jusqu'à a₃₃, pour ensuite revenir à a₁₁. Et justement, la commande f MATRIX 1
est un raccourci pour initialiser à 1 d'un coup les registres Rₒ et R₁. Elle est équivalente à :
1 STO 0 1 STO 1
La séquence suivante permet ainsi d'entrer tous les termes de la matrice A l'un après l'autre, sans avoir à s'occuper des indices :
3 ENTER 3 f DIM A f USER f MATRIX 1 4 STO A 2 STO A 3 STO A 5 STO A 1 CHS STO A 4 STO A 3 CHS STO A 2 STO A 1 CHS STO A
On fait de même pour la matrice B. Les indices courants ont fait un cycle complet avec la matrice A et sont réinitialisés à 1 et 1, mais il vaut sans doute mieux, surtout si on a fait autre chose entre temps, s'en assurer avec un nouveau f MATRIX 1
:
3 ENTER 1 f DIM B f MATRIX 1 4 STO B 6 STO B 0 STO B
Attention à l'utilisation du mode USER
si l'on veut avoir accès aux fonctions √x
, eˣ
, etc. On a tout intérêt à réserver le mode USER
uniquement à l'entrée et la lecture des éléments de matrices, et à en sortir le plus rapidement possible.
Par défaut, la calculatrice stocke le résultat des opérations matricielles dans une matrice dont l'étiquette est libre : au moment où je fais ces calculs, il s'agit de la matrice dont l'étiquette est D. On peut aussi prévoir une autre étiquette pour recevoir le résultat du calcul, par exemple C. Cela se fait par la commande f RESULT C
. Il n'est pas nécessaire de dimensionner la matrice résultat : elle le sera automatiquement lors du calcul.
Passons enfin à la solution du problème. L'équation matricielle AX=B a pour solution X=A⁻¹B :
f RESULT C RCL MATRIX A 1/x f RESULT D RCL MATRIX B ×
Explications :
1/x
). Le résultat est donc stocké dans la matrice résultat C, qui est placé automatiquement dans la pile.La calculatrice indique alors que le résultat se trouve dans la matrice D dont la dimension est 3×1 :
d 3 1
Attention (bis) à l'utilisation de la touche 1/x
en mode USER
.
On peut maintenant lire les 3 éléments de D (avec le mode USER
activé) :
f MATRIX 1 RCL D RCL D RCL D
et lire ainsi (avec ravissement, non ?) successivement les solutions du système linéaire :
x = −0,9524
y = −0,0952
z = 2,6667.
Évidemment, ce sont des valeurs approchées (les valeurs exactes sont −20/21, −2/21 et 8/3).
Pour libérer la mémoire utilisée par toutes les matrices et effacer leur contenu, on utilise la commande f MATRIX 0
.
Voici la liste complète de la séquence de touches à effectuer pour obtenir les solutions du système :
3 ENTER 3 f DIM A 3 ENTER 1 f DIM B f MATRIX 1 f USER 1 STO A 2 STO A 3 STO A 5 STO A 1 CHS STO A 4 STO A 3 CHS STO A 2 STO A 1 CHS STO A 4 STO B 6 STO B 0 STO B f USER f RESULT C RCL MATRIX A 1/x f RESULT D RCL MATRIX B × f USER f MATRIX 1 RCL D RCL D RCL D f USER
Quand la matrice est singulière, la calculette parvient quand même à calculer son inverse et à résoudre l'équation ! C'est assez déroutant pour un matheux : la calculette modifie d'elle même les éléments de la matrice pour pouvoir absolument trouver une matrice inverse... Pour un ingénieur, les éléments de la matrice sont de toute façon des valeurs approchées, alors, un peu plus ou un peu moins...
On aura donc intérêt à calculer le déterminant de la matrice avant de commencer un calcul, à l'aide de la commande f MATRIX 9
. Pour obtenir le déterminant de la matrice A ci-dessus, on entre :
RCL MATRIX A f MATRIX 9
On lit alors −21.
Je le signale, parce que, évidemment, la première matrice A choisie complètement au hasard pour écrire cet article... était singulière ! Karma, tout ça...
D'autres opérations sont évidemment possibles sur les matrices : sommes, transposées, etc., inutiles ici.
Il est possible de résoudre l'équation matricielle AX=B en effectuant l'opération X=B÷A :
RCL MATRIX B RCL MATRIX A ÷
Cette opération donne le même résultat que précédemment. Mais, après avoir effectué l'opération, si l'on rappelle les éléments de A, on a la surprise de constater que la matrice A a changé ! La matrice que l'on trouve maintenant stockée avec l'étiquette A est :
⎧ 5 −1 4⎫ | 0,8 2,8 −0,2| ⎩−0,6 0,5 1,5⎭.
C'est bien embêtant. Parce que si l'on souhaite modifier un seul coefficient du système linéaire de départ, il faut réécrire toute la matrice A ! Comprenons d'abord ce qu'il s'est passé, puis voyons ensuite une mesure pour pallier à cette complication.
Quand la machine résout l'équation matricielle B÷A, la matrice A est d'abord décomposée en produit P⁻¹LU, un produit de trois matrices : A = P⁻¹ x L x U. La première matrice P⁻¹ est une matrice de permutation (d'où le P). Les deux autres L et U sont des matrices triangulaires, la première étant triangulaire inférieure (Low) avec tous les termes diagonaux égaux à 1 et la deuxième triangulaire supérieure (Up). L'avantage de cette décomposition est que les algorithmes qui l'effectuent, ainsi ensuite que le calcul de la solution X ou du déterminant, sont particulièrement simples et rapides (ils ont l'inconvénient d'accumuler les erreurs d'arrondis, mais c'est une autre histoire). Pour gagner du temps lors de prochains calculs utilisant la matrice A, tout en ne stockant pas plusieurs matrices qui auraient essentiellement la même utilité, les concepteurs de la calculatrice ont décidé qu'une fois calculée sa décomposition en produit P⁻¹LU, la matrice A est remplacée par ces trois matrices, compactées en une seule matrice, celle que nous avons déjà présentée :
⎧ 5 −1 4⎫ | 0,8 2,8 −0,2| ⎩−0,6 0,5 1,5⎭.
À partir de cette unique matrice, la machine est capable de reconstruire les matrices P⁻¹, L et U, pour faire ensuite les calculs demandés. La machine a d'ailleurs la courtoisie de signaler ce remplacement, en plaçant le cas échéant deux tirets (--) après son étiquette :
A-- 3 3
(Pour information, la décomposition de la matrice A en matrices P⁻¹LU est :
⎧ 4 2 3⎫ ⎧0 1 0⎫ ⎧ 1 0 0⎫ ⎧-3 2 -1⎫ | 5 −1 4|=|0 0 1|×|-4/3 1 0|×| 0 14/3 5/3| ⎩−3 2 −1⎭ ⎩1 0 0⎭ ⎩-5/3 1/2 1⎭ ⎩ 0 0 3/2⎭.
Je ne sais pas comment ce compactage des trois matrices en une seule est fait, parce que je ne sais pas comment les concepteurs ont choisi de tenir compte de la matrice de permutations.)
Toujours est-il que, vue la modification possible des matrices lors des calculs, on aura intérêt à sauvegarder le contenu des matrices originelles avant de s'y lancer. On peut par exemple copier la matrice A dans une autre matrice, par exemple celle d'étiquette E. Cela se fait à l'aide des commandes suivantes :
RCL MATRIX A STO MATRIX E
Ainsi, même après effectué un calcul qui altère la matrice A, si l'on veut modifier un des éléments de la matrice originelle, il suffira de faire l'opération inverse et de copier le contenu de la matrice E dans A :
RCL MATRIX E STO MATRIX A
Articles (304)
Je préfère vraiment les contacts à l'ancienne, par courrier électronique à l’adresse jpsmail(at)free.fr. Antispam : penseras-tu à remplacer (at) par @ dans l’adresse ? Que cela ne t'enpêche pas d'ajouter un commentaire :