• Tidak ada hasil yang ditemukan

グラフの描き方 (1) - 明治大学

N/A
N/A
Protected

Academic year: 2025

Membagikan "グラフの描き方 (1) - 明治大学"

Copied!
7
0
0

Teks penuh

(1)

情報処理II No.2

グラフの描き方 (1)

桂田 祐史 1995 年 4 月 28 日

この情報処理IIではOpenWindows 環境下で1グラフを描くための手段をいくつか提供します。今 回紹介する方法は、複雑なことをするのには向いていませんが、使うための準備が簡単なので、覚えて おくとなかなか便利です。

すでに環境設定を済ませている人は、

waltz11% getsample

としてファイルをコピーしてから(ls で確認してみよう)以下の実習を行ないましょう。

1 コンピューターで描く曲線

コンピューターで滑らか曲線のグラフを描くにはどうしたらよいでしょう?実は原理はとて も単純で

「十分細かい」折れ線を描けば人間の目には滑らかな曲線に見える

(だから折れ線を描けばいいんだ)というものです。折れ線で済ますのは、何かズルイような 気がするかもしれませんが、もともとラスター・ディスプレイでは飛び飛びのドットでしか表 示できないわけですから、それで十分なわけです。

しかし「十分細かい(=折れ線の頂点と頂点の間隔が十分小さい)」という点には注意しな くてはいけません。これが成立していないと、本来滑らかなはずの曲線がギクシャクしたもの になってしまったり2、一見滑らかなようでも実は本当の姿とはかけはなれたものになってし まったりする可能性もあります。

2 mgraph コマンド

折れ線を表現するのに、各頂点の座標データを並べるというのは、自然な考え方です。ここ で紹介するmgraphは、一言で説明すると、座標で指定された点を順に結んだ折れ線を描く ためのコマンドです3

1実はOpenWindowsの兄貴分であるX Window Systemでも利用可能です。

2特にプリンターで印刷する場合は、プリンターの解像度がディスプレイの解像度よりも高いのが普通なため、

ディスプレイ上に描画するよりも細かくしないとアラが目立ちます。

3mgraphは大抵のUNIXシステムに用意されているgraphコマンドの機能拡張版です(graph コマンドに ついてはmanコマンドで説明が読めます — “man graph”としてみましょう)。今回の例の多くはgraph コマ ンドでも実行可能です。

(2)

入力データは、x 座標と y 座標が並んでいるような行からなるテキストです。例えば 0.0 0.0

2.0 1.0 1.0 3.0 0.0 0.0

のような内容のテキストは、3点 (0,0), (2,0), (1,3)を頂点とする三角形を描くためのデータ ということになります。

実際に画面に図を描くには、上のデータを収めたファイルの名前を“sankaku.data”とし た時

waltz11% cat sankaku.data | mgraph | xplot

とします(図のウィンドウを消すには、マウス・カーソルをそのウィンドウまで移動して左ボ タンをクリックします)。また同じ図をプリンターで印刷するには

waltz11% cat sankaku.data | mgraph | plot2ps | lpr

とします4(紙がもったいないですから、どうしても必要な図だけ印刷するようにして下さい)。

解説 — 上の呪文のようなコマンドを理解するために

前回のプリントで説明したパイプ機能を利用しています。mgraphは標準入力からデータを読み込み、

標準出力にグラフィックス言語の一つである plot形式のデータを書き出します。xplotは標準入力から plot 形式のデータを読み込み、画面に図を描くためのプログラムです。plot2psは標準入力からplot 形式のデータを読み込み、標準出力にプリンター制御言語である PostScript 形式のデータを書き出し ます。

前回の最後でsinの関数表 “sintable”を作りなさいという問題を出しましたが、それがあ れば次のようにして sin のグラフが描けます。

waltz11% cat sintable | mgraph | xplot

sin の表を作るプログラムとしては、例えば次のような FORTRAN プログラムが使えま す(これで “sintable” を作るには “f77o mktable.f” そして “mktable > sintable” とし ます)。

* mktable.f -- sin の関数表を作る program mktable

integer i

real x,y,pi,degrad

* 円周率πの値(= 4 * Arctan(1)) pi = 4.0 * atan(1.0)

* (degree)をラジアン(radian)に変換するための比例定数の計算

* 1°= π/180 radian、である。

degrad = pi / 180.0

4lprコマンドでは、“-Pプリンター名”として出力するプリンターが選べます。0609号室では“w1”,· · ·, “w4”

という名前のプリンターがあります。例えば“w1” で印刷するには“lpr -Pw1”とします。

(3)

* 0 90°までの値を計算 do i=0,90

x = i * degrad y = sin(x) write(*,*) i,y end do

end

勘のいい人はここまでの知識で大抵のグラフが描けてしまうでしょう。

3 関数のグラフを描く

実一変数の実数値関数y=f(x), (a ≤x≤b)のグラフを描くには、定義区間[a, b]を適当に a=x0 < x1 < x2 <· · ·< xN =b,

と分割して、各 xj に対する f の値yj =f(xj)を計算して、

