Nom d'une fonction

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 !
xavans
Messages : 6
Enregistré le : mar. 11 juin 2013, 12:39

Nom d'une fonction

Message non lu par xavans » mar. 18 mars 2014, 22:08

Bonjour,
je cherche comment récupérer le nom d'un fonction passée en tant qu'argument d'une autre fonction:

Exemple :

Code : Tout sélectionner

real afficher_nom_fonction(real F(real x))
{

label("$F(x)$",(1,1));

}


Dans label("F(x)"...etc, j'aimerais remplacer la lettre F par le nom de la fonction F, c'est à dire quelque chose du style F.name , par exemple, puisque ma fonction F peut avoir différents noms .

Mais je n'arrive pas à trouver la propriété qui donne le nom d'une fonction...

Quelqu'un a une idée?

Bonne journée,
Xavier .
Xavier ANSIAUX,
Windows 8.1,
Miktek2.9+Asymptote 2.32+Texmaker

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

Re: Nom d'une fonction

Message non lu par GM » mer. 19 mars 2014, 01:05

Bonsoir,
il pourrait être utile de savoir dans quel cadre cela va être utile...
car on peut se demander pourquoi tu ne peux pas définir simultanément une chaine de caractère associée à chaque nouvelle fonction créée.

Une solution qui m'a traversé l'esprit pour gérer tes fonctions : les traiter comme des objets qui ont des "attributs" (c'est à dire des "caractéristiques intrinsèques de l'objet" : nom, xmin, xmax, ...) et des "méthodes" (c'est à dire des "fonctions intrinsèques à l'objet" : draw, ...) :

Figure asymptote cd5c3c79cdfc168e1d04f5b076ab6248
*** 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. ///////////////////////////////////////////////////
  2. //// Une classe d'objets pour gérer des fonctions
  3. ///////////////////////////////////////////////////
  4. import graph;
  5. struct fonction {
  6. string nom;
  7. real expression(real x);
  8. real xmin;
  9. real xmax;
  10. void operator init(string nom, real expression(real x), real xmin, real xmax){
  11. this.nom=nom;
  12. this.expression=expression;
  13. this.xmin=xmin;
  14. this.xmax=xmax;
  15. }
  16. void draw(bool affichernom=true, Label autrenom="...",
  17. real xmin=xmin, real xmax=xmax,
  18. pen stylo=currentpen){
  19.  
  20. Label lab = (autrenom.s=="...") ? Label(this.nom,Relative(1)) : autrenom;
  21. if (!affichernom) lab=null;
  22. draw(lab,graph(this.expression,xmin,xmax),stylo);
  23. }
  24. }
  25. ///////////////////////////////////////////////////
  26. ///////////////////////////////////////////////////
  27. ///////////////////////////////////////////////////
  28. ///////////////////////////////////////////////////
  29. size(5cm);
  30.  
  31. // Une définition classique de fonction, nommée f
  32. real f(real x){return x^2;};
  33. // Une liste de 4 objets de type 'fonction'
  34. // (avec une fonction définie précédemment et 3 fonctions anonymes (opérateur new))
  35. fonction mesfonctions[] =
  36. {
  37. fonction("$f$",f,-1,1),
  38. fonction("$g$",new real(real x){return x^2-1;},-1,1),
  39. fonction("$h$",new real(real x){return x^2-2;},-1.5,1.5),
  40. fonction("$k$",new real(real x){return x^2-3;},-2,2)
  41. };
  42. /// Deux courbes avec une mise en forme personnalisée
  43. mesfonctions[0].draw(false,-.5,.5,4bp+red);
  44. mesfonctions[1].draw(Label("$C_g$",Relative(0)),-1.5,1.5,4bp+green);
  45. /// Les 4 courbes, dans le style par défaut
  46. for(fonction f:mesfonctions) f.draw();


Il va de soi... que l'exemple proposé n'a rien de finalisé : il se veut un début d'exemple démonstratif de ce que l'on peut faire dans la création d'un nouveau type d'objet.
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.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Nom d'une fonction

Message non lu par maurice » mer. 19 mars 2014, 18:52

Bonsoir,

pour répondre j'avais essayé ça :

Code : Tout sélectionner

struct fct {
  string nom;
  real f(real x);
  void operator init(string nom, real f(real x)){
    this.nom = nom;
    this.f = f;
  }
}

fct f = fct("$f$", real (real x) {return x^2;});

void affiche_nom(fct f) {
  label(f.nom, (1,1));
}

affiche_nom(f);


Il manquait le new dans la définition de f.
Peut-on avoir plus d'explication quant à l'usage du new ?

Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

xavans
Messages : 6
Enregistré le : mar. 11 juin 2013, 12:39

Re: Nom d'une fonction

Message non lu par xavans » mer. 19 mars 2014, 22:25

Bonjour,

et merci pour vos deux réponses, qui sont fort instructives .


En fait, je voulais éviter d'avoir à créer un nouvel objet qui contiendrait la fonction elle même ( par exemple real F(real x)(return x^2;)) et le nom de la fonction sous forme d'une chaîne de caractères ( qui serait alors "F").

Je me disais que ce serait pratique de pouvoir récupérer directement le nom de la fonction ( soit "F") sans avoir à créer de chaine de caractères ;
mais je vois que ce n'est pas possible.


Je me pose la même question que Bruno à propos de "new".

Bonne soirée,

Xavier .
Xavier ANSIAUX,
Windows 8.1,
Miktek2.9+Asymptote 2.32+Texmaker

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

Re: Nom d'une fonction

Message non lu par GM » mer. 19 mars 2014, 23:28

Bonsoir,

maurice a écrit :Peut-on avoir plus d'explication quant à l'usage du new ?


Pas une grande explication de ma part... car je n'ai pas creusé la spécificité d'un new d'Asymptote par rapport au new du C++, dont Asymptote utilise une partie de la syntaxe.

Mais on peut au moins donner une explication basique, à savoir que... quand on veut passer une fonction en argument d'une autre, on a le choix entre
  • la définir et la nommer préalablement (comme f dans mon exemple que j'ai modifié) et se contenter de donner son nom en argument ;
  • ou... la passer comme une fonction anonyme avec l'opérateur new.

Si vous faites des recherches sur l'opérateur new en C++, vous pourrez lire qu'il y est question de subtilités au niveau de l'allocation dynamique de mémoire... mais comme je le disais, je ne sais pas ce que le new d'Asymptote a gardé des propriétés du new du C++. Il faudrait qu'un spécialiste (que je ne suis pas) se penche sur les sources d'Asymptote pour pouvoir nous en dire plus.
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.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Nom d'une fonction

Message non lu par maurice » jeu. 20 mars 2014, 04:53

GM a écrit :Bonsoir,

maurice a écrit :Peut-on avoir plus d'explication quant à l'usage du new ?


Pas une grande explication de ma part... car je n'ai pas creusé la spécificité d'un new d'Asymptote par rapport au new du C++, dont Asymptote utilise une partie de la syntaxe.

Mais on peut au moins donner une explication basique, à savoir que... quand on veut passer une fonction en argument d'une autre, on a le choix entre
  • la définir et la nommer préalablement (comme f dans mon exemple que j'ai modifié) et se contenter de donner son nom en argument ;
  • ou... la passer comme une fonction anonyme avec l'opérateur new.



Merci je n'en demandais pas plus.

Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

xavans
Messages : 6
Enregistré le : mar. 11 juin 2013, 12:39

Re: Nom d'une fonction

Message non lu par xavans » jeu. 20 mars 2014, 08:10

Pour moi aussi,
c'est une réponse largement suffisante .

Merci,
Xavier .
Xavier ANSIAUX,
Windows 8.1,
Miktek2.9+Asymptote 2.32+Texmaker

Répondre