begin process at 2012 05 27 18:05:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > RECHERCHE DES ZEROS PAR METHODE DE DICHOTOMIE

RECHERCHE DES ZEROS PAR METHODE DE DICHOTOMIE


 Information sur la source

 Description

Le principe est simple: on cherche à encadrer de plus en plus précisément la valeur du zéro recherché sur l'intervalle [a,b].
1. On divise le segment [a,b] en deux. L'abscisse du point intermédiaire est:
c = (a+b)/2.
2. On détermine lequel des deux segments [a,c], [c,b] contient le zéro recherché. Pour cela il suffit de calculer les produits f(a). f(c) et f(b)f(c) et retenir le segment qui correspond à une valeur négative.
3. on répète les étapes 1 et 2 autant de fois que nécessaire jusqu'à obtenir la précision désirée. Soit h la longueur du segment initial [a,b]. Après n itérations la longueur du segment
[Alpha, Beta] est h/2n. Si on retient comme valeur calculée du zéro f[ Alpha+Beta/2]  cette valeur est précise à h/2n+1 près.

Source

  • #include <stdio.h>
  • #define MAX 1000
  • float f(float); /* fonction a evaluer */
  • int main(int argc, char *argv[])
  • {
  • float a, b, precision, gauche, droite, fg, fc, c;
  • int i;
  • /* Lecture des donnees */
  • printf("Intervalle a etudier?: ");
  • scanf("%f%f", &a,&b);
  • printf("Precision necessaire?: ");
  • scanf("%f", &precision);
  • /* Initialisations */
  • i = 0;
  • gauche = a; droite = b;
  • fg = f(gauche);
  • /* Boucle d'iteration */
  • while ((droite - gauche) > precision)
  • {
  • c = (gauche + droite)/2;
  • fc = f(c);
  • if (fg*fc < 0)
  • droite = c;
  • else
  • {
  • gauche = c;
  • fg = fc;
  • }
  • if (i++ > MAX)
  • {
  • printf("Convergence non obtenue\n");
  • exit(1);
  • }
  • }
  • printf("x = %f\n",(gauche + droite)/2.);
  • return 0;
  • }
  • float f(float x)
  • {
  • /* La fonction que l'on veut étudier */
  • return -x*x + 2.*x + 3.;
  • }
#include <stdio.h>
#define MAX 1000
float f(float);   /* fonction a evaluer  */

int main(int argc, char *argv[])
{
float a, b, precision, gauche, droite, fg, fc, c;
   int i;

/*  Lecture des donnees  */
   printf("Intervalle a etudier?: ");
   scanf("%f%f", &a,&b);
   printf("Precision necessaire?: ");
   scanf("%f", &precision);
 
/*  Initialisations */
   i = 0;
   gauche = a; droite = b;
   fg = f(gauche);

/*  Boucle d'iteration */
   while ((droite - gauche) > precision) 
   {
      c = (gauche + droite)/2;
      fc = f(c);
      if (fg*fc < 0)
         droite = c;
      else
      {
         gauche = c;
         fg = fc;
      }
      if (i++ > MAX)
      {
         printf("Convergence non obtenue\n");
         exit(1);
      }
   }
   printf("x = %f\n",(gauche + droite)/2.);

  return 0;
}
float f(float x)
{
/* La fonction que l'on veut étudier  */
   return -x*x + 2.*x + 3.;
}



 Sources du même auteur

Source avec une capture FRACTALE NEWTON-RAPHSON VERSION GLUT
Source avec Zip FAST FOURIER TRANSFORM
TRANSFORMEE DE FOURIER DISCRETE
Source avec une capture FRACTALE TREE (ARBRE) VERSION GLUT
Source avec une capture COURBE DE GUMOWSKI & MIRA VERSION GLUT

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de Kirua le 02/12/2004 16:49:23

alors quelques petites idées si tu veux pousser ton programme:

- tenter de déterminer toi-même les intervalles à étudier en observant à quels moments on a un passage du négatif au positif (ou inversément), mais ça ne suffit pas: il faut aussi que tu t'arranges pour ne pas avoir plus d'une racine (zéro) dans l'intervalle que tu vas étudier et il faut gérer les racines doubles (comme x² par exemple qui a une racine double en (0,0): ça passe du positif au ... positif :))

- écrire (mais ça c'est un projet à part entière) un analyseur d'expression mathématique pour que tu puisses entrer la fonction f dans la console et que tu ne doives pas recompiler. c'est pas supeeeeer difficile, mais faut qd même des notions de classe, arbres binaires, pointeurs, récursion et gestion de chaînes de caractères. je sais pas trop où tu en es là dedans, mais c'est un beau challenge quand on en n'a jamais écrit :)

Commentaire de vBmad1 le 07/11/2009 22:51:19

Bon code, j'ai tenté de le developper pour avoir une fonction variable determinée par l'utilisateur de l'application, mais j'arrive pas à le faire, pouvez vous m'aider ?? !

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,920 sec (3)

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