Page 1 sur 2

Tracer une suite de fonctions avec Asymptote

Posté : jeu. 6 mai 2010, 16:37
par Toufan
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

Re: Tracer une suite de fonctions avec Asymptote

Posté : jeu. 6 mai 2010, 16:50
par ctop
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);

Re: Tracer une suite de fonctions avec Asymptote

Posté : jeu. 6 mai 2010, 17:43
par GM
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.  

Re: Tracer une suite de fonctions avec Asymptote

Posté : jeu. 6 mai 2010, 17:50
par Toufan
Merci GM

Toufan

Re: Tracer une suite de fonctions avec Asymptote

Posté : mer. 12 mai 2010, 14:48
par DGH
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

Re: Tracer une suite de fonctions avec Asymptote

Posté : mer. 12 mai 2010, 15:31
par GM
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.  

Re: Tracer une suite de fonctions avec Asymptote

Posté : mer. 12 mai 2010, 16:18
par GM
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.  

Re: Tracer une suite de fonctions avec Asymptote

Posté : mer. 12 mai 2010, 16:28
par DGH
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

Re: Tracer une suite de fonctions avec Asymptote

Posté : mer. 12 mai 2010, 16:37
par DGH
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

Re: Tracer une suite de fonctions avec Asymptote

Posté : mer. 12 mai 2010, 17:03
par GM
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.