
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 buildcycle
Befehl 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 Cf
und Cg
durch 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);
D1
Beachten Sie, dass ich auch und leicht geändert habe D2
: In Ihren Definitionen sind D1
, D2
undpp
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));
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 contour
Funktion 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 x
nahe 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 reflectedabout
Makro 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
.