Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Femme Profil pro
    Inscrit en
    mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : mai 2012
    Messages : 8
    Points : 0
    Points
    0

    Par défaut Problème mathématique dans un programme

    Salut, j'ai un problème mathématique et c'est urgent dans l'exercice suivant:

    Voici l'exercice:
    Soit la suite U définie par U0=3/4 et la relation:
    pour tout n appartient N, Un+1=Un-Un²
    On admet que la suite U est décroissante et converge vers 0.
    Ecrire un programme qui détermine le premier entier n pour lequel Un< 0.001

    voici ma solution
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    program exercice;
       uses crt;
       var n:integer;
     
       function u(n:integer):real;
          var i:integer;v:real;
          begin
             v:=3/4;
             for i:=1 to n do
                v:=v-v*v;
             u:=v;
     
          end;
     
    begin
       clrscr;
       n:=0;
     
       repeat
          n:=n+1;
       until u(n)<1/1000;
     
       write('le premier entier n pour lequel Un<1/1000 est=',n);
       readln;
    end.

    Alors mon problème est qu'on est pas sûr que les valeurs de la suite passeront par 0.001 (on a l'information que la suite est décroissante mais pas qu'elle est strictement décroissante) .lorsque on exécute le programme oui c'est juste mais coté algorithmique est ce qu'il y a un problème de ne pas faire un test..
    aidez moi s'il vous plait

  2. #2
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 294
    Points : 3 281
    Points
    3 281

    Par défaut

    Bonjour !

    Ton programme me paraît répondre correctement à la question.

    Ce qui t'inquiète, c'est de savoir ce qui se passerait si cette condition

    n'était jamais remplie, c'est ça ?
    L'Art est long et le Temps est court.

  3. #3
    Invité de passage
    Femme Profil pro
    Inscrit en
    mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : mai 2012
    Messages : 8
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par Roland Chastain Voir le message
    Bonjour !

    Ton programme me paraît répondre correctement à la question.

    Ce qui t'inquiète, c'est de savoir ce qui se passerait si cette condition

    n'était jamais remplie, c'est ça ?
    merci pour votre réponse oui c'est ça le problème

  4. #4
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 294
    Points : 3 281
    Points
    3 281

    Par défaut

    Tu pourrais ajouter un test sur la valeur de n en fixant une limite :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    program exercice_02;
     
    uses
      Crt;
     
    var
      u: real;
      n: integer;
     
    begin
      u := 3/4;
      n := 0;
      while (u >= 1/1000) and (n < 5) do
      //while (u >= 1/1000) and (n < 10000) do
      //while (u >= 1/1000) and (n < High(n)) do
      begin
        u := u - u * u;
        Inc(n);
      end;
      WriteLn('n = ', n);
      ReadLn;
    end.
    Soit dit en passant, une chose que tu pourrais améliorer dans ton programme, c'est que pour chaque valeur de n, tous les termes de la suite sont recalculés inutilement.
    L'Art est long et le Temps est court.

  5. #5
    Invité de passage
    Femme Profil pro
    Inscrit en
    mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : mai 2012
    Messages : 8
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par Roland Chastain Voir le message
    Tu pourrais ajouter un test sur la valeur de n en fixant une limite :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    program exercice_02;
     
    uses
      Crt;
     
    var
      u: real;
      n: integer;
     
    begin
      u := 3/4;
      n := 0;
      while (u >= 1/1000) and (n < 5) do
      //while (u >= 1/1000) and (n < 10000) do
      //while (u >= 1/1000) and (n < High(n)) do
      begin
        u := u - u * u;
        Inc(n);
      end;
      WriteLn('n = ', n);
      ReadLn;
    end.
    Soit dit en passant, une chose que tu pourrais améliorer dans ton programme, c'est que pour chaque valeur de n, tous les termes de la suite sont recalculés inutilement.

    ah toi maintenant tu parle de la fonction que j'ai programmer oui tu as raison si je fait une fonction j'aurai des recalcules inutiles c'est vrai mais concernant votre proposition de fixer la valeur du 'n' je ne peux pas faire ça puisque elle peut être une valeur inférieur à la valeur attendu

  6. #6
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 294
    Points : 3 281
    Points
    3 281

    Par défaut

    Citation Envoyé par roobi Voir le message
    concernant votre proposition de fixer la valeur du 'n' je ne peux pas faire ça puisque elle peut être une valeur inférieur à la valeur attendu
    Pas si tu utilises cette ligne-ci :

    Code :
    while (u >= 1/1000) and (n < High(n)) do
    Adapté à ton code, cela donnerait :

    Code :
    until (u(n) < 1/1000) or (n = High(n));
    High(n) est la plus grande valeur que peut avoir la variable n.
    L'Art est long et le Temps est court.

  7. #7
    Membre habitué Avatar de Modulpro
    Homme Profil pro Emilien
    Étudiant
    Inscrit en
    octobre 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Nom : Homme Emilien
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2010
    Messages : 73
    Points : 138
    Points
    138

    Par défaut

    Bonjour,

    Pour répndre à ton premier problème :

    Citation Envoyé par roobi Voir le message
    Alors mon problème est qu'on est pas sûr que les valeurs de la suite passeront par 0.001 (on a l'information que la suite est décroissante mais pas qu'elle est strictement décroissante
    On te dit que la suite converge vers 0. C'est cette information qui te garantie qu'elle passera en dessous de 0.001 à partir d'un certain rang. En effet, la définition même de la convergence vers une limite réelle notée b est :

    Pour tout réel a > 0, il existe un entier N tel que pour tout n >= N, on a |Un - b| < a.
    Si tu remplace a par 0.001 et b par 0, la définition te garantie bien l’existence d'un rang n tel que Un < 0.001

    Cordialement.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •