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é: 9 854 / 230

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

Fichier Zip

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

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

Commentaires et avis

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

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 Rectification : en fait mon probleme porte sur la reconnaissance de chaine [ par Ciol ] Voila j ai vu et lu en diagonale les messages postés par Xs sur la reconnaissance de chaines et il semble bien ke ce dont j'ai besoin se touve ds cett HACHAGE réversible? [ par chmod777 ] Beaucoup (tous?) d'entre vous vont me prendre pour un fou ou un con au choixpeut etremais bonMon objectif: trouver ou réaliser une fonction de hachage


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,452 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.