Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Sélection des nombres d'une liste compris entre tant et tant

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
slave97



Inscrit le: 03 Avr 2006
Messages: 29

MessagePosté le: 09 Sep 2011 16:21    Sujet du message: Sélection des nombres d'une liste compris entre tant et tant Répondre en citant

Bonjour,



Je souhaite construire une liste qui me renvoie les éléments d'une première liste compris entre tel nombre et tel nombre et qui me donne les nombres en question sous forme de fraction et en décimales flottantes...

Voilà ce que j'ai déjà fait:




"" a := seq(a, a = 1 .. 9); e := [evalf(seq(a/j, j = 1 .. 9))]; M := convert(e, set); sort(e) ""


Voilà je voudrais que mapple ne donne que les nombres compris entre tel et tel chiffre comment faire merci.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 10 Sep 2011 8:59    Sujet du message: Re: Répondre en citant

Bonjour,
Voici cette procédure qui construit à partir d'une séquence double les nombres de la forme i/j, pour i entre a et b entiers positifs donnés, et j entre c et d entiers positifs donnés.
On peut ensuite l'évaluer numériquement et la trier.

Code:

> liste:=proc(a::posint,b::posint,c::posint,d::posint)
>   [seq(seq(i/j,j=c..d),i=a..b)];
> end proc:
>
> liste(1,9,1,9);

  [1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 2, 1, 2/3, 1/2, 2/5,

        1/3, 2/7, 1/4, 2/9, 3, 3/2, 1, 3/4, 3/5, 1/2, 3/7, 3/8, 1/3,

        4, 2, 4/3, 1, 4/5, 2/3, 4/7, 1/2, 4/9, 5, 5/2, 5/3, 5/4, 1,

        5/6, 5/7, 5/8, 5/9, 6, 3, 2, 3/2, 6/5, 1, 6/7, 3/4, 2/3, 7,

        7/2, 7/3, 7/4, 7/5, 7/6, 1, 7/8, 7/9, 8, 4, 8/3, 2, 8/5, 4/3,

        8/7, 1, 8/9, 9, 9/2, 3, 9/4, 9/5, 3/2, 9/7, 9/8, 1]

> liste(4,7,3,8);

  [4/3, 1, 4/5, 2/3, 4/7, 1/2, 5/3, 5/4, 1, 5/6, 5/7, 5/8, 2, 3/2,

        6/5, 1, 6/7, 3/4, 7/3, 7/4, 7/5, 7/6, 1, 7/8]

> evalf(%);

  [1.333333333, 1., 0.8000000000, 0.6666666667, 0.5714285714,

        0.5000000000, 1.666666667, 1.250000000, 1., 0.8333333333,

        0.7142857143, 0.6250000000, 2., 1.500000000, 1.200000000, 1.,

        0.8571428571, 0.7500000000, 2.333333333, 1.750000000,

        1.400000000, 1.166666667, 1., 0.8750000000]

> sort(%);

  [0.5000000000, 0.5714285714, 0.6250000000, 0.6666666667,

        0.7142857143, 0.7500000000, 0.8000000000, 0.8333333333,

        0.8571428571, 0.8750000000, 1., 1., 1., 1., 1.166666667,

        1.200000000, 1.250000000, 1.333333333, 1.400000000,

        1.500000000, 1.666666667, 1.750000000, 2., 2.333333333]



Est-ce cela vous convient?
(le second message en double a été supprimé)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
slave97



Inscrit le: 03 Avr 2006
Messages: 29

MessagePosté le: 10 Sep 2011 10:20    Sujet du message: Répondre en citant

Bonjour, : )



Quel plaisir ALS de voir que vous êtes là pour nous aider.!
Merci pour votre réponse et de votre aide inestimable..!
Mais je pense que je me suis mal exprimé sur mon projet, permettez-moi donc...


En fait la séquence à la base c'est ça :

''"" a := seq(a, a = 1 .. 9); e := [evalf(seq(a/j, j = 1 .. 9))]; M := convert(e, set); sort(e) "" ''


Mais je ne voudrais pas que Maple fasse tous les calculs, perte de temps et pas très bon pour la mémoire, je voudrais que Maple me donne comme résultat que les quotients (a/j) qui seraient eux compris entre x et y par exemple entre 1 et 2.


donc du style ( 1. 1,25 ; 1,50 ; 1.75 .... 2 )

et non pas ( 0,33 ; 0,75 ; 0,95 ; 1. 1,25 ; 1,50 ; 1.75 ; 2 ; 3 ; ....)


