Fonctions

Résolu/Fermé
claire - 18 janv. 2013 à 11:15
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 19 janv. 2013 à 12:44
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

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 janv. 2013 à 20:32
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
18 janv. 2013 à 20:58
mamiemando,
Dans les printf, il est préférable de mettre %f pour les double.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
19 janv. 2013 à 12:37
Ok merci pour la remarque :-)
0
merci mamiemando pour la fonction:-)!
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
19 janv. 2013 à 12:44
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