vecteurs tangent, pas très tangent

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 !
YoungFrog
Messages : 14
Enregistré le : mar. 11 sept. 2012, 15:46

vecteurs tangent, pas très tangent

Message non lu par YoungFrog » ven. 20 déc. 2013, 18:08

Hello,

Le code suivant devrait si je ne m'abuse afficher un vecteur tangent + un vecteur normal en plusieurs points (je sais qu'il y a des exemples de ça dans les superbes docs des habitués de ce forum, mais j'aimerais comprendre pourquoi moi je me goure !). Or on peut remarquer qu'il y a comme un décalage : les vecteurs tangents sont pas toujours super super tangents, et les vecteurs normaux de même.

On pourrait croire que la formule ignoble pour les vecteurs normaux est responsable d'erreurs de calculs, mais en fait le vecteur normal me semble effectivement orthogonal au vecteur "tangent", le problème c'est que c'est ce dernier qui n'est pas vraiment tangent. Comme si le vecteur était juste attaché au mauvais endroit.

Vous voyez ? Hm... Je suis pas sûr que je suis très clair, n'hésitez pas à me le dire, et déjà merci pour votre aide.

Figure asymptote 0666ecc8971708760b82c11c17c0f681
*** 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. size(6cm,6cm);
  3.  
  4. real x(real t) { return t^2*cos(t); }
  5. real y(real t) { return t^2*sin(t); }
  6. real min = -1, max = 1;
  7.  
  8.  
  9. path p = graph(x,y,min,max);
  10. draw(p);
  11.  
  12. // vecteurs normaux (formule obtenue de manière automatisée...)
  13. picture vf = vectorfield(new path(real t) {
  14. real t = interp(min,max,t);
  15. // dot((x(t),y(t)));
  16. return (0,0)--unit(((t^2*sin(t) - 2*t*cos(t))*((t^2*cos(t) + 4*t*sin(t) - 2*cos(t))*(t^2*sin(t) - 2*t*cos(t)) - (t^2*cos(t) + 2*t*sin(t))*(t^2*sin(t) - 4*t*cos(t) - 2*sin(t)))/(abs(t^2*cos(t) + 2*t*sin(t))^2 + abs(t^2*sin(t) - 2*t*cos(t))^2)^(3/2) - (t^2*cos(t) + 4*t*sin(t) - 2*cos(t))/sqrt(abs(t^2*cos(t) + 2*t*sin(t))^2 + abs(t^2*sin(t) - 2*t*cos(t))^2), -(t^2*cos(t) + 2*t*sin(t))*((t^2*cos(t) + 4*t*sin(t) - 2*cos(t))*(t^2*sin(t) - 2*t*cos(t)) - (t^2*cos(t) + 2*t*sin(t))*(t^2*sin(t) - 4*t*cos(t) - 2*sin(t)))/(abs(t^2*cos(t) + 2*t*sin(t))^2 + abs(t^2*sin(t) - 2*t*cos(t))^2)^(3/2) - (t^2*sin(t) - 4*t*cos(t) - 2*sin(t))/sqrt(abs(t^2*cos(t) + 2*t*sin(t))^2 + abs(t^2*sin(t) - 2*t*cos(t))^2)));
  17. },p, 10,red+opacity(0.3));
  18. add(vf);
  19.  
  20. // vecteurs tangents
  21. picture vf = vectorfield(new path(real t) {
  22. real t = interp(min,max,t);
  23. // dot((x(t),y(t)));
  24. return (0,0)--unit((2t*cos(t)-t^2*sin(t),t^2*cos(t)+2t*sin(t)));
  25. },p, 10,red+opacity(0.3));
  26. add(vf);
  27.  
  28.  
  29. axes("$x$","$y$",Arrow);
Gentoo GNU/Linux -- Asymptote 2.24svn avec Emacs -- TeXlive 2012

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

Re: vecteurs tangent, pas très tangent

Message non lu par GM » ven. 20 déc. 2013, 19:43

Bonsoir,

je ne connais pas vectorfield, ne suis pas sûr qu'il est adapté... et il ne me serait pas venu à l'idée de l'utiliser.

Quand on me parle de tangente à un path, moi je pense à dir.

