IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Inversion de matrices


Sujet :

Fortran

  1. #1
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut Inversion de matrices
    Bonjour à tous,

    En ce moment on a pas mal de problème sur nos inversions de matrices.
    9 fois sur 10 on a le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La Matrice est singulière....bla,bla
    On utilise le librairie imsl, et on vient de s'apercevoir qu'il existait deux fonctions d'inversion: d_lsag et d_lslcg (on utilise actuellement d_lslcg).

    Et on cherchait simplement à connaitre la différence entre les deux, et si le fait d'utiliser l'une plutôt que l'autre de ces méthodes donnait plus de chances de "planter" les calculs du pivot de Gauss.

    Est-il possible que le calcul d'inversion de Fortran soit responsable de la singularité de nos matrices (à un pas de calcul informatique donné), alors que le matrice soit "manuellement" inversible ?

    Merci pour toute réponse...

    A+.
    For crying out loud !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Je ne connais pas la librairie IMSL plus que ça, mais il y a certainement un bout de doc qui dit, ne serait-ce qu'en deux lignes, quelles sont les méthodes employées par chacune des routines (inversion via une décomposition LU, gauss avec permutation des lignes et/ou colonnes,...). De là, on peut savoir si l'une est plus efficace (au moins en théorie) que l'autre.

    Sinon, tu peux toujours tester si d'autres librairies (par ex LAPACK, connue pour être une des meilleures librairies pour ce genre de calculs) ne font pas mieux. Mais j'imagine que tu y as déjà songé.

  3. #3
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci pour ta réponse,

    En fait les deux méthodes sont basées sur la décomposition LU, mais une des deux est "itérative" et pas l'autre. Et je suis pas sûr de comprendre la signification exacte de ce mot...

    Il me semble (pas sûr parceque ça date de plusieurs années déjà) que IMSL est issu de LAPACK, et doit donc en être une version amélioré. Sinon, existe-t-il des méthodes d'inversion plus "stable" informatiquement que d'autre, ou alors c'est comme en maths pures: quand une matrice est inversible ou non peut importe la méthode?

    A+.
    For crying out loud !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Il est effectivement possible que IMSL soit basée sur LAPACK; beaucoup ont repris cette librairie puisqu'elle est libre et efficace...

    Pour ce qui est des méthodes, en règle générale les méthodes itératives (où on obtient la solution par approximations successives, au bout d'un nombre d'étapes que l'on ne peut pas prévoir à l'avance) sont typiquement plus rapide mais moins stables que les méthodes directes (où le nombre d'opérations est fixé à l'avance).

    Par contre, il y a effectivement un "monde" entre une matrice inversible 'sur le papier' et le fait de parvenir à en calculer l'inverse par une méthode où une autre. C'est lié au conditionnement de la dite matrice; plus la matrice est mal conditionnée, plus il y aura des accumulations de petites erreurs qui peuvent mener à de gros problèmes (du type que tu rencontres, échec au cours d'une des étapes du calcul) alors que formelement l'inverse existe bel et bien.

    Les décompositions LU intègrent en général une stratégie de pertmutation des lignes pour minimiser les accumulations d'erreurs numériques. Une méthode directe plus efficace, en principe, mais plus chère et plus rarement implémentée, est la bonne vielle méthode de Gauss avec permutation des lignes et colonnes.

    Il existe également des méthodes de préconditionnement (que je connais moins bien) pour parvenir à calculer l'inverse de matrice particulièrement récalcitrantes.

  5. #5
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci beaucoup pour tes conseils, notamment sur la notion "itérative".

    Nous avons opter pour une méthodes stables (non-itératives)...Rien.
    nous avons tester plusieurs méthodes...Rien.
    D'autres langages: Matlab, C...Rien.
    Nous avons même créer un algorithme personnel...Toujours Rien.
    Alors on a revu notre façon de remplir notre matrice, et on a trouvé un gros bug qui datait du début du logiciel.

    En tout cas merci pour toutes ces précisions qui vont nous être très utiles.

    A+.
    For crying out loud !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Dur dur ...

    Bon courage pour la suite.

  7. #7
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut Inversion de matrice
    Tout d'abord, une question qui vous semblera peut-être étrange: avez-vous vraiment besoin d'inverser une matrice? En effet, c'est une maladresse que l'on voit très fréquemment: pour résoudre un système A * x = B, beacoup de gens commencent par calculer la matrice inverse inv(A), puis effectuent le produit x = inv(A) * B. C'est en principe correct, mais assez inefficace parce que l'inversion de matrice prend plus de temps que la résolution d'un système linéaire par une "bonne" méthode.

    Si vous voulez écrire un programme efficace, commencez par vous demander si votre matrice ne présente pas des propriétés qui permettrons d'optimiser le temps de calcul.

    Si ce n'est pas le cas, factorisez votre matrice, c'est-à-dire décomposez-la en le produit d'une matrice tridiagonale gauche et d'une tridiagonale droite (méthode LU). J'utilise pour cela la routine DGECO ou DGEFA de la bibliothèque LINPACK. Ensuite, résolvez-le système à l'aide de DGESL.

    Si la matrice est de type "bande", utilisez DGBCO ou DGBFA, puis DGBSL.

    Sil a matrice est symétrique, vous pouvez utiliser DSICO ou DSIFA, puis DSISL. Vous pouvez aussi économiser près de la moitié de la place en mémoire en utilisant DSPCO ou DSPFA, puis DSPSL.

    Si la nature du problème que vous étudiez vous indique que la matrice est définie positive (toutes ses valeurs propres positives) préférez les routines dont les noms commencent par DPO, DPP ou DPB.

    Pour mémoire, la bibliothèque LINPACK est disponible gratuitement sur le site www.netlib.org

    Bonne chance
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  8. #8
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 35
    Points : 185
    Points
    185
    Par défaut Quelques précisions
    Salut,

    Je confirme que certains algorithmes d'IMSL - en particulier ceux traitant de l'algèbre linéaire - sont basés sur LAPACK, qui est très largement répandu dans le domaine du calcul scientifique.

    S'agissant des méthodes utilisées, je ne peux que conseiller d'aller voir la documentation en ligne (très exhaustive), téléchargeable par tout un chacun à l'URL suivante : http://www.vni.com/products/imsl/doc...tion/index.php


    SebGR

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    vous pourrez aussi trouver des informations interessantes sur les algorithmes d'inversion à cette adresse:

    http://www.nrbook.com/a/bookfpdf.php

    (chapitre 2 - solution of linear algebraic equations)

    qui permettent parfois d'opter pour telle ou telle méthode en fonction de la forme de la matrice (creuse, tridiagonale, bandes...).

  10. #10
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    Tout d'abord, on ne répétera jamais trop ma mise en garde: n'inversez une matrice que lorsque c'est strictement nécessaire, ce qui est rare.

    A part ça, lorsqu'il se passe des choses peu orthodoxes avec une matrice, il est de bonne politique de passer par la méthode des valeurs singulières (fonction svd dans MatLab, routine DSVDC dans Linpack). Si la singularité résulte d'une erreur lors de la construction de la matrice, en général le diagnostic saute aux yeux.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    Bonjour
    Comme le dit FR119492, l'inversion de matrice est extrêmement coûteuse. On s'en sert rarement.
    Peut-être pourrait-tu nous donner plus de détail sur les raisons pour lesquelles tu veux inverser des matrices. Il est probable qu'une solution plus élégante (ou tout au moins, moins couteuse) existe.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    je viens de regarder la doc imsl.

    les fonctions que tu utilise ne semblent pas inverser la matrice (j'ai regardé rapidement mais c'est ce qu'il me semble avoir compris...)

    LSARG (et pas LSAG) donne l'information suivante :
    (traduction sommaire)
    LSARG résoud un système d'équations linéaire à coefficients réels. Elle utilise LFCRG pour calculer une factorisation LU des coefficients de la matrice et calculer le conditionnement puis utilise LFIRG pour résoudre le système itérativement.

    et LFIRG semble utiliser cette factorisation LU pour résoudre le système


    LSLCG fait sensiblement la même chose pour résoudre un système a coefficients complexes

  13. #13
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Premièrement, merci pour toutes vos réponses et votre aide.

    En regardant de plus, il semble en effet que le problème d'inversion ne vienne pas de l'algorithme mais de la construction de notre matrice...Matlab ne pouvant pas inverser notre matrice par svd non plus. On va tenter de reposer le problème car on a peut-être une sous-détermination de notre système dû au fait que certaines lignes de notre matrice ne comporte que des zéros parfois.

    A+.
    For crying out loud !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inversion de matrice
    Par mhooreman dans le forum Mathématiques
    Réponses: 6
    Dernier message: 26/10/2006, 18h35
  2. Probleme d'inversion de matrice subtil
    Par babycrash dans le forum C
    Réponses: 2
    Dernier message: 02/08/2006, 17h41
  3. inversion de matrice?
    Par babycrash dans le forum C
    Réponses: 17
    Dernier message: 21/06/2006, 22h18
  4. Comment inverser une matrice H(2,2) ?
    Par fafa624 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 10h23
  5. Calculer un inverse de matrice avec boost?
    Par Clad3 dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 02/06/2005, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo