begin process at 2012 02 05 04:59:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > RECHERCHE DE ZÉRO D'UNE FONCTION PAR DICHOTOMIE

RECHERCHE DE ZÉRO D'UNE FONCTION PAR DICHOTOMIE


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :recherche, zéro, fonction, dichotomie Niveau :Débutant Date de création :17/05/2005 Date de mise à jour :20/07/2009 14:37:00 Vu / téléchargé :14 512 / 296

Auteur : ncoder

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note


 Description

Le titre est assez explicite, c'est juste 60 petites lignes pour trouver le zéro d'une fonction par dichotomie.
                                                                                                            
Il s'agit d'un processus itératif où l'intervalle de recherche du zéro est divisé par deux à chaque étape,
ce qui le rend assez efficace.
                                                                                                            
J'ai essayé d'expliquer le fonctionnement avec des commentaires, ça me parait assez compréhensible...
                                                                                                            

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;
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

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 :
/
20 juillet 2009 14:37:01 :
Modification de la description

 Sources du même auteur

Source avec Zip Source avec une capture SIMULATION DE LA DIFFUSION THERMIQUE
Source avec Zip Source avec une capture [C/API] SUPPRESSION DE FICHIERS EN DOUBLE (NOMS/CONTENUS)
Source avec Zip Source avec une capture SAVESCREEN
Source avec Zip Source avec une capture DECOUPEUR DE MP3
Source avec Zip Source avec une capture INTERFACE CREATOR

 Sources de la même categorie

Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro
Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
Source avec Zip JOUR DE NAISSANCE par fredg19

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec une capture [C]BOUTON EN SDL par smartties
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip ALGORITHME DE RECHERCHE DICHOTOMIQUE par deck_bsd

Commentaires et avis

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

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 ? :/

Commentaire de ncoder le 17/05/2005 19:49:42

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

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 ;)

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");
}


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!

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.

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.

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

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

Commentaire de ncoder le 18/05/2005 18:23:14

Je regarde...;)

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...)
;)

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...

Commentaire de jad_raad le 18/05/2005 20:03:28

meme prob pour le parser
merci pour la remarque NCODER

Commentaire de MuPuF le 18/05/2005 20:09:43

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

Commentaire de Saros le 19/05/2005 14:09:18

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

Commentaire de ncoder le 19/05/2005 17:53:45

Ok Ok merci

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....;)

Commentaire de MuPuF le 20/05/2005 21:19:32

oh interressant ça ncoder

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

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..

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

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

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


Discussions en rapport avec ce code source dans le forum

Recherche fou de C pour réaliser une petite dll [ par loskiller62 ] BonjourProgrammeur VB, j'ai un besoin (relativement urgent) pour une dll. Il s'agit d'une fonction réalisable qu'en Cpp mais dont j'ai besoin pour mon Recherche algo de la fonction ulltoa() [ par akboy7015 ] Actuellement, je développe sur VC7 et je travail beaucoup avec des __int64. Le problème est que la fonction ulltoa() n'a pas l'air d'exister.Bien ente Aide pour une fonction recherche avec suivant [ par oeil123 ] je n'arrive pas a trouver la fonction que microsoft utilise pour faire le dialog recherche avec le fameux bouton suivant qui m'interesse.En fait je vo recherche de fonction [ par jeromedu94 ] je recherche une fonction qui dirait si il y a eu un appui sur une touche ou pas Problème Recherche + Helpppppppppppp [ par emmanuel9 ] Bonjour, En faite j'ai une fen&#234;tre destin&#233; &#224; la recherche et on peut recherche une personne sur son nom, pr&#233;nom, sur la date de Recherche méthodes pour faire pivoter le bureau de 0, 90, 180, 270 degrés [ par scrumby ] Bonjour &#224; tous,comme indiqu&#233; dans le sujet je cherche d&#233;sesp&#233;r&#233;ment une fonction ou une m&#233;thode qui me permettrait de fa retour d'une fonction [ par noulii ] J'ai utilisé la fonction suivante, venant de "bruno" que j'ai trouvé sur ce site :HANDLE hfind;WIN32_FIND_DATA wfd;// Initialise la recherchehfind = F recherche de l’optimum global de la fonction de Rastringin [ par angelmimitta ] bonjour à tous, enfait j'ai un petit projet à faire et j'ai besoin d'aide, l"nnoncé est le suivant: Implémenter le recuit simulé pour la recherche de Fonction recherche en C++ [ par Ciol ] Salut a tous J ai bien lu les differents messages deposés par les 3 habitués du Chat et je ne souhaite donc pas trouver une solution tte faite pour m Besoin d'aide , recherche d'une fonction [ par sivaller ] Bonjour, Je cherche en C AINSI : à lire les données BCD de Windows Vista ou Seven X64, afin de déterminer si Windows est en mode testsigning ou pas .


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,137 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales