Área de relleno de asíntota entre dos contornos

Área de relleno de asíntota entre dos contornos

Yo uso Asymptotepara hacer los gráficos. Tengo dos curvas definidas como contornos C_1 y C_2. Quiero llenar el área entre las dos curvas. El problema es que el contorno devuelve una guide estructura en asíntota, y esto no se acepta como buildcyclecomando. ¿Alguien puede decirme cómo solucionar este problema? Gracias. Este es el código que uso y que produce las dos curvas, pero no llena el área entre ellas.

import graph;
import patterns;
import contour; 

usepackage("mathrsfs");

size(8cm);

real eps=0.001;
real xmax=5.5,ymax=5.5;
pair af,ag;

real f(real x, real y) {return sqrt(1+x)-sqrt(x)+sqrt(1+y)-sqrt(y);}
real g(real x, real y) {return 1/sqrt(1+x)+1/sqrt(1+y);}

guide[][] Cf=contour(f,(eps,eps),(xmax,ymax),new real[] {1});
guide[][] Cg=contour(g,(eps,eps),(xmax,ymax),new real[] {1});

//these two lines are used to find intersection points
path D1=(0,ymax)--(xmax+eps,ymax);
path D2=(xmax,0)--(xmax,ymax+eps); 

draw(Cf);
draw(Cg);

//path pp=buildcycle(Cf,D1,Cg,D2);
// the preceding line produces and error if commented

xaxis(Label(scale(0.75)*"$x$"),xmax=6,Arrow);
yaxis(Label(rotate(90)*scale(0.75)*"$y$"),ymax=6,Arrow);

label("$\mathscr{C}_{1}$",(xmax,0.2));
label("$\mathscr{C}_{2}$",(xmax,1.9));
label("I"  ,(.2,.2));
label("II" ,(1.,1.));
label("III",(3.5,3.5));

end;

Respuesta1

Funciona al reemplazar Cfy Cgpor Cf[0][0]y Cg[0][0], lo que permite obtener las guías (únicas) deseadas.

path pp=buildcycle(Cf[0][0],D1,Cg[0][0],D2);

Tenga en cuenta que también modifiqué ligeramente D1y D2: en sus definiciones, D1y D2lo pphicenocruzarse de todos modos.

path D1=(0,ymax-eps)--(xmax+eps,ymax-eps);
path D2=(xmax-eps,0)--(xmax-eps,ymax+eps);

Para obtener explicaciones adecuadas sobre cómo utilizar contour, consulte el documento muy bien hecho (lamentablemente no completo)tutorial sobre asíntotapor Charles Staats, pág. 32.

import graph;
import patterns;
import contour; 

usepackage("mathrsfs");

size(8cm);

real eps=0.001;
real xmax=5.5,ymax=5.5;
pair af,ag;

real f(real x, real y) {return sqrt(1+x)-sqrt(x)+sqrt(1+y)-sqrt(y);}
real g(real x, real y) {return 1/sqrt(1+x)+1/sqrt(1+y);}

guide[][] Cf=contour(f,(eps,eps),(xmax,ymax),new real[] {1});
guide[][] Cg=contour(g,(eps,eps),(xmax,ymax),new real[] {1});

//these two lines are used to find intersection points
path D1=(0,ymax-eps)--(xmax+eps,ymax-eps);
path D2=(xmax-eps,0)--(xmax-eps,ymax+eps);

path pp=buildcycle(Cf[0][0],D1,Cg[0][0],D2); 
fill(pp,.8white); draw(pp);

xaxis(Label(scale(0.75)*"$x$"),xmax=6,Arrow);
yaxis(Label(rotate(90)*scale(0.75)*"$y$"),ymax=6,Arrow);

label("$\mathscr{C}_{1}$",(xmax,0.2));
label("$\mathscr{C}_{2}$",(xmax,1.9));
label("I"  ,(.2,.2));
label("II" ,(1.,1.));
label("III",(3.5,3.5));

ingrese la descripción de la imagen aquí

Respuesta2

Sólo a modo de comparación, aquí hay una versión de Metapost. No hay soporte para ecuaciones implícitas ni nada tan inteligente (o complejo) como la contourfunción de asíntota, por lo que no pude evitar algo de álgebra para obtener la "expresión larga" que el OP estaba feliz de evitar. Y para evitar desbordamientos cuando xestá cerca de cero, estoy explotando el hecho de que estas dos curvas tienen una simetría con respecto a la línea que pasa (0,0)--(1,1)y que C1 pasa (9/16,9/16)mientras C2 pasa (3,3). Por lo tanto, solo uso un bucle para construir las curvas a la derecha. de estos puntos; Luego uso reflectedaboutla macro de MP para crear las mitades superiores requeridas.

prologues := 3;
outputtemplate := "%j%c.eps";

beginfig(1);
u := 1cm;
path xx, yy, ff, gg;
xx = (1/2 left -- 6 right) scaled u;
yy = xx rotated 90;
drawarrow xx; drawarrow yy;

vardef f(expr x) = 
  save s; numeric s;
  s = (1+sqrt(x)-sqrt(1+x))**2;
  (1-2s+s**2)/(4s)
  enddef;

vardef g(expr x) = 
   (1+x)/(2+x-2*sqrt(1+x))-1
   enddef;

s = 0.05;
ff = ((9/16,9/16) for x = 9/16+s step s until 5.5: -- (x,f(x)) endfor) scaled u;
gg = ((3,3)       for x =    3+s step s until 5.5: -- (x,g(x)) endfor) scaled u;

ff := reverse ff reflectedabout(origin,(1,1)) & ff;
gg := reverse gg reflectedabout(origin,(1,1)) & gg;

path A;
A = ff -- reverse gg -- cycle;
fill A withcolor .9[blue,white];
draw ff;
draw gg;

string s; s = "";
for $=0,9/16u,3u:
  s := s & "I";
  label.urt(s,($,$));
  endfor

label.urt(btex ${\cal C}_1$ etex, point infinity of ff);
label.urt(btex ${\cal C}_2$ etex, point infinity of gg);

label.bot(btex $x$ etex, point 1 of xx);
label.lft(btex $y$ etex, point 1 of yy);

endfig;
end.

Si también quisieras dibujar los extremos del área, podrías reemplazar my draw ff; draw gg;con draw A.

ingrese la descripción de la imagen aquí

información relacionada