Dichotomie Pascal [Résolu]

uesgui 172 Messages postés vendredi 29 décembre 2000Date d'inscription 10 octobre 2012 Dernière intervention - 19 déc. 2008 à 13:05 - Dernière réponse : Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention
- 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.
Afficher la suite 

20 réponses

Répondre au sujet
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 19 déc. 2008 à 18:45
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jean_Jean
Utilisateur anonyme - 19 déc. 2008 à 20:03
+3
Utile
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;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 20:07
+3
Utile
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.

@+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Caribensila
uesgui 172 Messages postés vendredi 29 décembre 2000Date d'inscription 10 octobre 2012 Dernière intervention - 19 déc. 2008 à 19:33
0
Utile
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+
Commenter la réponse de uesgui
Utilisateur anonyme - 19 déc. 2008 à 19:59
0
Utile
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
Commenter la réponse de Utilisateur anonyme
uesgui 172 Messages postés vendredi 29 décembre 2000Date d'inscription 10 octobre 2012 Dernière intervention - 19 déc. 2008 à 20:21
0
Utile
merci pour ces conseils .
Je tacherai de faire un effort le prochain coup, de donner des informations plus précises.
A +
Bonnes fêtes
Commenter la réponse de uesgui
Utilisateur anonyme - 19 déc. 2008 à 21:28
0
Utile
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;
Commenter la réponse de Utilisateur anonyme
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 19 déc. 2008 à 21:48
0
Utile
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
Commenter la réponse de cs_Jean_Jean
Utilisateur anonyme - 19 déc. 2008 à 21:56
0
Utile
Non mais ca c'est à cause de la beuh que m'a refilé Cari hier
Commenter la réponse de Utilisateur anonyme
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 22:13
0
Utile
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 :
Commenter la réponse de Caribensila
Utilisateur anonyme - 19 déc. 2008 à 22:24
0
Utile
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
Commenter la réponse de Utilisateur anonyme
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 22:49
0
Utile
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)
Commenter la réponse de Caribensila
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 19 déc. 2008 à 22:52
0
Utile
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
Commenter la réponse de cs_Jean_Jean
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 22:59
0
Utile
nan, nan...  Ils suivent les bouses qui fument... comme nous.
Commenter la réponse de Caribensila
Utilisateur anonyme - 19 déc. 2008 à 22:59
0
Utile
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é
Commenter la réponse de Utilisateur anonyme
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 19 déc. 2008 à 23:04
0
Utile
y'a de nouvelles consignes des marabouts administratifs?

Jean_Jean
Commenter la réponse de cs_Jean_Jean
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 23:07
0
Utile
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.
Commenter la réponse de Caribensila
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 23:15
0
Utile
Nouvelle consigne :

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

le jour, c'est réservé aux tartes
Commenter la réponse de Caribensila
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 19 déc. 2008 à 23:20
0
Utile
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
Commenter la réponse de cs_Jean_Jean
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 19 déc. 2008 à 23:26
0
Utile
... Et la tendresse de Francky3615, c'est de la daube?!
Commenter la réponse de Caribensila

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.