Urgent

Discutez d'informatique ici !
lavela
Membre Naturel
Messages: 22
Enregistré le: 03 Avr 2007, 14:22

urgent

par lavela » 06 Juil 2007, 07:31

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 :hum:



Dominique Lefebvre
Membre Légendaire
Messages: 8005
Enregistré le: 03 Déc 2005, 12:00

par Dominique Lefebvre » 06 Juil 2007, 08:23

lavela a écrit: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 :hum:


Oui et alors....

anima
Membre Transcendant
Messages: 3762
Enregistré le: 15 Sep 2006, 11:00

par anima » 06 Juil 2007, 08:57

lavela a écrit: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 :hum:

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! :we:

Ta boucle serait (en language C):
#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)) {
// 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... :ptdr:

Patastronch
Membre Irrationnel
Messages: 1345
Enregistré le: 22 Aoû 2005, 23:53

par Patastronch » 06 Juil 2007, 10:28

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.

anima
Membre Transcendant
Messages: 3762
Enregistré le: 15 Sep 2006, 11:00

par anima » 06 Juil 2007, 13:53

Patastronch a écrit: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 :zen:

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite