GNUPLOT を経済学で使う(Version 1.3)

大石英嗣
大阪大学経済学研究科経済理論専攻 博士課程後期


本ドキュメント(「GNUPLOTを経済学で使う」) (アーカイブ版の付属ファイルは含みません)は、(1)経済学でよく用いられる(特に教科書でよく用いられる)関数のグラフをどのようにGNUPLOTで実現するかの説明、(2)GNUPLOTでのアニメーションの利用、および(3)LaTeXなどでの利用のための体裁の整え方について説明したものです。説明の流れの関係上経済学の初歩的な説明も加わっております。内容の中心は(1)です。

ただしこのドキュメントの内容には一切保証がありません。またこのドキュメントはFSFの定めるGNU General Public Licence (version 2)に従うものとします。従って著作権表示を保っている限り、再配布は私に断ること無く自由にできます。また内容を改変して再配布する場合も私に断る必要は全くありません。ただし再配布される場合(金銭の授受が伴う場合も含める)は、改変した場合も含め、GPL2(あるいはそれ以降のバージョンのライセンス)に従わなければなりません。GPL2は以下の住所に手紙を送ることで手に入れることも可能です。

Copyright(c) 1999 Oishi Hidetsugu to GNUPLOT wo keizaigaku de tsukau. All rights reserved.

    This document is free; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
    This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    You should have received a copy of the GNU General Public Licence along with this document; if not, write to

The Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA



内容
1    はじめに(リンクもあります)
2    効用関数を表示させる
3    効用用関数と無差別曲線の関係をみる
4    無差別曲線だけを表示させる(その1)
5    EmacsからGNUPLOTを使う
6    無差別曲線だけを表示させる(その2)
7    無差別曲線をアニメーションする
8    より具体的な応用例(クールノーの複占モデルの図)
9    論文に利用するための体裁
        (1)タイトルを入れる
        (2)x座標軸y座標軸のラベルを入れる
        (3)各関数、データの名前を付ける
        (4)仕上げ
        (補足)矢印と文字をグラフ中に入れる
10    LaTeXに張り込む
        (1)LaTeXで使える形式で出力する
        (2)LaTeXに実際に張り込む
        (3)日本語を使う
11    変更履歴

注意:最近知ったのですがGNUPLOT自身はGPLには従っていません。独自のライセンスです。



はじめに

GNUPLOTをご存知でしょうか。フリーで使えるグラフ(といってもグラフ理論の「グラフ」ではありません。)描画ソフトです。かなり広範な関数(初等関数以外にガンマ関数やベッセル関数など)を備えています。いわゆるデータからプロットすることも可能です。また簡単なフィッティングも行います。また使えるプラットフォームも広く
    Linux(X11,SVGA),OS2,Win3.1/95/98/NT,DOS(AT,PC-9801,J-3100),Mac(68K,PPC)など
とほとんどで利用可能です。ただDOS(98)でもCPUがV30などでは簡単な3次元グラフなどでものすごい時間が掛かります。DOSで使う場合は486以上が実用的なレベルだと思います。

既に研究の世界では認知度が高いわけで今更私が付け足すことは無く、多くの方が初心者向けのページから上級テクニックまで様々なレベルで紹介されているのでまずそちらを御覧下さい。私が検索でちょっと探した限りでのページを紹介します。

京都大学の大型計算機センターの簡易マニュアル;イラスト付で楽しそうです。
http://www.users.kudpc.kyoto-u.ac.jp/~w55017/COUNT/gnuplot.htm
小栗栖 修 氏(金沢大学)の「GNUPLOTの第一歩」
 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/gnuplot-intro/index.html
松田 氏(東京電機大学)のページ ; GNUPLOT関連のリンクが豊富です。
 http://ayapin.film.s.dendai.ac.jp/~matuda/Gnuplot/

また本家マニュアルもテキスト形式、HTML形式、DVI形式とそれぞれ日本語に翻訳されたものが手に入ります。基本的な使い方は誰でも身に付けられる環境が既に整っていますので、一般的使い方に関しては私がこれ以上付け足す必要はないでしょう。以下ではよく経済学で使われるであろうグラフを中心に説明します。

なお以下では標準のGNUPLOTを使う場合を説明しますが、大城氏(琉球大学)のtkgnuplotというGNUPLOTのGUIフロントエンドは極めて使い勝手がよいです。特にヘルプは優れものです。また3Dグラフの扱いが極めてよいです。tcl/tkが使える環境にある方は是非ともご利用されることをお勧めします。なおWin版GNUPLOTも使いやすく、コマンドを覚える必要があまりありません。

大城 氏(琉球大学)の自作プログラムを中心としたGNUPLOTのページ
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/gnuplot_primer/

またパッチをあてることによって某代数計算アプリにも負けない美しいグラフを描けるようになるようです。まだ試していませんが、次のMilulik 氏のページで扱われています。

