Calculer le sinus d’un angle

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! + …

sinus1sinus2

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.

About these ads
Publié dans Programmation. Mots-clés : , , . Leave a Comment »

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Suivre

Recevez les nouvelles publications par mail.

%d blogueurs aiment cette page :