Sujet de Travaux Dirigés n°3 – UEO12-- Correction Pour réaliser ce TD/TP, vous devez maîtriser les notions suivantes : – fonctions et procédures – boucles – structures conditionnelles Question n°1 : Enoncé : Ecrire les deux fonctions permettant de calculer sin(x) et cos(x). Correction : Ici, manifestement, il s'agit de s'inspirer de l'écriture utilisée pour calculer exponentielle et l'appliquer aux fonctions sin(x) et cos(x). C'est dans ce but que les formules pour ces fonctions sont données au bas du sujet : Fonction sinus : ∞ sin x = ∑ i= 0 −1 i 2×i+ 1 ! ×x2 in+1≈ x− x3 x5 x7 x23 − . .. . .. . . − 3 ! 5 ! 7! 23 ! D'après cette formule, l'on obtient une bonne approximation de sinus x en réalisant la somme pour i allant de 0 à 11 ( (23-1)/2) de -1 puissance i divisé par factorielle de 2i plus 1. Or, si l'on compare cette formule avec celle utilisée pour exponentiel, l'on se rend compte que les termes utilisés pour sin x sont compris dans la suite de termes utilisés pour le calcul de l'approximation de la fonction exponentielle. x ∞ e =∑ i=0 xi x 2 x3 x4 x 22 ≈1 +x+ .. . .. . .. i! 2! 3 ! 4! 22! Il nous reste à établir quels termes nous allons sélectionner dans cette suite. On remarque que la suite que nous cherchons à calculer ne contient que les termes impairs de la suite utilisée pour exponentielle. On peut donc réutiliser cette boucle en l'adaptant pour que la somme se réalise correctement et uniquement sur les terme de i impair. Il faut également modifier le calcul de cette somme pour prendre en compte la multiplication par -1 à la puissance i. De plus, la première itération de la boucle d'exponentiel nous amène un 1 qui n'est pas présent pour sinus. Il faut donc également penser à initialiser la variable de retour à 0 et non à 1. On peut donc considérer la proposition suivante : double sinus (float x) { int i ; double termcour , sin ; termcour = ­1.0; sin = 0.0; for (i = 1; i<= 23; i++) { termcour = termcour * x/ i ; //Si i est impair if(i%2==1) { sin = sin + termcour ; //Pour avoir l'alternance des ­ termcour = termcour * ­1; } } return (sin); } Passons maintenant à la fonction cosinus Fonction cosinus : Le principe reste le même : nous avons la formule de départ de cosinus −1 i x2 x4 x6 x 22 cos x = ∑ ×x 2×i≈1− − . .. . .. . . − 2! 4! 6! 22 ! i=0 2×i ! ∞ et nous allons adapter l'une des deux fonctions que nous avons déjà pour réaliser ce calcul. On remarque qu'ici ce sont les termes pairs que l'on conserve. De plus, nous avons également dans la somme correspondant à cosinus le -1 puissance i de sinus. Les modification à réaliser sont donc mineures. Nous pouvons donc, si nous modifions la fonction sinus proposée précédemment, en initialisant la variable de retour à 1 au lieu de 0 et en modifiant la condition pour ne conserver que les termes pairs, faire la proposition suivante : double cosinus (float x) { int i ; double termcour , cos ; termcour = ­1.0; cos = 1.0 ; for (i = 1; i<= 22; i++) { termcour = termcour * x/ i ; //Si i est pair if(i%2==0) { //Pour avoir l'alternance des ­ termcour = termcour * ­1; cos = cos + termcour ; } } return (cos); } Question n°2 : Enoncé : Ecrire ensuite la fonction permettant de calculer tg(x) Correction : Si l'on fait appel à nos souvenirs en mathématiques, l'on se rappelle de la formule suivante : tg(x)= sin(x) / cos(x). Donc on peut proposer la solution suivante : double tangente (float x) {return (sinus(x)/cosinus(x));} Question n°3 : Enoncé : Faire ensuite le main() en sortant la liste des valeurs de tg(x) pour x=0.0, x=0.1, x=0.2 … x=6.2. sous la forme : angle 0.1 0.2 tg 0.001745 0.003490 Correction : Au cours de cet exercice nous allons mettre en application la fonction tangente précédemment définie. Pour pouvoir utiliser cette fonction, il faut que les fonctions sinus, cosinus et tangente soient définies au dessus du main (ou dans une librairie incluse) Nous avons un calcul à effectuer et à afficher de façon périodique : de 0 à 6.2 avec un pas de 0.1. Il faut donc utiliser une structure itérative, de type for ou while pour réaliser les 62 itérations demandées. Donc à chaque itération, nous devons effectuer – le calcul de tangente de x – l'affichage de x et de tangente de x. On arrive donc à la proposition de code suivante : int main (void) { int i; double x=0.0; printf(« Calcul de tangente de x pour x allant de 0.0 à 6.2 \n »); printf(« \n\n Angle Tangente\n»); for(i=0; i<62; i++) { x+=0.1; printf(« %0.1f %0.6f \n »,x,tangente(x)); } } avec, bien sur, les fonctions sinus, cosinus et tangente écrite au dessus du main.