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 :

Contourner une erreur de précision?


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Points : 52
    Points
    52
    Par défaut Contourner une erreur de précision?
    Bonjour à toutes et à tous,

    Je me heurte à une erreur de précision lors d'un calcul. Il s'agit de déterminer bêtement si un rayon passe par une case d'un maillage (un maillage est constitué de plusieurs cases).

    A l'heure actuelle, pour déterminer si le rayon étudié passe par une case je regarde la position des points extrêmes constituant les diagonales d'un carré pour voir s'ils sont tous du même coté (ou colinéaires) du rayon. J'ai 4 points à tester.

    Mon problème vient du fait que lorsque que j'applique la formule ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x)) > 0 (deux points a et b (rayon) à tester contre c (point d'une diagonale)), j'obtiens des erreurs d'arrondi. que je corrige par une recherche près de eps.
    J'aimerais pouvoir certifier ce résultat sans avoir à corriger cette erreur d'arrondi. Est-ce possible?
    Je précise que je suis sur des contraintes rapides (pas temps réel, mais rapide quand même).

    un sample du code que j'utilise actuellement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        % ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x)) > 0
        t1 = (R2(1) - R1(1))*(cells(1:4,2,ilayers(i)) - R1(2)) - (R2(2) - R1(2))*(cells(1:4,1,ilayers(i)) - R1(1));
     
        %find & correct the rounding errors:
        inds = find(t1> 0 & t1 < (eps + 1e-14));
        if(~isempty(inds))
            t1(inds) = 0;
        end
     
        %if <0 or >0 lie from one side of the line
        %if == 0 points are colinear: no interest
        t1 = sign(t1(t1~=0));
     
        if(sum(t1) ~= size(t1,1) & sum(t1) ~= -size(t1,1))
        %intersect once, then the ray pass throught the cell
              clayers(k) = ilayers(i);
            k = k+1;
        end
    end
    Merci par avance pour vos remarques et suggestions.

    Gian

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour
    Citation Envoyé par Giansolo Voir le message
    J'aimerais pouvoir certifier ce résultat sans avoir à corriger cette erreur d'arrondi. Est-ce possible?
    A part faire du calcul symbolique, ça va être compliqué....

    Pourquoi le fait d'utiliser un epsilon te gène? Tu as des résultats incohérents parfois? Du moment que l'espilon est bien inférieur à la précision de tes points, cela ne devrait pas poser de problème.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Points : 52
    Points
    52
    Par défaut
    Effectivement, ma précision est très inférieure à ma résolution (du maillage) donc ca ne pose pas de problèmes à priori, mais j'ai toujours l'impression que ca fait un peu bidouillage, c'est ca qui me gène.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/07/2010, 11h02
  2. Réponses: 19
    Dernier message: 21/12/2007, 17h27
  3. Comment contourner une erreur Mysql 1093?
    Par cassy dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/05/2007, 17h03
  4. [procédure PG] Une erreur mystérieuse...ou pas
    Par doohan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/07/2003, 17h16
  5. Ne pas formater une erreur
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/03/2003, 14h13

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