Figure asymptote 73d724505a01e81c38c6ddd902d0c72c
*** 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. size(6cm,6cm);
  3. real x(real t) { return t^2*cos(t); }
  4. real y(real t) { return t^2*sin(t); }
  5. int n=300;
  6. path p = graph(x,y,-1,1,n);
  7. draw(p);
  8. for (real t=0; t <= n; t += n/10){
  9. path ftan=point(p,t)--point(p,t)+dir(p,t)/2,
  10. fnor=point(p,t)--point(p,t)+rotate(90)*dir(p,t)/2;
  11. draw(Label(format("%f",t),EndPoint, fontsize(8pt)),ftan,red, Arrow);
  12. draw(fnor,blue, Arrow);
  13. }
  14. axes("$x$","$y$",Arrow);
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 !

YoungFrog
Messages : 14
Enregistré le : mar. 11 sept. 2012, 15:46

Re: vecteurs tangent, pas très tangent

Message non lu par YoungFrog » ven. 20 déc. 2013, 22:08

Bon sang mais c'est bien sûr : en relisant ce que fait dir(), je comprends mon erreur : le temps 't' passé par vectorfield à son premier argument (en fait, la distance entre le début de la courbe et le point considéré [*]) n'a rien à voir avec le paramètre t de *ma* paramétrisation (x(t),y(t)), et ma tentative d'interpoler via interp(min,max,t) n'y change rien. En l'écrivant j'aurais dû me dire que c'était bizarre...

Voici le code corrigé. Et merci pour ta version, qui est très claire !

Figure asymptote bbcd5f22e8a3f5731eb8523a5e359dbf
*** 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. size(6cm,6cm);
  3.  
  4. real x(real t) { return t^2*cos(t); }
  5. real y(real t) { return t^2*sin(t); }
  6. real min = -1, max = 1;
  7.  
  8.  
  9. path p = graph(x,y,min,max,500);
  10. draw(p);
  11.  
  12. // vecteurs normaux
  13. picture vf = vectorfield(new path(real t) {
  14. real t = reltime(p,t);
  15. return (0,0)--(I*dir(p,t));
  16. },p, 6,blue+opacity(0.3));
  17. add(vf);
  18.  
  19. // vecteurs tangents
  20. picture vf = vectorfield(new path(real t) {
  21. real t = reltime(p,t);
  22. return (0,0)--dir(p,t);
  23. },p, 6,red+opacity(0.3));
  24. add(vf);
  25.  
  26.  
  27. axes("$x$","$y$",Arrow);


[*] edit : plus précisément la fraction (entre 0 et 1) de la distance par rapport à la distance totale.
Modifié en dernier par YoungFrog le sam. 21 déc. 2013, 12:25, modifié 1 fois.
Gentoo GNU/Linux -- Asymptote 2.24svn avec Emacs -- TeXlive 2012

YoungFrog
Messages : 14
Enregistré le : mar. 11 sept. 2012, 15:46

Re: vecteurs tangent, pas très tangent

Message non lu par YoungFrog » ven. 20 déc. 2013, 23:40

Je voulais juste signaler que si on s'intéresse spécifiquement à la direction de l'accélération, il faut être prudent et ne pas prendre I*dir(...) comme vecteur normal : cela ne marche pas si la courbe est orientée dans le "mauvais" sens. Voici une version qui fonctionne même si on modifie le sens de la courbe :

Figure asymptote 1d5abf23841b13c3ca8fc98037d9d9b1
*** 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. size(6cm,6cm);
  3.  
  4. real x(real t) { return t^2*cos(t); }
  5. real y(real t) { return t^2*sin(t); }
  6. real min = -1, max = 1;
  7.  
  8. path p = graph(x,y,min,max,500);
  9.  
  10. draw(p);
  11.  
  12. pair normal(path p,real t) {
  13. real eps = 1;
  14. real before = t-eps, after = t+eps;
  15. if (before <= 0) { before = t; };
  16. if (after >= length(p)) { after = t; };
  17. return unit(dir(p,after) - dir(p,before));
  18. }
  19.  
  20. // vecteurs normaux
  21. picture vf = vectorfield(new path(real t) {
  22. real t = reltime(p,t);
  23. return (0,0)--normal(p,t)/2;
  24. },p, 6,blue+opacity(0.3));
  25. add(vf);
  26.  
  27. // vecteurs tangents
  28. picture vf = vectorfield(new path(real t) {
  29. real t = reltime(p,t);
  30. return (0,0)--dir(p,t)/2;
  31. },p, 6,red+opacity(0.3));
  32. add(vf);
  33.  
  34. axes("$x$","$y$",Arrow);
Gentoo GNU/Linux -- Asymptote 2.24svn avec Emacs -- TeXlive 2012

Répondre