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

Algorithmes et structures de données Discussion :

algorithm fonction atan


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut algorithm fonction atan
    Bonjour,

    j'aurais besoin de coder sur un microcontroleur la fonction atan, je ne sais pas si il est plus performant de faire une table, ou si coder soit meme l'algo de l'atan est faisable.(je possede le compilateur C ou sinon je peut aussi programmer directement en assembleur)

    Merci de votre aide.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Cela dépend aussi de la précision de l'angle que tu fournis.

    Si tu acceptes une précision au degre près seulement, je partirai sur une table. Par contre, si tu veux le millième de degré, il faudra implémenter l'algorithme.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    malheuresement il me faut une précision de au minimum de l'ordre de 0.1 degré, j'ai essayé avec la formule de taylor mais je trouve que c'est pas fameux. Est ce que tu connaitrais un algo performant ?

  4. #4
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Les formules de Taylor, c'est principalement pour la théorie.

    L'algorithme CORDIC est rapide et précis.

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    L'algorithme CORDIC est rapide et précis.
    +1.

    Si je peux me permettre de faire un peu de pub pour un de mes anciens prof :

    http://orochoir.club.fr/Maths/cordic.htm

  6. #6
    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!
    Personnellement, je commencerais par subdiviser l'intervalle de définition en 4 parties:
    1. de 0 à +1;
    2. de +1 à +infini;
    3. de -1 à 0;
    4. de -infini à -1.

    Pour le premier intervalle, on approxime la fonction atan par une combinaison linéaires de polynômes de Tchebychev. Les valeurs sur les 3 autres intervalles s'en déduisent facilement.
    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)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    j'ai trouvé un algo qui fonctionne vraiment bien au niveau de la précision, il me reste a voir au niveau implémentation si ce n'est pas trop lourd, et le temps que ca prend pour un calcul d'arctan :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    sq2p1 = 2.414213562373095048802;
    sq2m1  = 0.414213562373095048802;
    p4  = 16.1536412982230228262;
    p3  = 268.42548195503973794141;
    p2  = 1153.0293515404850115428136;
    p1  = 1780.40631643319697105464587;
    p0  = 896.78597403663861959987488;
    q4  = 58.95697050844462222791;
    q3  = 536.265374031215315104235;
    q2  = 1666.7838148816337184521798;
    q1  = 2079.33497444540981287275926;
    q0  = 896.78597403663861962481162;
    PI_2 = 1.5707963267948966135;
    PI_4 = 0.7853981634;
     
     
    if(x > 0)
        flag = 0;   %(bool)
        arg = x;
    else
        flag = 1;
        arg = -x;
    end
     
            if(arg < sq2m1)
                    temp = arg;
                    argsq = temp*temp;
                    value = ( ( ( (p4*argsq + p3)*argsq + p2) *argsq + p1) *argsq + p0);
                    value = value /( ( ( ( (argsq + q4)*argsq + q3) *argsq + q2)*argsq + q1) *argsq + q0);
                    if(flag == 0)
                        result = value*temp;
                    else
                        result = -1*(value*temp);
                    end
     
            elseif(arg > sq2p1)
                    temp = 1/arg;
                    argsq = temp*temp;
                    value = ( ( ( (p4*argsq + p3)*argsq + p2) *argsq + p1) *argsq + p0);
                    value = value /( ( ( ( (argsq + q4)*argsq + q3) *argsq + q2) *argsq + q1) *argsq + q0);
                    if(flag == 0)
                        result = PI_2 - (value*temp);
                    else
                        result = -1*(PI_2 - (value*temp));
                    end
            else
                    temp = (arg-1)/(arg+1);
                    argsq = temp*temp;
                    value = ( ( ( (p4*argsq + p3)*argsq + p2) *argsq + p1) *argsq + p0);
                    value = value /( ( ( ( (argsq + q4)*argsq + q3) *argsq + q2) *argsq + q1) *argsq + q0);
                    if(flag == 0)
                        result = (PI_4) +  (value*temp);
                    else
                        result = -1*((PI_4) +  (value*temp));
                    end
            end

  8. #8
    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!
    j'ai trouvé un algo qui fonctionne vraiment bien au niveau de la précision
    Ce n'est pas exactement ce que je t'ai proposé, mais ça y ressemble beaucoup. Juste une petite remarque: tes coefficients sont donnés avec plus de chiffres que ce que ton processeur est capable de traiter, selon la norme IEEE 754.
    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)

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    C'est vrai que la j'ai testé sous Matlab pour voir si cela fonctionnait bien, à moi de voir si avec des coefs moins précis, le résultat final est satisfaisant.

    @FR119492 : Tu m'a l'air de connaitre un peu cette algo, serait tu me dire de quel méthode il vient et comment ont été trouvé ces coéfficients?

  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!
    Tu m'a l'air de connaitre un peu cette algo
    Comme je travaille depuis longtemps avec des ordinateurs sur lesquels la fonction atan est déjà implémentée, je ne me suis pas fatigué à la reprogrammer. Malgré cela, je peux t'indiquer quelques pistes.

    Tu sais que l'on a
    arctan(0)=0
    arctan(2-sqrt(3))=pi/12
    arctan(1/sqrt(3))=pi/6
    arctan(1)=pi/4
    D'autre part, tu as
    tan(x/2)=(1-cos(x))/sin(x)=sin(x)/(1+cos(x))
    ce qui te permet de calculer d'autres valeurs.

    Ensuite, pour ce qui concerne l'approximation de Tchebychev, va voir dans Numerical Recipes ou dans Wikipedia.

    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    oki merci pour ton aide, je vais quand même essayer de comprendre un minimum ce que fait cette algorithme, l'histoire de ne pas l'utiliser betemment

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par chris069 Voir le message
    oki merci pour ton aide, je vais quand même essayer de comprendre un minimum ce que fait cette algorithme, l'histoire de ne pas l'utiliser betemment
    Ca m'a tout l'air d'être le calcul de l'approximant de Padé de Atan(x), découpé sur les 3 intervalles: [0,Sqrt(2)-1] [Sqrt(2)-1,Sqrt(2)+1] [Sqrt(2)+1,+oo]

    C'est peut être plus clair comme cela:
    Code java : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    double PI_4 = 0.78539816339744830675;
    double PI_2 = 1.5707963267948966135;
     
    double sq2p1 = 2.414213562373095048802;
    double sq2m1  = 0.414213562373095048802;
     
    double p4  = 16.1536412982230228262;
    double p3  = 268.42548195503973794141;
    double p2  = 1153.0293515404850115428136;
    double p1  = 1780.40631643319697105464587;
    double p0  = 896.78597403663861959987488;
     
    double q4  = 58.95697050844462222791;
    double q3  = 536.265374031215315104235;
    double q2  = 1666.7838148816337184521798;
    double q1  = 2079.33497444540981287275926;
    double q0  = 896.78597403663861962481162;
     
    // atan near 0
    double atan_near0(double x) {
    	double x2,result;
    	x2 = x*x;
    	double P = ( ( ( (p4*x2 + p3)*x2 + p2) *x2 + p1) *x2 + p0);
    	double Q = ( ( ( ( (x2 + q4)*x2 + q3) *x2 + q2)*x2 + q1) *x2 + q0);
    	result = x*(P/Q);
    	return result;
    }
     
    // atan in range [0,+inf]
    double atan_positive(double x) {
    	if(x < sq2m1)
    		return atan_near0(x);
    	else if(x > sq2p1)
    		return PI_2 - atan_near0(1/x);
    	else
    		return PI_4 + atan_near0((x-1)/(x+1));
    }
     
    //  atan in range [-inf,+inf]
    double atan(double x) {
    	if (x<0)
    		return -atan_positive(-x);
    	else
    		return atan_positive(x);
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    exacte, j'arrive a voir le lien avec l'approximant de Padé.

    Merci de ton aide!

Discussions similaires

  1. Algorithme fonction randomize
    Par pomazi dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/05/2009, 18h26
  2. algorithme pour calculer les fonctions trigo ?
    Par thomas0302 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 24/12/2007, 22h44
  3. Réponses: 6
    Dernier message: 21/09/2007, 14h18
  4. Algorithme de la fonction rand()
    Par Tellmarch dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 02/03/2007, 20h07
  5. Fonction d'évaluation d'un jeu de dames utilisant l'algorithme du min/max
    Par elron8 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 31/01/2007, 11h04

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