Tracer une suite de fonctions avec Asymptote

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
Toufan
Messages : 2
Enregistré le : jeu. 6 mai 2010, 16:31

Tracer une suite de fonctions avec Asymptote

Message non lu par Toufan » jeu. 6 mai 2010, 16:37

Bonjour,

J'ai le problème suivant :

Je voudrais tracer la suite de fonctions f_n(x)=x^n ( x\in [0,1] ) pour n=1 \ldots 6 .

Pour différentes valeurs de n, je voudrais positionner les graphes comme dans l'image ci-dessous.

Quelqu'un a une idée?

Merci
Toufan
Fichiers joints
dessin.png
dessin.png (5.73 Kio) Vu 8230 fois

ctop
Messages : 8
Enregistré le : jeu. 18 mars 2010, 20:32

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par ctop » jeu. 6 mai 2010, 16:50

Tu peux peut-être t'inspirer de cet exemple

Code : Tout sélectionner

//Plusieurs graphes sur une même figure.
import graph;
picture pic1,pic2,pic3,pic4;
//La fonction
real f(real x){
  return 5exp(-5x)*cos(60x);
}
//Le tracé de la fig1
size(pic1,6cm,4cm,IgnoreAspect);
draw(pic1,graph(f, 0, .8), red+2);
add(pic1.fit(),(0,0),W);

//Le tracé de la fig2
size(pic2,6cm,4cm,IgnoreAspect);
draw(pic2,graph(f, 0, .8), blue+2);
add(pic2.fit(),(5mm,0),E);

//Le tracé de la fig3
size(pic3,6cm,4cm,IgnoreAspect);
draw(pic3,graph(f, 0, .8), green+2);
add(pic3.fit(),(0,-2cm),SW);

//Le tracé de la fig4
size(pic4,6cm,4cm,IgnoreAspect);
draw(pic4,graph(f, 0, .8), black+2);
add(pic4.fit(),(5mm,-2cm),SE);

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1474
Enregistré le : dim. 7 mars 2010, 14:50

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par GM » jeu. 6 mai 2010, 17:43

Une autre source d'inspiration :

Figure asymptote cb4b2c844968d1ec5dc8fa74fe12a315
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2.  
  3. unitsize(1cm);
  4.  
  5. typedef real fonction_avec_parametre(real);
  6.  
  7. fonction_avec_parametre F(real n) {
  8. return new real(real x) {return x^n;};
  9. };
  10.  
  11.  
  12. picture fonction_puissance_n(int n) {
  13. picture pic;
  14. unitsize(pic,1cm);
  15. draw(pic,graph(F(n),0,4),Pen(n));
  16. limits(pic,(0,0),(4,4),Crop);
  17. xaxis(pic,"$x$",BottomTop,LeftTicks);
  18. yaxis(pic,format("$x^%i$",n),LeftRight,RightTicks(trailingzero));
  19. return pic;
  20. }
  21.  
  22. real ev=5.5;
  23. for(int i=0; i < 3; ++i){
  24. add(fonction_puissance_n(2*i).fit(),(0,-i*ev),W);
  25. add(fonction_puissance_n(2*i+1).fit(),(0,-i*ev),E);
  26. }
  27.  
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.69)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

Toufan
Messages : 2
Enregistré le : jeu. 6 mai 2010, 16:31

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par Toufan » jeu. 6 mai 2010, 17:50

Merci GM

Toufan

DGH
Messages : 11
Enregistré le : mer. 28 avr. 2010, 14:24

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par DGH » mer. 12 mai 2010, 14:48

Dans la même type de question, je propose le problème suivant : On a six fonctions qui sont définies sur des différents intervalles, par exemple

f_1(x)=sin(x) sur [0; 3\pi]
f_2(x)=cos(x) sur [-\pi; 3\pi]
f_3(x)=log(1+sin^2(x)) sur [-2\pi; 5\pi]
f_4(x)=log(1+cos^2(x)) sur [-3\pi; \pi]
f_5(x)=\sqrt{1+x^2} sur [-2; 7]
f_6(x)=sin(\pi x)+\sqrt{1+x^2} sur [-1; 1]

