不等式の表す領域

不等式の表す領域を斜線で示します。

高校数学の教科書の範囲で考えることとし,一般的な閉曲線内にハッチをかけることは行いません。

また,扱うのは直線と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]);

);

);

赤い点をドラッグすれば図が変化します。