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   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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