Recherche de zéro d'une fonction par dichotomie

Soyez le premier à donner votre avis sur cette source.

Vue 31 008 fois - Téléchargée 1 038 fois

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


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

Codes Sources

A voir également

Ajouter un commentaire Commentaires
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
18 oct. 2006 à 19:15
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 !
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
18 oct. 2006 à 18:37
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
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
16 oct. 2006 à 23:09
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
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
12 sept. 2006 à 17:47
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..
flodelarab Messages postés 2 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 11 septembre 2006
11 sept. 2006 à 18:00
Bon ben, je suis au regret de dire que ce code ne marche évidemment pas.

2 contres exemples flagrants:
x^2
sin(x)+1
Afficher les 24 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.