Et si possible que maple donne chaque résultat sous sa forme de fraction accolée à sa forme décimale du style :


( 1/1 = 1 ; 3/2 = 1.5 ; 5/3 = 1,66... 8/4 = 2)

Donc là Maple a renvoyé que les résultats du quotient (a/j) compris entre 1 et 2 et il a mis les résultats sous forme de fraction et de décimales...


Voilà, voilà en espérant que j'ai pas été trop long.
Je vous remercie d'avance ALS pour votre précieuse aide.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 10 Sep 2011 14:52    Sujet du message: Répondre en citant

Voici ce que je vous propose:
On sous-entend x<=y.
Pour avoir x<= a/j <=y , on prend j entier entre a/y et a/x.
D'où les 2 bornes mini et maxi à calculer suivant les valeurs de a,x,y a variant de 1 à 9.

Code:

> liste:=proc(x::posint,y::posint)
> local a,j,L,mini,maxi;
> L:=NULL:
> for a to 9 do
>   if type(a/y,posint) then mini:=a/y else mini:=floor(a/y)+1 fi;
>   if type(a/x,posint) then maxi:=a/x else maxi:=floor(a/x) fi;
>   for j from mini to maxi do
>     L:=L,cat(a,`/`,j)=evalf(a/j)
>   end do
> end do:
> {L}
> end proc:
>   
> liste(1,4);

  {1/1 = 1., 2/1 = 2., 2/2 = 1., 3/1 = 3., 3/2 = 1.500000000,

        3/3 = 1., 4/1 = 4., 4/2 = 2., 4/3 = 1.333333333, 4/4 = 1.,

        5/2 = 2.500000000, 5/3 = 1.666666667, 5/4 = 1.250000000,

        5/5 = 1., 6/2 = 3., 6/3 = 2., 6/4 = 1.500000000,

        6/5 = 1.200000000, 6/6 = 1., 7/2 = 3.500000000,

        7/3 = 2.333333333, 7/4 = 1.750000000, 7/5 = 1.400000000,

        7/6 = 1.166666667, 7/7 = 1., 8/2 = 4., 8/3 = 2.666666667,

        8/4 = 2., 8/5 = 1.600000000, 8/6 = 1.333333333,

        8/7 = 1.142857143, 8/8 = 1., 9/3 = 3., 9/4 = 2.250000000,

        9/5 = 1.800000000, 9/6 = 1.500000000, 9/7 = 1.285714286,

        9/8 = 1.125000000, 9/9 = 1.}



C'est bien ce que vous cherchiez à obtenir?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
slave97



Inscrit le: 03 Avr 2006
Messages: 29

MessagePosté le: 10 Sep 2011 15:43    Sujet du message: Vous êtes un génie...! : ) Répondre en citant

Bonjour ALS, : )



Vous êtes un génie c'est pas possible, avec vous il n'y à que des solutions....!
Extraordinaire...!
Merci, merci merci...!
Les gens comme vous sont des perles si rares....! Puisse D.. vous garder...!

Dernière chose s'il vous plait, si au lieu de prendre les bornes x et y comme entiers du style ( 1 , 4 ) si je voulais prendre par exemple un entier et un décimal comme borne du style x et y tel que ( 1 ; 1.5 )......??


Soyez Béni...!
Merci ALS.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
slave97



Inscrit le: 03 Avr 2006
Messages: 29

MessagePosté le: 10 Sep 2011 18:46    Sujet du message: Re. Répondre en citant

Bonjour ALS,



Pensez-vous qu'il soit possible d'ordonner les résultats selon un ordre croissant et d'éviter les doublons avec la commande "" CONVERT "" et "" SORT ""..??
Merci.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 11 Sep 2011 8:12    Sujet du message: Répondre en citant

Bonjour,
Merci pour vos remarques, mais n'en jetez plus...la cour est pleine!!
Pour répondre à votre première question, il suffit de remplacer le type posint (entier>0) de x et y par le type numeric (nombre) et vous pouvez avoir les 2 bornes sous forme de nombre flottant.

Exemple avec x=1.5 et y=3.7 :

Code:

>  liste:=proc(x::numeric,y::numeric)
>  local a,j,L,mini,maxi;
>  L:=NULL:
>  for a to 9 do
>    if type(a/y,posint) then mini:=a/y else mini:=floor(a/y)+1 fi;
>    if type(a/x,posint) then maxi:=a/x else maxi:=floor(a/x) fi;
>    for j from mini to maxi do
>      L:=L,cat(a,`/`,j)=evalf(a/j)
>    end do
>  end do:
>  {L}
>  end proc:
 
