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

MATLAB Discussion :

Décomposition en valeurs singulières


Sujet :

MATLAB

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Décomposition en valeurs singulières
    Bonjour à tous,

    J'ai un produit de matrice P = AB qui est définie négative.
    J'aimerais en tirer A et B.
    Je fais donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [P1, P2, P3] = svd(P);
    A = P1*sqrtm(P2);
    B = sqrtm(P2)*P3'
    Ensuite je définis une matrice C à partir de A et B moyennant quelques opérations élémentaires, qui est censée, d'après un théorème, être définie positive (sur papier la démonstration est claire).

    Cependant, je me retrouve avec n valeurs propres négatives (très proches de 0 cependant).

    Je tente de les forcer à 0 en redécomposant C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [C1, C2, C3] = svd(C);
    % pour toutes les valeurs propres i négatives:
    C2(i,i) = 1E-6; % positif
    C = C1*C2*C3'
    Mais là je retombe sur des valeurs propres négatives, ou même complexes...

    Je ne sais pas du tout quoi faire de ces erreurs numériques, valeurs propres négatives, comment feriez-vous?

    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    A priori ton premier bout de code est bon.
    Néanmoins, la racine carrée d'une matrice n'est pas unique, et ton problème vient peut etre de
    doc sqrtm : is the unique square root for which every eigenvalue has nonnegative real part
    Peut etre que -sqrt(-P2) te donnerait une autre racine ?

    Quel est le calcul (A,B) -> C ?

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Après vérification A et B ont des valeurs propres réelles et bien strictement positives avec le sqrtm().
    Si j'utilise -sqrt(-P2) j'obtiens des matrices à coefficients complexes, je pense pas que ça soit correct.

    Je calcule C par (ou X et Y sont connues symétriques définies positives):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C = [Y -Y*X/A+inv(A);B -B*X/A];
    J'ai essayé notamment avec des pinv(), ou en divisant (/) mais la précision est la même.

    Merci

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Si j'utilise -sqrt(-P2) j'obtiens des matrices à coefficients complexes, je pense pas que ça soit correct.
    Si P est définie négative ca ne me semble pas normal !

    Par ailleurs, si P = AB , la svd n'identifie pas forcément A et B (par exemple si A et B sont carrées, AB= (A*M)*(inv(M)*B) pour toute M inversible

  5. #5
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    D'après la doc svd() retourne une matrice diagonale de valeurs positives, donc a priori c'est bon.

    Après pour la reconstruction, c'est vrai que ma méthode n'est pas unique, mais c'est une solution qui existe puisque le produit donne bien AB?

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Ok pour svd-> positif. Désolé !

    mais c'est une solution qui existe puisque le produit donne bien AB?
    Tout à fait, mais dans le calcul de C, tu supposes peut être que c'est une solution particulière, et pas n'importe quel A,B

  7. #7
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Je me permets de faire ce commentaire pour ceux qui souhaiteraient suivre mais qui ne comprennent pas tout... Deux notions sont importantes à connaître :
    - Matrice définie positive
    - Décomposition en valeurs singulières (svd dans matlab : svd = Singular Value Decomposition)

    Ensuite, je pense que vous avez fait une erreur de raisonnement quelque part. Je m'explique. J'ai fait quelques tests. Prenons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >> P = diag([-3 -4 -5])
    C'est une matrice réelle, diagonale, symétrique, et à valeurs propres toutes négatives (-3, -4 et -5) ==> c'est une matrice définie négative

    Maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [P1 P2 P3] = svd(P);
    A = P1 * sqrtm(P2);
    B = sqrtm(P2) * P3';
    Et on se situe donc bien dans ton cas si je ne m'abuse.

    Chez moi, eig(A) me renvoie trois valeurs propres réelles : 2 positives et 1 négative... sauf erreur de ma part, ça contredit donc ce qui a été dit un peu plus haut (je parle du post #3)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ans =
     
        1.9680
       -1.9680
        2.0000
    ...à moins qu'il faille que la matrice P aie une forme particulière pour que A > 0 ? Par ailleurs, je ne vois pas pourquoi il faudrait que A>0 et B>0...

    Si c'est possible j'aimerai avoir un exemple typique de P, X et Y. Ainsi que la démo qui dit que C>0.

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

Discussions similaires

  1. Algorithme de Décomposition en valeur singulière
    Par guinda dans le forum Mathématiques
    Réponses: 3
    Dernier message: 03/03/2014, 08h58
  2. Décomposition en valeur singulière en Java
    Par guinda dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 01/03/2014, 11h39
  3. Réponses: 3
    Dernier message: 14/06/2009, 23h17
  4. la décomposition en valeurs singulières(SVD)
    Par naima2005 dans le forum Langage
    Réponses: 6
    Dernier message: 27/01/2008, 19h16

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