Programmation avec méthode dichotomie
physicien009
-
KX Messages postés 19031 Statut Modérateur -
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 .
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:
- Programmation avec méthode dichotomie
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation carte à puce vierge ✓ - Forum Matériel & Système
- Programmation binaire - Guide
- Programmation vb - Télécharger - Langages
1 réponse
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...
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...
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.