Dichotomie Pascal

Résolu
uesgui Messages postés 172 Date d'inscription vendredi 29 décembre 2000 Statut Membre Dernière intervention 10 octobre 2012 - 19 déc. 2008 à 13:05
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 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';

end;

begin
   writeln('                           DICHOTOMIE                                ');
   writeln('       ');

   writeln('              ');
     verif;

end.

20 réponses

cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
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
3
Utilisateur anonyme
19 déc. 2008 à 20:03
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;
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
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.

@+
3
uesgui Messages postés 172 Date d'inscription vendredi 29 décembre 2000 Statut Membre Dernière intervention 10 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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
19 déc. 2008 à 19:59
Salut,

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
0
uesgui Messages postés 172 Date d'inscription vendredi 29 décembre 2000 Statut Membre Dernière intervention 10 octobre 2012
19 déc. 2008 à 20:21
merci pour ces conseils .
Je tacherai de faire un effort le prochain coup, de donner des informations plus précises.
A +
Bonnes fêtes
0
Utilisateur anonyme
19 déc. 2008 à 21:28
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;
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
19 déc. 2008 à 21:48
Tiens j'arrive après les courses!
uesgui, tu peux dire merci à francky qui t'as bien bidouillé la fonction ésotérique que tu nous avez transmis.


Faut dire que Francky est un marabout qui sait lire entre les entre-lignes! Quant ilveut!
Bien à vous!
Jean_Jean
0
Utilisateur anonyme
19 déc. 2008 à 21:56
Non mais ca c'est à cause de la beuh que m'a refilé Cari hier
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 déc. 2008 à 22:13
J't'avais pourtant bien dit que tu devais tenir jusqu'au nouvel an avec ces 300 gr.
Maintenant, t'es un marabout tout pourri :
0
Utilisateur anonyme
19 déc. 2008 à 22:24
A force de faire dans la divination fallait bien que ca arrive .

La derniere fois que j'étais dans cet état là c'est quand on a fait les tartes o concombres avec Matt : t'avais pissé sur les mocassins à Japee
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 déc. 2008 à 22:49
CS c'est la d


ivination gratuite :

Horoscope
Tarot
marc de café et jus de concombre
Boule de cristal
poupée vaudou
lignes de la main et dichotomie...







Votre avenir et celui de votre code : GRATOS par un grand marabout !

(enfin, tant qu'y en a pas marre)
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
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
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 déc. 2008 à 22:59
nan, nan...  Ils suivent les bouses qui fument... comme nous.
0
Utilisateur anonyme
19 déc. 2008 à 22:59
Cari fait la meme chose avec les femmes .

On va se faire engueuler ce coup-ci : on dira que c'est JeanJean  (au fait content de te revoir ) qui a commencé
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
19 déc. 2008 à 23:04
y'a de nouvelles consignes des marabouts administratifs?

Jean_Jean
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 déc. 2008 à 23:07
Ouais, t'as raison de parler tout bas.
'faut faire dans la discrétion avec PCKC.
Jean-Jean, il exagère quand même, je trouve. Il a pas de limite.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 déc. 2008 à 23:15
Nouvelle consigne :

On peut déconner, mais que la nuit et en gris clair.

le jour, c'est réservé aux tartes
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
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!




Jean_Jean
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 déc. 2008 à 23:26
... Et la tendresse de Francky3615, c'est de la daube?!
0
Rejoignez-nous