Dicotomie en langage C
zebino
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
j'ai fais un petit programme en C qui calcul la racine d'une fonction f(x)=0 par la méthode de dichotomie.. Cependant j'ai un souci : si jamais ma fonction à plusieurs racine il ne calcule que la première racine et s'arrête.
Avez vous un astuce pour qu'il balaye tout l'intervalle étudié et qu'il affiche toutes les racines.
Voici mon programme :
double Racine_Dicho(double a, double b, double epsilon)
{
double y = 0, x = 0, temp = 0;
if(b < a) //test en cas d'inversion de l'intervallle
{
double temp = a;
a = b;
b = temp;
}
do
{ i=i++;
x = (b + a)/2; //x est au milieux de l'intervalle
y = f(x);
if (y<0) //si le résultat est négatif
{
if(f(b) > f(a))//cas fct croissante
a = x; //on change la borne inférieur
else //cas fct décroissante
b = x; //on change la borne supérieur
}
else if (y>0) // si le résultat est négatif
{
if(f(b) > f(a))
b = x;
else
a = x;
}
else
break; //pour sortir de la boucle
}while (y>=epsilon || -y>=epsilon && i<MAX_ITER); //valeur absolue possible
//on affiche le résultat
return a;
}
Merci de votre aide
j'ai fais un petit programme en C qui calcul la racine d'une fonction f(x)=0 par la méthode de dichotomie.. Cependant j'ai un souci : si jamais ma fonction à plusieurs racine il ne calcule que la première racine et s'arrête.
Avez vous un astuce pour qu'il balaye tout l'intervalle étudié et qu'il affiche toutes les racines.
Voici mon programme :
double Racine_Dicho(double a, double b, double epsilon)
{
double y = 0, x = 0, temp = 0;
if(b < a) //test en cas d'inversion de l'intervallle
{
double temp = a;
a = b;
b = temp;
}
do
{ i=i++;
x = (b + a)/2; //x est au milieux de l'intervalle
y = f(x);
if (y<0) //si le résultat est négatif
{
if(f(b) > f(a))//cas fct croissante
a = x; //on change la borne inférieur
else //cas fct décroissante
b = x; //on change la borne supérieur
}
else if (y>0) // si le résultat est négatif
{
if(f(b) > f(a))
b = x;
else
a = x;
}
else
break; //pour sortir de la boucle
}while (y>=epsilon || -y>=epsilon && i<MAX_ITER); //valeur absolue possible
//on affiche le résultat
return a;
}
Merci de votre aide
2 réponses
Ce que tu veux faire et ce que tu as implémente ressemble à la méthode de Newton qui nécessite que ton x de départ soit proche de la racine cherchée. Or puisque tu pars toujours de x=0 tu auras toujours la même racine (celle la plus proche de 0).
Pour obtenir d'autres racines essaye de changer ton x de départ, il faut évidemment avoir une idée de quelle valeur pour x choisir, tu pourrais par exemple augmenter ton x dans les positifs jusqu'à changer de signe (éventuellement jamais) ou au contraire le diminuer dans les négatifs...
Pour obtenir d'autres racines essaye de changer ton x de départ, il faut évidemment avoir une idée de quelle valeur pour x choisir, tu pourrais par exemple augmenter ton x dans les positifs jusqu'à changer de signe (éventuellement jamais) ou au contraire le diminuer dans les négatifs...
Merci de ta réponse.
Non j'ai aussi fais newton raphson et c un autre programme ou je dois rentrer la valeur de départ donc c autre chose. La c par dichotomie et donc je prends un intervalle que je coupe en deux puis je regarde le demi intervalle ou il y a chgt de signe puis je redivise en deux etc etc... jusqu'à avoir mon pourcentage d'erreur epsilon...
Non j'ai aussi fais newton raphson et c un autre programme ou je dois rentrer la valeur de départ donc c autre chose. La c par dichotomie et donc je prends un intervalle que je coupe en deux puis je regarde le demi intervalle ou il y a chgt de signe puis je redivise en deux etc etc... jusqu'à avoir mon pourcentage d'erreur epsilon...
Si tu cherches des valeurs sur l'intervalle [A,B], tu pars de x=A pour trouver la valeur x1 la plus petite telle que f(x1)=0, et si tu recommence en partant de x=B tu vas trouver la valeur la plus grande x2 telle que f(x2)=0. Si x1 et x2 sont identiques tu t'arrêtes, sinon tu recommence
Si tu sais que tu as d'autres valeurs à trouver, elles seront forcément sur l'intervalle [x1,x2] mais il faudrait juste pouvoir s'assurer que tu ne reprennes pas x1 et x2 à nouveau... et tu recommences !
Dans tous les cas, il faudra que tu réitères ton algorithme avec au moins autant de x différents que de racines à trouver...
Si tu sais que tu as d'autres valeurs à trouver, elles seront forcément sur l'intervalle [x1,x2] mais il faudrait juste pouvoir s'assurer que tu ne reprennes pas x1 et x2 à nouveau... et tu recommences !
Dans tous les cas, il faudra que tu réitères ton algorithme avec au moins autant de x différents que de racines à trouver...