Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Projet informatique pour le lundi 5 mai !!!



  1. #1
    Gell-Müller

    Exclamation Projet informatique pour le lundi 5 mai !!!

    Bonjour,

    1/ Recherche de solutions (approchées) d'équations du type f(x) = 0. Méthode dichotomique.

    Méthode applicable à une fonction f continue monotone sur I = [a;b], avec f(a)*f(b) < 0 (f(a) et f(b) sont de signes contraires).

    Méthode basée sur le théorème des valeurs intermédiaires : Comme f(a) et f(b) sont de signes contraires, f s'annule entre a et b.

    On s'intéresse alors au milieu de l'intervalle
    c = (a + b) / 2.

    Soit f(c) est du même signe que f(a), on recommence alors avec l'intervalle [c, b]

    Soit f(c) est du signe de f(b), on recommence alors avec l'intervalle [a,c]

    Soit exceptionnellement, f(c) = 0, c'est fini, c'est OK.

    Comme à chaque étape, la longueur de l'intervalle est divisée par 2, le moment va arriver où la longueur de l'intervalle va être inférieure à la précision cherchée epsilon, nous aurons la valeur de la solution de l'équation à epsilon près.

    Ecrire une procédure dichotomie qui, à partir d'un intervalle [a;b] et d'une précision epsilon, vérifie si la méthode est applicable (a < b et f(a)*f(b) <0), et si c'est le cas rend x, la solution de l'équation f(x) = 0 (f supposée monotone sur l'intervalle)

    J'ai pensé pour la programmation normale à un schéma itératif Tantque.

    Tantque f(c) non égal à 0, faire
    Si f(c) (Ici, il faudrait peut-être créer une fonction booléene TRUTH, qui rende VRAI si f(c) est du signe de a et FAUX si f(c) est du signe de b, non ?) TRUTH
    Alors a:= c
    Sinon b:=c
    Fintantque

    Je sais qu'il faut d'autres paramètres, qu'il faut définir et tout ça. Pourriez-vous m'aider à rédiger cette procédure en langage normal et en langage pascal, s'il vous plaît ?

    Je vous remercie d'avance

    BONNE JOURNEE ET BON COURAGE

    -----

    " Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.

  2. Publicité
  3. #2
    DomiM

    Re : Projet informatique pour le lundi 5 mai !!!

    Bonjour,

    petite erreur:
    qui rende VRAI si f(c) est du signe de f(a)

    Il me semble que tu as oublié c=(a+b)/2 juste avant FinTantque
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  4. #3
    Gell-Müller

    Re : Projet informatique pour le lundi 5 mai !!!

    Effectivement...
    " Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.

  5. #4
    SuperTux

    Re : Projet informatique pour le lundi 5 mai !!!

    Salut,

    Tu as de la chance, comme j'ai trouvé le problème intéressant, je l'ai codé en C. En analysant le code source tu devrais pouvoir facilement comprendre comment cela marche.

    Attention par contre, la dichotomie ne marchera que sur une fonction monotone.

    Code:
    #include <stdio.h>
    
    double absolute(double x)
    {
      if(x < 0)
      {
        x = x * -1.0;
      }
    
      return x;
    }
    
    double f(double x)
    {
      return (x * 2.0) + 5.0; // f(x) -> 2x+5
    }
    
    int test(double a, double b)
    {
      if((a > b) || ((f(a) * f(b)) > 0))
      {
        return 0;
      }
    
      return 1;
    }
    
    double dicho(double a, double b, double ep)
    {
      double c;
    
      do
      {
        c = b - ((b - a) / 2);
    
        if(f(c) < 0)
        {
          a = c;
        }
        else
        {
          b = c;
        }
      }
      while((absolute(f(c)) - ep) > 0);
    
      return c;
    }
    
    int main()
    {
      double r;
    
      if(test(-20.0, 10.0) == 1)
      {
        r = dicho(-20.0, 10.0, 0.1);
        printf("f(%f) = %f\n", r, f(r));
      }
    
      if(test(-100.0, -1.0) == 1)
      {
        r = dicho(-100.0, -1.0, 0.1);
        printf("f(%f) = %f\n", r, f(r));
      }
    
      if(test(0.0, 10.0) == 1) // Ne passe pas le test, f(a) * f(b) > 0
      {
        r = dicho(0.0, 10.0, 0.1);
        printf("f(%f) = %f\n", r, f(r));
      }
    
      return 0;
    }

  6. #5
    Gell-Müller

    Re : Projet informatique pour le lundi 5 mai !!!

    Code:
    program ZERODEFONCTION;
    
    uses WinCrt;
    
    procedure DICHOTOMIE;
    
    var X,INF, SUP, MILIEUINT, SOLUTION, EPS : real;
    
    Begin
    
    MILIEUINT:= (INF + SUP) / 2;
    
                If INF < SUP and (((sqr(INF)-1))*((sqr(SUP)-1))) < 0;
    
                Then begin
    
                     While (sqr(MILIEUINT)-1) <> 0 do
    
                           If sqr(MILIEUINT) < 0
    
                           Then begin
    
                           INF:= MILIEUINT;
    
                           end
    
                           Else begin
    
                           SUP:= MILIEUINT;
    
                           end;
    
                           SOLUTION:= MILIEUINT;
    
                           Writeln('LE ZERO DE LA FONCTION SE SITUE AU POINT D''ABSCISSE X = ',SOLUTION);
    
                end;
    
                Else begin
    
                Writeln('LE ZERO DE LA FONCTION NE SE TROUVE PAS DANS CET INTERVALLE !!!');
    
                end;
    end.
    Tout ce programme est le programme PASCAL que j'ai rédigé. Mais, il y a une erreur quelque part... Je ne sais pas pourquoi. Dois-je créer la fonction x²-1 ou non.

    Il y a aussi un deuxième exercice dans le projet.

    2/ Les flottants

    On peut représenter un nombre décimal d par deux entiers appelés mantisse et exposant de telle façon que


    d = mantisse * 10^(exposant). Dans cet exercice on se limitera à la base 10.

    a) Construire un type flottant capable de représenter un nombre décimal par 2 entiers.

    J'ai pensé à un type composé de mantisse et d'exposant (mantisse étant de type réel et exposant de type entier).

    Est-ce exact ?

    b) Ecrire une procédure qui étant donné deux flottants d1 et d2 renvoie un autre flottant représentant le produit d1*d2

    Et là je dois avouer que je suis coincé. Comment faire ?

    c) Ecrire une fonction puissance qui à partir d'un entier x et d'un entier positif n renvoie l'entier x^n.

    d) En utilisant la fonction puissance, écrire la procédure qui à partir de 2 flottants d1 et d2 renvoie un autre flottant représentant la somme d1+d2

    Pour les deux derniers, je suis coincé...

    P.S : Pour ln, exp et les fonctions trigonométriques, ce sont des fonctions prédéfinies dans Turbo-Pascal, c'est OK !!!

    MERCI D'AVANCE...

    BON COURAGE ET BONNE JOURNEE
    retour au forum


    Pour la 2/c), j'ai fait le programme PASCAL suivant qui s'éxécute normalement, mais il posséde un défaut majeur

    Code:
    program POWER;
    
    uses WINCRT;
    
    var NOMBRE, FORCE, PUISSANCENOMBRE : integer;
    
    function PUISSANCE(X,n,SOLUTION:integer):integer;
    
    var i,AUX : integer;
    
    begin
    
    AUX:= X;
    
    While i < n do  
    
    SOLUTION := X*AUX;
    
    X:= SOLUTION;
    
    i:= i+1;
    
    end;
    
    begin
    
    Writeln('Bienvenue dans le programme PUISSANCE D"UN NOMBRE !!!');
    
    Writeln('Nombre a multiplier : ');
    
    Read(NOMBRE);
    
    Writeln('Combien de fois dois-je multiplier ce nombre ? : ');
    
    Read(FORCE);
    
                          If FORCE <= 0
    
                                Then begin
    
                                     IF FORCE < 0
    
                                     Then begin
    
                                     Writeln('CE NOMBRE NE DOIT EN AUCUN CAS ETRE NEGATIF !!!');
    
                                     Writeln('Saisissez un nombre positif ou nul !!!');
    
                                     end
    
                                     ELSE BEGIN
    
                                     PUISSANCENOMBRE := 1;
    
                                     Writeln(NOMBRE ,' à la puissance', FORCE, ' donne : ',PUISSANCENOMBRE);
    
                                     end;
    
                                     end
    
                                Else begin
    
                                PUISSANCENOMBRE:= PUISSANCE(NOMBRE,FORCE,PUISSANCENOMBRE);
    
                                Writeln(NOMBRE, ' à la puissance ', FORCE, ' donne : ',PUISSANCENOMBRE);
    
                                end;
                   
    end.
    Pour lui, 5² = 4672



    Qu'est-ce que je dois changer? Et pourriez-vous m'aider, s'il vous plaît ?

    Merci d'avance...
    Dernière modification par yoda1234 ; 28/04/2008 à 06h40. Motif: Ajout de balises
    " Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.

  7. A voir en vidéo sur Futura
  8. #6
    DomiM

    Re : Projet informatique pour le lundi 5 mai !!!

    Bonjour,

    Est ce qu'en pascal les variable sont initialisées à la déclaration ?
    car VAR i
    puis
    While i < n do
    si i n'est pas égal à 0 au départ ça donnera nimporte quoi
    c'est ce qui se passerait dans le langage C++, i aurai une valeur aléatoire.
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  9. Publicité
  10. #7
    Gell-Müller

    Re : Projet informatique pour le lundi 5 mai !!!

    Effectivement, j'ai oublier d'initialiser i = 0. Mais, j'ai un autre problème maintenant. Le programme fonctionne jusqu'à ce que je lui demande d'effectuer le calcul. C'est là qu'il se met à ne plus répondre.
    Qu'est-ce qui pourrait ne pas aller correctement ?
    Serait-ce un dépassement de capacité ???

    MERCI D'AVANCE ET MERCI BEAUCOUP

    BONNE JOURNEE ET BON COURAGE
    " Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.

  11. #8
    Gell-Müller

    Re : Projet informatique pour le lundi 5 mai !!!

    Comment analyse-t-on un code source pour le faire passer du C au Java ???
    " Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.

  12. #9
    Gell-Müller

    Exclamation Re : Projet informatique pour le lundi 5 mai !!!

    Voici le premier programme :

    Code:
    program POWER;
    
    uses WINCRT;
    
    var NOMBRE, FORCE, PUISSANCENOMBRE : integer;
    
    function PUISSANCE(X,n,SOLUTION:integer):integer;
    
    var i,AUX : integer;
    
    begin
    
    i:= 0;
    SOLUTION:=1;
    AUX:= X;
    
    While i < n do
    begin
    Writeln('La vie est belle');  
    
    SOLUTION :=SOlUTION * x;
    
    i:= i+1;
    end;
    
    
    end;
    Code:
    begin
    
    Writeln('Bienvenue dans le programme PUISSANCE D"UN NOMBRE !!!');
    
    Writeln('Nombre à multiplier : ');
    
    Read(NOMBRE);
    
    Writeln('Combien de fois dois-je multiplier ce nombre ? : ');
    
    Read(FORCE);
    
                          If FORCE <= 0
    
                                Then begin
    
                                     IF FORCE < 0
    
                                     Then begin
    
                                     Writeln('CE NOMBRE NE DOIT EN AUCUN CAS ETRE NEGATIF !!!');
    
                                     Writeln('Saisissez un nombre positif ou nul !!!');
    
                                     end
    
                                     Else begin
    
                                     PUISSANCENOMBRE := 1;
    
                                     Writeln(NOMBRE ,' à la puissance', FORCE, ' donne : ',PUISSANCENOMBRE);
    
                                     end;
    
                          end
    
                          Else begin
    
                          PUISSANCENOMBRE:= PUISSANCE(NOMBRE,FORCE,PUISSANCENOMBRE);
    
                          Writeln(NOMBRE, ' à la puissance ', FORCE, ' donne : ',PUISSANCENOMBRE);
    
                          end;
    end.
    Juste un problème : POURQUOI J'OBTIENS DES VALEURS "spaces" comme :

    5² = 4671 ; 3² = 4671... Enfin je peux mettre n'importe quel x ou n, x^n vaut toujours 4671... QUE SE PASSE-T-IL DONC ???


    Merci d'avance pour votre aide...

    BONNE JOURNEE ET BON COURAGE
    Dernière modification par yoda1234 ; 29/04/2008 à 11h01.
    " Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.

  13. #10
    yoda1234

    Re : Projet informatique pour le lundi 5 mai !!!

    Merci d'utiliser les balises à ta disposition et dans ton cas la balise code .
    Là où l'ignorance est un bienfait, c'est de la folie d'être sage (Thomas Gray).

  14. #11
    Gaara

    Re : Projet informatique pour le lundi 5 mai !!!

    Salut,

    je ne prétends pas être un pro mais je te propose çà :

    Remplace la variable PUISSANCENOMBRE par PUISSANCENBR juste pour voir..


    A+


    =)
    Et enfin on plaît aux filles... D'abord on houuhouuhouu <3

  15. #12
    badboy.nc

    Re : Projet informatique pour le lundi 5 mai !!!

    Salut Einstein, alors comme ça on veut avoir des info!!!!
    bon ben je te laisse.
    PS: L'université de Nouvelle Calédonie n'admet que "Tape Touche" dans ces salle INFO et non "counter strike" ....
    A lundi Einstein....

  16. Publicité
  17. #13
    Gaara

    Re : Projet informatique pour le lundi 5 mai !!!

    Citation Envoyé par badboy.nc Voir le message
    Salut Einstein, alors comme ça on veut avoir des info!!!!
    bon ben je te laisse.
    PS: L'université de Nouvelle Calédonie n'admet que "Tape Touche" dans ces salle INFO et non "counter strike" ....
    A lundi Einstein....

    HS non ?
    Et enfin on plaît aux filles... D'abord on houuhouuhouu <3

Sur le même thème :

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2008, 01h07
  2. Propriété de Pythagore (exercice pour lundi!!)
    Par Motivée94 dans le forum Mathématiques du collège et du lycée
    Réponses: 3
    Dernier message: 07/03/2008, 21h19
  3. Aide projet informatique
    Par Lucie017 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 04/01/2008, 17h09
  4. [CHIMIE]Aide pour un projet informatique.
    Par noname dans le forum Chimie
    Réponses: 5
    Dernier message: 18/01/2007, 15h34