P.Milulik 氏のページ
 http://www.sci.muni.cz/~mikulik/gnuplot.html

例によって自分の興味に関係した部分しか説明していません。例えばデータのプロットなどは詳しく説明しません(というよりも私には分かりません。フィッティングもどれが良くてどれが悪いのか詳しくは分からないので..。)ので、あしからず。多分GNUPLOTという以上、本当はデータのプロットにも優れているのだと思います。

注意:ここであげているリンクは、このページをつくるに当たり参考にさせて頂いたページでもあります。



効用関数を表示させる
 
<新出の命令> 
splot [xの範囲始まり: xの範囲終り] [yの範囲始まり: yの範囲終り] 関数
それではミクロ経済学でしばしば出現するコブ=ダグラス型の効用関数を描いてみましょう。中谷巌著「入門マクロ経済学」によれば、「コブ=ダグラス」の名称は、「アメリカの上院議員のポール・ダグラス氏がアメリカの国民所得の資本と労働に対する分配率が長期にわたってほぼ一定であることに気付き、数学者のチャールズ・コブ氏にこのような事実と矛盾しない生産関数は存在するかを尋ねた」ところ、

Y=AKaN(1-a)

という形の生産関数が導出されたことによるようです。ですから、本当は(マクロ的)生産関数に対してのみ用いるべきなのかもしれませんが、今では一般に

f(x)=kx1a1x2a3x3a3・・・xnan

の形の関数を「コブ=ダグラス型」と経済学では呼んでいます。今は2財の場合のコブ=ダグラス型効用関数を

u(x,y)=2x0.3y0.9

としましょう。三次元のグラフを描くには splot というコマンドを用います。x,yの範囲は非負とします。

splot [0:] [0:] 2*(x**0.3)*(y**0.9)

です。[0:] は「0以上の範囲」を意味します。一つ目がxの範囲二つ目の括弧がyの範囲を表しています。うまく表示されたでしょうか。代数計算ソフトに慣れると掛け算の記号を省略したくなりますが、GNUPLOTでは省略できませんので注意して下さい。また巾(べき)乗は ** で表現されます。これはFORTRAN流の様です。



効用関数と無差別曲線の関係をみる
 
<新出の命令> 
set contour base ( または surface か both ;初期設定は base ) 
set nocontour 
set nosurface 
set surface
次に無差別曲線を描きます。既に実数値関数である効用関数が与えられているときの無差別曲線は、効用関数の等高線(contuor)のx-y平面への射影になります。射影した段階で実数値関数がもつ「基数性」すなわち「数量」としての情報が失われます。「地図などで等高線から立体図形を復元することが可能なのだから、効用水準の数量的情報は失われていないのでは」、とお思いの方もいるかも知れませんが、地図には私達が世界標準で用いている「メートル」という基準に加え、各等高線に「何メートル」という情報が書き加えられています。もし標高のメートル数が書き込まれていない場合、つまり単に等高線だけの地図の場合は現実の山(あるいは現実の山のある決まった縮尺立体模型)を復元することはできません。

ではその失われた情報が無くても分析上は問題無いのでしょうか。実はほとんどの場合問題ありません(というかもし問題が生じたら、私達は「効用」の"メートル原器"を作らなければならなくなります。もちろん"主観的なメートル原器"が必要になるぐらいのことなら問題は無いでしょう)。多くの重要な定理は、効用水準の数量としての情報が無くても成り立つことが分かっています。したがって、ミクロ経済学の教科書には普通、無差別曲線だけが書かれているのです。もちろん情報が失われたといっても、等高線がもつ「順序」の情報、すなわち「序数性」は依然保たれていることに注意しましょう。

それでは等高線をx-y平面に射影しましょう。取り合えず効用関数も同時に表示します。等高線を描く命令は

set contour base

です。なおcontourは初期設定でbaseに設定されていますので、単に set contour でもよいです。これをsplotの前に実行しておくと、x-y平面に等高線が描かれます。山つまり効用関数の表面に等高線を描く場合は

set contour surface

とします。x-y平面と表面の両方に描く場合は

set contour both

とします。そして再び

splot [0:] [0:] 2*(x**0.3)*(y**0.9)

としてみて下さい。どうでしょう。無差別曲線のでき方が確認できたでしょうか。ひょっとすると、元のグラフがじゃまかもしれません。等高線だけ表示させる場合は、

set nosurface

とします。一般にGNUPLOTのコマンドに共通している点として、設定を解除するのは全て "no"を前に付けます。逆に再びグラフを表示させる場合は

set surface

として再びグラフを表示すればよい訳です。



無差別曲線だけを表示する(その1)
 
<新出命令> 
set view 上下方向の角度、横回転の角度 
set cntrparam level 本数
set noclabel
set clabel
さてそれでは無差別曲線だけを表示するにはどうしたらよいのでしょうか。まずお手軽にする方法があります。三次元グラフは見る視点を変えることができますのでその機能を利用します。視点を変える命令は