Manuellement, on peut appliquer la méthode proposée par ctop.

L'idée c'est automatiser le problème et appliquer la méthode proposée par Gaétan.
Créer deux listes l'une pour les fonctions et l'autre pour les domaines, comme ceci :

ListeFonction[0]=f_1(x) , .... , ListeFonction[5]=f_6(x)
ListeDomaine[0]=pair (0, 3\pi) , .... ,  ListeDomaine[5]=pair (-1, 1)

Quelqu'un a une idée?

Merci

D.GH

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1474
Enregistré le : dim. 7 mars 2010, 14:50

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par GM » mer. 12 mai 2010, 15:31

Quelque chose comme cela ?

Figure asymptote 3cf33b647a31bb017eeac7ae9921b330
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2.  
  3. unitsize(1cm);
  4.  
  5. struct FONCTION{
  6. string n;
  7. real expr(real);
  8. real xmin;
  9. real xmax;
  10. real ymin;
  11. real ymax;
  12. void operator init(string n="",
  13. real expr(real),
  14. real xmin,
  15. real xmax,
  16. real ymin=-5,
  17. real ymax=5)
  18. {
  19. this.n=n;
  20. this.expr=expr;
  21. this.xmin=xmin;
  22. this.xmax=xmax;
  23. this.ymin=ymin;
  24. this.ymax=ymax;
  25. }
  26. }
  27.  
  28. FONCTION f1=FONCTION("$f_1$",new real(real x) {return sin(x);}, 0, 3pi, -1, 1),
  29. f2=FONCTION("$f_2$",new real(real x) {return cos(x);}, -pi, 3pi, -1, 1),
  30. f3=FONCTION("$f_3$",new real(real x) {return log(1+(sin(x))^2);}, -2pi, 5pi),
  31. f4=FONCTION("$f_4$",new real(real x) {return log(1+(cos(x))^2);}, -3pi, pi),
  32. f5=FONCTION("$f_5$",new real(real x) {return sqrt(1+x^2);}, -2, 7),
  33. f6=FONCTION("$f_6$",new real(real x) {return sin(pi*x)+f5.expr(x);}, -1, 1);
  34.  
  35. FONCTION[] f={f1,f2,f3,f4,f5,f6} ;
  36.  
  37. picture courbefonction(FONCTION f) {
  38. picture pic;
  39. size(pic,120,120,false);
  40. draw(pic,graph(f.expr,f.xmin,f.xmax));
  41. limits(pic,(f.xmin,f.ymin),(f.xmax,f.ymax),Crop);
  42. xaxis(pic,"$x$",BottomTop,LeftTicks);
  43. yaxis(pic,f.n,LeftRight,RightTicks(trailingzero));
  44. return pic;
  45. }
  46.  
  47. real eh=10, ev=5;
  48. for(int i=0; i < 3; ++i){
  49. add(courbefonction(f[2*i]).fit(),(0,-i*ev),eh*W);
  50. add(courbefonction(f[2*i+1]).fit(),(0,-i*ev),eh*E);
  51. }
  52.  
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.69)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1474
Enregistré le : dim. 7 mars 2010, 14:50

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par GM » mer. 12 mai 2010, 16:18

Une petite variante.

au delà du changement esthétique, à noter la modification de la fin du code... qui me semble mieux.

