begin process at 2010 02 10 06:00:24
  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é :11 363 / 248

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 CALLOCATOR par troctsch
Source avec Zip HEAPCOLLECTOR par troctsch
Source avec Zip GÉNÉRE UN TABLEAU DE CARACTÉRE AU FORMAT C CONTENANT LE BYTE... par kertimanoff
FRACTIONS EGYPTIENNES par lptm974
BITOPERATOR par FrancoisGauthier

 Sources en rapport avec celle ci

Source avec Zip RECHERCHE D'ANNAGRAMMES par Torin
Source avec Zip Source avec une capture JEUX DU DÉMINEUR POUR DÉBUTANT par phenix22000
Source avec Zip DEMINEUR : CRÉATION ET SOLUTION par bzrd
Source avec Zip Source avec une capture YAHOO OR GOOGLE par f_l_a_s_h_b_a_c_k
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 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 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 Exercice sur Pointeurs, classes, héritage... [ par snoozriton ] Bonjour à tous, étant en train d'étudier le C++, j'ai quelques soucis avec un exercice. C'est un classique dont je vous donne l'énoncé : [b]1. Défini


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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 : 1,123 sec (4)

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