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

Modules Perl Discussion :

Problème avec le module Math::Trig


Sujet :

Modules Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut Problème avec le module Math::Trig
    Bonjour,

    Je viens de remarquer quelque chose d'assez bizarre quand j'utilise le module Math::Trig qw(great_circle_distance deg2rad) pour calculer la distance entre deux points géographiques, alors quand je prends l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        use Math::Trig qw(great_circle_distance deg2rad);
        sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1])}
        my @L = NESW(5.761080000, 36.822300000);
        my @T = NESW(5.76108, 36.8223);
        my $km = great_circle_distance(@L, @T, 6378);
        print("$km\n");
    Logiquement je dois trouver 0 km et bien non je trouve 0,0000950396060943604 km.
    J'ai utilisé l'exemple le plus répondu sur internet à ce sujet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       use Math::Trig qw(great_circle_distance deg2rad);
       sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1]) }
       my @L = NESW( -0.5, 51.3);
       my @T = NESW(139.8, 35.7);
       my $km = great_circle_distance(@L, @T, 6378); # About 9600 km.
       print("$km\n");
    Moi je trouve 9605.26637021388 km et non 9600 km .

    Est-ce que c'est la même chose pour vous ? Peut-être que j'utilise mal le module ou alors le calcul n'est pas très précis .

    Merci de m'aider.
    H.

  2. #2
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Je trouve les mêmes résultats que toi : en regardant de plus prêt la fonction "great_circle_distance" je pense savoir d'où cela vient.

    Voici la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    sub great_circle_distance {
        my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_;
     
        $rho = 1 unless defined $rho; # Default to the unit sphere.
     
        my $lat0 = pip2 - $phi0;
        my $lat1 = pip2 - $phi1;
     
        return $rho *
    	acos_real(cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) +
    		   sin( $lat0 ) * sin( $lat1 ));
    }
    En essayant de récupérer les différentes valeurs dans la fonction et en faisant des prints comme suit en utilisant ton premier exemple (celui qui doit afficher 0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $value = cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) +
    		   sin( $lat0 ) * sin( $lat1 );
    print "value : $value => acos_real($value) = ".acos_real($value)."\n";
    print "acos_real(1) = ".acos_real(1)."\n";
    on obtient :
    value : 1 => acos_real(1) = 1.49011611938477e-08
    acos_real(1) = 0
    On remarque donc qu'il met value à 1 et le acos_real ne met pas à 0 contrairement à la ligne suivante où j'affiche le acos_real(1) = 0.

    Ensuite j'ai essayé d'afficher le valeur de value avec la fonction sprintf pour avoir 15 et 20 chiffres après la virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     print sprintf("%.15f",$value)."\n";
     print sprintf("%.20f",$value)."\n";
    on obtient respectivement:
    1.000000000000000
    0.99999999999999988898
    Je pense donc que le problème vient de la gestion des "nombres réels" et leur approximation dans calcul de cette valeur "cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) + sin( $lat0 ) * sin( $lat1 )"

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut
    Bonjour Beniou,

    Je vous remercie pour vos explications, il doit surement y avoir un problème d'approximation, c'est dommage pour les utilisateurs de ce module.

    J'ai masqué ce bémol en prenant que deux chiffres après la virgule du résultat final, et là je peux enfin avoir mon 0 km , mais ceci dit le résultat n'est pas vraiment très très juste pour d'autres jeux de données.

    Merciiiiiiii beaucoup.
    H.

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

Discussions similaires

  1. Problème avec le module AI::Categorizer
    Par Pinoute dans le forum Modules
    Réponses: 0
    Dernier message: 20/07/2007, 11h50
  2. problème avec le module TK
    Par thierry7106 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 12/05/2007, 13h50
  3. Probléme avec le module turtle
    Par Newbie46 dans le forum Général Python
    Réponses: 7
    Dernier message: 15/02/2007, 21h03
  4. problème avec le module DBI
    Par vbcasimir dans le forum SGBD
    Réponses: 6
    Dernier message: 08/10/2005, 12h48
  5. problème avec un module
    Par vbcasimir dans le forum Modules
    Réponses: 2
    Dernier message: 29/08/2005, 15h59

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