 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
slave97
Inscrit le: 03 Avr 2006 Messages: 29
|
Posté le: 09 Sep 2011 16:21 Sujet du message: Sélection des nombres d'une liste compris entre tant et tant |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 10 Sep 2011 8:59 Sujet du message: Re: |
|
|
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 |
|
 |
slave97
Inscrit le: 03 Avr 2006 Messages: 29
|
Posté le: 10 Sep 2011 10:20 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 10 Sep 2011 14:52 Sujet du message: |
|
|
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 |
|
 |
slave97
Inscrit le: 03 Avr 2006 Messages: 29
|
Posté le: 10 Sep 2011 15:43 Sujet du message: Vous êtes un génie...! : ) |
|
|
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 |
|
 |
slave97
Inscrit le: 03 Avr 2006 Messages: 29
|
Posté le: 10 Sep 2011 18:46 Sujet du message: Re. |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 11 Sep 2011 8:12 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 11 Sep 2011 8:51 Sujet du message: |
|
|
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 |
|
 |
slave97
Inscrit le: 03 Avr 2006 Messages: 29
|
Posté le: 11 Sep 2011 10:10 Sujet du message: : ) |
|
|
Bonjour AlS : )
Mille Merci pour votre aide......! ça fonctionne à merveille.....!
D.. vous garde....! Soyez béni....!
A plus tard. |
|
Revenir en haut de page |
|
 |
|
|
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
|

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.
|