Dicotomie en langage C

Fermé
zebino Messages postés 6 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 22 juillet 2015 - 27 mars 2011 à 16:56
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 27 mars 2011 à 21:31
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


2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
27 mars 2011 à 17:47
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...
0
zebino Messages postés 6 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 22 juillet 2015
27 mars 2011 à 20:51
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...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
27 mars 2011 à 20:54
Je pense que le problème doit quand même être à peu près le même, essaye de changer ta condition initiale x=0 pour voir si ça te permet d'obtenir d'autres solutions...
0
zebino Messages postés 6 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 22 juillet 2015
27 mars 2011 à 21:01
nan en faite je veux pas qu'il me donne une seule valeur mais TOUTES. C'est vrai que je peux changé ma cond initiale pour avoir la deuxième mais je veuxqui balaye tout mon intervale en gros sur [-10;10] qu'il me donne les racine -1 et 1 pour la fonction x²-1
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 27/03/2011 à 21:32
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...
0