Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal
Pascal Forum d'entraide sur la programmation en langage Pascal et sur les EDI. Avant de poster -> la F.A.Q Pascal, les cours
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/11/2012, 16h45   #1
roobi
Invité de passage
 
Femme
Inscription : 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
roobi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2012, 18h58   #2
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 689
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 689
Points : 1 005
Points : 1 005
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2012, 19h03   #3
roobi
Invité de passage
 
Femme
Inscription : mai 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : mai 2012
Messages : 8
Points : 0
Points : 0
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
roobi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2012, 19h51   #4
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 689
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 689
Points : 1 005
Points : 1 005
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/11/2012, 20h26   #5
roobi
Invité de passage
 
Femme
Inscription : mai 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : mai 2012
Messages : 8
Points : 0
Points : 0
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
roobi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2012, 21h49   #6
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 689
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 689
Points : 1 005
Points : 1 005
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/11/2012, 12h25   #7
Modulpro
Membre habitué
 
Avatar de Modulpro
 
Homme Emilien
Étudiant
Inscription : octobre 2010
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Emilien
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 70
Points : 148
Points : 148
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 :

Citation:
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.
Modulpro est déconnecté   Envoyer un message privé Réponse avec citation 30
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h14.


 
 
 
 
Partenaires

Hébergement Web