Surface p-V-T d'un corps pur

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 !
Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Surface p-V-T d'un corps pur

Message non lu par GM » jeu. 29 avr. 2010, 21:11

Avec ceci avant la boucle for :

Code : Tout sélectionner

guide lignecoexistence1,lignecoexistence2;

cela avant la redéfinition de Cf :

Code : Tout sélectionner

lignecoexistence1=lignecoexistence1..point(Cf,zi[0]);
lignecoexistence2=lignecoexistence2..point(Cf,zi[2]);

et encore ceci après la boucle for :

Code : Tout sélectionner

draw(lignecoexistence1..reverse(lignecoexistence2),blue);


tu devrais obtenir quelque chose comme cela :
2010-04-29_220313.png
Diagramme PVT de changement de phase d'un corps pur.
2010-04-29_220313.png (31.3 Kio) Vu 7659 fois
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 !

cjorssen
Messages : 23
Enregistré le : dim. 14 mars 2010, 17:35

Re: Surface p-V-T d'un corps pur

Message non lu par cjorssen » mar. 4 mai 2010, 11:18

Ce résultat est déjà excellent en soi pour la représentation 2D. Un grand merci.

La même chose avec un peu plus de couleur pour identifier les différents domaines.

Code : Tout sélectionner

unitsize(4cm,8cm);

import graph;

// t est la température réduite
real t;
// C_isotherme_VdW : isotherme de Van der Walls (conduisant pour t<1
// à des propriétés non physiques)
path C_isotherme_VdW;
// C_isotherme_Andrews : isotherme de Van der Walls corrigées
// (palier de liquéfaction)
path C_isotherme_Andrews;
// Cg et C_palier sont des courbes auxiliaires nécessaires au calcul
path Cg,C_palier;
// vmin et vmax sont les bornes du volume réduit utilisées pour la
// détermination du palier de liquéfaction (ne correspond pas forcément
// aux bornes de l'affichage définitif)
// On prend vmin très légèrement supérieur à 1/3 car sinon problème de
// définition de la pression réduite p (voir infra)
real vmin=1/3+0.000001;
real vmax=30;
// precision est la précision du calcul d'aire (Maxwell)
real precision=.0001;
// Variable auxiliaire pour le calcul d'aire
real diff_aires;
// nb_points est le nombre de points servant à obtenir C_isotherme_VdW
int  nb_points=1000;
// Variables auxiliaires dichotomie
real a,b,c;

// Guide (un peu un équivalent de path) pour la courbe de saturation
// construite point par point dans la boucle suivante
guide C_saturation_liquide,C_saturation_vapeur;

// Style du tracé des isothermes
pen couleur_hypercritique = red;
pen couleur_liquide = .5green;
pen couleur_vapeur = purple;
pen couleur_liquide_vapeur = couleur_liquide + couleur_vapeur;
pen style_isotherme;

