BONJOUR, je suis un débutant, on me demande d'écrire un programme pour la fonction cosinus en C en utilisant son développement limité sans faire la fonction factorielle ni la puissance. J'arrive pas à le faire. Si vous pouvez m'aider.
BONJOUR, je suis un débutant, on me demande d'écrire un programme pour la fonction cosinus en C en utilisant son développement limité sans faire la fonction factorielle ni la puissance. J'arrive pas à le faire. Si vous pouvez m'aider.
Bonjour
Sans faire la factorielle ni la puissance là je vois pas. Le DL de cos(x) n'est qu'une somme de puissances sur des factorielles...
bonsoir tout d'abord il faut avoir la formule mathématique pour ça c'est important.
Ensuite il doit certainement y avoir une boucle donc savoir faire une boucle limite min limite max et utiliser des fonctions mathématiques au besoin
Bonjour,
Les termes successifs qu'il faudra additionner sont 1, puis -x^2/2!, puis x^4/4!, puis -x^6/6!, etc.
À chaque fois, pour passer d'un terme au suivant, on multiplie par x deux fois, on multiplie par -1 et on divise par deux entiers.
Par exemple, pour passer de x^4/4! à -x^6/6!, on multiplie par x deux fois, on multiplie par -1 et on divise par 5 et par 6.
Donc, algorithmiquement, tu peux écrire une boucle dans laquelle tu mets à jour à chaque itération le numéro du terme courant, la valeur du terme courant et la somme courante des termes déjà calculés (qui correspond à la valeur approchée de cos(x)).
Algorithme alternatif : tu peux aussi stocker dans un tableau les coefficients successifs du polynôme (1 pour le degré 0, -1/2! pour le degré 2, 1/4! pour le degré 4, etc.). Chaque coefficient peut se calculer à partir du précédent sans faire appel à la fonction factorielle. Ensuite, à partir des coefficients, on peut calculer la valeur du polynôme en appliquant la méthode de Ruffini-Horner, qui permet d'éviter des calculs de puissance.
Les termes de la somme du développement limité constitue une suite. Tu dois trouver la relation de récurrence entre un terme de rang n et un terme de rang n+1 de ton développement limité (autrement dit comment on passe de l'un à l'autre). De cette manière tu pourras déduire chaque terme suivant en partant du précédent sans utiliser ni le factoriel ni la puissance.
[EDIT] Zut, j'ai été trop lent.
Splash:
en complément des bons conseils déjà donnés, et même si ce n'est peut-être pas demandé explicitement dans ton énoncé, n'oublie pas de faire l'étude mathématique proprement avant de te précipiter vers le clavier et de jouer du compilateur.
Comme je suis un peu taquin, la première valeur que je saisirais pour tester ton programme est x=-4357 pour voir ce qui se passe.
Donc: étude de la convergence et du critère d'arrêt de la boucle, utilisation judicieuse des symétries de la fonction pour réduire le domaine de calcul, etc.
bonjour Sve@r, voilà le code que j'ai fait mais il utiliser somme de puissances et factorielles
Ce qui ne répond pas à la question puisque il ne faut pas utiliser factorielles et puissances
Cependant la où ça bloque c'est la limite max dans la boucle.
Est-ce 1 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <math.h> double Calc_Cos(double x) { double expression_numerateur=0; double expression_denominateur=0; double expression=0; double n=0; double borne_max=1 ? /////// Est-ce 1??? for(n=0;n<borne_max;n++) { expression_numerateur=pow(-1,n); expression_denominateur=calc_fact(n) *2; expression=expression_numerateur / expression_denominateur; expression=expression * pow(x,2*n); } } double calc_fact(double x) { double fact=0; double i=0; for(double i=1;i<=x;i++) fact=fact*i; return fact; }
Oui, flatté que tu me demandes mon avis... mais je crois que tu as oublié d'additionner les fractions (un DL c'est bien la somme de tout non ?)
Une boucle qui va de 0 (inclus) à 1 (exclu) par pas de 1 ???
Je vais te donner un truc que m'a donné mon prof de C à l'issue d'un devoir où il fallait trouver une limite. J'avais fait comme toi et établi une borne max de recherche (mais une borne un peu plus intelligente ). Il m'a rendu mon devoir (16/20) puis il m'a expliqué comment faire.
Il faut t'arrêter quand le calcul de l'itération n est identique au calcul de l'itération n-1. Parce que ça veut dire que le calcul a atteint la limite de la précision du processeur et que cela ne sert plus à rien de continuer.
Donc grosso-modo, il te faut faire un truc de ce type
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 mem=0; while (1) { expression=calcul_de_folie if (expression == mem) break; mem=expression; }
La remarque de Pyramidev à ce sujet est pas mal du tout. Le premier terme c'est x^0 / 0!. Le second terme c'est x^2 / 2!. le 3° terme c'est x^4 / 4!. Donc à chaque itération "i", on multiplie le numérateur par "x*x" et le dénominateur par (i-1) * i. Comme ça, on obtient bien chaque fraction sans utiliser de puissance ni de factorielle. Evidemment dans les faits ça reste des puissances et des factorielles mais d'une part on optimise le calcul (qui monte avec les itérations) et on répond à l'esprit de l'énoncé.
Ce qui donne (par exemple)
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 long double myCos(double x) { int neg=1; long double tmp=0; long double num=1; unsigned long den=1; long double dl=1; unsigned long i; for (i=2; i > 0; i+=2) { num=num * x * x; den=den * i * (i-1); neg=-neg; dl+=(num / den) * neg; printf("i=%lu, %Lf/%lu (%Lf)\n", i, num, den, dl); if (dl == tmp) break; tmp=dl; } return dl; }
A vrai, dire après réduction du domaine de calcul en exploitant les symétries, le calcul se ramène à un polynôme de degré 4 (en x²) pour un résultat en simple précision, et de degré 7 pour la double précision.
Il suffit de calculer sur [0, π/8[, ensuite utiliser l'identité cos(x) = 2*cos²(x/2)-1 pour passer à [0, π/4[, et ensuite utiliser les symétries de la fonction pour couvrir R.
En simple précision, on peut même écrire directement la formule factorisée convenablement (Horner), calculée sans itérations.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager