urgent

(Cliquez-ici pour accéder à la version originale de cette discussion avec couleurs et images)







Posted by: lavela

on nous a donne un bleme de programation sur la methode de dichotomie en language C,avec f(x)=lnx sur [0.5,1.5].THANKS



Posted by: Dominique Lefebvre

Citation:
Posté par lavela
on nous a donne un bleme de programation sur la methode de dichotomie en language C,avec f(x)=lnx sur [0.5,1.5].THANKS


Oui et alors....



Posted by: anima

Citation:
Posté par lavela
on nous a donne un bleme de programation sur la methode de dichotomie en language C,avec f(x)=lnx sur [0.5,1.5].THANKS

Bah quoi? Tu calcules f(0.5) et f(1.5); tu en déduis par le changement de signe qu'il y a une solution entre les 2.
Tu affines donc une valeur, en cherchant f(0.8). Toujours négatif. La solution est donc plus loin.
Tu essayes f(0.9). Ah, toujours plus loin.
Tu essayes f(1) -> BINGO!

Ta boucle serait (en language C):
Citation:
#include math.h
main()
{
double StartValue;
double EndValue;
double LogVal1;
double LogVal2;
double LogValTemp;
bool FinDeDicho;
FinDeDicho = false;
StartValue = 0.5;
EndValue = 1.5;

// On vérifie si il y a une solution sur l'intervalle [StartValue;EndValue]
LogVal1 = log(StartValue);
LogVal2 = log(EndValue);
if ((LogVal1 < 0) && (LogVal2 > 0)) {
// On peut effectuer la dicho
fputs("Dichotomie; pas=0.1");
LogVal2 = 0;
while(FinDeDicho = false) {
LogValTemp = log(StartValue + LogVal2);
// N'ayant pas fait de C depuis longtemps,
// Je ne me souviens plus comment vérifier si 2 doubles sont de signes opposés
if (LogValTemp == 0) {
puts("Solution: %s",StartValue+LogVal2);
break;
}
LogVal2 = LogVal2+0.1;
}
puts("Fin de la dichotomie");
}
else {
puts("Il n'y a pas de solution sur l'intervalle");
}
}


C'est codé on-the-fly, donc il y aura peut-etre une erreur de syntaxe par-ci par-la, mais bon...



Posted by: Patastronch

while(bool == false)


Mais quelle horreur !
Sans t'en rendre compte tu fais 2 fois le meme test.
Et puis c est pas bool ta variable mais finDeDicho


Et puis je croyais que la dichotomie c'etait de séparer l'ensemble en 2 parties.

C'est a dire si l'interval est [a,b] alors on lance sur (a+b)/2 si c est plus petit on refait pareil avec a=(a+b)/2 si c est trop grand b=(a+b)/2 et si c'est egal on renvoit la solution.

Enfin bon je dis ca je dis rien.



Posted by: anima

Citation:
Posté par Patastronch
while(bool == false)


Mais quelle horreur !
Sans t'en rendre compte tu fais 2 fois le meme test.
Et puis c est pas bool ta variable mais finDeDicho


Et puis je croyais que la dichotomie c'etait de séparer l'ensemble en 2 parties.

C'est a dire si l'interval est [a,b] alors on lance sur (a+b)/2 si c est plus petit on refait pareil avec a=(a+b)/2 si c est trop grand b=(a+b)/2 et si c'est egal on renvoit la solution.

Enfin bon je dis ca je dis rien.

Oula. Oui bon j'ai rien dit pour le while, j'étais encore la tete dans les choux d'eAthena :)

La dichotomie peut se faire de plusieurs facons. Il y a la séparation en 2, et l'approche en pas + séparation











-