Le Blog Hypocondriaque

Calculer le sinus d’un angle

Publié par hypoblog sur avril 8, 2008

Sur ce billet, j’explique la démarche pour approximer la valeur du sinus d’un angle et comment on peut la mettre en oeuvre dans une fonction C++ pour calculer les sinus des angles.

Tout d’abord, trouvons l’équation qui décrit l’approximation du sinus d’un angle autour de 0 grâce au développement de Taylor. On obtiens:

sin(x)= x - (x³)/3! + (x^5)/5! - (x^7)/7! + …

Free Image Hosting at www.ImageShack.usFree Image Hosting at www.ImageShack.us

Les schémas nous montrent qu’une approximation du septième ordre est assez précise pour des angles allant de -π/2 à π/2. Cet intervalle ne décrit pas totalement une période du sinus mais elle recouvre l’ensemble des valeurs que le sinus peut prendre (de -1 à 1), il suffira de trouver l’angle correspondant entre -π/2 et π/2.

Pour trouver cet angle, il suffit tout d’abord de trouver l’angle correspondant compris entre -π et π, ce qui s’obtient en faisant une succession d’ajout ou de retrait de 2π. Une fois l’angle compris entre -π et π. Si celui-ci est compris entre -π/2 et π/2, on peut appliquer l’approximation directement, sinon il faut prendre son angle supplémentaire car les sinus d’angles supplémentaires sont égaux.

Nous pouvons donc attaquer le code en C++.

Créons tout d’abord une fonction qui retourne l’angle correspondant pour le sinus à l’angle passé en paramètre.

const double PI = 3.14159265; // constante contenant la valeur de π
double angleCorrespondant(double angle)
{
    // On teste tout d'abord si l'angle se trouve entre -π et π, dans le cas échéant
    // on lui soustrait on ajoute la valeur de 2π
    while(angle>PI)
        angle -= 2*PI;
    while(angle<-PI)
        angle += 2*PI;

    // Si l'angle ne se trouve pas entre -π/2 et π/2, on prend son supplémentaire
    if(angle>(PI/2) || angle<(-PI/2))
    {
        angle = PI - angle;
    }
    // On retourne la valeur trouvée
    return angle;
}

On va créer également deux fonctions utiles pour calculer l’approximation (les puissances et les factorielles) même si on peut utiliser celles de la bibliothèque cmath.

double puissance(double n, int exp)
{
    double result = 1;

    for(int i=0; i<exp; i++)
        result *= n;

    return result;
}

int factorielle(int n)
{
    int fact = 1;

    for(int i=2; i<n; i++)
        fact *= i;

    return fact;
}

Et maintenant on passe à la fonction sinus en tant que telle:

double sinus(double angle)
{
    double sin;

    // On prend l'angle correspondant entre -π/2 et π/2
    angle = angleCorrespondant(angle);

    // On calcul la valeur approchée du sinus.
    sin = angle - puissance(angle,3)/factorielle(3) + puissance(angle,5)/factorielle(5) -  puissance(angle,7)/factorielle(7);

    // On retourne la valeur trouvée
    return sin;
}

Et voilà, vous avez créé une fonction qui calcule le sinus d’un angle avec une assez bonne précision.

Laisser un commentaire

XHTML: Vous pouvez utiliser ces étiquettes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>