set view 上下方向の角度、横回転の角度

で指定します。初期設定は 60度 、30度です。つまり無差別曲線だけを見るには、グラフを消して、垂直からなおかつ回転の角度を無くして見ればよい訳です。

set nosurface
set contour
set view 0,0
splot [0:] [0:] 2*(x**0.3)*(y**0.9)

で希望通りの無差別曲線が得られたと思います。無差別曲線の本数が少くて寂しい感じがするかもしれません。無差別曲線の数を増やすのは、つまり等高線の刻みを細かくするのは、

set cntrparam levels 20

とします。20を40ぐらいにするともっと細かくなります。単純に数を増やしても、自動的に計算して等高線を引きますので、必ずしも希望通り変化するとは限りません。また set cntrpapram は等高線の設定を色々変える命令です。他にも等高線を滑らかにしたりいろいろ設定項目があります。無差別曲線の本数を増やすと右上に表示されているラベルがうるさいと感じると思います。このラベルを等高線に関してのみ消す命令は

set noclabel

です。もとに戻す場合は set clabel とします。

今紹介したのは便宜的方法です。きちんと論文などで使うグラフにアウトプットする場合は、グラフの大きさのバランスがあっていないので、あまりお勧めではありません。



EmacsからGNUPLOTを利用する

そろそろコマンドラインから命令を打ち込むのが面倒になってきたのではないでしょうか。実はGNUPLOTは、今まで行ったような対話的な使い方以外に、命令群をあらかじめテキストファイルに記述しておいて、それを実行させる、という使い方ができます。例えば先程の

# 無差別曲線を表示する(1)
set nosurface
set contour
set view 0,0
set cntrparam levels 20
splot [0:] [0:] 2*(x**0.3)*(y**0.9)
pause -1

をあらかじめエディタで書いておいて、indifference.gp という名前で保存するとします。これを実行するにはシェルなどから、

gnuplot indifference.gp

とするだけです。最後の行の pause -1は「グラフ表示後、リターンキーが押されるまでその行以下の命令を実行しない」という意味です。もしこの行が無いと、一瞬グラフが表示されてすぐに消えてしまいます。また最初の行の行頭に # が付いていますが、 #の後のその行の部分はコメントとして実行の際には無視されます。

さてエディタで編集して保存して、それをコマンドラインから入力するのは結構面倒です。もう少し楽をしましょう。コンピューター利用の極意は「如何に怠けるか」です(怠けるためにはちょっと努力しければなりませんが)。実はGNUPLOTのソースあるいはパッケージにはgnuplot.elというemacslispが付いてきます。これを利用しましょう。残念ながらEmacs,Mule,Xemacsなど以外のエディタをお使いの方は何らかの工夫が必要です。インストールは、.emacsに

