Tom's Guide > Forum > Programmation > Programmation C - DL de sinus :-S

Programmation C - DL de sinus :-S

Forum Programmation : Programmation C - DL de sinus :-S

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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.


Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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):

Code :
  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. /* La fonction factorielle :
  18. Arguments :
  19. x : le nombre dont il faut calculer la factorielle
  20. Resultat :
  21. la factorielle de x
  22. */
  23. double fact (double c)
  24. {
  25.     double i;
  26.     double result = 1.0f;
  27.     for (i = 1.0f ; i <= c; i += 1.0f)
  28.         result *= i;
  29.     return result;
  30. }
  31. int main (void)
  32. {
  33.     double x, s;
  34.     int i, n;
  35.     /* double limit test */
  36.     double test = 180;
  37.     printf ("%lf! == %lf\n", test, fact (test));
  38.     printf ("Donnez une valeur pour x \n" );
  39.     scanf ("%lf", &x);
  40.     printf ("Donnez un entier n \n" );
  41.     scanf ("%d", &n);
  42.     s=x;
  43.     for (i=1; i<=n; i++)
  44.     {
  45.         s+=puiss (-1, i)*puiss (x, 2*i+1)/fact ((double) (2*i+1));
  46.     }
  47.     printf ("\t Une valeur approchée du sinus de %lf par son développement limité au rang %d est %lf \n", x, n, s);
  48.     printf ("\t La valeur exacte du sinus de %lf est %lf", x, sin(x));
  49.     return 0;
  50. }



ç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.

Répondre à CRicky

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...

Répondre à Emmylou

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) ?

Répondre à CRicky

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

Répondre à momo_2007

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

Répondre à momo_2007
Tom's Guide > Forum > Programmation > Programmation C - DL de sinus :-S
Aller à :

Il y a 2086 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens