Programmation C - DL de sinus :-S
Forum Programmation : Programmation C - DL de sinus :-S
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.
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 :
|
ç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.
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...
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) ?
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
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
Il y a 2086 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
