Área de preenchimento de assíntota entre dois contornos

Área de preenchimento de assíntota entre dois contornos

Eu uso Asymptotepara 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 buildcyclecomando. 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 Cfe Cgpor 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 D1and D2: em suas definições D1, D2e ppfiznã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));

insira a descrição da imagem aqui

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 contoura 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 xestá 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 reflectedabouta 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.

insira a descrição da imagem aqui

informação relacionada