線形計画法

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と同じ図ができます。

< 戻る >