// Boucle sur différentes valeurs de la température réduite
for(int i=-27; i<10; ++i){
  t=1+i/100;
  write(t);
  // Équation de Van der Waals en coordonnées réduites
  real p(real v){return 8*t/(3*v-1)-3/v^2;}
  // La courbe représentant l'isotherme de Van der Waals est calculée
  C_isotherme_VdW=graph(p,vmin,vmax,n=nb_points,Spline);
  if(t>=1){
    // Si la température critique est supérieure à 1, le fluide de Van der
    // Waals est supercritique. Il ne subit pas de changement d'état.
    // L'isotherme d'Andrews est identique à l'isotherme de Van der Waals.
    C_isotherme_Andrews=C_isotherme_VdW;
    draw(C_isotherme_Andrews,couleur_hypercritique);}
  else{
    // Sinon, il faut déterminer la position du palier de liquéfaction.
    // Ici, on utilise la construction de Maxwell : voir par exemple
    // www.lerepairedessciences.fr/sciences/agregation_fichiers/thermo/maxw.pdf
    //
    // Soit v1 le volume réduit corespondant au minimum
    // (tangente horizontale) de l'isotherme de Van der Waals.
    // Cg est l'isotherme de Van der Waals pour v > v1.
    Cg=subpath(C_isotherme_VdW,
          dirtime(C_isotherme_VdW,(1,0)),
          reltime(C_isotherme_VdW,1));
    // Soit v2 le volume réduit correspondant au maximum de l'isotherme de
    // Van der Waals. Cg est l'isotherme de Van der Waals pour v1 < v < v2.
    Cg=subpath(Cg,0,maxtimes(Cg)[1]);
    // a est la pression réduite pour le volume v1 (le minimum de p)
    a=max(min(Cg).y,.02);
    // b est la pression réduite pour le volume v2 (la maximum de p)
    b=max(Cg).y;
    // On initialise diff_aires à une valeur supérieure pour rentrer dans
    // la boucle while
    diff_aires=2*precision;
    while(abs(diff_aires)>precision)
      {
   // On amorce une boucle pour procéder par dichotomie afin
   // de trouver la pression réduite du palier de liquéfaction
   // donnant des aires égales compte tenu de la précision
   // demandée.
   c=(a+b)/2;
   // v_palier_inter_isotherme_VdW est un tableau donnant généralement
   // 3 valeurs de v correspondant à la valeur de la pression d'essai
   // du palier stockée dans c
   real[] v_palier_inter_isotherme_VdW=times(C_isotherme_VdW,(0,c));
   if(v_palier_inter_isotherme_VdW.length!=3) {
     // Problème...
     write("attention");
     break;
   }
   // Pour calculer l'aire de Maxwell, il faut recentrer les courbes
   // sur l'axe des abscisses. On retranche dans à la pression de Van
   // der Waals p(v) la pression d'essai du palier c.
   real g(real v){return p(v)-c;}
   // Méthode de simpson pour le calcul d'intégrale
   diff_aires=simpson(g,
            point(C_isotherme_VdW,
             v_palier_inter_isotherme_VdW[0]).x,
            point(C_isotherme_VdW,
             v_palier_inter_isotherme_VdW[2]).x);
   // Dichotomie
   if(diff_aires<0) b=c; else a=c;
      }
    // Construction du palier (la pression réduite de liquéfaction vaut c)
    real h(real v){return c;}
    // Deux points suffisent pour construire une droite
    C_palier=graph(h,vmin,vmax,n=2);
    real[] v_palier_inter_isotherme_VdW=times(C_isotherme_VdW,(0,c));
    if(v_palier_inter_isotherme_VdW.length==3){
      C_saturation_liquide=C_saturation_liquide..
   point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[0]);
      C_saturation_vapeur=C_saturation_vapeur..
   point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[2]);
      C_isotherme_Andrews=firstcut(C_isotherme_VdW,C_palier).before
   -- lastcut(C_isotherme_VdW,C_palier).after;}
    draw(firstcut(C_isotherme_VdW,C_palier).before,couleur_liquide);
    draw(point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[0]) --
    point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[2]),
    couleur_liquide_vapeur);
    draw(lastcut(C_isotherme_VdW,C_palier).after,couleur_vapeur);
    write(v_palier_inter_isotherme_VdW);
  }
  // draw(C_isotherme_Andrews,style_isotherme);
}   
draw(C_saturation_liquide..reverse(C_saturation_vapeur),blue);

xlimits(-.5,4.5,Crop);
ylimits(-.2,1.5,Crop);

xaxis(Label("$v_r$",position=EndPoint, align=SE),
      xmin=0, xmax=4.6,
      Ticks(scale(.7)*Label(),
            NoZero,
            Step=.5,step=.1,
            Size=2mm, size=1mm,
            pTick=black,ptick=gray),
      Arrow);

yaxis(Label("$p_r$",position=EndPoint, align=NE),
      ymin=-.1,ymax=1.55,
      Ticks(scale(.7)*Label(),
            NoZero,
            Step=0.5,step=.1,
            Size=2mm, size=1mm,
            pTick=black,ptick=gray),
      Arrow);
write("patienter encore un peu...");


--
Christophe

cjorssen
Messages : 23
Enregistré le : dim. 14 mars 2010, 17:35

Re: Surface p-V-T d'un corps pur

Message non lu par cjorssen » mar. 4 mai 2010, 13:28

Je me dis qu'une étape supplémentaire pour avoir la figure en 3D est d'avoir aussi les isobares. Voilà ce que j'ai fait. Ça marche... presque :?

Code : Tout sélectionner

unitsize(4cm,8cm);

import graph;

