
Eu uso Asymptote
para fazer os gráficos. Tenho duas curvas definidas como contornos C_1 e C_2. Quero preencher a área entre as duas curvas. O problema é que o contorno retorna uma guide
estrutura em Assíntota, e isso não é aceito no buildcycle
comando. Alguém pode me dizer como resolver esse problema? Obrigado. Este é o código que utilizo e que produz as duas curvas, mas não consegue preencher a área entre elas.
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;
Responder1
Funciona ao substituir Cf
e Cg
por Cf[0][0]
e Cg[0][0]
, o que permite obter as guias (únicas) desejadas.
path pp=buildcycle(Cf[0][0],D1,Cg[0][0],D2);
Observe que também modifiquei ligeiramente D1
and D2
: em suas definições D1
, D2
e pp
fiznãocruzar de qualquer maneira.
path D1=(0,ymax-eps)--(xmax+eps,ymax-eps);
path D2=(xmax-eps,0)--(xmax-eps,ymax+eps);
Para explicações adequadas sobre como usar contour
, veja o muito bem feito (infelizmente não completo)tutorial sobre assí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));
Responder2
Apenas para comparação, aqui está uma versão do Metapost. Não há suporte para equações implícitas ou algo tão inteligente (ou complexo) como contour
a facilidade do Asymptote, então não pude evitar um pouco de álgebra para obter a "expressão longa" que o OP ficou feliz em evitar. E para evitar estouros quando x
está próximo de zero, estou explorando o fato de que essas duas curvas têm uma simetria em relação à linha que passa (0,0)--(1,1)
e que C1 passa (9/16,9/16)
enquanto C2 passa (3,3)
- portanto, só uso um loop para construir as curvas à direita desses pontos; Em seguida, uso reflectedabout
a macro do MP para criar as metades superiores necessárias.
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.
Se você também quiser desenhar as extremidades da área, basta substituir my draw ff; draw gg;
por draw A
.