Dichotomie Pascal [Résolu]

Signaler
Messages postés
172
Date d'inscription
vendredi 29 décembre 2000
Statut
Membre
Dernière intervention
10 octobre 2012
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
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.
A voir également:

20 réponses

Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
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;
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
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.

@+
Messages postés
172
Date d'inscription
vendredi 29 décembre 2000
Statut
Membre
Dernière intervention
10 octobre 2012

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+

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

merci pour ces conseils .
Je tacherai de faire un effort le prochain coup, de donner des informations plus précises.
A +
Bonnes fêtes

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;
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
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

Non mais ca c'est à cause de la beuh que m'a refilé Cari hier
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
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 :

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
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
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)
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
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
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
nan, nan...  Ils suivent les bouses qui fument... comme nous.

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é
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
y'a de nouvelles consignes des marabouts administratifs?

Jean_Jean
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
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.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Nouvelle consigne :

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

le jour, c'est réservé aux tartes
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
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
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
... Et la tendresse de Francky3615, c'est de la daube?!