IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction cosinus


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Fonction cosinus
    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.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    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...

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 395
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 395
    Points : 20 502
    Points
    20 502
    Par défaut
    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

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    et utiliser des fonctions mathématiques au besoin
    Oui, la fonction cos par exemple

  5. #5
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 488
    Points : 6 180
    Points
    6 180
    Par défaut
    Citation Envoyé par Splash wade Voir le message
    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,

    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.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 899
    Points : 6 674
    Points
    6 674
    Par défaut
    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.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    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.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 395
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 395
    Points : 20 502
    Points
    20 502
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    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...
    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;
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    bonjour Sve@r, voilà le code que j'ai fait mais il utiliser somme de puissances et factorielles
    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 ?)

    Citation Envoyé par Mat.M Voir le message
    Cependant la où ça bloque c'est la limite max dans la boucle.
    Est-ce 1 ?
    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;
    }

    Citation Envoyé par Mat.M Voir le message
    Ce qui ne répond pas à la question puisque il ne faut pas utiliser factorielles et puissances
    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;
    }

  10. #10
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    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.

Discussions similaires

  1. fit d'une fonction cosinus
    Par Fatehcz dans le forum MATLAB
    Réponses: 1
    Dernier message: 26/12/2017, 10h03
  2. Fonction cosinus en C
    Par Flav78 dans le forum Débuter
    Réponses: 9
    Dernier message: 12/11/2013, 10h02
  3. Probleme fonction cosinus et sinus
    Par jeremyvb11 dans le forum VB.NET
    Réponses: 8
    Dernier message: 12/12/2011, 15h38
  4. [Turbo Pascal] Fonction Cosinus avec les sommes partielles
    Par max0u13 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 13/02/2011, 22h54
  5. Affiner une courbe à l'aide d'une fonction cosinus
    Par momo032114 dans le forum MATLAB
    Réponses: 0
    Dernier message: 12/08/2008, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo