Sujet de Travaux Dirigés n°3 – UEO12-- Correction

publicité
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.
Téléchargement