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 :

Programme d'une fonction mathématique


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut Programme d'une fonction mathématique
    Bonjour, j'ai besoin d'un programme en c qui ferait la fonction suivante :
    S = 1 - ((x-3)exp3)/3! + ((x-5)exp5)/5 - ((x-7)exp7)/7) + ...

    Le probleme étant qu'en programmation, je suis assez nul, la preuve avec le petit bout de code auquel j'ai pensé pour solutionner cela :

    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
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main()
    {
    	int n, x, i, j;
    	float num, denom;
     
        printf("Entrez le nombre de suites : ");
        scanf("%d", &n);
        printf("Entrez x : ");
        scanf("%d", &x);
        printf(" 1 - ");
     
     
        for (i=0 ; i>n ; i++)
        {
            int var;
            var = (3+(i*2));
            num=(pow((x-var),2);
            printf("(", "%d", x, "-", "%d", var , ")", "e2");
     
             for (j=0 ; j>n ; j++)
                {
                    denom=(var*(var-1));
                    printf(var);
                }
     
            printf("/n/n/n" ,"%f", num , " / ", denom);
        }
     
     
     
    }
    Donc, j'aimerais qu'on me montre une voie à suivre pour continuer ca, afin que je comprenne comment évoluer dans ce genre d'idée ... (Je signale au passage que moi et les math, ca fait 2 :o) ).

    Merci d'avance


    PS: Edit : En fait je précise que l'utilisateur doit entrer N, le nombre de termes, et x : valeur de x, bien sur

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, bienvenue sur le forum.
    Plusieurs choses
    1) attention à ta condition dans ta boucle for
    2) utilise double et non float
    3) utilise #include<math.h> et donc compile avec l'option -lm

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    bonjour,

    moi aussi les maths et moi ça fait 2

    il faut faire une boucle sur k de 1 à n (nombres de termes retenus dans l'expression mathématique) et sommer. la sommation a une fois sur deux un signe moins, donc il faut écrire (-1)^k. il faut également générer les nombres impairs (genre 2k+1) pour finir de calculer la somme.

    question : est-ce que les dénominateurs ont des factorielles. dans ce cas il serait bon de coder une petite fonction permettant de la calculer

    voila quelques pistes. si tu as besoin davantage d'aide, n'hésite pas.

    ps : c'est int main(void) et il faut ajouter un return 0; à la fin du main

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    Effectivement, le dénominateur est en factorielle. Merci de vos idées, je vais puiser dedans pour essayer de me "dépatouiller" les pinceaux...

    En fait quand je compile dans l'état actuel (apres y avoir rajouté math.h) j'ai une erreur dont voilà le log :

    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:22: error: syntax error before ';' token
    main.c:28: warning: passing arg 1 of `printf' makes pointer from integer without a cast
    Process terminated with status 1 (0 minutes, 0 seconds)
    Erreur qui se situe au niveau de la boucle sur la ligne :

    num=(pow((x-var),2);

    J'essaye de comprendre pourquoi...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    En fait, je pense qu'il faudrait que je fasses une fonction numérateur, et une fonction dénominateur...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par uuioga Voir le message
    Effectivement, le dénominateur est en factorielle. Merci de vos idées, je vais puiser dedans pour essayer de me "dépatouiller" les pinceaux...

    En fait quand je compile dans l'état actuel (apres y avoir rajouté math.h) j'ai une erreur dont voilà le log :



    Erreur qui se situe au niveau de la boucle sur la ligne :

    num=(pow((x-var),2);

    J'essaye de comprendre pourquoi...
    il te manque une parenthèse fermante, d'où l'erreur

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    Exact merci, mais du coup, j'essaye de recommencer avec vos instructions mais je bloque déja au niveau de la syntaxe des fonctions.

    Oui bon evidemment, j'avais commencé n'importe comment, je mettrais le code dans quelques instants :/

    il faut faire une boucle sur k de 1 à n (nombres de termes retenus dans l'expression mathématique) et sommer. la sommation a une fois sur deux un signe moins, donc il faut écrire (-1)^k. il faut également générer les nombres impairs (genre 2k+1) pour finir de calculer la somme.
    Qu'est-ce que tu entends par "k"?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    voila ce code affiche le résultat :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    long fact(long );
     
    long fact(long x)
    {
        long i,y=1.;
        for(i=2; i<=x; i++)
            y*=i;
        return y;
    }
     
    int main(void)
    {
        long i=1,k,n;
        double j,s,x;
     
        s=1.;
        printf("Entrez N : ");
        scanf("%ld",&n);
        printf("Entrez la valeur de x : ");
        scanf("%lf",&x);
        if (n>2)
        {
            for(k=3; k<=n; k+=2)
            {
                j=(double)k;
                s+=pow(-1.,i)*((x-j)*exp(j))/fact(j);
                i++;
            }
        }
        printf("Resultat : %f\n",s);
     
        return 0;
    }

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    Ah, je regarde merci.

    Merci beaucoup pour la syntaxe, je vais bien m'en inspirer je pense, me reste l'affichage du calcul à ajouter.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par uuioga Voir le message
    Exact merci, mais du coup, j'essaye de recommencer avec vos instructions mais je bloque déja au niveau de la syntaxe des fonctions.

    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
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main(void)
     
    {
    	int n, x, i, j;
    	double num(int n ,x);
    	double denom(int n,x);
     
        printf("Entrez le nombre de suites : ");
        scanf("%d", &n);
        printf("Entrez x : ");
        scanf("%d", &x);
     
     
        double num(int n ,x)
        {
     
        }
     
        double denom(int n ,x)
        {
     
        }
     
    return 0;
     
    }
    la syntaxe serait plus

    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
     
    ici tu mets tous les include nécessaires
     
    static double num(int,int);
    static unsigned denom(int,int);
     
    int main(void)
    {
     blabla;
     return 0;
    }
     
    static double num(int n,int x)
    {
     return (x-n)*exp(n);
    }
     
    static unsigned fact(int n)
    {
     if(n<0)
     {
      fprintf(stderr,"erreur\n");
      exit(1);
     }
     else if(n<2) return 1;
     else return n*fact(n-1);
     }
    }

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par salseropom Voir le message
    la syntaxe serait plus

    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
     
    ici tu mets tous les include nécessaires
     
    static double num(int,int);
    static unsigned denom(int,int);
     
    int main(void)
    {
     blabla;
     return 0;
    }
     
    static double num(int n,int x)
    {
     return (x-n)*exp(n);
    }
     
    static unsigned fact(int n)
    {
     if(n<0)
     {
      fprintf(stderr,"erreur\n");
      exit(1);
     }
     else if(n<2) return 1;
     else return n*fact(n-1);
     }
    }

    Effectivement, je m'en étais rendu compte apres l'avoir posté. Merci également

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    une petite maladresse s'est glissée dans mon code, dans la fonction factorielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long i,y=1; /*au lieu de long i,y=1.;*/

  13. #13
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ne pas se perdre dans une usine à gaz, mais regarder un peu le problème posé :

    Il est ici inutile et couteux en temps de calculer des factorielles (surtout de façon récursive) et des exponentielles. Les coefficients intervenant T2i+1 = (-1)^i *e^(2i+1)/(2i+1)! se déduisent facilement par récurrence les uns des autres
    T2i+1 = -T2i-1 * e^2/2i/(2i+1)
    avec T1 = e

    La fonction qui fait le calcul demandé ne nécessite alors que quelques lignes de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    double calc( double x, int ordre)
    {
     const double e = 2.71828183 ;
     const double e2 = e*e ;
     double T2i1 = e;
     double sum = 1;
     int i ;
     for(i=3; i<=ordre;i+=2)
     {
         T2i1= - T2i1*e2/i/(i-1);
         sum += (x-i)*T2i1;
     }
     return sum;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Programmation d'une fonction mathématique
    Par vitroze dans le forum Mathématiques
    Réponses: 9
    Dernier message: 31/03/2014, 23h16
  2. Tracer ellipse à partir d'une fonction mathématique
    Par juli1_h dans le forum Mathématiques
    Réponses: 2
    Dernier message: 13/03/2007, 09h43
  3. codage du calcul de dérivée d'une fonction mathématique
    Par pispa2005 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 08/01/2005, 20h54
  4. Programmation d'une fonction dans Rn
    Par simone.51 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/11/2004, 11h30
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

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