Figure asymptote d88660671b8d7679c299a2820d12a26d
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2.  
  3. unitsize(1cm);
  4.  
  5. struct FONCTION{
  6. string n;
  7. real expr(real);
  8. real xmin;
  9. real xmax;
  10. real ymin;
  11. real ymax;
  12. void operator init(string n="",
  13. real expr(real),
  14. real xmin,
  15. real xmax,
  16. real ymin=-5,
  17. real ymax=5)
  18. {
  19. this.n=n;
  20. this.expr=expr;
  21. this.xmin=xmin;
  22. this.xmax=xmax;
  23. this.ymin=ymin;
  24. this.ymax=ymax;
  25. }
  26. }
  27.  
  28. FONCTION f1=FONCTION("$f_1(x)$",new real(real x) {return sin(x);}, 0, 3pi, -1.5, 1.5),
  29. f2=FONCTION("$f_2(x)$",new real(real x) {return cos(x);}, -pi, 3pi, -1.5, 1.5),
  30. f3=FONCTION("$f_3(x)$",new real(real x) {return log(1+(sin(x))^2);}, -2pi, 5pi, -.5, 1),
  31. f4=FONCTION("$f_4(x)$",new real(real x) {return log(1+(cos(x))^2);}, -3pi, pi, -.5, 1),
  32. f5=FONCTION("$f_5(x)$",new real(real x) {return sqrt(1+x^2);}, -2, 7, 0, 10),
  33. f6=FONCTION("$f_6(x)$",new real(real x) {return sin(pi*x)+f5.expr(x);}, -1, 1, -1, 3);
  34.  
  35. FONCTION[] f={f1,f2,f3,f4,f5,f6} ;
  36.  
  37. picture courbefonction(FONCTION f, pen p) {
  38. picture pic;
  39. size(pic,120,120,false);
  40. draw(pic,graph(f.expr,f.xmin,f.xmax),p);
  41. limits(pic,(f.xmin,f.ymin),(f.xmax,f.ymax),Crop);
  42. xaxis(pic,Label("$x$",EndPoint,NE),
  43. Ticks(scale(.7)*Label(align=E),NoZero,Size=1mm, size=.5mm,pTick=black,ptick=gray),
  44. Arrow);
  45. yaxis(pic,Label(f.n,EndPoint,NE),
  46. Ticks(scale(.7)*Label(align=W),NoZero,Size=1mm, size=.5mm,pTick=black,ptick=gray),
  47. Arrow,autorotate=false);
  48. return pic;
  49. }
  50.  
  51. real eh=10, ev=5;
  52. for(int i=0; i < 3; ++i){
  53. picture pic;
  54. add(pic,courbefonction(f[2*i],Pen(2*i)).fit(),(0,0),eh*W);
  55. add(pic,courbefonction(f[2*i+1],Pen(2*i+1)).fit(),(0,0),eh*E);
  56. add(pic.fit(),truepoint(S),ev*S);
  57. }
  58.  
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.69)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

DGH
Messages : 11
Enregistré le : mer. 28 avr. 2010, 14:24

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par DGH » mer. 12 mai 2010, 16:28

GM a écrit :Quelque chose comme cela ?


Parfait.

Je vais pousser le problème plus loin. Est-il possible de produire les graphes de six fonctions à partir d'un seul code ?
Je vais expliquer , je cherche une commande qu'on note newplot qui crée une nouvelle figure. Quelque chose comme :

Code : Tout sélectionner

 newplot   ---  >  figure 1
draw(pic,graph(f1.expr,f1.xmin,f1.xmax));
....
....
 newplot  ---  >  figure 6
draw(pic,graph(f6.expr,f6.xmin,f6.xmax));


Merci

D.GH

DGH
Messages : 11
Enregistré le : mer. 28 avr. 2010, 14:24

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par DGH » mer. 12 mai 2010, 16:37

GM a écrit :Une petite variante.
au delà du changement esthétique, à noter la modification de la fin du code... qui me semble mieux.


Oui, avec des couleurs c'est mieux.
Cet exemple mérite d'être mis sur ton site (Galeries d'exemples).

D.GH

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1474
Enregistré le : dim. 7 mars 2010, 14:50

Re: Tracer une suite de fonctions avec Asymptote

Message non lu par GM » mer. 12 mai 2010, 17:03