> liste(1.5,3.7);

  {2/1 = 2., 3/1 = 3., 3/2 = 1.500000000, 4/2 = 2., 5/2 = 2.500000000,

        5/3 = 1.666666667, 6/2 = 3., 6/3 = 2., 6/4 = 1.500000000,

        7/2 = 3.500000000, 7/3 = 2.333333333, 7/4 = 1.750000000,

        8/3 = 2.666666667, 8/4 = 2., 8/5 = 1.600000000, 9/3 = 3.,

        9/4 = 2.250000000, 9/5 = 1.800000000, 9/6 = 1.500000000}
 


A plus tard.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 11 Sep 2011 8:51    Sujet du message: Répondre en citant

Quant à votre seconde question:
Citation:
Pensez-vous qu'il soit possible d'ordonner les résultats selon un ordre croissant et d'éviter les doublons avec la commande "" CONVERT "" et "" SORT ""..??


je vous apporte une solution: c'est plus compliqué, car on travaille sur une liste dont les membres sont des équations du type 5/2 = 2.5.

Dans la procédure liste, j'ai enlevé les doublons: je n'ajoute dans L que si ce nombre evalf(a/j) n'est pas déjà apparu dans {M}.

J'écris ensuite une procédure qui échange dans une liste les 2 membres à la position i et j.

Ensuite, je n'utilise pas SORT mais j'écris une procédure de tri à bulles (bubblesort) qui trie la liste selon l'ordre croissant (rhs récupère la partie à droite de l'égalité dans chaque équation).

Code:

> liste:=proc(x::numeric,y::numeric)
> local a,j,L,M,mini,maxi,u;
>  L:=NULL: M:=NULL:   
>  for a to 9 do
>    if type(a/y,posint) then mini:=a/y else mini:=floor(a/y)+1 fi;
>    if type(a/x,posint) then maxi:=a/x else maxi:=floor(a/x) fi;
>    for j from mini to maxi do
>      u:=evalf(a/j):
>      if not member(u,{M}) then M:=M,u: L:=L,cat(a,`/`,j)=u end if
>    end do
>  end do:
>  {L}
> end proc:


> L:=liste(1.5,3.7);

  L := {2/1 = 2., 3/1 = 3., 3/2 = 1.500000000, 5/2 = 2.500000000,

        5/3 = 1.666666667, 7/2 = 3.500000000, 7/3 = 2.333333333,

        7/4 = 1.750000000, 8/3 = 2.666666667, 8/5 = 1.600000000,

        9/4 = 2.250000000, 9/5 = 1.800000000}


> echange:=proc(T::list,i::posint,j::posint)
>      subsop(i=T[j],j=T[i],T)
> end proc:

 
> echange(convert(L,list),2,3);

  [2/1 = 2., 3/2 = 1.500000000, 3/1 = 3., 5/2 = 2.500000000,

        5/3 = 1.666666667, 7/2 = 3.500000000, 7/3 = 2.333333333,

        7/4 = 1.750000000, 8/3 = 2.666666667, 8/5 = 1.600000000,

        9/4 = 2.250000000, 9/5 = 1.800000000]


> tri_a_bulles:=proc(T::list)
>    local Z,i,j,n;
>    Z:=T: n:=nops(T):
>    for j from n to 2 by -1 do
>          for i to j-1 do
>              if rhs(Z[i])>rhs(Z[i+1]) then Z:=echange(Z,i,i+1) end if
>          end do;
>    end do;
>    Z;
> end proc:

 
> tri_a_bulles(convert(L,list));

  [3/2 = 1.500000000, 8/5 = 1.600000000, 5/3 = 1.666666667,

        7/4 = 1.750000000, 9/5 = 1.800000000, 2/1 = 2.,

        9/4 = 2.250000000, 7/3 = 2.333333333, 5/2 = 2.500000000,

        8/3 = 2.666666667, 3/1 = 3., 7/2 = 3.500000000]



Voilà, ça commence déjà à être de la programmation de bon niveau et qui utilise bien les possibilités de MAPLE.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
slave97



Inscrit le: 03 Avr 2006
Messages: 29

MessagePosté le: 11 Sep 2011 10:10    Sujet du message: : ) Répondre en citant

Bonjour AlS : )




Mille Merci pour votre aide......! ça fonctionne à merveille.....!
D.. vous garde....! Soyez béni....!

A plus tard.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.