
Asymptote
グラフィックスを作成するために使用します。輪郭 C_1 と C_2 として定義された 2 つの曲線があります。2 つの曲線の間の領域を塗りつぶしたいのですが、問題は、輪郭がguide
Asymptote で構造を返すことです。これはコマンドでは受け入れられませんbuildcycle
。この問題を解決する方法を教えてください。ありがとうございます。これは私が使用しているコードで、2 つの曲線を生成しますが、これらの間の領域を塗りつぶすことができません。
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;
答え1
Cf
これは、 とをCg
と に置き換えると機能し、必要な (単一の) ガイドを取得できます。Cf[0][0]
Cg[0][0]
path pp=buildcycle(Cf[0][0],D1,Cg[0][0],D2);
また、定義では、およびを少しD1
変更しました。D2
D1
D2
pp
ないとにかく交差します。
path D1=(0,ymax-eps)--(xmax+eps,ymax-eps);
path D2=(xmax-eps,0)--(xmax-eps,ymax+eps);
の使い方についての適切な説明についてはcontour
、非常によくできた(残念ながら完全ではない)Asymptote のチュートリアルチャールズ・シュターツ著、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));
答え2
比較のため、Metapost バージョンを次に示します。暗黙の方程式や Asymptote のcontour
機能ほど巧妙な (または複雑な) ものはサポートされていないため、OP が喜んで避けた「長い式」を取得するために代数計算を避けることはできませんでした。また、がゼロに近い場合にオーバーフローを回避するために、これらの 2 つの曲線が直線を中心に対称性を持ち、C1 が通過し、C2 が通過するというx
事実を利用しています。したがって、ループを使用してこれらのポイントの右側の曲線のみを構築し、次に MP のマクロを使用して必要な上半分を作成します。(0,0)--(1,1)
(9/16,9/16)
(3,3)
reflectedabout
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.
領域の端も描画したい場合は、 mydraw ff; draw gg;
を に置き換えるだけですdraw A
。