Page 1 sur 1

Hermite...

Posté : sam. 12 mars 2016, 18:46
par Nico56
Bonsoir, je voudrais créer une fonction f à l'aide d'une interpolation (Hermite).
Je sais comment faire pour tracer un graphe, mais je n'arrive pas à définir la fonction f (pour pouvoir l'utiliser après), j'ai vu qu'on peut utiliser pwhermite mais il faut définir les coefficients directeurs des tangentes, ce que je ne veux pas avoir à gérer.

Graphe (code pris dans la galerie):

Code : Tout sélectionner

import graph;
size(10cm,0);
real[] xpt={-1,.5,2,2.5,4};
real[] ypt={2,-1,2,-2,3};

draw(graph(xpt,ypt,Hermite(monotonic)));

Merci d'avance!
Bon week-end.
Nico

Re: Hermite...

Posté : dim. 13 mars 2016, 10:04
par GM
Bonjour,

si j'ai bien compris, ceci devrait t'intéresser :

Figure asymptote d4baa94ec9fa51feca4d1f89a9c250d6
*** 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. size(200);
  2. import graph;
  3.  
  4. real[] xpt={-1,.5,2,2.5,4};
  5. real[] ypt={2,-1,2,-2,3};
  6. path Cf=graph(xpt,ypt,Hermite(monotonic));
  7. real f(real x){
  8. real[] t=times(Cf,x);
  9. return point(Cf,t[0]).y;
  10. }
  11. // Je dessine la courbe
  12. draw(Cf);
  13. // J'affiche en noir les points qui ont défini la courbe
  14. dot(Cf,8bp+black);
  15. // J'affiche en rouge les points d'abscisses 0 à 3.
  16. for(int i=0; i<4; ++i)
  17. dot((i,f(i)),6bp+red);
  18. // J'ajoute des axes en vert pour que cela soit plus lisible.
  19. axes(green);
  20. xaxis(nullpen,Ticks(scale(.5)*"",Step=1,Size=.5mm,blue));


Je devance une question : http://asy.marris.fr/asymptote/Intersec ... path_times

Re: Hermite...

Posté : lun. 14 mars 2016, 14:00
par Nico56
Merci, loin d'être trivial :)
Bonne journée.
Nico

Re: Hermite...

Posté : lun. 14 mars 2016, 15:43
par GM
Attention : j'ai supprimé l'appel à geometry.asy qui était inutile.
Nico56 a écrit :loin d'être trivial :)
Quelques explications, pour comprendre d'abord la notion de "time" :
  • Les 5 points qui définissent la courbe ont pour "time" : 0, 1, 2, 3 et 4.
  • Un point qui se situe entre le premier et le deuxième de ces 5 points a un "time" t tel que 0<t<1.
    Un point qui se situe entre le deuxième et le troisième de ces 5 points a un "time" t tel que 1<t<2.
    ...
    Un point qui se situe entre le quatrième et le dernier de ces 5 points a un "time" t tel que 3<t<4.
Parmi les fonctions qui exploitent cette notion de "time", il faut connaitre notamment les deux que j'ai utilisées :
  • La fonction real[] times(path p, real x) dont la documentation dit ceci :
    real[] times(path p, real x) returns all intersection times of path p with the vertical line through (x,0).
  • La fonction pair point(path p, real t) dont la documentation dit ceci :
    pair point(path p, real t)
    This returns the coordinates of the point between node floor(t) and floor(t)+1 corresponding to the cubic spline parameter
    t-floor(t) (see Chapter 5 [Bezier curves], page 22). If t lies outside the range [0,length(p)], it is first reduced modulo length(p) in the case where p is cyclic or else converted to the corresponding endpoint of p.
    Cette dernière fonction renvoie donc un "pair" (couple) ; et on accède à la deuxième valeur du couple (ordonnée qui est l'image de la première (abscisse) par la fonction représentée par la courbe) en ajoutant ".y".
Dois-je expliquer davantage ?

Re: Hermite...

Posté : dim. 20 mars 2016, 10:43
par Nico56
Bonjour GM, je pense avoir compris!
Merci beaucoup pour les précisions, c'est bien utile.
Je m'en vais de ce pas faire mes tests.
Bonne journée.
Nico

edit:
J'ai bien compris tes explications mais une partie de code n'est pas claire pour moi:

Code : Tout sélectionner

real f(real x){
   real[] t=times(Cf,x);
   return point(Cf,t[0]).y;
}
Je pense avoir bien bien compris le principe de la définition de f à partir de Cf, j'ai 2 questions:
1. la liste t contient combien de valeurs?
2. A chaque valeur de x, on définit une valeur de la liste t (le time de l'ordonnée du point d'intersection de X=x avec Cf,je me trompe?) puis on détermine les coordonnées du point de Cf dont le time est donné et on ne garde que l'ordonnée. Par contre, je ne comprends pas le t[0], j'avoue ne pas avoir compris la partie sur le courbes de Beziers que je ne maîtrise pas du tout...

Re: Hermite...

Posté : dim. 20 mars 2016, 11:18
par GM
Nico56 a écrit :1. la liste t contient combien de valeurs?
Comme le path est réprésentatif d'une partie de courbe de fonction, l'intersection avec une droite d'équation x=a ne donne qu'un seul point d'intersection : donc t ne contient qu'une valeur ! Et cette valeur est t[0].

Mais si tu prends un path tel que celui de l'exemple donné dans la galerie :
http://asy.marris.fr/asymptote/Intersec ... path_times
on pourrait avoir plusieurs points d'intersection et t serait une liste dont les premières valeurs seraient t[0], t[1], ...
Nico56 a écrit :2. A chaque valeur de x, on définit une valeur de la liste t (le time de l'ordonnée du point d'intersection de X=x avec Cf,je me trompe?)
A chaque valeur de x, t est une liste qui ne contient qu'un seul élément t[0] (pour la raison donnée ci-dessus).
Nico56 a écrit :puis on détermine les coordonnées du point de Cf dont le time est donné et on ne garde que l'ordonnée.
"... dont le time est récupéré par la fonction times(...') ..."

C'est cela.
Nico56 a écrit :Par contre, je ne comprends pas le t[0]
Cela devrait aller mieux avec ma première explication : c'est le premier élément de la liste t (qui n'en comporte qu'un seul dans notre cas particulier).
Nico56 a écrit :j'avoue ne pas avoir compris la partie sur les courbes de Bezier que je ne maîtrise pas du tout...
Pour bien comprendre la "construction" des path, voir cet exemple et ceux qui suivent :
http://asy.marris.fr/asymptote/Lignes/i ... ath_Bezier

Re: Hermite...

Posté : dim. 20 mars 2016, 12:27
par Nico56
J'ai mal raisonné; dans mon exemple, il est évident, en effet, que la liste t ne contienne qu'une valeur.
Merci pour les infos, j'ai bien compris maintenant!
Comme dirait l'autre, je peux mourir en paix maintenant.