(autoload 'gnu-plot-mode "gnuplot" nil t)

の一行を入れておけば良いでしょう。デフォルトでは *.gp という拡張子がgpのファイルをGNUPLOTファイルとして読み込みます。拡張子を変えたい場合は、ソースのgnuplot.elの最終行に書いてありますので、そこをいじってみてください。明示的にgnu-plot-modeに移行する場合は他のものと同様に

Meta + x   gnu-plot-mode

です。機能は二つだけです。がこれを使うとちょうど某代数計算アプリのノートブック機能の様に使うことができます(図は張り込めませんが)。
(1)Meta + e でカーソルのある行の命令を実行します。
(2)Meta + r で選択した範囲の命令を実行します。
これらを実行するとEmacsの画面が割れて、片方に実行のプロセスが表示されます。これを利用するとデバッグにも使えます。これで作業が随分と楽になります。



無差別曲線だけを表示する(その2)
 
<新出の命令> 
set term table 
set out 'ファイル名' 
set out 
set term x11 
pasue -1 
plot 関数 with lines
Emacsでの利用が可能になったところで、もう少し長いプログラムを利用して無差別曲線を表示させましょう。実はContourPlotのさせかたはヘルプファイルに書いてあります。今度はその手順に従いましょう。

#無差別曲線を表示する(2)
set nosurface
set contour
set cntrparam levels 20
# set term table はグラフを画像ではなく、数値データとして表示する命令
set term table
# set out ' ファイル名 ' は出力先を標準出力ではなく「ファイル名」のファイルに出力する命令
#ここではindif2.gpというファイルに出力します。
set out 'indif2.gp'
splot [0:] [0:] 2*(x**0.3)*(y**0.9)
# set out で出力先を、ファイルではなく、元の状態(標準出力)に戻します。
set out
# ここまででindif2.gpにx-y平面に射影された等高線のデータが記されています。
# 最後に射影された等高線、ここでは無差別曲線の表示する先を指定し直します。
# 私はLinuxなのでx11ですが、DOSではcgaやvgalibということになります。
set term x11
# 最後に今度は本物の二次元のグラフを表示します。
# plot 'ファイル名'でファイルの数値データを二次元でグラフ化します。
plot 'indif2.gp'
pause -1

さてうまく表示されたでしょうか。数値データのグラフなので初期設定では点描のグラフになっていると思います。線でつないで表示させましょう。そのためにはplot 'indif2.gp` を次のように変えます。

plot `indif2.gp` with lines

とします。なお with lines は省略して w l と頭文字だけで使うことができます。他にもGNUPLOTでは省略形がたくさんあります。実はすでに使っていて、先程のプログラム中のtermはterminal、outはoutputの省略形です。ともかくこれで滑らかな線で無差別曲線で描かれたと思います。



無差別曲線をアニメーションする
 
<新出の命令> 
ユーザー定義変数 
pause 秒数
アニメーションといっても某代数計算ソフトのように簡単にはできません。ぱらぱら漫画の要領で手作業でデータをつくらなければなりません。この辺がフリーの限界といえば限界です。もちろんどなたか気合いの入った方がGNUPLOTを拡張しようと頑張っていらっしゃるかもしれませんが、今のところは無いようです。

ここでつくるアニメーションは効用関数の分配率(といってよいか疑問ですが)の0.3と0.9を色々動かしてやろうという訳です。第1財の分配率を0.1から0.9まで、第2財の分配率を0.9から0.1まで動かすことにします。まず準備として

set view 40,300
set contour
set cntrpara levels 15
set noclabel

を設定します。新しい命令は特にありません。なおアニメーションをするにはエディタで編集してファイルとして実行させるということが必要なのです。次に分配率を a , b を変数として用います。a,bそれぞれの刻みを表す変数を c , d とします。またアニメーションの刻みを表す変数を t とします。GNUPLOTは自分で定義した関数を用いることができます。もちろん変数も使えます。これを利用します。まず初期設定で

a=0.0
b=1.0
t=0.3
c=0.1
d=0.1

とします。次に

a=a+c
b=b-d
splot [0:] [0:] [0:20] 2*(x**a)*(y**b)
pause t

とファイルに続けて書きます。最初の2行はパラメターのaをc=0.1減らし、bをd=0.1増やすということです。pause t はt秒待つという意味です。これを後はアニメーションを繰り返す数だけコピーペーストすればよい訳です。最後に pause -1 を入れるのを忘れずに。でないとすぐにアニメーションが終ったらすぐに消えます。まとめたものが次です。

#無差別曲線をアニメーションする
set view 40,300
set contour
set cntrpara levels 15
set noclabel
a=0.0
b=1.0
t=0.5
c=0.1
d=0.1
#-----
a=a+c
b=b-d
splot [0:] [0:] [0:20] 2*(x**a)*(y**b)
pause t
#-----
:
以下アニメーションを続ける数だけ#--  #--で挟んだ部分をコピーペースト
最初の数値の設定のままであれば9回が妥当でしょう。
:
a=a+c
b=b-d
splot [0:] [0:] [0:20] 2*(x**a)*(y**b)
pause -1

このプログラムを、anime.gpとでも名前を付けて、あとはGNUPLOTで実行するだけです。これで何とかアニメーションが見られたと思います。この方法はマシーンの性能に大きく依存するので、ひょっとすると遅くてアニメにならないかもしれません。私のLinux機(AT)は互換CPUの166Mhzですが、何とかアニメっぽくなっています。試していませんが、もっと早いCPUでは確実にアニメになると思います。もう少し繰り返し部分が簡素になりそうですが、あいにくGNUPLOTはifで分岐することしかできません。ひょっとすると繰り返しをうまくできるのかもしれませんが、まあ取り合えず動きますから我慢して下さい。

あとはa,b,c,d,tを適当に動かしていろいろ試して見て下さい。例えば a=0.0,b=0.5,c=0.1,d=0 とすれば a だけを変化させたときの軌跡が分かります。



より具体的な応用例(クールノーの複占モデルの図)
 
<新出の命令>
set isosamples サンプリング数
set cntrpara levels incremental 始点の高さ, 増分, 終点の高さ
set cntrparam levels descrete 等高線の高さ
効用関数を描くだけではあまり有難くないかもしれません。もう少し具体的な例を考えます。ここでは線形な逆需要関数の場合のクールノー型(生産量の調整で二企業が張り合うタイプ)の複占モデルを考えます。最近のミクロ経済学の教科書には載っていると思います。載っていない場合は応用ミクロ経済学の教科書かあるいは(非協力)ゲーム理論の教科書には絶対載っています(載っていなかったらそれはほとんど詐欺です)。
 
設定
x 企業1の生産量
y 企業2の生産量
20-x-y 逆需要関数(つまり価格)
3x 企業1の費用関数
3y 企業2の費用関数
(20-x-y)x-3x 企業1の利潤
(20-x-y)y-3y 企業2の利潤
それぞれどうしてこういう設定になっているかは教科書で確認して下さい。まず2企業の利潤をグラフに表してみましょう。利潤のグラフは3次元のグラフですからsplotを使います。

set view ,300
set isosamples 40
splot [0:20] [0:20] [0:] (20-x-y)*x-3*x, (20-x-y)*y-3*y

です。set view ,300 は原点が手前にくるように調節しています。次の set isosamaples 40 は3次元グラフのメッシュの細かさを指定する命令です。初期設定では10になっていますが、ここではもう少し細かくしてみました。最後に新しい使い方として、二つ以上のグラフを同時に表示するときは「 , 」で区切って次のグラフを記します。また値域もこの場合は指定します。このモデルの場合、マイナスの利潤が発生したら企業は撤退する(あるいは生産を行わない)ことは分かっているからです。マイナス利潤のところは興味が無いので省きます。三つ目のかぎかっこがそれです。どうでしょううまく表示されたでしょうか。なんとなく中央付近で2企業の利潤が等しくなりそうな生産量の組があって、それ以外の点ではお互いの利潤はちょうど逆に動いている様子が分かるでしょうか。

次の等高線を描いてみましょう。効用関数では等高線のことを無差別曲線と呼びましたが、この関数は利潤を表していますので等高線のことを「等利潤曲線」と呼びます。3次元のグラフは正確に関数の情報を記述しているわけですが、それを分析にそのまま使うには結構しんどい訳でして、当然ある種の情報を省略しても分析しやすいところに持ち込むということが考えられます。等高線を描くのも同じ精神です。

等高線を描くには先程設定したように set contour を使います。ただしそのままだとマイナス利潤の部分の等高線も描かれてしまいます。そこで次の命令を実行します。

set contour
set cntrpara levels incremental 0,10

二行目の意味は、等高線の開始レベルを0から、増分を10にするという意味です。これで先程のグラフの命令を実行すると、等利潤曲線と利潤の関係が分かると思います。これを等利潤曲線だけ見たい場合は、(その1)の便宜的方法を使って

set view 0,0
set nosurface
set contour
set cntrpara levels incremental 0,10
splot [0:20] [0:20] [0:] (20-x-y)*x-3*x, (20-x-y)*y-3*y

を実行します。多分等利潤曲線が描けたことと思います。普通はこのあと反応関数を求めます。反応関数は相手企業の生産量が与えられたとき、自企業が利潤を最大化する生産量を示したものです。次のようになります

x=max[ 0 , 1/2(20-3-y) ]    :企業1の反応関数
y=max[ 0 , 1/2(20-3-x) ]    :企業2の反応関数

今は反応関数はx=1/2(17-y),y=1/2(17-x)とします(そうしてもよかったことは後で確認できます)。x=1/2(17-y)はこのままでは二次元のグラフに描けませんので整理しますと、

y=-2x+17            :企業1の反応関数
y=1/2(17-x)        :企業2の反応関数

となります。これをグラフに描くのは簡単です。

plot [0:]  [0:] -2*x+17,0.5*(17-x)

とします。二つの目のグラフは(1/2)*(17-x)でもよさそうなのですが、うまく表示されません。0.5*(17-x)ならばうまく表示されます。恐らくコンピュータ特有の小数の処理の問題でそうなるのだと思います。ここら辺も調整無しに、うまく表示してくれるとかなりアリガタイのですが、フリーですから我慢しましょう。コンピュータ全般に言えることですが、GNUPLOTも分数が苦手です数値に分数を使って、もし図に誤差が明らかにでているようでしたら、別の計算機(あるいは計算ソフト)で計算して小数点以下4、5桁で近似した値に変えて見て下さい。結構うまくいきます。で交点ですが、GNUPLOTで交点座標は求めてくれませんから、手計算で解きましょう。解くと x=17/3, y=17/3 となります。このとき両者の利潤は(17/3)**2=289/9となります。この点は一旦達成されると逸脱する誘因(インセンティブ)が無いことが確認できます。確認はきちんと計算することでもできますが、ここでは図で確認しましょう。今度は等高線を10,289/9,40のレベルだけ表示することにします。また今度は反応関数も一緒に表示したいので、(その2)の方法を使います。

# クールノー型複占モデルの図
set nosurface
# 初期設定では少し粗い様なので次の命令で滑らかにします。
set isosamples 40
set contour
set cntrparam levels discrete 10,289/9,40
# set cntrpara levels discrete  10,289/9,40で10,289/9,40のレベルだけ等高線を表示
# (17/3)**2を289/9としているのは小数部分の誤差が大きくならないようにするため。
# 実際両者では結果が大きく違ってきます。
set term table
set out 'cournot2.gp'
splot [0:20] [0:20] [0:] (20-x-y)*x-3*x, (20-x-y)*y-3*y
set out
set term x11
plot [0:] [0:] 'cournot2.gp' w l,-2*x+17,0.5*(17-x)
#ここも誤差の関係上、小数に直してあります。
pause -1

さてうまく表示されたでしょうか。きちんと両企業の等利潤曲線の一本が反応関数の交点を通っているでしょうか。まず気付くことは各企業の等利潤曲線のてっぺんが、反応関数上にあるということです。これは反応関数が「関数」(一価関数)になっていることの証拠です。もしそれ以外の点を反応曲線が通っているなら、相手企業がある生産水準のとき、同じ利潤をもたらす生産量が他にもあることになります。
反応関数の交点も当然両企業の等利潤曲線のてっぺんを通っています。さて、企業1が交点から離れようとしたします。ところがこれは等利潤曲線のてっぺんですから、左右に動けば利潤が下がります。企業2も同様です。企業1、企業2ともにそういう状態になる点は、反応関数が等利潤曲線のてっぺんを通っていることを考えると、反応関数の交点以外ありません。実はこの点のことを「ナッシュ均衡」と呼びます。ナッシュ均衡は非協力ゲーム理論の一般的な均衡概念です。ただしクールノーのモデルは1838年に既に提出されていて、モデルが特定化されているとはいえ、均衡概念のアイデアとしては先なので、クールノーに敬意を払う意味で「クールノー=ナッシュ均衡」と呼ぶことがあります。



論文に利用するための体裁
 
<新出の命令>
set title 'タイトル名' 文字のx座標, 文字のy座標
set x(y)label 'ラベル名'
set nokey
set key
set cntrparam bspline
set cntrparam order 数字 (2から10)
plot 関数 title 'タイトル'
set arrow from x座標,y座標 to x座標,y座標
set label "ラベル名" at x座標,y座標
さてこの図を論文に張り込むことを考えます。ただし等高線は均衡に関するもののみにしましょう。

(1)タイトルを入れる
図には題が付きものです。ただしLaTeXで利用される場合は、LaTeXの方で題を入れるので特に必要は無いでしょう。そうでない場合は大抵題を入れますし、OHPなどにアウトプットするときも必要でしょう。ではどうするか。

set title 'Cournot Duopoly Model'

とします。これでグラフの中央上端あたりにCournot Duopoly Modelと表示されます。表示位置を変えるときは、例えば

set title 'Cournot Duopoly Model' 25,-25

とします。初期設定の「中央上端」を(0,0)とした文字の座標で与えます。ですからこの例は初期の位置から右に25文字、下に25文字を意味します。なお普通に配布されているGNUPLOTをそのまま使う場合は日本語を表示できませんので注意して下さい。ただし日本語が使えるようになるパッチはあります。またLaTeX2eを使う場合は、後で紹介しますように、「適当なアルファベットを書いておいて、日本語に置き換える」ということができますので、特に心配はいりません。

(2)x座標軸 y座標軸のラベルを付ける
ここではx座標をThe Output of Firm 1 、y座標をThe Output of Firm2とします。

set xlabel 'The Output of Firm 1'
set ylabel 'The Output of Firm 2'

です。表示位置の変え方はタイトルと同じです。

(3)各関数、データーの名前を付ける
初期設定では関数名は、打ち込んだ通りの関数名が表示されます。しかしこれではグラフを見ている側には何が何だか分かりません。もしこれを表示しない場合は

set nokey

とします。ここでは表示しますので

set key

としておいて下さい。表示位置は set key x座標,y座標 で指定します。ここでは初期設定のままにします。取り合えず各関数、データ名をことばで補いましょう。まずグラフの一つ目は等利潤曲線ですから、Iso Profit Curveとします。また二つ目は、企業1の反応関数なのでThe Reaction Function of Firm 1、三つ目はThe Reaction Function of Firm 2とします。それぞれを設定するにはplotのあとに設定する必要があります。plot なんとか title 'タイトル' で「タイトル」に名前が置き換わります。具体的には、

plot [0:] [0:] 'cournot2.gp' title 'Iso Profit Curve' w l,-2*x+17 title 'The Reaction Function of Firm 1', 0.5*(17-x) title 'The Reaction Function of Firm 2'

とします。

(4)仕上げ
前のままだと等利潤曲線が二企業とも同じグラフとして扱われています。最後にこれを分けるようにします。いままでのをまとめると、

# クールノー複占モデルのグラフ完成版
set nosurface
set isosamples 40
set contour
set cntrparam bspline
set cntrparam order 10
set cntrparam levels discrete 289/9
set term table
set out 'firm1.dat'
splot [0:20] [0:20] [0:] (20-x-y)*x-3*x
set out 'firm2.dat'
splot [0:20] [0:20] [0:] (20-x-y)*y-3*y
set out
set term x11
set title 'Cournot Duopoly Model' 0,0
set xlabel 'The Output of Firm 1'
set ylabel 'The Output of Firm 2'
plot [0:] [0:] 'firm1.dat' title 'The Iso Profit Curve of Firm 1' w l, 'firm2.dat' title 'The Iso Profit Curve of Firm 2' w l,-2*x+17 title 'The Reaction Function of Firm 1', 0.5*(17-x) title 'The Reaction Function of Firm 2'
pause -1

です。長いようですが、大したことはしていません。set cntrparam bsplineset cntrparam order 10 は等高線を最も滑らかにする設定です(2が最も粗い)。bspline は補完の方法です。また等高線の滑らかさだけを高くしてももとのグラフが滑らかでないときれいには描けないようなので、set isosamples 40 も入れてあります。

(補足)矢印と文字をグラフ中にいれる
ここはそういう機能がありますよという程度です。私はグラフに矢印や文字をいれて装飾するのは別のグラフィックソフトで行った方が良いと思っています。Linuxであればtgif形式でtgif (tgifはフリーの高機能ドローアプリ。日本語も使えます) から読み込めます。また大城氏のtkアプリケーションにはGUIな環境で矢印などを書き込めるものがありますので、利用してみてはいかがでしょうか。ただ、目的とする数値が具体的に分かっているときは、数値で絵を描く方が便利なこともありますので、以下で紹介します。

ここではナッシュ均衡点を矢印で指し示すことを考えます。幸いナッシュ均衡点は(17/3,17/3)という点であることが分かっています。そのちょっと斜め上の(6,6)の位置に矢印がくるようにします。長さは適当ですが(8,8)ぐらいから引けばよいでしょう。これには、plot命令の前で

set arrow from 8,8 to 6,6

とします。更に矢印の出発点にCournot-Nash Equilibriumといれることにします。グラフ中に文字をいれるには set labelを使います。具体的には

set label "Cournot-Nash Equilibrium" at 8.5,8

とします。これで論文に使えそうな、なおかつ数値例に忠実なグラフが書けたことになります。Xではこんな感じです。



LaTeXに張り込む
 
<新出の命令>
set term postscript eps [12,24]
さていよいよ文章に張り込むことになります。EPSで出力できますから大概のワープロソフトには張り込めるのではないでしょうか。またWin用GNUPLOTはGIFでアウトプットできるようなので、HTMLにも楽に使えると思います。ともかく私は有名なワープロソフトをことごとく使ったことがありませんので、ワープロ文書に張り込むということに関しては一切分かりません。ここではLaTeXでどう使うかを考えます。

(1)LaTeXで使える形式で出力する
まずLaTeXに関係する出力形式としては

LaTeX picuture 環境 形式
LaTeX eepic 形式
Postscript 形式(EPS)

があります。最初の形式はほぼどのLaTeX環境でも動く形式です。が出力はあまりきれいではなく、かつLaTeXのコンパイルに時間がかかります。eepicは少しましですが、やはりそうきれいな出力が得られる訳ではありません。実用的な選択としてはEPS形式でしょう。EPS形式で出力するには 先程の完成版のプログラムの set term x11 となっているところを

set term postscritpt eps 12

とします。フォントを変えられたりもしますが、ここでは初期設定のままでいきましょう。またアウトプットするファイルも指定しなければなりません。これは既に扱っています set out をつかいます。以上を合わせると

# クールノー複占モデルのグラフ epsで出力するぞ! 版
set nosurface
set isosamples 40
set contour
set cntrparam order 10
set cntrparam levels discrete 289/9
set term table
set out 'firm1.dat'
splot [0:20] [0:20] [0:] (20-x-y)*x-3*x
set out 'firm2.dat'
splot [0:20] [0:20] [0:] (20-x-y)*y-3*y
set out 'cournot.eps'
# cournot.eps というファイルで出力
set term postscript eps 12
# epsを指定
set title 'Cournot Duopoly Model' 0,0
set xlabel 'The Output of Firm 1'
set ylabel 'The Output of Firm 2'
set arrow from 8,8 to 6,6
set label "Cournot-Nash Equilibrium" at 8.5,8
plot [0:] [0:] 'firm1.dat' title 'The Iso Profit Curve of Firm 1' w l, 'firm2.dat' title 'The Iso Profit Curve of Firm 2' w l,-2*x+17 title 'The Reaction Function of Firm 1', 0.5*(17-x) title 'The Reaction Function of Firm 2'

となります。これでepsファイルができたはずです。

(2)LaTeXに実際に張り込む
    [1]LaTeX picture 環境の場合
もしLaTeX picucture環境で cournot.tex というファイル名でアウトプットした場合、既に環境として出力されていますので、普通のLaTeXファイルをよみこむのと同じように
        \input{cournot.tex}
とします。あとはfigure環境などで調整して下さい。
    [2]EPSの場合
まず最初にパッケージを読み込む必要があります。
        \usepackage[dvips]{graphicx}
です。[dvips]はdvipsを使う場合に必要なだけで、単にxdviなどで表示する場合は必要ありません。が特に何も無ければ最初から付けておいたほうがよいでしょう。具体的にはどうやって読み込むかといいますと
        \includegraphics{cournot.eps}
とします。幅や高さを具体的数値で与えて大きさを調整する場合は
        \includegraphics[width=13cm]{cournot.eps}
とか
        \includegraphics[width=13cm, height=13cm]{cournot.eps}
のようにします。もとの図形の1/2の縮尺にしたいというときは
        \includegraphics[scale=0.5]{cournot.eps}
とします。またもとの図形を90度回転させる場合は
        \includegraphics[angle=90]{cournot.eps}
とします。より詳しい使い方は dtxファイル をLaTeXにかけてできるマニュアルを読まれるか、あるいは
        Keith Rekdahl,1997,Using Imported Graphics in LaTeX2e (全86ページ)
        D.P.Carlisle,1998,Packages in the 'graphics' bundle(全14ページ)
などに当たってみて下さい。両方ともフリーのドキュメントです。CTANなどで手に入ると思います。

(3)日本語を使う
これはGNUPLOTが日本語を扱えないがゆえに発生している問題です。しかし解決法はあります。
まず先程のクールノーモデルの図中にあらわれた説明をすべて日本語にすることを目標にします。これを置き換えるので、取り合えず英語は記号としてしか機能しませんから、なるべく短い語で、プログラムは書くことにします。次のがそうです。

# クールノー複占モデルのグラフ epsで出力するぞ! 日本語版
set nosurface
set isosamples 40
set contour
set cntrparam order 10
set cntrparam levels discrete 289/9
set term table
set out 'firm1.dat'
splot [0:20] [0:20] [0:] (20-x-y)*x-3*x
set out 'firm2.dat'
splot [0:20] [0:20] [0:] (20-x-y)*y-3*y
set out 'cournot.eps'
set term postscript enhanced
set title 'cdm' 0,0
set xlabel 'of1'
set ylabel 'of2'
set arrow from 8,8 to 6,6
set label "cne" at 8.5,8
plot [0:] [0:] 'firm1.dat' title 'ipc1' w l, 'firm2.dat' title 'ipc2' w l,-2*x+17 title 'rf1', 0.5*(17-x) title 'rf2'

大体もとの英語の頭文字で表しています。
        [1]LaTeX picture 環境 形式の場合
この場合は楽です。LaTeX picture形式というのはテキストファイルです。ラベルなどの言葉はそのままテキスト中に現われていますから容易に探すことができます。要は該当する単語・記号(いまはcdm とか ipc2など)を日本語に置き換えるだけでよいです。ただし、バランスは保証されません。

        [2]EPSファイルの場合
この場合は、Postscriptで出力できる環境が必要です。PSfragと呼ばれるパッケージを使います。従って
    \usepackage{psfrag}
を最初の方に付け加えます。EPSを扱うのでgraphicx(or graphics)パッケージも当然必要です。同様に読み込む設定をしておいて下さい。そのあと次のようにします。

\begin{figure}
    \psfrag{cdm}{クールノー型複占モデル}
    \psfrag{of1}{企業1の生産量}
    \psfrag{of2}{企業2の生産量}
    \psfrag{cne}{クールノー=ナッシュ均衡}
    \psfrag{ipc1}{{\small 企業1の等利潤曲線}}
    \psfrag{ipc2}{{\small 企業2の等利潤曲線}}
    \psfrag{rf1}{{\small 企業1の反応関数}}
    \psfrag{rf2}{{\samll 企業2の反応関数}}
    \includegraphics{cournot.eps}
\end{figure}

のように使います。\psfrag{元の文字}{置き換える文字} という使い方です。この状態でLaTeXをかけて xdvi などで出力しても、画面には PSfragreplacement という表示以下に置き換えるべき文字が列挙されているだけで、置き換えは行われません。実際に日本語に置き換えるにはPostscript形式に変換する必要があります。変換にはフリーのdvipsを普通用います。変換されたPostscritpファイルは日本語が表示させます。私が最初に実際に使ってみたところでは、関数を説明する部分がつまってしまって読みにくかったので、\small で小さくしてあります。



変更履歴

Apr/18/2000    ver 1.3
--いくつか誤植がまだあったので修正。
--文中のプログラム(?)をファイルにしてアーカイブでも利用できるようにした。
Nov/27/1999    ver 1.2a
--EPS出力の命令が間違っていました。
--てっきりenhanced だと思っていました。申し訳ないです。
--enhanced->eps ということです。
--enhanced は上つき文字などをPSで直接実現する環境のようです。
Nov/24/1999    ver 1.2
--表現を一部改める。
--GNU General Public Licence の すすめる方法に従った書式にした。
Nov/19/1999    ver 1.1
--新出命令の項目を追加。
--誤植の訂正 (「LaTeXに張り込む」の節の13->13cm,hight->heightなど)。
--つかえるプラットフォームの紹介を追加。
--CopyrightをCopyleftに改める。
Nov/16/1999    ver 1.0
--正式公開



Copyleft Oishi Hidetsugu 1999
OoishiHidetsugu@compsrv.econ.osaka-u.ac.jp