Fonctions

Résolu
claire -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

comment puis-je programmer cette fonction: ln(1+x)=(x-x^2/2+x^3/3-x^4/4+x^5/5-...+(-1)^n+1*x^n/n)

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    La manière la plus simple c'est simplement d'utiliser la fonction log fournie par la librairie mathématique (attention à bien linker ton programme avec la librairie mathématique) :

    #include <math.h>
    #include <stdio.h>
    
    int main() {
      double x = 0.03;
      printf("ln(1 + %lf) = %lf\n", x, log(x + 1));
      return 0;
    }


    Exemple : Voici à quoi ça ressemble pour compiler (ici sous linux) :

    (mando@silk) (~) $ gcc -W -Wall toto.c -lm && ./a.out 
    log(1 + 0.030000) = 0.029559


    Maintenant si j'ai bien compris tu veux recoder le développement limité de ln(1+x). Dans ce cas il faut deux paramètres :
    - la valeur de x
    - la valeur de n

    Ensuite il faut écrire une boucle qui permet de calculer la valeur en ajoutant les termes successifs du développement limité.

    //#include <math.h>
    #include <stdio.h>
    
    double ln_vois_1(double x, unsigned n) {
        unsigned i;
        double res = 0;
        double x_i = 1;
        int sign_i = -1;
        for(i = 1; i < n; ++i) {
            x_i *= x;
            sign_i *= -1;
            res += sign_i * x_i / i;
        }
        return res;
    }
    
    
    int main() {
        double x = 0.03;
        unsigned n = 20;
        printf("log(1 + %lf) = %lf\n", x, ln_vois_1(x, n));
        //printf("log(1 + %lf) = %lf\n", x, log(1 + x));
        return 0;
    }


    Du coup, à moins que tu décommentes les deux lignes en gras,tu n'as plus besoin de linker avec la libm :

    (mando@silk) (~) $ gcc -W -Wall toto.c && ./a.out 
    log(1 + 0.030000) = 0.029559


    Bonne chance
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      mamiemando,
      Dans les printf, il est préférable de mettre %f pour les double.
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
       
      Ok merci pour la remarque :-)
      0
    3. claire
       
      merci mamiemando pour la fonction:-)!
      0
    4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
       
      De rien, j'espère que le code est clair (sans mauvais jeu de mots) pour toi, sinon n'hésite pas à demander des précisions.
      0