Programmation avec méthode dichotomie

physicien009 -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

j'ai programmé ce programme en c qui applique la méthode de dichotomie a ma fonction " fpro" mais la mais j'ai un probléme dans mon programme !! il y a une seule itération et le programme s'arrête !!

ou est l'erreur svp ? et merci d'avance .


#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define PI acos(-1.)
#define HBAR 1.05360572e-34
#define M 9.e-31
#define K0 1.61e+10
#define A 10.e-10
#define EPS 1.e-10
#define N_MAX 50
#define NPAS 10

double fp(double zm);
double fpz(double z1);
int main()
{
          
   double z1,z2,zm,fpro,fz1,v,fpz1,k;
   printf("donner la valeur de z1\t");
   scanf("%lf",&z1);
      FILE *fichier;
      fichier=fopen("figure2.dat","w");    
   printf("donner la valeur de z2\t");
   scanf("%lf",&z2);     
          
    while ( fabs(z1-z2)> EPS)
    {
       
       zm = (z1+z2) / 2. ;
       v=fp(zm);
       k=fpz(z1);   
       if (fpro==0) break; //zero trouvé
       if (fpro*fz1 < 0)
        {
           z2=zm;
       
        }
    
      else 
        {
           z1=zm;
        }
    
      
    } 
    fprintf(fichier,"%lf \t %lf \n",zm,v);
    fclose(fichier);
    system("pause");
    return 0;        
}

    
double fp(double zm)
       {
          double fpro;
          fpro=tan(zm/2.)-sqrt((K0*A/zm)*(K0*A/zm)-1.);
          return (fpro);
        
          
      }
      
double fpz(double z1)
       {
          double fz1;
          fz1=tan(z1/2.)-sqrt((K0*A/z1)*(K0*A/z1)-1.);
          return (fz1);
        
          
      }
A voir également:

1 réponse

Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

if (fpro==0) break; //zero trouvé
if (fpro*fz1 < 0)

Ce ne serait pas plutôt v et k sur lesquels tu fais tes tests ?
fpro et fz1 ne sont pas initialisés (et ne devraient pas être déclarés ni utilisés) dans ta méthode main()...

Xavier

PS : sinon méfie-toi, je ne sais pas ce qu'il en est en C, mais je ne suis absolument pas convaincu que tu puisses utiliser le type double de façon fiable sur des précisions de 10^-10 ! Tout dépend en fait de la valeur de la mantisse...
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Le double en C est en IEEE 754 sur 64 bits. avec donc 52 bits de mantisse.
Avec un petit calcul rapide, je dirais que la précision d'une valeur D, est environ de D*2^-52=D*10^-16
Donc la précision à 10^-10 près ne pourrait être correct que pour des nombres inférieurs à 10^6...
Mais ce sont des calculs très grossiers, il faudrait regarder plus attentivement.
0