begin process at 2008 07 06 13:02:33
1 205 545 membres
122 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RECHERCHE DE ZÉRO D'UNE FONCTION PAR DICHOTOMIE


Information sur la source

Catégorie :Divers Classé sous : recherche, zéro, fonction, dichotomie Niveau : Débutant Date de création : 17/05/2005 Date de mise à jour : 09/02/2008 20:15:28 Vu / téléchargé: 7 655 / 191

Note :
Aucune note

Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note


Description

C'est ma première source alors je vous demande d'etre indulgent...;)

Voila le titre est assez compréhensible , c'est juste 60 petites lignes pour trouver le zéro d'une fonction par dichotomie....

J'ai essayé d'expliquer le fonctionnement mais ça me parait compréhensible quand meme...

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <math.h> //pour cos, sin ou autre...
  • int dichotomie ( double (*)(double), double, double, double*, double); //fonction
  • int main (int argc, char *argv[])
  • {
  • double zero , //zero recherché
  • a, b, //intervalle [a,b]
  • precision ; //précision voulue
  • printf("Exemple : \n");
  • if ( dichotomie (sin, -1.0, 1.0, &zero, 1.0e-2) != -1 ) {// exemple avec sin dans [-1;1]
  • printf("Zero de la fonction sin dans l'intervalle [-1;1] a 1e-2 pres : \n%le\n", zero);
  • }
  • else printf("Erreur.\n");
  • if ( dichotomie (sin, -1.0, 2.0, &zero, 1.0e-2) != -1 ) {// exemple avec sin dans [-1;2]
  • printf("Zero de la fonction sin dans l'intervalle [-1;2] a 1e-2 pres : \n%le\n", zero);
  • }
  • else printf("Erreur.\n");
  • system("PAUSE");
  • return 0;
  • }
  • int dichotomie ( double (*f)(double), double a, double b, double* zero, double precision)
  • //f : fonction dont on veut trouver le zero
  • //a et b : intervalle
  • //zero : zero
  • //precision : precision voulue
  • {double m, //milieu de l'intervalle courant
  • fm, //valeur de f(m)
  • fa, fb ; //valeur de f(a) et de f(b)
  • fa = (*f)(a);
  • fb = (*f)(b);
  • if (fa*fb>=0 || a>=b ) {printf("Intervalle incorrect.\n"); return -1;} //Intervalle incorrect
  • while ( b-a > precision )
  • {
  • m = (b+a) / 2 ;
  • fm = (*f)(m) ;
  • if (fm==0) break; //zero trouvé
  • if (fa*fm < 0) {
  • b = m;
  • fb = fm;
  • }
  • else {
  • a = m;
  • fa = fm;
  • }
  • }
  • *zero = m;
  • return 0;
  • }
#include <stdio.h>
#include <stdlib.h>
#include <math.h> //pour cos, sin ou autre...

int dichotomie ( double (*)(double), double, double, double*, double); //fonction

int main (int argc, char *argv[])
{ 
  double zero , //zero recherché
         a, b, //intervalle [a,b]
         precision ; //précision voulue
  
  printf("Exemple : \n");
  
  if ( dichotomie (sin, -1.0, 1.0, &zero, 1.0e-2) != -1 ) {// exemple avec sin dans [-1;1]
  printf("Zero de la fonction sin dans l'intervalle [-1;1] a 1e-2 pres : \n%le\n", zero);
  }
  else printf("Erreur.\n");
  
  if ( dichotomie (sin, -1.0, 2.0, &zero, 1.0e-2) != -1 ) {// exemple avec sin dans [-1;2]
  printf("Zero de la fonction sin dans l'intervalle [-1;2] a 1e-2 pres : \n%le\n", zero);
  }
  else printf("Erreur.\n");
  
  system("PAUSE");	
  return 0;
}

int  dichotomie ( double (*f)(double), double a, double b, double* zero, double precision)
//f : fonction dont on veut trouver le zero
//a et b : intervalle
//zero : zero
//precision : precision voulue
{double m, //milieu de l'intervalle courant
        fm,  //valeur de f(m)
        fa, fb ; //valeur de f(a) et de f(b)

fa = (*f)(a);
fb = (*f)(b);
if (fa*fb>=0 || a>=b ) {printf("Intervalle incorrect.\n"); return -1;} //Intervalle incorrect

while ( b-a > precision )
{
m = (b+a) / 2 ;
fm = (*f)(m) ;
if (fm==0) break; //zero trouvé

if (fa*fm < 0) {
b = m;
fb = fm;
}
else  {
a = m;
fa = fm;
}

}

*zero = m;
return 0;
}
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