(x0, y0),(x1, y1),(x2, y2),· · ·,(xN, yN)

を順に結んだ折れ線を書けばいいでしょう。特に複雑な関数でない限り、xj は区間 [a, b]の N 等分点に取るのが自然でしょう。

例題2-1 y= sinx+ sin 3x+ sin 5x のグラフを描きなさい。

解答: 問題の関数は周期2πですから、0≤x≤2πで描けば良いでしょう。次の“reidai2-1.f”

というプログラムは、前節で解説したような形式のデータを計算するためのプログラムです。

実行すると最初に区間を何等分するか尋ねてくるようになっています。

* reidai2-1.f

program rei21

real x, y, h, Pi, a, b, f integer N, j

parameter (Pi = 3.14159265)

parameter (a = 0.0, b = 2.0 * Pi) read(*,*) N

h = (b - a) / N do 100 j=0,N

x = a + j * h y = f(x)

write(*,*) x, y 100 continue

end

*

real function f(x) real x

f = sin(x) + sin(3.0 * x) + sin(5.0 * x) end

(4)

この“reidai2-1”を用いてグラフを描くには、座標データをファイル “ftable” に記録し てから、それを使うやり方

waltz11% reidai2-1 > ftable

100 ← 分割数として100 を入力

waltz11% cat ftable | mgraph | xplot

でも良いし、あるいは全部パイプを使って次のように済ますことも出来ます。

waltz11% reidai2-1 | mgraph | xplot

100 ← 分割数として100 を入力

問題2-1 “reidai2-1.f” を読んで理解し、書き換えることによって、色々な関数のグラフを

描きなさい。面白いものが出来たら印刷してみなさい。

問題2-2 f(x) = sinx+ sin1000x のような関数のグラフを描くことについて考察しなさい。(グ

ラフの描きにくい関数である。なぜか?区間や分割数を色々変えて実験してみよう。)

4 パラメーター曲線を描く

例題2-2 楕円 x2 4 +y2

9 = 1 を描け。

解答: 方程式を局所的にy(あるいは x)について解くことによって(y=±3q1 x42 とか)、

例題2-1 と同様に扱うことも可能ですが、ここではパラメーター表示 x= 2 cosθ, y= 3 sinθ (θ [0,2π])

を利用してみましょう。パラメーター θ の区間 [0,2π]を 0 =θ0 < θ1 < θ2 <· · ·< θN = 2π,

と分割して、楕円上の点 (xj, yj) を

xj = 2 cosθj, yj = 3 sinθj

で定めて、(x0, y0), (x1, y1),· · ·,(xN, yN)を順に結んだ折れ線を描けばいいでしょう。この考え 方に従って座標を計算するプログラムは例えば、次のように書けます。

* reidai2-2.f

program rei22

real x, y, theta, h, Pi, a, b integer N, j

parameter (Pi = 3.14159265, a = 0.0, b = 2.0 * Pi) read(*,*) N

h = (b - a) / N do 100 j=0,N

(5)

theta = a + j * h x = 2.0 * cos(theta) y = 3.0 * sin(theta) write(*,*) x, y 100 continue

end

このプログラム “reidai2-2”を用いてグラフを描くには

waltz11% reidai2-2 | mgraph -R -x -3.2 3.2 -y -3.2 3.2 | xplot

100 ← 100 等分を指定

ここで、“-x -3.2 3.2 -y -3.2 3.2” としているのは、描画する領域を 3.2 x 3.2,

3.2≤y≤3.2 に指定しています。

問. “-x -3.2 3.2 -y -3.2 3.2” を指定しないとどうなるか?

問題2-3 “reidai2-2.f” を読んで理解し、書き換えることによって、色々な曲線を描きなさ

い。面白いものが出来たら印刷してみなさい。

問題2-4 極座標で r=θ と表される図形(螺旋の一種)を描け。

-20 -15 -10 -5 0 5 10 15 20

-20 -10 0 10 20

5 その他

例題2-3 “mapdata” というファイルには世界地図のデータが入っています。普通のテキス

ト・ファイルですから、ちょっとのぞいて見て下さい5。実はこのデータは陸地の輪郭線の頂 点の座標(経度・緯度)を順に並べたものですが、線を切りたいところで、二重引用符で囲っ た空白を置いてあります:

133 35 134 35 135 35

5“cat mapdata”とします。lessを知っていたら、“less mapdata” として見ることを勧めます。

(6)

" "

134 33 133 33 132 33

こうして作ったデータを表示するには

cat mapdata | mgraph -b | xplot

とします。“-b” を指定することにより線を途中で切ることが出来ます。

問. “-b”を指定しないとどうなるか試しなさい。

問題2-5 地図には目的に応じてさまざまな「図法」があることは社会科あるいは地理の時間 に習ったことがあるでしょう。どれか一つの図法を(具体的にどう描くのか)調べて、その図 法による世界地図を描きなさい。(FORTRAN でこの問題を解くのは面倒かもしれません。)

問題2-6 何か面白いデータを入手して mgraphコマンドを用いて図を描きなさい。