// t est la température réduite
real t;
// C_isotherme_VdW : isotherme de Van der Waals (conduisant pour t<1
// à des propriétés non physiques)
path C_isotherme_VdW;
path C_isobare_VdW;
// C_isotherme_Andrews : isotherme de Van der Waals corrigées
// (palier de liquéfaction)
path C_isotherme_Andrews;
path C_isobare_Andrews;
// Cg et C_palier sont des courbes auxiliaires nécessaires au calcul
path Cg,C_palier;
path Cg_isobare,C_palier_isobare;
// vmin et vmax sont les bornes du volume réduit utilisées pour la
// détermination du palier de liquéfaction (ne correspond pas forcément
// aux bornes de l'affichage définitif)
// On prend vmin très légèrement supérieur à 1/3 car sinon problème de
// définition de la pression réduite p (voir infra)
real vmin=1/3+0.000001;
real vmax=30;
// precision est la précision du calcul d'aire (Maxwell)
real precision=.0001;
// Variable auxiliaire pour le calcul d'aire
real diff_aires;
// nb_points est le nombre de points servant à obtenir C_isotherme_VdW
int  nb_points=1000;
// Variables auxiliaires dichotomie
real a,b,c;

// Guide (un peu un équivalent de path) pour la courbe de saturation
// construite point par point dans la boucle suivante
guide C_saturation_liquide,C_saturation_vapeur;
guide C_saturation_liquide_isobare,C_saturation_vapeur_isobare;

// Style du tracé des isothermes
pen couleur_hypercritique = red;
pen couleur_liquide = .5green;
pen couleur_vapeur = purple;
pen couleur_liquide_vapeur = couleur_liquide + couleur_vapeur;
pen style_isotherme;

// Un tableau pour conserver les pressions de changement d'état calculées
// pour les isothermes. Cela peut être utile pour construire les isobares
// "qui vont bien".
real[] pression_palier_isotherme;
real[] vmin_palier,vmax_palier;
//
int imin=-10,imax=10;

// Boucle sur différentes valeurs de la température réduite
for(int i=imin; i<imax; ++i){
  t=1+i/100;
  write(t);
  // Équation de Van der Waals en coordonnées réduites
  real p(real v){return 8*t/(3*v-1)-3/v^2;}
  // La courbe représentant l'isotherme de Van der Waals est calculée
  C_isotherme_VdW=graph(p,vmin,vmax,n=nb_points,Spline);
  if(t>=1){
    // Si la température critique est supérieure à 1, le fluide de Van der
    // Waals est supercritique. Il ne subit pas de changement d'état.
    // L'isotherme d'Andrews est identique à l'isotherme de Van der Waals.
    C_isotherme_Andrews=C_isotherme_VdW;
    pression_palier_isotherme[i-imin]=t;
    vmin_palier[i-imin]=-1;
    vmax_palier[i-imin]=-1;
    // draw(C_isotherme_Andrews,couleur_hypercritique);
  }
  else{
    // Sinon, il faut déterminer la position du palier de liquéfaction.
    // Ici, on utilise la construction de Maxwell : voir par exemple
    // www.lerepairedessciences.fr/sciences/agregation_fichiers/thermo/maxw.pdf
    //
    // Soit v1 le volume réduit corespondant au minimum
    // (tangente horizontale) de l'isotherme de Van der Waals.
    // Cg est l'isotherme de Van der Waals pour v > v1.
    Cg=subpath(C_isotherme_VdW,
          dirtime(C_isotherme_VdW,(1,0)),
          reltime(C_isotherme_VdW,1));
    // Soit v2 le volume réduit correspondant au maximum de l'isotherme de
    // Van der Waals. Cg est l'isotherme de Van der Waals pour v1 < v < v2.
    Cg=subpath(Cg,0,maxtimes(Cg)[1]);
    // a est la pression réduite pour le volume v1 (le minimum de p)
    a=max(min(Cg).y,.02);
    // b est la pression réduite pour le volume v2 (la maximum de p)
    b=max(Cg).y;
    // On initialise diff_aires à une valeur supérieure pour rentrer dans
    // la boucle while
    diff_aires=2*precision;
    while(abs(diff_aires)>precision)
      {
   // On amorce une boucle pour procéder par dichotomie afin
   // de trouver la pression réduite du palier de liquéfaction
   // donnant des aires égales compte tenu de la précision
   // demandée.
   c=(a+b)/2;
   // v_palier_inter_isotherme_VdW est un tableau donnant généralement
   // 3 valeurs de v correspondant à la valeur de la pression d'essai
   // du palier stockée dans c
   real[] v_palier_inter_isotherme_VdW=times(C_isotherme_VdW,(0,c));
   if(v_palier_inter_isotherme_VdW.length!=3) {
     // Problème...
     write("attention");
     break;
   }
   // Pour calculer l'aire de Maxwell, il faut recentrer les courbes
   // sur l'axe des abscisses. On retranche dans à la pression de Van
   // der Waals p(v) la pression d'essai du palier c.
   real g(real v){return p(v)-c;}
   // Méthode de simpson pour le calcul d'intégrale
   diff_aires=simpson(g,
            point(C_isotherme_VdW,
             v_palier_inter_isotherme_VdW[0]).x,
            point(C_isotherme_VdW,
             v_palier_inter_isotherme_VdW[2]).x);
   // Dichotomie
   if(diff_aires<0) b=c; else a=c;
      }
    // Construction du palier (la pression réduite de liquéfaction vaut c)
    real h(real v){return c;}
    pression_palier_isotherme[i-imin]=c;
    // Deux points suffisent pour construire une droite
    C_palier=graph(h,vmin,vmax,n=2);
    real[] v_palier_inter_isotherme_VdW=times(C_isotherme_VdW,(0,c));
    if(v_palier_inter_isotherme_VdW.length==3){
      C_saturation_liquide=C_saturation_liquide..
   point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[0]);
      C_saturation_vapeur=C_saturation_vapeur..
   point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[2]);
      C_isotherme_Andrews=firstcut(C_isotherme_VdW,C_palier).before
   -- lastcut(C_isotherme_VdW,C_palier).after;
      // draw(firstcut(C_isotherme_VdW,C_palier).before,couleur_liquide);
      // draw(point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[0]) --
      //       point(C_isotherme_VdW,v_palier_inter_isotherme_VdW[2]),
      //       couleur_liquide_vapeur);
      // draw(lastcut(C_isotherme_VdW,C_palier).after,couleur_vapeur);
      vmin_palier[i-imin]=v_palier_inter_isotherme_VdW[0];
      vmax_palier[i-imin]=v_palier_inter_isotherme_VdW[2];}
    write(v_palier_inter_isotherme_VdW);
    write("Vmin "+string(vmin_palier[i-imin]));
  }
  // draw(C_isotherme_Andrews,style_isotherme);
}   
//draw(C_saturation_liquide..reverse(C_saturation_vapeur),blue);

write(pression_palier_isotherme);
real p;

// Boucle sur différentes valeurs de la pression réduite
for(int i=imin; i<imax; ++i){
  p=pression_palier_isotherme[i-imin];
  write(p);
  // Équation de Van der Waals en coordonnées réduites
  real t(real v){return (p+(3/v^2))*(3*v-1)/8;}
  // La courbe représentant l'isotherme de Van der Waals est calculée
  C_isobare_VdW=graph(t,vmin,vmax,n=nb_points,Spline);
  if(p>=1){
    // Si la pression critique est supérieure à 1, le fluide de Van der
    // Waals est supercritique. Il ne subit pas de changement d'état.
    // L'isobare d'Andrews est identique à l'isobare de Van der Waals.
    C_isobare_Andrews=C_isobare_VdW;
    draw(C_isobare_Andrews,couleur_hypercritique);}
  else{
    // Sinon, il faut déterminer la position du palier de liquéfaction.
    real t_palier(real v){return t(vmin_palier[i-imin]);}
    // Deux points suffisent pour construire une droite
    write(t_palier(vmin));
    C_palier_isobare=
      graph(t_palier,vmin,vmax,n=2);
    C_saturation_liquide_isobare=C_saturation_liquide_isobare..
      point(C_isobare_VdW,vmin_palier[i-imin]);
    C_saturation_vapeur_isobare=C_saturation_vapeur_isobare..
      point(C_isobare_VdW,vmax_palier[i-imin]);
    C_isobare_Andrews=firstcut(C_isobare_VdW,C_palier_isobare).before
      -- lastcut(C_isobare_VdW,C_palier_isobare).after;
    draw(firstcut(C_isobare_VdW,C_palier_isobare).before,couleur_liquide);
    draw(point(C_isobare_VdW,vmin_palier[i-imin]) --
        point(C_isobare_VdW,vmax_palier[i-imin]),
          couleur_liquide_vapeur);
    draw(lastcut(C_isobare_VdW,C_palier_isobare).after,couleur_vapeur);
  }
}


xlimits(-.5,4.5,Crop);
ylimits(-.2,1.5,Crop);

xaxis(Label("$v_r$",position=EndPoint, align=SE),
      xmin=0, xmax=4.6,
      Ticks(scale(.7)*Label(),
            NoZero,
            Step=.5,step=.1,
            Size=2mm, size=1mm,
            pTick=black,ptick=gray),
      Arrow);

yaxis(Label("$t_r$",position=EndPoint, align=NE),
      ymin=-.1,ymax=1.55,
      Ticks(scale(.7)*Label(),
            NoZero,
            Step=0.5,step=.1,
            Size=2mm, size=1mm,
            pTick=black,ptick=gray),
      Arrow);
write("patienter encore un peu...");


--
Christophe

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

Re: Surface p-V-T d'un corps pur

Message non lu par GM » mar. 4 mai 2010, 18:18

cjorssen a écrit :Voilà ce que j'ai fait. Ça marche... presque :?

Qu'est ce qui ne fonctionne pas ? Je ne sais pas ce que tu veux obtenir : elles ressemblent à quoi les isobares ?
Il y a le même type de construction avec les aires égales ?
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 !

cjorssen
Messages : 23
Enregistré le : dim. 14 mars 2010, 17:35

Re: Surface p-V-T d'un corps pur

Message non lu par cjorssen » mar. 4 mai 2010, 18:43

Qu'est ce qui ne fonctionne pas ? Je ne sais pas ce que tu veux obtenir : elles ressemblent à quoi les isobares ?


Oui, c'est vrai que ce n'est pas très clair :roll:

Les isobares ressemblent aux isothermes (voir la figure dans le premier message de ce sujet) : deux portions de courbe données par l'équation d'état et un palier à T=cte entre les mêmes valeurs de v que pour le palier de p de l'isotherme. C'est pour cela qu'une fois qu'on a fait le calcul d'aire pour les isothermes et qu'on a les valeurs vmin et vmax correspondant au palier, si on reprend les isobares des pressions du palier, on n'a pas besoin de déterminer de nouveau vmin et vmax puisque ce sont les mêmes valeurs (voir le diagramme p,T : ce qui dans le diagramme p,V ou dans le diagramme T,V est une surface de coexistence est une courbe dans le diagramme p,T).

Image

Présentement, avec le code que j'ai fait, on voit bien les paliers, mais la courbe est tracée dans son intégralité (y compris là où il ne devrait y avoir que le palier).

J'espère que c'est plus clair...

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

Re: Surface p-V-T d'un corps pur

Message non lu par GM » mer. 5 mai 2010, 12:17

cjorssen a écrit :Je me dis qu'une étape supplémentaire pour avoir la figure en 3D est d'avoir aussi les isobares. Voilà ce que j'ai fait. Ça marche... presque :?

Je ne sais pas ce que tu dois modifier aux niveaux de tes calculs...
... mais je peux dire que le problème vient apparemment de ta fonction t_palier qui renvoie des valeurs plus grandes que le YMax et donc le path C_palier_isobare n'a pas d'intersection avec l'autre path.
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 !

cjorssen
Messages : 23
Enregistré le : dim. 14 mars 2010, 17:35

Re: Surface p-V-T d'un corps pur

Message non lu par cjorssen » mer. 5 mai 2010, 15:25

En fait, la fonction times, ça renvoie quoi ? J'ai vaguement l'impression que cela ne renvoie pas une coordonnée compatible avec le système de coordonnées des axes et celui utilisé avec la commande graph. Ça serait pas les coordonnées en unités postscript ou un truc du genre ?

--
Christophe

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

Re: Surface p-V-T d'un corps pur

Message non lu par GM » mer. 5 mai 2010, 17:53

cjorssen a écrit :En fait, la fonction times, ça renvoie quoi ? J'ai vaguement l'impression que cela ne renvoie pas une coordonnée compatible avec le système de coordonnées des axes et celui utilisé avec la commande graph. Ça serait pas les coordonnées en unités postscript ou un truc du genre ?
--
Christophe

Code : Tout sélectionner

real arctime(path p, real L);

returns the path "time", a real number between 0 and the length of the path in the sense of point(path p, real t), at which the cumulative arclength (measured from the beginning of the path) equals L.

Code : Tout sélectionner

real[] times(path p, explicit pair z)

returns all intersection times of path p with the horizontal line through (0,z.y).


times renvoie ce que renvoie arctime dans cet exemple : http://www.marris.org/asymptote/Lignes/index.html#fig_ta01_010808_arctime, mais pour les points d'intersection du path et d'une parallèle à l'axe des abscisses passant par le pair.

Je vais essayer de pondre un ou plusieurs exemples supplémentaires pour l'illustrer... car moi-même je dois souvent relire la doc et aller jeter un oeil à mes exemples pour me souvenir : pour les xxxtimes mais aussi pour les xxxabscissa de Philippe.
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 !

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

Re: Surface p-V-T d'un corps pur

Message non lu par GM » mer. 5 mai 2010, 18:39

GM a écrit :Je vais essayer de pondre un ou plusieurs exemples supplémentaires pour l'illustrer...

de ce genre là :

Figure asymptote 32b93b60294f01bf22bd746e03ed8730
*** 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 geometry;
  2. import patterns;
  3.  
  4. unitsize(1cm);
  5. show(currentcoordsys);
  6.  
  7. path p=(2,0)--(2,2)--(4,2)--(4,0)--(6,0)--(6,2)--(7,2);
  8. pair pA=(1,1);
  9.  
  10. draw(p,2bp+blue);
  11. dot(p,5bp+red);
  12. draw((0,1)--(7,1),dashed);
  13. dot("$A$",pA,NW,.5green);
  14.  
  15. dot("$I_1$",point(p,times(p,pA)[0]),NE,.5green);
  16. dot("$I_2$",point(p,times(p,pA)[1]),NE,.5green);
  17. dot("$I_3$",point(p,times(p,pA)[2]),NE,.5green);
  18.  
  19.  


Code : Tout sélectionner

import geometry;
import patterns;
unitsize(1cm);
show(currentcoordsys);
path p=(2,0)--(2,2)--(4,2)--(4,0)--(6,0)--(6,2)--(7,2);
pair pA=(1,1);
draw(p,2bp+blue);
dot(p,5bp+red);
draw((0,1)--(7,1),dashed);
dot("$A$",pA,NW,.5green);
dot("$I_1$",point(p,times(p,pA)[0]),NE,.5green);
dot("$I_2$",point(p,times(p,pA)[1]),NE,.5green);
dot("$I_3$",point(p,times(p,pA)[2]),NE,.5green);


size(p) renvoie 7 noeuds
length(p) renvoie 6 "sections"

arctime(p,1) renvoie 0.5 (une demie section depuis le point de départ)
arctime(p,5) renvoie 2.5 (deux sections et demie depuis le point de départ)
arctime(p,9) renvoie 4.5 (quatre sections et demie depuis le point de départ)

1, 5, 9 sont les longueurs depuis le point de départ.

times(p,pA) renvoie 0.5, 2.5 et 4.5


Donc pour conclure, les times sont des nombres dont
  • la (partie entière+1) donne la section du path sur lequel se trouve le point,
  • la partie décimale permet de placer le point sur la section en question : c'est une fraction de la longueur de la section.
Un time de 4,75 correspond au point sur la 5ème section du path (entre le 5ème (d'indice 4) et 6ème noeud (d'indice 5)), au 75% de la dite section.
Pour placer le point sur le dit-path, on écrira : point(p,4.75). ;-)

J'espère avoir été complet.

Edition pour un ajout : des extraits de plain_path.asy

Code : Tout sélectionner

// Return all intersection times of path g with the vertical line through (x,0).
real[] times(path p, real x)
{
  return intersections(p,(x,0),(x,1));
}

// Return all intersection times of path g with the horizontal line through
// (0,z.y).
real[] times(path p, explicit pair z)
{
  return intersections(p,(0,z.y),(1,z.y));
}


// return the point on path p at arclength L
pair arcpoint(path p, real L)
{
  return point(p,arctime(p,L));
}
Les définitions de intersections et de arctime doivent être au niveau du C++ ... ou j'ai mal cherché dans les *.asy.
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 !

cjorssen
Messages : 23
Enregistré le : dim. 14 mars 2010, 17:35

Re: Surface p-V-T d'un corps pur

Message non lu par cjorssen » mer. 5 mai 2010, 19:46

En effet, c'est très complet. Merci, je n'avais rien compris...

Bon, alors maintenant que le problème est identifié, y-a-t-il moyen de connaître les coordonnées associées à ces times ? J'espère que oui...

--
Christophe

Répondre