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

Mathématiques Discussion :

Précision machine lors d'une projection d'un vecteur sur un hyperplan


Sujet :

Mathématiques

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Précision machine lors d'une projection d'un vecteur sur un hyperplan
    Bonjour à tous,

    Je suis en train d'écrire un programme d'optimisation sous contraintes, dans le cadre d'un petit projet.
    C'est un simple algorithme de suivi de gradient.
    Au départ je voulais utiliser "fmincon" de matlab, mais ma fonction objective n'est pas continue, elle est affine par morceaux.
    Du coup, j'écris un algorithme maison qui est pas loin d'être fini, si ce n'est que j'ai des soucis lors de la projection de mon gradient sur ma contrainte, qui est un hyperplan (hypercube de manière générale).

    Je projette mon gradient sur mon hyperplan de la manière suivante :
    p = grad - ( grad' * n / (sum(n.^2) ) *n

    où grad est mon vecteur à projeter et n un vecteur normal de mon hyperplan ( non unitaire , d'où la division par la norme au carré )

    le problème, c'est que mon projeté p, n'est en général pas tout à fait sur la contrainte :

    Sur un cas ou deux testé, lorsque j'écris (grad' * p) , j'obtiens une valeur de l'ordre de 10^-16 au lieu de zero.
    C'est bien entendu un problème de précision numérique, mais je ne sais pas comment faire, ou plutôt quel seuil S fixer, pour considérer que si (grad' * p) < S alors j'arrondi à 0.

    Des idées ? je suis pas très fort pour ces trucs là.

    merci d'avance

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 694
    Points : 188 894
    Points
    188 894
    Par défaut


    Tout d'abord, c'est normal d'obtenir des e^-16 au lieu de zéro : calcule la valeur de Formule mathématique, normalement zéro, mais -2.4493e-16 chez moi (MATLAB 2013b). Tu ne peux pas éviter ces cas. Quand tu fais des tests (d'optimalité, par exemple), ce n'est que par chance que tu auras zéro, il faut définir un seuil pour toute comparaison entre des nombres à virgule flottante (il est courant de citer http://docs.oracle.com/cd/E19957-01/..._goldberg.html).

    Maintenant, choisir un seuil, c'est un peu de la magie : pas trop élevé, sinon tu englobes plus que les erreurs numériques (1 est un très mauvais choix…) ; pas trop bas, sinon toutes les erreurs numériques ne seront pas comprises (à titre de comparaison, MATLAB m'indique un epsilon machine de 2.2204e-16). Dans un contexte similaire (optimisation numérique, mais sans contraintes), un seuil de e-4 (ou même e-8) fonctionnait à merveille.

Discussions similaires

  1. Suivi de numerotation des points lors d'une projection
    Par lileric13 dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/01/2012, 12h55
  2. Réponses: 4
    Dernier message: 19/08/2011, 16h59
  3. Deloggage lors d'une recherche de type cliquer sur le sous-forum "Tous"
    Par is_null dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 06/08/2007, 14h07
  4. Réponses: 1
    Dernier message: 19/12/2006, 15h08
  5. Réponses: 4
    Dernier message: 24/01/2005, 09h20

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