
Yo uso Asymptote
para 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 buildcycle
comando. ¿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 Cf
y Cg
por 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 D1
y D2
: en sus definiciones, D1
y D2
lo pp
hicenocruzarse 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));
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 contour
funció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 x
está 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 reflectedabout
la 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
.