DGH a écrit :Je vais pousser le problème plus loin. Est-il possible de produire les graphes de six fonctions à partir d'un seul code ?
Je vais expliquer , je cherche une commande qu'on note newplot qui crée une nouvelle figure. Quelque chose comme :

Code : Tout sélectionner

 newplot   ---  >  figure 1
draw(pic,graph(f1.expr,f1.xmin,f1.xmax));
....
....
 newplot  ---  >  figure 6
draw(pic,graph(f6.expr,f6.xmin,f6.xmax));


Je ne suis pas sûr de comprendre. Tu veux un fichier asy qui produit plusieurs images ????

Si c'est cela que tu veux, essaye ceci :

Code : Tout sélectionner

import graph;

unitsize(1cm);

////////////////////////////////////////////////
// Une structure pour définir des fonctions
////////////////////////////////////////////////
struct FONCTION{
  string n;
  real expr(real);
  real xmin;
  real xmax;
  real ymin;
  real ymax;
  void operator init(string n="",
                     real expr(real),
                     real xmin,
                     real xmax,
                     real ymin=-5,
                     real ymax=5)
  {
       this.n=n;
       this.expr=expr;
       this.xmin=xmin;
       this.xmax=xmax;
       this.ymin=ymin;
       this.ymax=ymax;
  }
}

FONCTION f1=FONCTION("$f_1(x)$",new real(real x) {return sin(x);}, 0, 3pi, -1.5, 1.5),
         f2=FONCTION("$f_2(x)$",new real(real x) {return cos(x);}, -pi, 3pi, -1.5, 1.5),
         f3=FONCTION("$f_3(x)$",new real(real x) {return log(1+(sin(x))^2);}, -2pi, 5pi, -.5, 1),
         f4=FONCTION("$f_4(x)$",new real(real x) {return log(1+(cos(x))^2);}, -3pi, pi, -.5, 1),
         f5=FONCTION("$f_5(x)$",new real(real x) {return sqrt(1+x^2);}, -2, 7, 0, 10),
         f6=FONCTION("$f_6(x)$",new real(real x) {return sin(pi*x)+f5.expr(x);}, -1, 1, -1, 3);
         
FONCTION[] f={f1,f2,f3,f4,f5,f6};

size(120,120,false);

///////////////////////
// Figure 1
///////////////////////
draw(graph(f1.expr,f1.xmin,f1.xmax),red);
limits((f1.xmin,f1.ymin),(f1.xmax,f1.ymax),Crop);
xaxis(Label("$x$",EndPoint,NE),
      Ticks(scale(.7)*Label(align=E),NoZero,Size=1mm, size=.5mm,pTick=black,ptick=gray),
      Arrow);
yaxis(Label(f1.n,EndPoint,NE),
      Ticks(scale(.7)*Label(align=W),NoZero,Size=1mm, size=.5mm,pTick=black,ptick=gray),
      Arrow,autorotate=false);
shipout(prefix="figure_1");    

erase();

///////////////////////
// Figure 2
///////////////////////
draw(graph(f2.expr,f2.xmin,f2.xmax),red);
limits((f2.xmin,f2.ymin),(f2.xmax,f2.ymax),Crop);
xaxis(Label("$x$",EndPoint,NE),
      Ticks(scale(.7)*Label(align=E),NoZero,Size=1mm, size=.5mm,pTick=black,ptick=gray),
      Arrow);
yaxis(Label(f2.n,EndPoint,NE),
      Ticks(scale(.7)*Label(align=W),NoZero,Size=1mm, size=.5mm,pTick=black,ptick=gray),
      Arrow,autorotate=false);
shipout(prefix="figure_2");    


ou encore

Code : Tout sélectionner

add(courbefonction(f1,red).fit());
shipout(prefix="figure_1");    
erase();
add(courbefonction(f2,blue).fit());
shipout(prefix="figure_2");    


avec la fonction courbefonction du message précédent.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.69)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

Répondre