GNUPLOT
による関数グラフの作り方
2004
年 10 月 6 日
概 要
UNIX版とMicrosoft-Windows版のGNUPLOTバージョン3.7を使って関数をグラフに
する方法を説明する。 具体的に書いてあるので実際にGNUPLOTを操作して試しながら読む ことができる。 数値データの扱い方についても述べてあるが、バッチ処理とか他のプログラム とのデータ交換のようなことはこの文書の範囲外である。
目 次
1 GNUPLOTとは 2 2 実行方法 2 3 コマンドの入力方法 4 4 関数グラフの描きかた 7 5 グラフの出力 9 6 重ね合わせグラフ 10 7 パラメトリック関数のグラフ 12 8 極座標表示 13 9 2変数の関数 14 10 補足 — 数値データのあつかい 17図 目 次
1 GNUPLOT操作中の画面 . . . . 3 2 MS-Windows版 GNUPLOT のアイコンの例 . . . . 3 3 y = x2− 2x のグラフ . . . . 8 4 振動子の応答 . . . . 11 5 振動子の応答 (両対数目盛) . . . . 12 6 パラメトリックプロット . . . . 13 7 惑星の軌道 . . . . 138 2変数関数のプロット . . . . 15 9 2変数関数の等高線プロット . . . . 16 10 関数のデータへの適合 . . . . 18
1
GNUPLOT
とは
GNUPLOTはグラフを描くプログラムです。グラフの作成に必要な範囲に機能を絞ってあるの で、いろいろな機能を含んでいる複雑なプログラムに比べて理解しやすく操作が簡単で高速です。 GNUPLOTの機能を大雑把に言えば次のようになります。 • 与えられた 1 変数または2変数の式からグラフを作る。 • 与えられた数値データからグラフを作る。 • 多種の装置やデータ形式への出力を行う。 • モデル関数をデータに適合させる。 当然、式の値を計算したり計算結果や式を憶えておく機能もあるので、普通の関数電卓としても 利用することができます。しかも復素数の関数の計算までできます。作ることのできるグラフの 種類はそれほど豊富ではなくパイチャート (円グラフ) や凝った絵グラフのようなものは作れませ んが、技術系の地味な用途での要求は満たします。いろいろな形式でデータを出力できることはGNUPLOT の大きな特徴で、そのことによって、GNUPLOT で作ったグラフを TEX や各種の
ワープロなど他のプログラムで取り込んで利用することがかなり自由に行えます。「適合」という のはいわゆる fitting で、測定データに合わせて理論曲線を調節して描く機能です。 その他、操作の結果を保存する機能やバッチ処理(自動運転)の機能もあり、複雑な作業を行う 場合の助けになります。マニュアルは印刷したものを読むこともできますし、オンラインマニュア ルとして読むこともできます。GNUPLOT に関する情報はたとえば www ページの http://www.cs.dartmouth.edu/gnuplot info.html をご覧ください。
2
実行方法
UNIXマシンでは GNUPLOT は標準で X 端末にグラフを表示します。 UNIX ワークステーショ
ンでの作業なら通常 X 環境になっていますからそのままで GNUPLOT が動作するでしょう。 他に GNUPLOTには Tektronix 4010 型端末エミュレーターを使ってグラフの表示を行う機能がありま す。 この機能を利用すると、比較的遅い通信回線で繋いだ他のコンピューターから GNUPLOT を 使うことができます。 端末の側で表示に使うことのできる端末エミュレーターとしては、Kermit や Teraterm や xterm があります。 ここでは、UNIX に関しては標準の X 環境での操作を想定します。その場合、kterm か何かの 端末ウィンドウを開き、そこで次のようなコマンドを打ち込んで GNUPLOT を起動します。
% gnuplot 左端の% は UNIX シェルのコマンドプロンプトのつもりです (シェルのコマンドプロンプトは設定 によって異なります。)。キーボードから入力するのはこれを除いた部分です。 起動コマンドを入 力した端末ウィンドウ内で引続き GNUPLOT との対話セッションが行われますが、グラフを描こ うとするとグラフ用のウィンドウが別に開いてそこにグラフが表示されます。 図 1 はその様子で す。 グラフを表示するウィンドウは一つだけで、別のグラフを描くときにもこのウィンドウが再 利用されます。 図 1: GNUPLOT 操作中の画面 図 2: MS-Windows 版 GNUPLOT のアイコンの例 Windowsでは、コマンドではなく GUI を使った操作でアプリケーションを起動しますが、コン ピューターの設定がどうなっているかによって具体的な方法は異なります。デスクトップ画面の中 に GNUPLOT のアイコンが置いてあるかも知れませんし、プログラムマネージャーやスタートメ ニューの中を探す必要があるかもしれません。 GNUPLOT のアイコンやメニューには Wgnuplot と か GNUPLOT for Windows というような名前が使われているかもしれません。図 2 は GNUPLOT を起動するアイコンの例です。GNUPLOT が起動すると、 GNUPLOT との対話セッションに使 うウィンドウが新たに開かれます。これ以後の操作は UNIX と同様です。
GNUPLOTが動き出すと、UNIX の場合でも Windows の場合でも、GNUPLOT のバージョ
ン情報などの表示に続いて次のようなプロンプトが表示されます。 gnuplot>
ユーザーはこのプロンプトに対してコマンドなどを入力して GNUPLOT を操作します。たとえ ば、pwd と打ってみてください。すると、GNUPLOT のカレントディレクトリーが表示されます。 これは特に何も指定しない場合にファイルの読み書きを行う場所です。
GNUPLOTを終了させるには quit または exit と打ちます。UNIX の場合は、グラフィック
スのウィンドウが開いていればそれが閉まり、シェルのプロンプトが復活します。Windows では GNUPLOTのウィンドウがすべて閉まるだけです。
3
コマンドの入力方法
実際に GNUPLOT で作業を行うために、まず作業を行うためのディレクトリーを作りましょう。 UNIXでは、たとえば、端末ウィンドウで、 % mkdir ~/gplot % cd ~/gplot % gnuplot のように入力します。これで、ホームディレクトリー (~であらわされる) の下に gplot という 名のディレクトリーができ、そこをカレントディレクトリーとして GNUPLOT が起動します。 GNUPLOTの中で pwd と打つと、GNUPLOT がどこをカレントディレクトリーとして認識して いるかを確かめることができます。 もし、ディレクトリーについて理解できないし理解したくもないという場合は、ホームディレク トリーになんでもかんでも保存するしかありません。この場合は % cd % gnuplot と打ってください。gnuplot と打つ前に cd と打つのは、確実にホームディレクトリーを使うよう にするためです。しかし、このコンピューターを他の用途にも使うかもしれないのなら、本当はこ のようなことをやってはいけません。 Windowsの世界ではプログラムがファイル操作をする場所に関しての一般的な規約というもの はありません。しかし、きちんと管理されているコンピューターならそれに関するポリシーが決め られているはずですから、それを確かめてください。さもなければ、データを保存したつもりなの にそれを見付けることができないということが起こります。 前述のように、GNUPLOT がどこを標準のディレクトリーと思っているかは、pwd コマンドで わかります。また、GNUPLOT の中でこのディレクトリーを変更するコマンドは cd です。この コマンドにはクォーテーションマークで囲んだディレクトリー名を続けて入力します。 GNUPLOTに対するコマンドはすべてキーボードを打って入力することができますが、Windows 版ではメニューやボタンを併用することもできます。たとえば 1 + 2 という式の値を表示するには gnuplot> print 1+2のように打って Enter キーを押します (左端の gnuplot> という部分は GNUPLOT のプロンプ ト) が、 Windows 版なら Expressions メニューの Evaluate を使って print の部分を入力するこ ともできます。 続けてキーボードで 1+2 と打って Enter キーを押せば完了です。 コマンドの綴 りを覚えていてキーボードから入力するのが最も能率的ですが、ほとんどのコマンドがメニューか らも入力できるようになっているので、英語の綴りを忘れていてしかもマニュアルを見るのが嫌な
場合ても大丈夫。 数式で使う演算記号の一部や関数記号もメニューから入力することができます。 演算記号は Expressions メニュー、関数は Functions メニューにあります。 GNUPLOTに与えるコマンドはすべて上の例の print のような動詞から始まる命令文か、変数 に値をセットする代入文です。 扱うことのできる数値データは整数か実数か複素数ですが、グラ フのラベルやファイル名などには文字列が使えます。 式は四則演算と関数を含むことができます。 なお、整数どうしの割算の結果は余りが出る場合でも整数になります。通常の計算ではこれは困 ります。たとえば、9/4 は 2 になってしまうのです。しかし、9.0/4 とか 9/4.0 とするとちゃんと 2.25になります。このように、小数点を付けないと期待した結果にならないかもしれないので気 を付けましょう。 関数の引数は
gnuplot> print sin(3.14)
のようにいつでも括弧で囲む必要があります。 同じ数値や式を繰り返して入力する代わりに,次 のように変数を使うことができます。
gnuplot> kekka = sin(3.14) + 1 gnuplot> print kekka
1.00159
gnuplot> print - kekka -1.00159 kekkaのように変数名を自分で勝手に作って使いますが、使える文字は英字と (アンダースコア) および数字です。ただし単語の先頭の文字には数字は使えません。アンダースコアはどこに用いて もよいのですが、the_mass_of_electron のように複数の英単語を集めて 1 つの単語にするよう な場合に役立ちます。 大文字・小文字は区別されるので、kekka と Kekka は全く別物とみなされ ます。 kekka の値は今 1.00159 ですが、 kekka=0.5 のように後から違う値を代入することもで きます。 違う値を代入すると前の値は無くなります。 つまり、変数は最も新しく代入した値だけ を憶えています。 関数も自前で定義して使うことができます。関数名は変数名と同じ規則で作ります。次の例で は、始めの 2 行で関数を 2 つ定義し、定義した関数を使って計算しています。(プロンプトの右側 だけがオペレーターの入力です。) gnuplot> f(x) = x**2 - 2*x gnuplot> g(x,y) = x**2 - y**2 gnuplot> print f(3) 3 gnuplot> print g(2,1) 3 gnuplot> print g(1,2) -3 *は掛け算、 ** はべき乗の演算記号です。始めの行は f (x) = x2− 2x、という 1 変数の関数、2 番目の行は g(x, y) = x2 − y2 という 2 変数の関数を定義しています。上の print コマンドで表示 される結果が自分でも予測できれば理解できたことになりますが、どうですか? キーポイントは、 x や y のような定義で使った引数(仮引数という)と 1 や 2 や 3 のような実際に計算するときに 与える引数(実引数という)との対応の規則にあります。
変数に式の値を代入するときと関数を定義するときに与えるコマンドは動詞が無くいきなり変数 名や関数名から始まることに注意してください。 = が動詞の役割をしていると解釈してもよいで しょう。 他の場合はすべて実際に動詞から始まります。 単語は今までに変数名、 関数名、 コマンドの動詞として出てきました。GNUPLOT は単語が 変数名なのか関数名なのかそれともコマンドの動詞なのかをコマンド中での前後関係から判断する ようになっています。 gnuplot> sin = 12345 gnuplot> print sin(3.14)
0.00159265 gnuplot> print sin
12345 このように、単語は括弧があるかどうかで関数として解釈されたり変数として解釈されたりしま す。コマンドの動詞については次の例でわかるとおりです。 gnuplot> print = 123 gnuplot> print 456 456
gnuplot> print print 123 しかし、別のものに同じ名前を使うのは間違いの元になりますしメリットも無さそうです。した がって上のは悪い例です。 さて、 同じようなコマンドを繰り返して実行したい場合には前に入力したコマンドを思い出さ せる機能が役に立ちます。 キーボードの上向き矢印キーを押す度に前回のコマンド、 前々回のコ マンド · · · とさかのぼって呼び出されるので、 目的のものが出てきたら左右の向きの矢印キーや Backspaceキーなどを使って必要なところだけを書き換えます。 書き換えたら Enter キーを押し て実行させます。 また、さかのぼり過ぎたら下向き矢印キーで戻ることができます。Windows で はウィンドウ上部の Prev ボタンと Next ボタンにもコマンドを思い出させる機能があります。 そのほかの重要な機能としてはオンラインヘルプがあります。 オンラインヘルプは help と打て ば起動して、情報提供の可能な項目のリストが表示されます。 そのリストから項目を選ぶとさら に詳しい表示に変わります。 UNIX では、 オ ンラインヘルプが表示されているとき Return キー を単独で押すとオンライン ヘルプの階層を逆に戻るようになっています。 それで、 Return キー を何度か押せばオンラインヘルプの表 示が終了します。 Windows 版では Help メニューからオン ラインヘルプを辿ることができます。 オンラインヘルプの中の見たい項目がわかっている場合は、help コマンドにその項目名を指定す れば、すぐに目的の項目が表示されます。たとえば、GNUPLOT に組込まれている関数にどんな ものがあるかが知りたければ、次のようにして “functions” という項目に直接行けばよいのです。
gnuplot> help functions
GNUPLOTのグラフ作成機能のデモンストレーションを行うこともできます。Windows 版で
は File メニューの Demos でファイルを呼び出すダイアログボックスが開くので、 demo フォル ダーの中の自動実行スクリプトファイルから選んで OK ボタンを押します。 このフォルダーの中 でファイル名の最後が.dem となっ ているものが GNUPLOT で実行可能な自動実行スクリプト
ファイルです。 ただし all.dem と animate.dem は Windows パソコンで実行すると時間がかかっ たりコンピュータを停止させたりする可能性があるのでやめておいた方がよいでしょう。 UNIXでは、デモンストレーション用の自動実行スクリプトファイルが格納されているディレ クトリーを調べてそこにあるファイルをまず自分で作ったサブディレクトリーにすべてコピーし ておくのが良いでしょう。 そのサブディレクトリーに移ってスクリプトファイルの名前を付けて GNUPLOT を起動します。 ここまでのシェルでのコマンド操作は大体次のようになるでしょう。 (この通りやってうまく行くかどうかは状況によります。) % mkdir gplotdemo % cp /NF/local/general/lib/gnuplot/demo/* gplotdemo/ % cd gplotdemo % gnuplot all.dem all.demはすべてのデモンストレーションを順に自動実行するものです。1部だけ見たい場合は % gnuplot simple.dem のように各デモンストレーションファイルを実行させると良いでしょう。 デモンストレーション用のスクリプトファイルはテキストエディタ(たとえば Notepad や mule) で開いて読むことができます。 ファイルの中身は GNUPLOT に与えるコマンドが順番に並んだ ものですから、コマンドの使い方の例として読むことができます。 #で始まる行には説明が書い てあります。
4
関数グラフの描きかた
GNUPLOTを使うと関数のグラフを非常に簡単に描くことができます。y = x2− 2x のグラフ を描いてみましょう。後で印刷もします。 gnuplot> plot x**2 - 2*x と入力するとグラフ用のウィンドウが開き放物線が描かれます。(独立変数として x 以外のものを 使いたい場合は plot と dummy に関するヘルプを見てください。) この放物線が x = 0 と x = 2 で x 軸と交わるはずであることは式からわかりますが、今描いたグラフではあまりはっきりとは わかりません。そこで、この 2 点のあたりがよくわかるようにグラフを描く範囲を決めます。gnuplot> set xrange [-1:3] gnuplot> replot
set コマンドにはいろいろなバリエーションがあり、グラフを描くときのいろいろな条件を設定し
ます。 set xrange は横軸の下限と上限を設定します。replot は最近描いたグラフを描き直すコ マンドです。図 3はこのようにして描きました。
set xrangeの括弧の種類と下限値、上限値を区切る記号に注意してください。間違えると、た
とえば
gnuplot> set xrange [-1, 3] ^
-1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 Dependent variable Independent variable A Parabola 図 3: y = x2 − 2x のグラフ のようにエラーメッセージで間違いのある箇所を指摘してきます。今の場合はコンマのところを : (コロン) か to に直せばよいことがエラーメッセージでわかります。 yの範囲は関数の値の範囲に合わせて自動的に調整されます。 しかし、関数の値が部分的に非常 に大きくなるような場合には、自動調整にまかせていては関数の値が小さい部分の変化が見えなくな ります。たとえば、y = 1/x のような発散する関数でそれが起こります。その場合には set yrange を使って y の範囲を x の範囲指定と同様にして指定します。
現在の設定値を調べるには show というコマンドを、 gnuplot> show xrange
のように使います。 いろいろある設定や変数の値などを全部見るには次のようにします。 gnuplot> show all
ところで、 replot は rep と縮めて入力してもだいじょうぶです。 plot は p だけでも OK で す。また、 set xrange は se xr としても Ok です。縮めすぎてどのコマンドかわからなくなる とそのことを教えてくれます。 たとえば se x とやってみてください。
次に横軸のラベルと縦軸のラベルと表題を入れます。 後で印刷するときに自分のものであるこ とがわかるように、表題には自分の名前などを入れておきましょう。
gnuplot> set xlabel "Independent variable" gnuplot> set ylabel "Dependent variable"
gnuplot> set title "A Parabola (by Imoko Ono, May 607)" gnuplot> replot 表題などの文字列はダブルクォート (”) で囲っておく必要があります。これらのコマンドは Windows では Axes メニューや Chart メニューからも呼び出すことができますが、その場合は文字列をダ ブルクォートで囲む必要はありません。またメニューから呼び出す場合には文字列の入力を行った 後描く位置の入力を促されますが、位置の指定が必要無ければ入力する必要はありません。 次のようにするとグラフの内部まで目盛線が引かれます。 gnuplot> set grid
set gridの反対は set nogrid です。また、グラフの右上には入力した式が表示されますが、こ れは GNUPLOT では Key と呼んでいます。Regend(凡例) のことです。これがいらない場合は
gnuplot> set nokey
とやります。 Windows ではこれらは Chart メニューにあります。
5
グラフの出力
では今作ったグラフを印刷しましょう。 Windows ではグラフを表示したウィンドウからプリン ターに出力する方法が最も簡単です。 このウィンドウの中をマウスの右ボタンでクリックすると メニューが出ますから、 その中から Print を選んでプリンターの設定などを適当に行えばグラフ がプリンターから印刷されて出て来ます。 UNIX では「パイプ」という機能を使って印刷するの が簡単です。その手順は次のようになります。 (実際に試す前に説明をよく読んで特にプリンター 名の指定を間違えないように注意して下さい。)gnuplot> set term postscript landscape 22 gnuplot> set output "|lpr -P pripri" gnuplot> replot
gnuplot> set output gnuplot> set term x11
1行目はプリンターの種類と用紙の向きと文字の大きさをセットしています。UNIX ではプリン ターに送る印刷データの形式として PostScript 形式が標準的に使われます。今回はグラフをプリ ンターでそのまま印刷しますから、PostScript 形式でグラフを出力するように指定しています。
set termの term はコンピューターの端末を意味する terminal のことで、このコマンドは元々は
グラフを表示する端末の種類を選ぶものだったようです。現在は端末に表示するだけではなく各種 のプリンターに出力したりいろいろな形式でファイルに保存したりするのにも同じ命令が使われて いるというわけです。
set termの余分のパラメーターのひとつである landscape は地図のように紙を横長に使うこ
とを意味します。 縦長の場合は portrait です。もうひとつのパラメーター 22 は文字の大きさ を 22 ポイントにセットしています (1 ポイントは約 0.35 mm)。 他にどんな設定ができるかは help postscriptと打ってオンラインマニュアルで調べることができます。 2行目は印刷で使うコマンド lpr とプリンター名 pripri を指定しています。 実際にはプリン ター名としては pripri ではなく最寄りのプリンターのものを使ってください。 縦線 | は出力が 「パイプ」を通って他のコマンド lpr に送られて処理されることを示しています。-P の P は大文 字です。 グラフをプリンターに送るのではなくファイルに保存するにはクォーテーションマーク の間にファイル名だけを入れます。3行目は replot でグラフを描き直しています。 replot では いつもは端末画面に出力が行きますが、 今は set output で出力先を切り替えているので、 lpr コマンドを介してプリンターに出力されます。 4行目は出力を元に戻して端末画面にグラフが描 かれるようにしています。 5行目は端末が X 端末であることを思い出させています。これがなけ れば、次にグラフを描こうとしても PostScript 形式の文字データが表示されてしまうでしょう。 同じグラフを何度も描き直す場合この手順は少々面倒ですが、 次のように複数のコマンドをセ ミコロン ; で区切って1行に書けば ↑ キーで何度も呼び戻して使う場合に楽です。 (ついでにコマ ンド名などを縮めて書いてみました。 se ou の後はなぜかセミコロンが2つ必要です。)
gnuplot> se te po la 22; se ou "|lpr -P pripri"; rep gnuplot> se ou;; se te x11
他の文書中に挿入するためにグラフをファイルに保存するには、次のように landscape のところ を eps に変え出力先としてファイル名を指定します。 eps というのは Encapsulated PostScript のことで、 用紙の中での絵の配置や用紙の大きさの情報を除いて絵だけにしたものです。
gnuplot> se te po eps 22; se ou "parabola.eps"; rep gnuplot> se ou;; se te x11
ファイルに保存した後は、ghostview というコマンドでファイルの内容を表示して出来上がりを確 認することができます。
% ghostview parabola.eps
gvというコマンドが使えるなら ghostview よりもこちらを使う方が良いでしょう。使い方は同
じです。 この eps ファイルは epsbox か graphics パッケージを使って LATEX 文書の中に取り込む
ことができます。
図の手直しを行いたい場合はどうすればよいでしょうか。PostScript の図をまともに編集するこ とができるプログラムは実はあまりありません。この目的には現在のところ Adobe Illustrator と いうプログラムが最適だと思われますが、これはかなり高価です。 でも大丈夫です。 手直しが予想 される場合、UNIX では PostScript ではなく tgif 形式で図を保存すればよいのです。GNUPLOT では se te tgif と設定します。tgif ファイルの名前には普通、parabola.obj のように .obj を 付けます。 tgif というプログラムを使えば、tgif 形式の図を手直しした後で PostScript 形式で保 存し直すことができます。tgif を使って日本語の文字やギリシャ文字を図の中に書き込むこともで きます。
GNUPlotで set terminal と打つと、他にどのような出力形式が使えるかを見ることができま
す。Postscript 形式や tgif の他にも LATEX で使われる tpic 形式とか、 製図ソフトで使われる dxf
や hpgl 形式などが含まれています。GNUPLOT で TEX の数式を図の中に書き込んで tpic 形式
で出力し、LATEX の文書中に取り込んで処理すると、図中の数式もきれいに印刷されます。
Windowsでは右ボタンのメニューの中の Copy to Clipboard は他のソフトで編集している文書
などにグラフを取り込む場合に使います。 Copy to Clipboard をやった後、 目的の文書の中で「貼 り付け」コマンドや「Paste」コマンドを使うとグラフが取り込まれます。 この機能は現在のとこ ろ精度に問題があり、印刷物には不向きです。 もっと精度の高い出力が必要な場合は UNIX での ファイル出力と同じ手順を使います。 Windows では出力先を画面に戻すには
gnuplot> set output
gnuplot> set terminal windows のようにします。
6
重ね合わせグラフ
次の関数は振動数 x の入力に対する振動子の応答の強さをあらわすものでローレンツ関数と呼 ぶこともあります。 y = 1 (x− 1/x)2+ D2パラメーター D はエネルギーの散逸の速さをあらわし、D の値が小さいほど振動子は強い共鳴を 起こします。 0 0.5 1 1.5 2 2.5 3 3.5 4 0 0.5 1 1.5 2 2.5 3 3.5 4 Intensity Normalized Frequency Response of Linear Oscilater
R(x, 1) R(x, 2) R(x, 0.5) 図 4: 振動子の応答 いくつかの D の値に対する x-y グラフを混ぜて描いてみましょう。 式がちょっと複雑なので、 次のようにして2変数の関数 R(x, D) を定義します。 gnuplot> R(x, D)= 1 / ( (x - 1/x)**2 + D**2 ) D = 1 の場合のグラフは、 gnuplot> plot R(x, 1) で描くことができますが、それに D = 0.5 と D = 2 のグラフも加えてみましょう。 gnuplot> set xrange [0: 4]
gnuplot> set samples 250 gnuplot> set key
gnuplot> plot R(x, 1), R(x, 2), R(x, 0.5) このように、plot コマンドに複数の式を指定するとそれらのグラフが一緒に描かれます。 式と式 の間はコンマで区切る必要があります。set samples コマンドは計算する点数を指定するもので す。 何も指定しなければこの値は 100 です。 これではグラフの鋭く曲がっている部分が不正確に 描かれるのでここでは 250 に増やしています。 set key は凡例を書き込むように指定しています。 凡例には R(x, 1) のような式が表示されます。 対数目盛のグラフの作り方についても触れておきましょう。 先ほど定義した関数のパラメーター D と変数 x をもっと広範囲に取ってグラフを描きます。広範囲に変化する量には対数目盛りが適 しています。
gnuplot> set logscale x gnuplot> set logscale y
gnuplot> set xrange [0.01: 100] gnuplot> set yrange [0.00005: 200] gnuplot> set samples 400
0.0001 0.001 0.01 0.1 1 10 100 0.01 0.1 1 10 100 Intensity Frequency D=0.1 D=1 D=10 図 5: 振動子の応答 (両対数目盛)
set logscaleで x 軸と y 軸を対数目盛にし、set xrange で x の範囲を広げました。 対数目
盛りはプラスの範囲しか含むことができませんから、この範囲には 0 が入らないようにしなけれ ばなりません。 y の範囲は特に指定しなくても関数の値によって自動的に調整されます。
通常のリニアスケールの目盛に戻すには gnuplot> set nologscale
とやります。 また、目盛りの範囲を自動に戻すには gnuplot> set auto y
などとやります。
7
パラメトリック関数のグラフ
パラメトリック関数というのは x も y も何か別の独立変数であらわされるものです。たとえば、 運動物体の位置座標は x も y も時間の関数としてあらわされます。 GNUPLOT ではパラメトリッ ク関数の独立変数として t を使いますが都合によっては別のに変えることもできます。 たとえば、 x = sin t + t, y = cos t であらわされる運動の軌跡を表示するには次のようにします。 gnuplot> set parametricdummy variable is t for curves, u/v for surfaces gnuplot> set trange [-5:5]
gnuplot> set autoscale
gnuplot> plot sin(t)+t, cos(t)
最初の set parametric は plot 命令の機能をパラメトリックモードに変更します。 通常のモー ドにもどすコマンドは set noparametric です。plot 命令では x と y を t であらわす式をコンマ で区切って並べます。 独立変数 t の範囲を決めるには set trange を使います。 set autoscale は表示される範囲を自動的に決めるようにします。2 つ以上のグラフを重ねたいときは plot 命令 で x, y の式をくりかえして指定します。
-2 0 2 -6 -4 -2 0 2 4 6 Y X sin(t)+t, cos(t) 2*sin(t)+t, 2*cos(t) 図 6: パラメトリックプロット
8
極座標表示
Keplerの法則によれば、惑星の軌道の形を極座標であらわすとr = a(1 + e)/(1 + e cos θ)
となります。 a は近日点距離、 e は軌道の離心率で、 r は惑星の太陽からの距離、 θ は近日点 方向からの偏角です。 この式で e が 0 なら r は一定になります。 つまり e = 0 の軌道は完全な 円です。 e が正の値で 1 以下なら r は a 以上 a(1 + e)/(1− e) 以下の範囲を変化し軌道は楕円に なりますが、e が 1 に近づくほど軌道は偏平になります。 e が1以上になると無限遠まで飛んで いくので惑星とは言えなくなりますがそのような軌道も可能です。 e < 1 の場合の軌道の形は双 曲線ですが、e = 1 のときは放物線です。 双曲線は2つの枝がありますが、惑星は太陽から斥力で はなく引力を受けて運動するので内側に太陽を含むような枝が実際の軌道です。 4 2 0 2 4 4 2 0 2 4 Y X e=0 e=0.5 e=1 e=2 図 7: 惑星の軌道 近日点を固定していろいろな離心率に対応する軌道を描いてみましょう。 まず gnuplot> Q(x, e) = (1+e)/(1+e*cos(x)) と打って関数 Q(x, e) を定義します。 この関数は近日点距離を単位にして測った太陽からの距離
を近日点方向からの角度と離心率であらわすものです。θ のかわりに x を使っています。 このよ うな極座標表示の式をそのままグラフにするには次のようにします。
gnuplot> set nogrid gnuplot> set noparametric gnuplot> set polar
gnuplot> set xrange [-3.14: 3.14] gnuplot> set yrange [-5: 5]
gnuplot> plot Q(x,0) title "e=0", \
> Q(x,0.5) title "e=0.5",\
> Q(x,1) title "e=1", \
> Q(x,2) title "e=2"
set polarが plot コマンドの機能を極座標表示のモードにするコマンドです。 前にパラメトリッ
クモードを使っていたなら set noparametric でそれを解除します。 set yrange コマンドは y 軸方向の範囲ではなく中心からの距離を制限します。 今扱ってる軌道のいくつかは無限に遠くまで 伸びているので、グラフに収める範囲を制限しなければなりません。 plot コマンドでは離心率の 異なる4つの軌道をプロットしています。 title というキーワードとクォーテーションマークの 中の文字列を使って凡例の文字列を指定しています。 全部を1行に入れることもできますが、見 にくいので数行に分けて打ち込んでいます。 このように行末にバックスラッシュを付けると現在 の行を次の行に継続することができます。 (日本語 Windows ではバックスラッシュは円マーク Y= になります。) > は継続行の始めに表示されるプロンプトですからこれは入力しません。
9
2変数の関数
3次元のグラフを綺麗に作るにはいろいろなテクニックが必要になります。 ここでは2変数の 実数値関数のグラフの作り方をざっと見ておくことにしましょう。2変数 x と y のガウス関数 G(x, y; x0, y0, a, b) = e−(x−x0)2/a2e−(y−y0)2/b2 のグラフは吊鐘型で吊鐘の中心の位置は x = x0, y = y0 で吊鐘の x 方向の幅はだいたい 2a、 y 方向の幅はだいたい 2b です。 中心が x = 0, y = 0 でどちらの幅も 10 のグラフは次のようにし て描くことができます。gnuplot> g(x,y,a,b) = exp(-(x/a)**2 - (y/b)**2) gnuplot> set xrange [-10:10]
gnuplot> set yrange [-10:10] gnuplot> set zrange [0:1.1] gnuplot> splot g(x,y,5,5)
関数 g の引数は x, y, a, b の4つにしてありますが、 これでも次のように簡単に中心の位置を変 えることができます。
gnuplot> splot g(x-5,y+1,5,5)
この場合の吊鐘の中心は x = 5, y =−1 です。 グラフのメッシュの数を増やして縦横共 40 本に
gnuplot> set isosamples 40,40 ; replot
とします。 この値が大きすぎると計算がなかなか終らなくなるので注意してください。 メッシュ のすきまを不透明にして内側が見えないようにするには
gnuplot> set hidden ; replot とやります。
g(x-5,y+3,4,4) + g(x+5,y+3,4,4) + 0.6*g(x,y-3,2,2)
-10 -5 0 5 -10 -5 0 5 10 0 0.5 1 図 8: 2変数関数のプロット では、 上記の関数を使って3つのコブを並べてみましょう。
gnuplot> splot g(x-5,y+3,4,4) + g(x+5,y+3,4,4) + 0.6*g(x,y-3,2,2)
3番目の項でできるコブは背が 0.6 倍で低いので他のコブに隠れて一部しか見えていませんね。 見 る角度を変えるには、
gnuplot> set view 45,30
のようにします。 始めのパラメーターが x 軸の回りの回転角度で2番目のパラメーターが z 軸の 回りの回転角です。 単位は度です。 これらの値をゼロにすると z 軸方向から垂直に見下ろす視点 になります。 これらの値を少しずつ変えて効果を観察すればよくわかるでしょう。 地図のように関数値を等高線であらわすグラフを作ることもできます。set contour と打つと 等高線モードになり、 splot で描く3次元グラフの中の x-y 平面に等高線が描かれます。 曲面が じゃまなら set nosurface で消します。 さらに視点を真上に持って来ると見慣れた普通の等高線 図になります。 これらの操作をまとめると次のようになります。
gnuplot> set contour gnuplot> set nosurface gnuplot> set view 0,0
もっと精密な図を得るには、 計算する点の数を増やす必要があります。 さらに B-Spline という方 法で曲線を滑らかにするように指定すると効果があります。また等高線の本数を調節することもで きます。 これらの操作は次のようにします。
gnuplot> set isosamples 100,100 gnuplot> set samples 100,100 gnuplot> set cntrparam bspline gnuplot> set cntrparam levels 20 gnuplot> replot 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 -10 -5 0 5 10-10 -5 0 5 10 図 9: 2変数関数の等高線プロット
10
補足
—
数値データのあつかい
GNUPLOTは式だけではなく数値で与えられたデータをグラフにすることもできます。ここで は捕捉としてこれについて簡単に述べます。 変化する2つの量の間になんらかの関係がある場合、これらを同時に多数回測定してグラフにす ると量の間の関係が浮かび上がります。GNUPLOT でグラフ化するには、測定データをたとえば 次のように並べてテキストファイルに入れておきます。 0 6.8 3 7.8 6 6.0 7 5.1 10 0.4 8 4.2 9 2.0 4 7.3 5 6.8 2 7.7 1 7.5 このように、第一の量の値およびそれと同時に測定した第2の量の値を1行中に並べます。これを カレントディレクトリーの data1 というファイルに保存したということにしましょう (データを打 ち込むには mule のようなテキストエディターを使う)。すると、GNUPLOT で次のようにしてこ れをグラフにすることができます。gnuplot> plot "data1"
関数のグラフと一緒に描かせるには、次のようにファイル名と式とをコンマで区切って並べます。 gnuplot> plot 8 - 0.1*x**2, "data1"
この場合、グラフの横方向の範囲はデータの範囲で決まります。 式をデータに適合させる機能もあります。それにはまず、次のようにパラメーター付きの式を定 義し、パラメーターに大雑把な予測値を入れておきます。 gnuplot> f(x) = a*x**2 + b*x + c gnuplot> a = -0.1 gnuplot> b = 0 gnuplot> c = 8
gnuplot> plot f(x), "data1"
予測値が当たらずとも遠からずであることをグラフで確かめています。次に fit というコマンドを 使えばパラメーターの値を自動的に調節してくれます。
gnuplot> fit f(x) "data1" via a,b,c
これでパラメーター a, b, c の最適値が表示され、それらの変数の値も最適値に変更されます。も う一度グラフを描くと、データに適合した式のグラフが得られます。後からパラメーターの値を見 るには、
gnuplot> print a,b,c のようにやります。 0 1 2 3 4 5 6 7 8 0 2 4 6 8 10 f(x) "data1" 図 10: 関数のデータへの適合 パラメーターに対して一次の式の場合は上のように簡単に適合させることができます。しかし、 パラメーターに対して非線形の式だとうまくいかない場合があります。そういう場合はまず、パラ メーターの初期値として最適値になるべく近い値を選ぶことが重要です。また、一度に1つのパラ メーターしか動かさないようにし、何度も適合を繰り返しながら各パラメーターを絞り込んで行く ようにします。また、1つのパラメーターがゼロに近い場合に適合に失敗することがあります。こ の場合には、式を変形するなりして、異なるパラメーターの値のオーダーが (桁) があまり違わな いようにすれば解決します。