uesgui
Messages postés172Date d'inscriptionvendredi 29 décembre 2000StatutMembreDernière intervention10 octobre 2012
-
19 déc. 2008 à 13:05
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019
-
19 déc. 2008 à 23:26
Bonjour,
J'ai récupéré un code pour faire un exercice de maths sur la dichotomie , j'ai bidouillé le code pour l'adapter à mon exercice mais je ne trouve pas la bonne solution.
Quelqu'un peut il y jeter un coup d'oeil et me dire ce qui est à revoir.
Merci
Voici le code :
program dichotomie;
var y:integer;
function f(var x:real):real;
begin
if y=1 then f:=(ln (x))/x+((x*x)-1) /2*(1/x) end;
procedure verif;
var a,b,m,ep,va:real;
i,n:integer;
r,c:char;
begin repeat
writeln('f[x]=ln(x)/x + ((x*x)-1)/2*(1/x)');
writeln('pour calculer la fonction f[x]=1 donnez l intervalle[a,b]') ;
write(' a=');
readln(a);
write(' b=');
readln(b);
begin
writeln('la fonctin f admet une solution dans [',a,';',b,']');
write(' ');
write('entrer le nombre d"iteration n=');
readln(n);
m:=(a+b)/2; if f(m)=1 then ep:=m
else
begin for i:=1 to n-1 do
begin if f(m)*f(a)>0 then begin a:=m; m:=(b+m)/2; end
else m:=(a+m)/2; b:=2*m-a;
end;
end; i:=i+1;
ep:=m;
writeln(' la valeur pour l"iteration ',n,' est epsilon=',ep);
write('voulez vous continuer O/N? ');
readln(r); end;
until r='N';
cs_Jean_Jean
Messages postés614Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 19 déc. 2008 à 18:45
Bj
Le pb c'est qu'on a pas envie de bidouiller, ni de lire ton code qui ne nous éclaire pas sur ton pb, genre solution dans [',a,';',b,']': Quésako!???
Quel problème as-tu? Quel but poursuis-tu?
quels résultats attends tu? Donne les nous si tu les a!
A revoir!
A+
Jean_Jean
Désolé pour le résultat : j'avais cru voir un moins.
Voila un code opérationnel
//Retourne l'image de x
function f(x:real):real;
begin
Result:=ln (x)/x+((x*x)-1) /2*(1/x)-1;
End;
//Retourne le résultat de la dichotomie
Function Dichotomie(a,b:real;n:Integer) : Real;
var
m:real;
i:integer;
begin
//On répète
i:=1;
Repeat
//On calcule la moyenne entre a et b
m:=(a+b)/2;
//Si f(m)=0 alors m est le résultat;
If f(m)=0 Then
Begin
Result:=m;
Break;
End;
//Si f(m)>0 alors b=m
If f(m)>0 Then b:=m
//Sinon a=m
Else a:=m;
//On retourne m comme résultat
Result:=m;
//On incrémente i
Inc(i);
Until i=n+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage('Le résultat est : '+FloatToStr(Dichotomie(1,4,10)));
end;
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 19 déc. 2008 à 20:07
Salut,
Ici, tu es sur un site d'entraide. Ce n'est donc pas une oeuvre de bienfaisance.
Tu avoues abuser un peu (doux euphémisme), et c'est plutôt sympa de l'avouer. Mais ce n'est pas en délocalisant ta reflexion dans le cerveau des autres que tu progresseras en programmation.
Pour ton prochain coup, stp, essaie de localiser clairement ta ou tes difficultés.
Et surtout fais preuve d'empathie. Il nous est possible de te dépanner sur un point précis, mais personne n'a envie d'écrire ton code à ta place. Tu as récupérer un bout de code qui traînait on ne sait où et tu l'as bidouillé. C'est pas très engageant pour nous. J'espère que tu nous comprends.
uesgui
Messages postés172Date d'inscriptionvendredi 29 décembre 2000StatutMembreDernière intervention10 octobre 2012 19 déc. 2008 à 19:33
Bonsoir
Je dois avouer que j'abuse un peu et que mon objectif est de plus ou moins rien faire et attendre que quelqu'un me ponde une solution...
J'essaye d'adapter un code sur la dichotomie pour en faire un programme qui fonctionne et qui me donne le résultat de mon équation (que l'on peut voir dans le code) pour f(x)=1.
['a,';'b'] correspond à l'intervalle où doit se trouver la solution .
Normalement et avec une calculatrice on trouve y~=1,87 à 0,01 prés.
Je cherche la solution à 0,000001 prés.
Mais Jean Jean c'est pas parce que vous n'avez pas envie de bidouiller que faut en faire un cas général ou un problème de fond ensuite je precise que j'en suis a mes tout debuts en programmation (un peu d'indulgence).
Par contre si on ne connais vraiment pas à quoi correspond la dichotomie ce n'est pas forcément de ma faute.
On peut trouver de l'aide sur Wikipedia (ce que j'ai fait au début).
L'énoncé précis de mon exercice est de donner la valeur de l'équation f(x)=1 sachant que cette solution se trouve sur l'intervalle [1,5 ; 2] et la donner par méthode de dichotomie.
Bon a part ça je suis désolé si ça en a frustré certains ,j'aurai les résultats de mon exercice un de ces quatres et je verrai à m'améliorer sur le prochain coup.
Bonne soirée
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
A priori tu as quelques lacunes sur les fonctions : la dichotomie consiste à déterminer une valeur approchée de l'antécédent d'une fonction tel que l'image associée soit égaile à une valeur donnée.
Ici tu définis l'antécédant comme une variable
function f(var x:real):real;
begin
if y=1 then f:=(ln (x))/x+((x*x)-1) /2*(1/x)
end;
De plus je ne vois pas ce que fait la condition si y=1 car y n'intervient pas dans f(x). Si tu as voulu écrire si x=1 alors f:(x)=(ln (x))/x+((x*x)-1) /2*(1/x) alors la seule solution est par définition 1. Si tu as voulu écrire que si f(x)=1 alors f(x)=(ln (x))/x+((x*x)-1) /2*(1/x) il y a un probleme aussi : car ta fonction n'est définit que pour une valeur donnée de f(x).
Ensuite je te rappelle que le logarithme néperien d'un nombre négatif n'existe pas : Donc la solution de (ln (x))/x+((x*x)-1) /2*(1/x)=1 ne peut pas etre celle que tu donnes.
Je rejoins JeanJean on comprend pas ou tu veux arriver
Bon allez on peut aller encore un petit peu plus loin :
//Retourne l'image de x
function f(x:real):real;
begin
Result:=ln (x)/x+((x*x)-1) /2*(1/x)-1;
End;
//Retourne le résultat de la dichotomie
Function Dichotomie(a,b:real;n:Integer) : Real;
var
m:real;
i:integer;
begin
//On répète
i:=1;
Repeat
//On calcule la moyenne entre a et b
m:=(a+b)/2;
//Si f(m)=0 alors m est le résultat;
If f(m)=0 Then
Begin
Result:=m;
Break;
End;
//Si f(m)>0 alors
If f(m)>0 Then
Begin
//b=m
b:=m ;
//Si |a|<m alors le résultat est a
If Abs(a)<m Then Result:=a
//sinon le résultat est m
Else Result:=m;
End
//Sinon
Else
Begin
//a=m
a:=m;
//Si |m|<b alors le résultat est m
If Abs(m)<b Then Result:=m
//sinon le résultat est a
Else Result:=a;
End;
//On incrémente i
Inc(i);
Until i=n+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage('Le résultat est : '+FloatToStr(Dichotomie(1.5,2,3)));
end;
cs_Jean_Jean
Messages postés614Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 19 déc. 2008 à 22:52
Ah oui, Cari, j'avel oublié!
Tu marabout des marabout d'outre mer à ce qu'il parait!
J'ai lu un bouquin d'ethonologie il y a quelques mois, il parait qu'en afrique, ils repèrent les troupeaux de vache non pas en hélicoptère comme toute civilisation bien dégradée, mais en fumant "du bon je ne sais quoi"!
Jean_Jean
cs_Jean_Jean
Messages postés614Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 19 déc. 2008 à 23:20
Bon ben OK on va se coucher !
Bonne nuit les petits et ne fumez pas trop hein!
Vous n'avez le droit qu'à la tendresse de votre douce, hein, jeveux dire en chair et os!
et turbinez pas en dichotomie, c'est mieux en harmonie!