29 novembre 2005 18:43:10 :
Mise à jour des mots clés pour le moteur de recherche comme proposé dans la lettre d'info...
09 février 2008 20:15:28 :
/
  • signaler à un administrateur
    Commentaire de Cyberboy2054 le 17/05/2005 18:47:16

    Plus qu'à coder le parser d'expression qui va avec pour plus avoir a coder les fonctions en dur, et ce serait excellent :)
    Un petit probleme par contre, mais qui vient de l'algo lui même: et si la fonction a plusieurs zéros dans l'intervalle donné :p ?
    Sinon, je comprends pas comment le compilo accepte de compiler le code avec une declaration de fonction à l'intérieur d'une autre fonction (cf dichotomie dans main)
    Voilou

  • signaler à un administrateur
    Commentaire de ncoder le 17/05/2005 19:36:03

    Je peux déclarer une fonction à l'intérieur d'une autre mais alors je peux utiliser la fonction déclarée que par la fonction dans laquelle elle a été déclarée...

    Euh, c'est compréhensible ce que j'ai mis ? :/

  • signaler à un administrateur
    Commentaire de ncoder le 17/05/2005 19:49:42

    Si ya 2 zéros dans l'intervalle donné ça renvoie "Intervalle incorrect" ...

  • signaler à un administrateur
    Commentaire de Cyberboy2054 le 17/05/2005 20:41:01

    Oui c'est parfaitement compréhensible, je ne savais pas que c'est possible. Par contre je maintiens que ce serait encore mieux avec un parser d'expression mathématiques ;)

  • signaler à un administrateur
    Commentaire de jad_raad le 17/05/2005 23:15:55

    j'ai lu tous vos commentaires ici mais est ce qu'il y a quelqu'un peut me donner un exmeple du source sur le parser
    message pour l'auteur du source en fait ta methode pour la dichotomie et avec la definition des variables est tres compliqué et tu peux la faire autrement j'ai deja codé ce programme avant et je pense que cette methode va t'interesser


    //dichotomie
    #include<math.h>
    #include<stdio.h>

    double f(double x)//la fonction f
    {
           return (exp(2*x)-exp(x)-1);
    }

    int main()
    {
        int n;//n = nombre d'iteration
        double a,b,c,e;//les points a et b sont l'intervalles à choisir
        //e est la precision
        printf("Saisir respectivement a,b,e:\n");
        printf("a=");
        scanf("%lf",&a);
        printf("b=");
        scanf("%lf",&b);
        printf("e=");
        scanf("%lf",&e);
        
        n=0;
        while(fabs(b-a)>e)
        {
                          n++;
                          
                          c=(a+b)/2;
                          if(f(a)*f(c)<0)
                          b=c;
                          else a=c;
                          
        }//end while
        printf("\nle resultat est:%lf\niteration:%d\n",c,n);
        system("pause");
    }


  • signaler à un administrateur
    Commentaire de Jarod1980 le 18/05/2005 10:37:25

    Salut,
    J'ai moi aussi codé et publié sur ce site une source sur la recherche de zéro par la méthode de dichotomie il y a un bon moment de ça.
    http://www.cppfrance.com/code.aspx?ID=27919

    Ca peut être aussi t'interesser. Par contre pour le parser j'en ai pas sur vu sur site. Donc si tu décides de le faire ça serais un beau challenge!

  • signaler à un administrateur
    Commentaire de MuPuF le 18/05/2005 12:49:29

    euh, ta changé la source ou je fumme, la fonction est définie apres la fonction main et en plus sans prototype .... Tu as reussi a compiler ça ?
    Peux etre que je suis pas en état today, les cours c'est chiant.

  • signaler à un administrateur
    Commentaire de Saros le 18/05/2005 14:01:07

    C'est quoi un parser ?

    Il me semble qu'il n'y a pas nécessairement besoin d'un prototype si la fonction est définie avant d'être appellée, quand on lit le code de haut en bas. Il y aurait eu un problème si on l'avait mise après main.

  • signaler à un administrateur
    Commentaire de MuPuF le 18/05/2005 14:10:11

    justement, c'est ce que je dis, mais je parle pas de la source Jad_Raad qui est un modele de présentation, je parle de ncoder (celle a l'origine du post)

    Un parser (d'apres ce que je j'ai compris) est une sorte de fonction est capable d'avaler une fonction litterale et d'un ressortir le resultat.
    ex:
    int fonction(char* fonction,int rang)
    {
    //calculs
    return resultat;
    }

    voila
    @+ et bon codage

  • signaler à un administrateur
    Commentaire de Saros le 18/05/2005 14:38:05

    J'ai programmé un parser il y a peu, il utilise une conversion en notation suffixée (RPN)... sans vouloir faire de pub...
    Il est commenté et tout et tout :
    http://www.cppfrance.com/code.aspx?ID=28472

  • signaler à un administrateur
    Commentaire de ncoder le 18/05/2005 18:23:14

    Je regarde...;)

  • signaler à un administrateur
    Commentaire de ncoder le 18/05/2005 18:46:59

    jad_raad, ton code est bon, mais il pose qqes pb si l'intervalle est incorrect...( 2 zéros par ex...)
    ;)

  • signaler à un administrateur
    Commentaire de ncoder le 18/05/2005 18:51:14

    Dev cpp me crée des erreurs bizarres lors de la compilation de ton  parser Saros... Non pas que tu aies fait des erreurs mais Dev c++ a des pb...:/

    Je vais essayer de "transcrire" pour qu'il comprenne...

  • signaler à un administrateur
    Commentaire de jad_raad le 18/05/2005 20:03:28

    meme prob pour le parser
    merci pour la remarque NCODER

  • signaler à un administrateur
    Commentaire de MuPuF le 18/05/2005 20:09:43

    ah ah, meme pas besoin de se faire chier alors jad ?

  • signaler à un administrateur
    Commentaire de Saros le 19/05/2005 14:09:18

    J'ai réadapté mon parser pour DevCPP, et mis à jour le zip

  • signaler à un administrateur
    Commentaire de ncoder le 19/05/2005 17:53:45

    Ok Ok merci

  • signaler à un administrateur
    Commentaire de ncoder le 20/05/2005 18:10:15

    Pour la fonction :

    int fonction(char* fonction,int rang)
    {
    //calculs
    return resultat;
    }

    J'ai réussi mais j'ai encore qques bugs avec la dichotomie....;)

  • signaler à un administrateur
    Commentaire de MuPuF le 20/05/2005 21:19:32

    oh interressant ça ncoder

  • signaler à un administrateur
    Commentaire de flodelarab le 11/09/2006 18:00:39

    Bon ben, je suis au regret de dire que ce code ne marche évidemment pas.

    2 contres exemples flagrants:
    x^2
    sin(x)+1

  • signaler à un administrateur
    Commentaire de Saros le 12/09/2006 17:47:43

    La fonction doit être monotone au voisinage du zéro considéré, sinon tu prends la dérivée
    Dans ton cas, les zéros sont aussi ceux de
    2*x
    et cos(x)
    Par contre à programmer c'est plus chaud..

  • signaler à un administrateur
    Commentaire de fdiedler2000 le 16/10/2006 23:09:30

    c'est possible d'avoir plus de 28 decimales pour enncadrer la racine ? Avec la variable decimal je peux avoir maximum 28 decimales mais je voulais savoir si je pouvais en avoir plus ??

    Merci

  • signaler à un administrateur
    Commentaire de Saros le 18/10/2006 18:37:26

    Ca doit exister, des classes pour manipuler des nombres avec une précision fixée par l'utilisateur... Au pire c'est pas très compliqué à programmer.
    Tu devrais en trouver à profusion sur cppfrance

  • signaler à un administrateur
    Commentaire de fdiedler2000 le 18/10/2006 19:15:33

    je programme en VB.NET

    si tu as des exemples ou des sources hesites pas je peux toujours voir comment on fait... car je vois pas du tout comment on pourais faire !

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS