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 » mer. 5 mai 2010, 19:56

cjorssen a écrit :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...

tu obtiens les points avec

Code : Tout sélectionner

point(path,time)

et leurs coordonnées avec

Code : Tout sélectionner

point(path,time).x
point(path,time).y

;-)

NB : j'ai modifié mon explication du 4,75 dans le message précédent : il y avait un décalage.
un time de 4,75 correspond à un point entre le noeud 4 et le noeud 5... qui sont le 5ème et le 6ème noeuds,puisque l'on commence à 0.
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, 21:06

Ça y est ! Merci.

Alors en route pour la 3D... Des conseils ?

Peut-on créer des array de path ?

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=-30,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]=point(C_isotherme_VdW,
            v_palier_inter_isotherme_VdW[0]).x;
      vmax_palier[i-imin]=point(C_isotherme_VdW,
            v_palier_inter_isotherme_VdW[2]).x;}
    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);
    path C_palier_isobare2=
      graph(t_palier,vmin_palier[i-imin],vmax_palier[i-imin],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(C_palier_isobare2,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

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

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

Message non lu par OG » mer. 5 mai 2010, 21:21

bonsoir

désolé de ne pas aider. Un peu trop de réunions en ce moment.

Pour le tableau de path, oui

Code : Tout sélectionner

path [] tg;
path [][] ttg;

et plus généralement pour tout type tu peux créer un tableau.
Voir la section array de la doc.

O.G.

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, 21:26

cjorssen a écrit :Alors en route pour la 3D... Des conseils ?

J'avoue que là... je ne sais pas trop ce qui va être possible techniquement.
On peut définir et tracer des path3 et les tracer... mais je me demande si cela ne va pas être un peu lourd... vu le nombre... et tout cela en Spline.
Il faut que je fasse moi-même des tests pour pouvoir te répondre.

Si ... une piste différente : il devrait y avoir possibilité d'avoir un premier script qui décrivent les surfaces par des nuages de points dans des fichiers de données...
... puis après avoir un fichier qui génère la surface comme dans cet exemple : http://www.marris.org/asymptote/Surfaces_3D/index.html#fig_sf01_070309_fichier_de_donnees.
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, 22:04

GM a écrit :On peut définir et tracer des path3 et les tracer... mais je me demande si cela ne va pas être un peu lourd... vu le nombre... et tout cela en Spline.


De quel point de vue ça peut être lourd ?

GM a écrit :Si ... une piste différente : il devrait y avoir possibilité d'avoir un premier script qui décrivent les surfaces par des nuages de points dans des fichiers de données...
... puis après avoir un fichier qui génère la surface comme dans cet exemple : http://www.marris.org/asymptote/Surfaces_3D/index.html#fig_sf01_070309_fichier_de_donnees.


C'est en effet une option, mais pourquoi serait-elle moins lourde que la précédente ?

OG a écrit :Pour le tableau de path, oui. [...] Voir la section array de la doc.


Bonne nouvelle. J'avoue que cette doc, j'ai vraiment du mal à rentrer dedans.

Merci à tous les deux.

--
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, 22:12

cjorssen a écrit :De quel point de vue ça peut être lourd ?

On a quand même des paths avec des nombres de points importants, pour l'instant : cela a été nécessaire pour une détermination précise des paliers.
Utiliser une transformation pour les mettre dans les bons plans... c'est à tester...
... mais je ne sais pas pourquoi : je crains le "out of memory" que je rencontre trop souvent sous windows avec la 3D.
Mais ce n'est qu'une crainte... sans arguments solides : il faut tester.
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 » sam. 8 mai 2010, 13:48

Bon, j'ai essayé de séparer les problèmes.

Grâce à un premier programme asymptote, je génère un fichier contenant, pour une température sous critique (t<1), la pression p du palier de liquéfaction ainsi que les deux volumes vmin et vmax le limitant. Cela est déterminé grâce à la méthode des aires de Maxwell et grâce à la méthode développée par Gaétan précédemment.

Code : Tout sélectionner

// Ce programme détermine les valeurs de v pour le palier de liquéfaction
// à t constant.
import graph;

file fichier=output("palier-isoT.dat");

// Volume minimal et maximal utilisés pour le calcul.
real vmin=1/3+0.000001;
real vmax=30;
// Précision du calcul d'aire (dichotomie)
real precision=.0001;
// Nombre de points pour le graphe (ne doit pas être trop petit)
int nb_points=1000;
// Intervalle de calcul
int imin=-30,imax=0;

// Les lignes commençant par # sont ignorées lors de la lecture
write(fichier,"# Nb de paliers déterminés",suffix=newl);
write(fichier,imax-imin+1,suffix=newl);
write(fichier,"# T p Vmin Vmax",suffix=newl);

real a,b,c,diff_aires,t;
path C_isotherme_VdW,Cg;
real[] v_palier_inter_isotherme_VdW;
path C_palier;

// Boucle sur différentes valeurs de la température réduite
for(int i=imin; i<imax; ++i){
  t=1+i/100;
  write(t);
  write(fichier,t,suffix=tab);
  // É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){
    // On ne fait rien : pas de palier
  }
  else{
    // On détermine la pression du palier par dichotomie (aires de Maxwell)
    Cg=subpath(C_isotherme_VdW,
          dirtime(C_isotherme_VdW,(1,0)),
          reltime(C_isotherme_VdW,1));
    Cg=subpath(Cg,0,maxtimes(Cg)[1]);
    a=max(min(Cg).y,.02);
    b=max(Cg).y;
    diff_aires=2*precision;
    while(abs(diff_aires)>precision)
      {
   c=(a+b)/2;
   v_palier_inter_isotherme_VdW=times(C_isotherme_VdW,(0,c));
   real g(real v){return p(v)-c;}
   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);
   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;}
    write(fichier,c,suffix=tab);
    // 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){
      write(fichier,point(C_isotherme_VdW,
           v_palier_inter_isotherme_VdW[0]).x,
       suffix=tab);
      write(fichier,point(C_isotherme_VdW,
           v_palier_inter_isotherme_VdW[2]).x,
       suffix=newl);}
  }
}


Cela me donne le fichier palier-isoT.dat suivant

Code : Tout sélectionner

# Nb de paliers déterminés
31
# T p Vmin Vmax
0.7   0.200817   0.478516   7.79394
0.71   0.215621   0.479583   7.29381
0.72   0.23111   0.478963   6.83434
0.73   0.247478   0.480431   6.40532
0.74   0.264582   0.485125   6.00952
0.75   0.282471   0.491785   5.64273
0.76   0.301115   0.497957   5.30333
0.77   0.320478   0.502493   4.98969
0.78   0.340633   0.506436   4.69795
0.79   0.361604   0.511318   4.4259
0.8   0.383351   0.517601   4.17263
0.81   0.405957   0.524514   3.93529
0.82   0.429316   0.531217   3.71414
0.83   0.453511   0.53791   3.50668
0.84   0.478565   0.545172   3.31154
0.85   0.504515   0.553314   3.12739
0.86   0.531254   0.562044   2.95446
0.87   0.558876   0.571147   2.79085
0.88   0.587332   0.5809   2.63625
0.89   0.616731   0.591715   2.48892
0.9   0.647006   0.603374   2.34879
0.91   0.678116   0.616077   2.21539
0.92   0.710181   0.630233   2.08714
0.93   0.743224   0.645873   1.96314
0.94   0.77699   0.6637   1.8444
0.95   0.811886   0.684104   1.72703
0.96   0.847671   0.708114   1.61141
0.97   0.884393   0.737447   1.49521
0.98   0.921802   0.775763   1.37719
0.99   0.960312   0.831745   1.24546


Donc, les paliers, c'est fait une fois pour toute (au pire, si besoin est, on peut affiner, avoir plus de valeurs, mais je pense que c'est inutile).

Ensuite, j'ai fait le code suivant pour afficher les isothermes en 3D.

Code : Tout sélectionner

import graph3;

size3(150,IgnoreAspect);
size(8cm,0);

file fichier=input("palier-isoT.dat",comment="#");

int nb_palier=fichier;
write(nb_palier);
real[] t_palier,p_palier,vmin_palier,vmax_palier;

for(int i=0;i < nb_palier; ++i){
  t_palier[i]=fichier;
  p_palier[i]=fichier;
  vmin_palier[i]=fichier;
  vmax_palier[i]=fichier;
}

real t;
real vmin=1/3+0.12;
real vmax=5;
path3 C_isotherme_Andrews_liquide,C_isotherme_Andrews_vapeur,
C_isotherme_Andrews_liquide_vapeur,C_isotherme_Andrews;
int nb_points=20;

pen couleur_hypercritique = red;
pen couleur_liquide = .5green;
pen couleur_vapeur = purple;
pen couleur_liquide_vapeur = couleur_liquide + couleur_vapeur;

for(int i=4;i < nb_palier-1; ++i){
  real t(real v){return t_palier[i];}
  write(t_palier[i]);
  real p(real v){return 8*t(v)/(3*v-1)-3/v^2;}
  real v3D(real v){return v;}
  C_isotherme_Andrews_liquide=graph(v3D,t,p,vmin,vmin_palier[i],n=nb_points,Spline);
  draw(C_isotherme_Andrews_liquide,couleur_liquide);
  C_isotherme_Andrews_vapeur=graph(v3D,t,p,vmax_palier[i],vmax,n=nb_points,Spline);
  draw(C_isotherme_Andrews_vapeur,couleur_vapeur);
  C_isotherme_Andrews_liquide_vapeur=(vmin_palier[i],t_palier[i],p_palier[i]) --
    (vmax_palier[i],t_palier[i],p_palier[i]);
  draw(C_isotherme_Andrews_liquide_vapeur,couleur_liquide_vapeur);
  C_isotherme_Andrews=C_isotherme_Andrews_liquide --
    C_isotherme_Andrews_liquide_vapeur -- C_isotherme_Andrews_vapeur;
  // draw(C_isotherme_Andrews,couleur_liquide_vapeur);
}


