Votre question

Programmation C - DL de sinus :-S

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
13 Mars 2005 15:39:03

Bonjour.

Je viens quérir votre aide en dernier recours O_o
Je suis en première année de maths-info et ça fait quelques petits moments que je suis en train de tenter vainement de faire un programme en C pour calculer une valeur approchée du sinus par son DL, mais impossible d'y arriver.
Y a toujours quelque chose qui va pas :'( 
Le mieux que j'ai fait, c'est arriver à l'opposé, mais en même temps, la formule du DL n'était pas la bonne (avec un - à la place du +...)

Alors si jamais quelqu'un a la connaissance et la gentillesse qui pourraient me venir en aide j'en serai drôôôlement reconnaissante
:-D

#include <stdio.h>
#include <math.h>
/* La fonction puissance :
Arguments :
a : le nombre dont il faut calculer la puissance
b : la puissance
Resultat :
la puissance b de a
*/
double puiss (double a, int b)
{
double resultat;
for (resultat=1; b>0; b--)
resultat*=a;
return resultat;
}
/* La fonction factorielle :
Arguments :
x : le nombre dont il faut calculer la factorielle
Resultat :
la factorielle de x
*/
double fact (double c)
{
return (c>1)?(c*fact(c-1)):1;
}
int main (void)
{
double x, s;
int i, n;
printf ("Donnez une valeur pour x \n");
scanf ("%lf", &x);
printf ("Donnez un entier n \n");
scanf ("%d", &n);
s=x;
for (i=1; i<=n; i++)
{
s=s+puiss (-1, i)*puiss (x, 2*i+1)/fact (2*i+1);
}
printf ("\t Une valeur approchée du sinus de %lf par son développement limité au rang %d est %lf \n", x, n, s);
printf ("\t La valeur exacte du sinus de %lf est %lf", x, sin(x));
scanf ("%d");
return 0;
}


Merci beaucoup !

Emmylou.


Autres pages sur : programmation sinus

a b L Programmation
13 Mars 2005 17:38:50

Le développement limité est correct.

J'ai fait qq tests (j'ai dérécursifié la fonction factorielle, mais ce n'est pas le probleme):

  1. #include <stdio.h>
  2. #include <math.h>
  3. /* La fonction puissance :
  4. Arguments :
  5. a : le nombre dont il faut calculer la puissance
  6. b : la puissance
  7. Resultat :
  8. la puissance b de a
  9. */
  10. double puiss (double a, int b)
  11. {
  12. double resultat;
  13. for (resultat=1.0f; b>0; b--)
  14. resultat*=a;
  15. return resultat;
  16. }
  17.  
  18. /* La fonction factorielle :
  19. Arguments :
  20. x : le nombre dont il faut calculer la factorielle
  21. Resultat :
  22. la factorielle de x
  23. */
  24. double fact (double c)
  25. {
  26. double i;
  27. double result = 1.0f;
  28. for (i = 1.0f ; i <= c; i += 1.0f)
  29. result *= i;
  30. return result;
  31. }
  32.  
  33.  
  34. int main (void)
  35. {
  36. double x, s;
  37. int i, n;
  38.  
  39. /* double limit test */
  40. double test = 180;
  41. printf ("%lf! == %lf\n", test, fact (test));
  42.  
  43. printf ("Donnez une valeur pour x \n");
  44. scanf ("%lf", &x);
  45. printf ("Donnez un entier n \n");
  46. scanf ("%d", &n);
  47. s=x;
  48. for (i=1; i<=n; i++)
  49. {
  50. s+=puiss (-1, i)*puiss (x, 2*i+1)/fact ((double) (2*i+1));
  51. }
  52. printf ("\t Une valeur approchée du sinus de %lf par son développement limité au rang %d est %lf \n", x, n, s);
  53. printf ("\t La valeur exacte du sinus de %lf est %lf", x, sin(x));
  54. return 0;
  55. }


ça fonctionne bien si 'n' n'est pas trop grand:
la valeur maximale d'un double est 1.7976931348623158e+308
et 180! dépasse cette valeur...

donc jusqu'à n=100, ça fonctionne.
13 Mars 2005 21:44:53

Merci, mais les résultats ne correspondent toujours pas chez moi Oo
Ca fait la même chose qu'avec ce que j'avais fait...
Contenus similaires
Pas de réponse à votre question ? Demandez !
a b L Programmation
14 Mars 2005 17:11:52

L'angle est en radian.
Pour un angle de 90° (PI/2 ~= 1.57)
avec n=100, on a comme résultat 1.00000

donc c'est bon non ?

Quelles valeurs as-tu testé (pour x et n) ?
20 Avril 2007 00:27:34

program sinus ;
uses wincrt ;
var t,t1,angle, sinn, rad : real ;
s,i,n,compteur:integer;
procedure saisie(var a,b : real);
begin
write('l''angle = ');
read(a);
b:=3.14*a/180;
end;
function pow (x:real;y:integer):real;
var p:real;i:integer;
begin
p:=1;
for i:=1 to y do
p:=p*x;
pow:=p;
end;
function factoriel(x:integer):integer;
var i,f:integer;
begin
f:=1;
for i:=1 to x do
f:=f*i;
factoriel:=f;
end;
function calcul(x:real;n,s : integer):real;
var tmp : real;
begin
tmp := s*pow(x,2*n+1)/factoriel(2*n+1);
calcul:=tmp;
end;
procedure affiche (x,y: real);
begin
writeln('sinus de ',x:2:2,' = ',y:2:4,'.');
end;

begin
for compteur :=0 to 10 do begin
saisie(angle,rad);
t:=angle;
t1:=0;
s:=1;
n:=0;
while (abs(t-t1))>0.0001 do begin
t:=calcul(rad,n,s);
sinn:=sinn+t;
s:=-s;
n:=n+1;
t1:=calcul(rad,n,s);
sinn := sinn + t1;
end;
affiche(angle, sinn);
end;
end.

hamma tunisiano, gafsa, FSKG
20 Avril 2007 00:28:05

program sinus ;
uses wincrt ;
var t,t1,angle, sinn, rad : real ;
s,i,n,compteur:integer;
procedure saisie(var a,b : real);
begin
write('l''angle = ');
read(a);
b:=3.14*a/180;
end;
function pow (x:real;y:integer):real;
var p:real;i:integer;
begin
p:=1;
for i:=1 to y do
p:=p*x;
pow:=p;
end;
function factoriel(x:integer):integer;
var i,f:integer;
begin
f:=1;
for i:=1 to x do
f:=f*i;
factoriel:=f;
end;
function calcul(x:real;n,s : integer):real;
var tmp : real;
begin
tmp := s*pow(x,2*n+1)/factoriel(2*n+1);
calcul:=tmp;
end;
procedure affiche (x,y: real);
begin
writeln('sinus de ',x:2:2,' = ',y:2:4,'.');
end;

begin
for compteur :=0 to 10 do begin
saisie(angle,rad);
t:=angle;
t1:=0;
s:=1;
n:=0;
while (abs(t-t1))>0.0001 do begin
t:=calcul(rad,n,s);
sinn:=sinn+t;
s:=-s;
n:=n+1;
t1:=calcul(rad,n,s);
sinn := sinn + t1;
end;
affiche(angle, sinn);
end;
end.

hamma tunisiano, gafsa, FSKG
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS