Dichotomie Pascal [Résolu]

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

Votre réponse

20 réponses

Meilleure réponse
cs_Jean_Jean
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 19 déc. 2008 à 18:45
3
Merci
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

Merci cs_Jean_Jean 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_Jean_Jean
Meilleure réponse
Utilisateur anonyme - 19 déc. 2008 à 20:03
3
Merci
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;

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 20:07
3
Merci
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.

@+

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Caribensila
uesgui
Messages postés
172
Date d'inscription
vendredi 29 décembre 2000
Dernière intervention
10 octobre 2012
- 19 déc. 2008 à 19:33
0
Merci
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
Merci
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
Messages postés
172
Date d'inscription
vendredi 29 décembre 2000
Dernière intervention
10 octobre 2012
- 19 déc. 2008 à 20:21
0
Merci
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
Merci
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
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 19 déc. 2008 à 21:48
0
Merci
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
Merci
Non mais ca c'est à cause de la beuh que m'a refilé Cari hier
Commenter la réponse de Utilisateur anonyme
Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 22:13
0
Merci
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
Merci
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
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 22:49
0
Merci
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
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 19 déc. 2008 à 22:52
0
Merci
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
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 22:59
0
Merci
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
Merci
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
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 19 déc. 2008 à 23:04
0
Merci
y'a de nouvelles consignes des marabouts administratifs?

Jean_Jean
Commenter la réponse de cs_Jean_Jean
Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 23:07
0
Merci
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
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 23:15
0
Merci
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
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 19 déc. 2008 à 23:20
0
Merci
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
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 19 déc. 2008 à 23:26
0
Merci
... 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.