limits((0,0,0),(5,1.5,4));
// Les quatres lignes qui suivent permettront dans la majorité
// des cas, d'avoir un angle de vue convenable.
triple m=currentpicture.userMin;
triple M=currentpicture.userMax;
triple target=0.5*(m+M);
currentprojection=perspective(camera=target+realmult(dir(50,40),M-m),
                              target=target);

xaxis3(Bounds(),OutTicks(endlabel=false),p=blue);
yaxis3(Bounds(),OutTicks(),p=red);
zaxis3(Bounds(),OutTicks,p=.8green);

write("Hypercritique");

for(real t=1;t < 1.1; t=t+.01){
  real t3D(real v){return t;}
  write(t);
  real p(real v){return 8*t/(3*v-1)-3/v^2;}
  real v(real v){return v;}
  C_isotherme_Andrews=graph(v,t3D,p,vmin,vmax,n=2*nb_points,Spline);
  draw(C_isotherme_Andrews,couleur_hypercritique);
}


Bon, ça commence à ressembler à quelque chose. Mais j'ai quelques soucis. Déjà, le point de vue donné par la camera n'est pas le bon et j'ai beau faire de l'essai/erreur, ça ne fonctionne pas. Ensuite, j'ai quelques lignes en purple qui dépassent du cadre et je ne comprends pas bien pourquoi. Enfin, je ne comprends pas l'utilisation de Crop en 3D, donc les courbes dépassent des limites. Bref, j'aurais encore besoin d'un petit coup de main. Si quelqu'un passe par là...

Merci d'avance

--
Christophe
Fichiers joints
VdW-isoT-3D.png
Image obtenue
VdW-isoT-3D.png (9.16 Kio) Vu 8319 fois

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 » sam. 8 mai 2010, 15:12

Je rencontre des problèmes de mémoire pour compiler ton exemple : j'ai vraiment un problème sous windows. (pourtant Seven 64b avec 4Go ... mais le processus s'arrête avant le premier Go... pour une raison inexpliquée - J'ai ce problème avec d'autres exemples, je te rassure.)
Je testerai plus tard sous linux.

Sans avoir testé, deux remarques :
  • en tournant la figure comme tu le souhaites sous opengl, tu peux effectuer un double-clic droit sur l'image et tu auras la possibilité de récupérer le réglage de l'angle de vue en console, qu'il te suffit de copier coller dans le fichier asy, à la place de tes réglages actuels.
  • pour le crop en 3d, je ne pense pas que cela existe (mais j'ai peut-être raté une info)... et, si j'ai raison, il va te falloir filtrer les données à afficher.
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. 11 mai 2010, 13:54

J'avance... J'ai mis en place une méthode pour "cropper" très sale (tellement sale que je ne la publie pas :oops: ) et j'arrive à tracer, en un temps raisonnablement long, quelques isothermes et quelques isobares à coup de graph en 3D. Ça devient pas mal. Je posterai dès que ça sera présentable.

J'ai néanmoins une petite question. Ce que je fais là, ce n'est pas vraiment une surface mais plutôt un juxtaposition de lignes de niveau. D'où ma question : à partir des lignes de niveau, comment construire une surface, soit formulé autrement, qu'attend asymptote comme type de données pour construire une surface ? J'imagine que c'est un tableau de coordonnées, mais comment sont-elles ordonnées ?

Ah, et question subsidiaire, y-a-t-il un moyen d'accéder à l'ensemble des coordonnées calculées par une commande graph ?

Merci d'avance.

--
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. 12 mai 2010, 12:31

cjorssen a écrit :J'ai néanmoins une petite question. Ce que je fais là, ce n'est pas vraiment une surface mais plutôt un juxtaposition de lignes de niveau. D'où ma question : à partir des lignes de niveau, comment construire une surface, soit formulé autrement, qu'attend asymptote comme type de données pour construire une surface ? J'imagine que c'est un tableau de coordonnées, mais comment sont-elles ordonnées ?

Une possibilité est celle que je t'ai déjà donnée : ici.

Regarde le fichier des données de l'exemple : http://gmaths.free.fr/asymptote/obj/donnees.txt

valeurs de x sur la première ligne
valeurs de y sur la deuxième ligne
puis un tableau à x lignes et y colonnes (ou le contraire) ... pour les valeurs de z ensuite.

Pour d'autres syntaxes, parcourir le fichier graph3.asy du dossier d'installation et faire une recherche de "surface surface(".
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 !

Répondre