不等式の表す領域
不等式の表す領域を斜線で示します。
高校数学の教科書の範囲で考えることとし,一般的な閉曲線内にハッチをかけることは行いません。
また,扱うのは直線と2次曲線(放物線,円,楕円,双曲線),整関数のグラフとします。
考え方
曲線を表す方程式と,直線 y=ax+k の交点を求めて直線を引く範囲を決めます。kの値を変化させれば領域に斜線を引くことができます。
曲線を表す方程式と,y=ax+k の連立方程式を解けば交点が求められます。yを消去するとxのn次方程式になりますので,Cindyscriptの組み込み関数 roots() で解が求められます。
2次曲線で囲まれる領域
2次曲線の方程式は
放物線 y=ax², 楕円 x²/a²+y²/b²=1 ,双曲線 x²/a²-y²/b²=±1 とします。円は楕円でa=bの場合です。
これらを平行移動した方程式の場合は,全体を平行移動して処理します。
y=cx+d との連立方程式から y を消去すると,方程式は次のようになります。
放物線 ax²-cx-d=0
楕円 (a²c²+b²)x²+2ca²dx+a²d²-a²b²=0
双曲線 (b²-a²c²)x²-2ca²dx-a²d²-a²b²=0 (右辺が-1のときは +a²b²)
この係数を,次数の低い方からリストにして roots() に渡します。
// 曲線と y=cx+d の交点を求める方程式の係数をリストで返す coeflistは[a,b,c,d]
// type : 0:直線 1:放物線 2: 楕円(円) 3: 双曲線
intersectconic(coeflist,type):=(
regional(a,b,c,d,cf);
a=coeflist_1;
b=coeflist_2;
c=coeflist_3;
d=coeflist_4;
if(type==1,cf=[-d,-c,a]);
if(type==2,cf=[a^2*d^2-a^2*b^2,2*d*a^2*c,b^2+a^2*c^2]);
if(type==3,cf=[-a^2*d^2-a^2*b^2,-2*d*a^2*c,b^2-a^2*c^2]);
if(type==4,cf=[-a^2*d^2+a^2*b^2,-2*d*a^2*c,b^2-a^2*c^2]);
roots(cf);
);
交点が存在しない場合は虚数解が返ってくるので,それで交点の有無を判断できます。
交点が2つの場合,その最小値と最大値を取って,描画範囲の左から最小値までと,最大値から描画範囲の右までに直線を引けば,領域の外側に斜線が引かれます。最小値と最大値の間なら,領域の内側です。どちらに引くかは引数で指定することにします。
条件がいろいろあるので引数が多くなります。
2次曲線の係数 a,b
平行移動量 p,q
斜線の傾き c
定義域 x1,x2
2次曲線のタイプ type : 1〜4
領域の内外 0/1
これだけ必要です。
// 2次曲線の領域に斜線を引く
// coeflist=[[a,b],[p,q]] [a,b]は2次曲線の係数,[p,q]は平行移動量
// c: 斜線の傾き , range=[x1,x2]:引く範囲 , inout : 0/1 中/外
hatchdomain(coeflist,c,range,type,inout):=(
regional(coef,trans,r1,r2,k,rt,d1,d2);
coef=append(coeflist_1,c);
trans=coeflist_2;
r1=range_1;
r2=range_2;
repeat(100,n,start->-50,
k=n/2;
rt=intersectconic(append(coef,k),type);
if(isreal(rt_1),
d1=min(rt)+trans_1;
d2=max(rt)+trans_1;
,
d1=0;
d2=0;
);
if(type==0, // 直線のとき d1=d2
if(inout==1,
plot(c*(#-trans_1)+k+trans_2,start->r1,stop->d1);
,
plot(c*(#-trans_1)+k+trans_2,start->d1,stop->r2);
);
,
if(inout==1,
plot(c*(#-trans_1)+k+trans_2,start->r1,stop->d1);
plot(c*(#-trans_1)+k+trans_2,start->d2,stop->r2);
,
d1=max([d1,r1]);
d2=min([d2,r2]);
plot(c*(#-trans_1)+k+trans_2,start->d1,stop->d2);
);
);
);
);
作図例
2次曲線は媒介変数表示で描きます。
(1) 放物線 y>(x-1)²-2
trans=[1,-2]; // 平行移動量
a=1;
col=[0,0,0];
plot([trans_1+t,trans_2+a*t^2],start->-6,stop->7,color->col);
hatchdomain([[a,b],trans],1,[-6,7],1,0);
(2) 楕円 (x-2)²/9+(y-1)²/4<1
trans=[2,1]; // 平行移動量
a=3;
b=2;
col=[0,0,0];
plot([trans_1+a*cos(t),trans_2+b*sin(t)],start->0,stop->2*pi,steps->100,color->col);
hatchdomain([[a,b],trans],1,[-6,7],2,0);
直線の上下
2直線の交点は,「応用編 01 値・式の取得」で作成した linearsolve() で求められます。これを使って次のようにすることもできます。
作図例1 y>2x-2
color([0,0,0]);
drawline([2,-1,-2],[-6,6]);
color([0,0,1]);
repeat(60,n,start->-20,
k=n/2;
p1=intersectline([2,-1,-2],[1,-1,k]);
drawline([1,-1,k],[-6,p1_1]);
);
作図例2 x+y-2<0
color([0,0,0]);
drawline([1,1,-2],[-6,6]);
color([0,0,1]);
repeat(60,n,start->-20,
k=n/2;
p1=intersectline([1,1,-2],[1,-1,k]);
drawline([1,-1,k],[-6,p1_1]);
);
連立不等式
2直線
斜線の直線と,連立不等式の2つの直線の交点を,前節のように linearsolve() で交点を求め,x座標の大小でどこまで斜線を引くか決めます。
【例】
(1) 2x-y-1<0 , x+y-2<0
L1=[2,-1,-1];
L2=[1,1,-2];
color([0,0,0]);
drawline(L1,[-6,6]);
drawline(L2,[-6,6]);
color([0,0,1]);
repeat(60,n,start->-20,
k=n/2;
p1=intersectline(L1,[1,-1,k]);
p2=intersectline(L2,[1,-1,k]);
r=min([p1_1,p2_1]);
drawline([1,-1,k],[-6,r]);
);
repeat(60,s,start->-20, のところの数は,描いてみて適当に決めます。
それぞれの不等式が表す領域を図示し,その上で共通部分として編目のように表示したい場合は,斜線の傾きを変えて表示すればよいでしょう。この不等式の場合,一方の直線の傾きが,斜線の傾きと同じ -1 になってしまうので,斜線の方をわずかに変えてやればうまくいきます。
まず,次のようにそれぞれ描画して
repeat(60,n,start->-20,
k=n/2;
p1=intersectline(L1,[1,-1,k]);
p2=intersectline(L2,[1,-1,k]);
r=min([p1_1,p2_1]);
drawline([1,-1,k],[-6,r]);
p1=intersectline(L1,[1,1.01,k]);
p2=intersectline(L2,[1,1.01,k]);
r=min([p1_1,p2_1]);
drawline([1,1.01,k],[-6,r]);
);
(2) (2x-y-1)(x+y-2)>0
(1) と同様で,右側にも斜線を引きます。追加するのは2行だけです。
L1=[2,-1,-1];
L2=[1,1,-2];
color([0,0,0]);
drawline(L1,[-6,6]);
drawline(L2,[-6,6]);
color([0,0,1]);
repeat(60,n,start->-20,
k=n/2;
p1=intersectline(L1,[1,-1,k]);
p2=intersectline(L2,[1,-1,k]);
r=min([p1_1,p2_1]);
drawline([1,-1,k],[-6,r]);
r=max([p1_1,p2_1]);
drawline([1,-1,k],[r,6]);
);
円と直線
先に例を示しましょう。 x-y+1>0 , x²+y²<4 です。
図を見て考えると,斜線 x+y-k=0 と直線 x-y+1=0 の交点と,斜線 x+y-k=0 と円 x²+y²=4 の交点のうち x 座標の大きい方とを結べばよいことがわかるでしょう。
L1=[1,-1,1];
color([0,0,0]);
drawline(L1,[-6,6]);
plot(2*[cos(t),sin(t)]);
color([0,0,1]);
repeat(30,n,start->-15,
k=n/4;
rt=roots([k^2-4,-2*k,2]);
p1=intersectline(L1,[1,1,-k]);
if(isreal(rt_1),
r=min(rt);
d1=max(r,p1_1);
d2=max(rt);
drawline([1,1,-k],[d1,d2]);
);
);
このように,状況に応じて作成していくことになります。大枠は同じなので,方程式の係数を変えていけばよいでしょう。
(x-y+1)(x²+y²-4)<0 の場合は,
if(isreal(rt_1),
r=min(rt);
d2=min(r,p1_1);
,
d2=p1_1;
);
drawline([1,1,-k],[-6,d2]);
を追加することで描けます。(repeat の範囲は広くします)
2つの円
十分条件・必要条件を図で考えるとき,次のような図を描くことがあります。
trans=[0,0]; // 平行移動量
col=[0,0,0];
plot(2*[cos(t),sin(t)],start->0,stop->2*pi,steps->100,color->col);
hatchdomain([[2,2],trans],1,[-2,2],2,0);
trans=[1,0];
plot(trans+[cos(t),sin(t)],start->0,stop->2*pi,steps->100,color->col);
hatchdomain([[1,1],trans],1,[-2,2],2,0);
drawtext([-1,1],"A",size->20);
drawtext([1,0],"B",size->20);
線形計画法
線形計画法でよく使う図です。2本の直線は x+2y-8=0 と3x+y-9=0 とします。
L1=[1,2,-8];
L2=[3,1,-9];
color([0,0,0]);
drawline(L1,[-6,6]);
drawline(L2,[-6,6]);
color([0,0,1]);
repeat(60,n,start->-20,
k=n/2;
p1=intersectline(L1,[1,-1,k]);
p2=intersectline(L2,[1,-1,k]);
r2=min([p1_1,p2_1]);
p3=intersectline([0,1,0],[1,-1,k]);
r1=max([p3_1,0]);
drawline([1,-1,k],[r1,r2]);
);
drawtext([2,3],"(2,3)",size->20);
放物線と接線で囲まれる領域
これは不等式で表される領域ではありませんが(表すこともできます),積分でよく使われる図です。
放物線 y=x² に,外部の点から引いた2本の接線と,この放物線で囲まれる領域を斜線で示します。
問題の一つは接線です。手計算で微分して接線の方程式を出すことができますが,インタラクティブに動かそうと思うと,点の座標を文字で表す必要があり,ちょっと面倒です。
そこで,ここでは,作図ツールを使って放物線と接線を引いてしまい,外部の点と接点から接線の方程式を求めて斜線を引く,という手順でやってみましょう。
まず,作図をします。
・準線 AB と,焦点C をとり,放物線を描きます。
・外部の点 D をとり,「点の極線」ツールで極線を描きます。
・放物線と曲線の交点を作図します。(E,F)
つぎに,インスペクタを用いて,点A,B,C と準線,極線は非表示にし,点E,Fは小さくしておきます。
線の色を黒にします。
ここから計算です。
・D,Eを通る直線の方程式の係数 L1 , D,Fを通る直線の方程式の係数 L2 を求めます。
・斜線 y=x+k と放物線の交点 および 2接線との交点を求めます。
放物線との交点があれば(座標が実数なら)2ヶ所に分けて線を引きます。
なければ2接線との交点だけで線を引きます。
なお,放物線と接線の間で,上の方は対象外として線は引きません。そのために,接点のx座標と,直線との交点のx座標でそれを判断します。
引く範囲(nの範囲) は動かし見て適当に決めましょう。
L1=pointonline(D,E);
L2=pointonline(D,F);
repeat(80,n,start->-24,
k=n/8;
// y=x² と y=x なので a=1 , b=0 ,c=1 として [1,0,1]を引数とする
rt=intersectconic([1,0,1,k],1);
p1=intersectline(L1,[1,-1,k]);
p2=intersectline(L2,[1,-1,k]);
if(isreal(rt_1),
d1=max([p1_1,E.x]);
d2=min(rt);
d3=max(rt);
d4=min([p2_1,F.x]);
drawline([1,-1,k],[d1,d2]);
drawline([1,-1,k],[d3,d4]);
,
drawline([1,-1,k],[p1_1,p2_1]);
);
);
赤い点をドラッグすれば図が変化します。