6 mgraph コマンドについての補足

既に紹介した“-b”, “-x 数1 数2”, “-y 数1 数2” の他に以下のオプションが使えます。

-g 数 枠や軸、目盛をコントロールとします(数=0,1,2,3,4)。例えば -g 0 とすると枠も軸も 描きません。

-lx, -ly 対数グラフを描くためのオプションです。-lxとすると、水平方向の軸を対数目盛に

します。-ly とすると、垂直方向の軸を対数目盛にします。もちろん、二つを同時に指 定して、両方の軸を対数目盛にすることも出来ます。

-a x 座標に相当する部分を省略したデータを作ることはよくあります。例えば、例題 2-1 のようにx 座標が一定の量だけ増えていくような場合、一々記録するほどのこともない と考えて省略することが多いです。このようなデータを表示するため、自動的に等間隔 の x 座標を補って表示するオプション-a があります。

-L 文字列, -X 文字列, -Y 文字列 その直後に来る引数をラベル6として表示します。-X は水 平方向の軸につけるラベルの指定、-Y は垂直方向の軸につけるラベルの指定、-L はグ ラフ上部につけるラベル(つまりメインのラベル)の指定。(例えば “-L "FIGURE 1"”

のように指定します。)。

-M x座標の非単調性を検知して、折れ線を切ります。(一枚の図に複数の関数のグラフを描 く場合のように、一つのグラフを描くためのデータが終って、次のグラフ用のデータに 移るところで、 x 座標が「戻る」場合に、そこで一度折れ線を切ります。)

6graph コマンドに与えるデータで、二重引用符"で囲まれた文字列をラベルといいます。

(7)

-8000 -6000 -4000 -2000 0 2000 4000 6000 8000 -8000

-6000 -4000 -2000 0 2000 4000 6000 8000

図 1:

透明な地球

問題2-7 (getsample でコピーされたプログラム“reidai2-4.f” を使って)

f77o reidai2-4.f

reidai2-4 | mgraph -M -lx -ly | xplot

として描けるグラフは一体何か? “reidai2-4.f” と上記の説明を読んで考えなさい。 “-lx -ly” を省略するとどうなるか?

Referensi

Dokumen terkait

注意 10.7 陰関数定理の条件 ii の言い換え「零点集合がグラフになる」 定理10.5のii は、「方程式が解ける」といういわば解析的な表現であるが、幾何学的な表現である次の ii’ で置き換えることも出来る。 ii’ U ×V において、F の零点集合はφ のグラフに一致する: NF ∩U×V =

Meiji。 改善意見のようなのを書いてくれると嬉しい。 期末試験: 7月22日金 9:30–11:30 120分 くれぐれも寝坊しないように気をつけて下さい。 試験範囲は、初回の授業から宿題10まで。 期末試験を受験できない場合にどうするか、現在検討中です。特別 試験が受けられるように「欠席の事由を証明できる書類」の準備を

後は通常と同様にして送信する。 µ ´ 3 改めて TEX の紹介 3.1 TEX とは? 駆け足で説明する。後から加筆する可能性が大きい。 TEXは著名なコンピューター・サイエンティストである Donald Knuthの開発した文書整形 システム 組版システムである。TEXは日本では「てっく」または「てふ」と呼ばれている。

実際の計算機では適当な個数のビットをまとめて処理することが多い。いわば2進法のそろ算ばん盤 が並んでいるようになっている。例えばパソコンや多くのワークステーションでは主記憶装置 はバイト単位に番地をつけられて、読み書きの最少単位はバイトである。また CPU central processing unit, 中央演算装置 にはレジスター 置数器

これは約24セント2(半音の1/4程度)のズレになる。3m 2n = 2を満たす自然数n, mは存 在しないので、必ずズレが生じてしまう。 実用するにあたって、完全5度を基音から上下に対称的に導出していく。そうすること で先端にある旋律であまり使わない2音間にズレ(濁り)を寄せている。また、完全5度 にのみ着目しているので3度の和音に少し唸りが生まれる。 2.2

輪講 順番に講義をする。輪講とは、1つのテキスト、論文を皆で読む。 1コマに2人、場合によって3人が話すくらいが目安。毎週3人は用意し ておくこと。輪講の運営の仕方は君達に任せる。 まずは、ファーロウ「偏微分方程式」朝倉書店 [1]をテキストとする。偏 微分方程式とそのための数学。これは学んで損はない。 ここに出て来るものを数値計算できるようにする。

実は g の2階偏導関数をf の偏導関数で表したり、逆に f の2階偏導関数をg の偏導関数で 表すことが重要であるが、それはまた後で紹介する。 余談 7.2 上の例は簡単だが、f を具体的に与えていないため、本質的に2変数の例となって いるつまり1変数関数の合成関数の微分法だけでは得られない。

real x f = sinx + sin3.0 * x + sin5.0 * x return end 全体が、主プログラム “program reidai31” と関数副プログラム “f”の 2 つの部分からなって いることが見て取れます。後者は reidai1-1.f のそれと全く同じものです。主プログラムの中で call