Page 2 sur 2

Re: somme de fonctions

Posté : ven. 22 mars 2013, 23:46
par zariski
Voilà ce que je souhaitais, c'est un peu tiré par les cheveux mais à priori ça fonctionne !

Figure asymptote 8817b4449066b8b26148469568b345ea
*** 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. // Les axes///////////////////////////////////////////
  6. draw((-0.5,0)--(5,0),0.5bp+black,Arrow); //horiz
  7. draw((0,-1)--(0,8),0.5bp+black,Arrow); //vert
  8. //////////////////////////////////////////////////////
  9.  
  10.  
  11. //Graduations verticales/////////////
  12. label("$1$",(0,1),W);
  13. draw((-0.1,1)--(0.1,1));
  14.  
  15. label("$2$",(0,2),W);
  16. draw((-0.1,2)--(0.1,2));
  17.  
  18. label("$3$",(0,3),W);
  19. draw((-0.1,3)--(0.1,3));
  20.  
  21. label("$4$",(0,4),W);
  22. draw((-0.1,4)--(0.1,4));
  23.  
  24. label("$5$",(0,5),W);
  25. draw((-0.1,5)--(0.1,5));
  26.  
  27. label("$6$",(0,6),W);
  28. draw((-0.1,6)--(0.1,6));
  29.  
  30. ////////////////////////////////////
  31.  
  32.  
  33. //Graduations horizontales/////////
  34. label("$1$",(1,0),2S);
  35. draw((1,0.1)--(1,-0.1));
  36.  
  37. label("$2$",(2,0),2S);
  38. draw((2,0.1)--(2,-0.1));
  39.  
  40. label("$3$",(3,0),2S);
  41. draw((3,0.1)--(3,-0.1));
  42.  
  43. label("$4$",(4,0),2S);
  44. draw((4,0.1)--(4,-0.1));
  45. //////////////////////////////////
  46.  
  47.  
  48.  
  49. typedef real fonction_avec_parametre(real);
  50.  
  51. fonction_avec_parametre F(int k) {
  52. return new real(real x) {
  53. return
  54. 3+sum(sequence(new real(int m){
  55. return 12*(-1)^m*cos(((2*m+1)*2*pi*x)/4)/((2*m+1)*pi);
  56. },
  57. k));
  58. };
  59. }
  60.  
  61. draw(graph(F(5),0,4,300), 1bp+red);
  62.  
  63. shipout(bbox(0mm,white,FillDraw(rgb(0.86,0.90,0.80))));

Re: somme de fonctions

Posté : sam. 23 mars 2013, 07:21
par GM
  1. La première solution fonctionne... sous réserve de ne pas oublier qu'il faut un "format" par "%i".

    Code : Tout sélectionner

    import graph;

    unitsize(1cm);

    int n=15;
    string fx="3",sfx;
    for(int k=0; k<=n; ++k)
    {
    fx += format("+12*(-1)^%i",k)+format("*cos(((2*%i+1)*2*pi*x)/4)",k)+format("/((2*%i+1)*pi)",k);
    }
    write(fx);
    sfx = "real f(real x) { return "+fx+"; }";

    eval(sfx,true);

    draw(graph(f,0,4,300), 1bp + rgb(0,0,1));

  2. Et la seconde n'a rien de tiré par les cheveux : j'ai dit dans mon premier message que j'avais deux solutions en tête. ;-)
    J'avais retenu le choix qui me permettait de ré-évoquer "eval" dont on n'avais plus parlé depuis longtemps... avec l'idée d'avoir une chaine qui permettait aussi d'écrire l'expression sur la figure : mais pour ce dernier point... il est vrai que si cela allait avec la simple somme de x^k que tu donnais au départ... on manque un peu de place et c'est peu lisible avec celle qui a suivi. :mrgreen:

NB : je rappelle que \pi a sa notation pi qui évite le 3.14.

Re: somme de fonctions

Posté : sam. 23 mars 2013, 09:15
par zariski
Cette première solution ne manque pas d'ingéniosité, je prends !
Merci pour tout !
Bonne journée.

Re: somme de fonctions

Posté : sam. 23 mars 2013, 16:25
par GM
Une suggestion pour améliorer la solution 1 :

"format" est inutile puisque que finalement, on prend l'entier sans chercher à l'écrire sous une forme particulière.

Il sera avantageusement remplacé par ceci :

Code : Tout sélectionner

string K;
for(int k=0; k<=n; ++k)
{
   K=string(k);
   fx += "+12*(-1)^"+K+"*cos(((2*"+K+"+1)*2*pi*x)/4)/((2*"+K+"+1)*pi)";
}


On gagne en clarté du code.