Algorithme de Gauss-Jordan de Wikipédia : un truc qui cloche ?

Le problème exposé dans ce sujet a été résolu.

Edit: j’ai vraiment l’impression que le problème vient de :

multipliée par A[i,j]

, qui se situe ici : https://fr.wikipedia.org/wiki/Élimination_de_Gauss-Jordan . Vous confirmez que j correspond bien au numéro de la colonne en cours de traitement, et que A[i,j] utilisée sur chaque ligne i ne dépend, parmi toutes les colonnes, QUE de la colonne j pour chaque ligne ?

======

@ache, je ne comprends pas ce que tu essaies de me faire remarquer. Je m’explique.

Le bout de code auquel tu fais référence me semble être la partie soustraction/multiplication. C’est-à-dire :

1
2
3
4
5
6
7
content.indices.foreach(id_line => {
        if(id_line != id_last_pivot) {
          content.indices.foreach(id_column => {
            mutable_being_inversed_matrix(id_line)(id_column) -= mutable_being_inversed_matrix(id_line)(general_id_column) * mutable_being_inversed_matrix(id_last_pivot)(id_column)
          })
        }
      })

Pour chaque ligne tu fais la première -1 à chaque terme multiplié terme à terme avec les autres

Non ; je fais : chaque ligne MOINS la case de cette ligne à la colonne courante FOIS la ligne du pivot. Dans l’algo de Wiki, c’est ce qui correspond à :

1
 |   |   |   |   Soustraire à la ligne i la ligne r multipliée par A[i,j] (de façon à annuler A[i,j])

Ajouter une constante à chaque terme d’une liste (en gros, tu ajoutes la ligne α(1,1,1,1) qui n’existe probablement pas encore

Je n’ajoute jamais de ligne dans mon code. Sauf si par "ajout" tu entends "soustraction" ? Mais ça c’est normal.

Multiplié deux listes liste terme à terme.

Non ; je soustrais deux listes terme à terme (c’est la définition que j’ai donnée à "Soustraire la ligne i à la ligne r […]").

Ce que tu as le droit de faire:

Multiplié une ligne par une constante différente de 0 Ajouter/soustraire une liste à une autre

C’est ce que je fais.

Ensuite il va falloir parcourir les lignes afin de d’obtenir que des 0 (sauf sur la ligne j) dans la colonne j, pour cela, tu soustraits la ligne normalisée (j donc) multipliée par le coefficient à annuler.

C’est bien ce que je fais.

+0 -0

Alors du coup normalement c’est bon !

1
2
3
4
5
6
7
8
content.indices.foreach(id_line => {
            if(id_line != id_last_pivot) {
              val tmp = mutable_being_inversed_matrix(id_line)(general_id_column)
              content.indices.foreach(id_column => {
                mutable_being_inversed_matrix(id_line)(id_column) -= mutable_being_inversed_matrix(id_last_pivot)(id_column) * tmp
              })
            }
          })

J’ai rajouté une variable $tmp$ pour garder $A[i,j]$ à la même valeur.

Résultats :

Avec une petite matrice : https://jsfiddle.net/0pe4xab6/

Avec la matrice du topic : https://jsfiddle.net/dhgLqe5y/

La matrice de Wikipédia marche !

+0 -0

Petite question. Maintenant que j’ai réussi à "convertir" la matrice originale en une matrice identité de la bonne façon, je voudrais "convertir" la matrice identité en la matrice inversée, résultat concret de l’élimination de Gauss-Jordan.

Je me contente d’appliquer les mêmes opérations que sur la matrice originale ?

Ben… Bien sûr que si… o_O

EDIT : je suis en train de me dire que tu n’as pas compris l’algo en fait, il s’agit d’effectuer les mêmes opérations sur ta matrice à inverser (disons $A$) et sur la matrice $I$ puisqu’en fait, l’algo de Gauss-Jordan est équivalent à multiplier par $A^{-1}$. Si tu Multiplies $A$ par $A^{-1}$ tu obtiens $I$ (c’est la partie que tu as déjà codée), et si tu multiplies $I$ par $A^{-1}$, tu obtiens $A^{-1}$. Il faut effectuer exactement les même opérations sur tes deux matrices pour que l’algo fonctionne, sinon ça n’aurait aucune raison de donner quoique ce soit de particulier…

+0 -0

Ben… Bien sûr que si… o_O

EDIT : je suis en train de me dire que tu n’as pas compris l’algo en fait, il s’agit d’effectuer les mêmes opérations sur ta matrice à inverser (disons $A$) et sur la matrice $I$ puisqu’en fait, l’algo de Gauss-Jordan est équivalent à multiplier par $A^{-1}$. Si tu Multiplies $A$ par $A^{-1}$ tu obtiens $I$ (c’est la partie que tu as déjà codée), et si tu multiplies $I$ par $A^{-1}$, tu obtiens $A^{-1}$. Il faut effectuer exactement les même opérations sur tes deux matrices pour que l’algo fonctionne, sinon ça n’aurait aucune raison de donner quoique ce soit de particulier…

adri1

hello Adri1, désolé de répondre avec un petit peu de retard (j’ai édité l’OP et mis en résolu ce topic mais c’est tout ce que j’ai eu le temps de faire rapidement).

Effectivement, j’ai manqué de recul et fait preuve d’étourderie quand j’ai posté mon dernier message (je parlais de la matrice identité alors que dans ma tête je pensais à l’autre matrice bref, grosse grosse confusion sur le moment).

Par contre depuis le début j’ai bien compris l’idée générale du procédé, là où j’ai eu un peu plus de mal c’est vers la dernière ligne de l’algo de wikipedia, mais là encore je l’avais bien comprise bien avant que j’ai créé ce topic.

A vrai dire, mon algo marchait depuis le début : j’avais juste oublié de stocker certaines valeurs de variables dans des variables "temporaires", pour éviter d’utiliser leur nouvelle valeur dans les calculs qui les impliquent dans une même boucle. C’est ce qui faisait foirer mon algo, mais sinon tout aurait dû marcher nickel depuis le début..................... Edit : d’ailleurs ça a bien été le cas quand j’ai corrigé ces oublis.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte