線形計画法
2変数の線形計画法の図を作成します。
次のような例です。
連立不等式 x+2y≦8 , 3x+y≦9 , x≧0 , y≧0 を満たす x,y に対して、x+y の最大値を求めよ。
図は次のようになります。これを作図します。
まず、必要な部品を考えます。
直線2本と交点、そして斜線です。
直線は Lineplot() でかけます。交点を求めるには、Cinderellaの作図機能を使う方が簡単なので、直線もCinderellaの作図機能で描きましょう。
次に、領域を示す斜線です。斜線は、関数 Hatchdata() を使いますが、これは指定した閉曲線に対して斜線をひく関数です。原点と両軸との交点、直線の交点の4つの点を結んでできる閉曲線です。
両軸との交点は直線を引くときにとれますし、交点は作図します。ですから、あとは原点です。
これだけの部品を先に作っておきます。順番はどうでもよいですが、スクリプトの関係もあるので、次のようにしましょう。
(1)原点をとる
(2)2本の直線をひく。位置はスクリプトできちんとすることにすれば、いい加減に引いても構いません。
(3)2本の直線の交点をとる。
交点F以外のそれぞれの点の位置をスクリプトで決めます。
A.xy=[0,0];
B.xy=[0,4];
C.xy=[8,0];
D.xy=[0,9];
E.xy=[3,0];
直線は描画ツールで引きましたが、TeXで描くには Lineplot() 関数で書かなくてはいけません。
また、閉曲線は4つの点を Listplot() で結んで描きます。
Lineplot([B,C]);
Lineplot([D,E]);
Listplot([A,B,F,E,A]);
コンソールに、できたプロットデータの名前が表示されています。閉曲線は sgABFEAです。
これを使って、Hatchdeta() で斜線をひきます。
Hatchdata("1","i",["sgABFEA"]);
1番目は名前、2番目の i は、閉曲線の内部 (in) であることを示します。3番目が閉曲線のプロットデータ名
これで斜線が引けるのですがCinderellaの画面には出ないので、書き出して確かめます。
これに必要な数字や文字をいれます。座標軸には矢じりをつけましょう。
Letter([B,"sw2","4",C,"s2","8",D,"w2","9",E,"s2","3",F,"e2","(2,3)",[1,7],"e","$3x+y=9$",[5,2],"e","$x+2y=8$"]);
Setax(["a"]);
こまかい位置調整は試行錯誤です。画面上ではもとからある点の名前とダブってごちゃつきますが、TeXの図では次のようになります。
最後に、直線 x+y=k を描きましょう。kは適当にして、y切片に k を書きます。
Lineplot("1",[[0,2],[2,0]],["dr,2"]);
Letter([[0,2],"w2","$k$"]);
こんどのLineplotは作図した点を使わないので、先頭に名前が必要です。"1" にしました。また、["dr,2"] オプションをつけて、線を太くしました。
こうしてできたのが冒頭の図です。
ところで、領域を示すのに D がよく使われます。そこで、斜線を引いた領域の中に文字 D を白抜きで表示することを考えます。
方法はいくつかあります。
その1 矩形を白抜きで描く
矩形は、Listplot() でも書けますし、Framedata()でもかけます。これで閉曲線ができるので、Shadeで塗りつぶすのですが、濃度を0にすれば白抜きになります。ただ、Cinderellaの画面では白抜きにはなりません。
Framedata("1",[1.5,1.5],0.5,0.5);
Shade(["fr1"],[0]);
Letter([[1,1],"n2e2","$D$"]);
その2 2つの閉曲線に挟まれる部分に斜線を引く。
Framedata() で矩形を描き、はじめに書いた Hatchdata()を書き換えます。Framedata()での矩形は実際には描かないので、"notex"オプションをつけておきます。
Framedata("1",[1.5,1.5],0.5,0.5,["notex"]);
Hatchdata("1","io",[["sgABFEA"],["fr1"]]);
Letter([[1,1],"n2e2","$D$"]);
Cinderellaの画面上には斜線がひかれませんが、その1と同じ図ができます。
< 戻る >