Asymptotische Füllfläche zwischen zwei Konturen

Asymptotische Füllfläche zwischen zwei Konturen

Ich verwende es Asymptote, um die Grafiken zu erstellen. Ich habe zwei Kurven, die als Konturen C_1 und C_2 definiert sind. Ich möchte den Bereich zwischen den beiden Kurven füllen. Das Problem ist, dass die Kontur eine guide Struktur in Asymptote zurückgibt, und dies wird vom buildcycleBefehl nicht akzeptiert. Kann mir jemand sagen, wie ich dieses Problem lösen kann? Danke. Dies ist der Code, den ich verwende und der die beiden Kurven erzeugt, aber den Bereich dazwischen nicht füllt.

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;

Antwort1

Dies funktioniert, wenn Cfund Cgdurch Cf[0][0]und ersetzt werden Cg[0][0], wodurch die gewünschten (einzelnen) Anleitungen erhalten werden.

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

D1Beachten Sie, dass ich auch und leicht geändert habe D2: In Ihren Definitionen sind D1, D2undpp hatnichtkreuzen sich trotzdem.

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

Für genaue Erklärungen zur Verwendungcontour siehe die sehr gut gemachte (leider nicht vollständige)Tutorial zu Asymptotevon Charles Staats, S. 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));

Bildbeschreibung hier eingeben

Antwort2

Nur zum Vergleich, hier ist eine Metapost-Version. Es gibt keine Unterstützung für implizite Gleichungen oder etwas so Cleveres (oder Komplexes) wie die contourFunktion von Asymptote, also konnte ich nicht umhin, etwas Algebra anzuwenden, um den „langen Ausdruck“ zu erhalten, den der OP gerne vermieden hat. Und um Überläufe zu vermeiden, wenn xnahe Null liegt, nutze ich die Tatsache aus, dass diese beiden Kurven eine Symmetrie um die Linie haben, die durch geht, (0,0)--(1,1)und dass C1 durchgeht, (9/16,9/16)während C2 durchgeht (3,3)– ich verwende daher nur eine Schleife, um die Kurven rechts von diesen Punkten zu konstruieren; dann verwende ich das reflectedaboutMakro von MP, um die erforderlichen oberen Hälften zu erstellen.

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.

Wenn Sie auch die Enden des Bereichs zeichnen möchten, können Sie einfach „my“ draw ff; draw gg;durch ersetzen draw A.

Bildbeschreibung hier eingeben

verwandte Informationen