• Tidak ada hasil yang ditemukan

第2回レポートの解説 (1)

N/A
N/A
Protected

Academic year: 2024

Membagikan "第2回レポートの解説 (1)"

Copied!
6
0
0

Teks penuh

(1)

JOHOSYORI No.9

第2回レポートの解説 (1)

桂田 祐史 1992 年 6 月 24 日

先週提出されたレポートの範囲を解説します。

1 問題 3-1 解説

この問題には多くの人が挑戦してくれました。f77x すなわちfplotラ イブラリィに慣れるということで結構なことですが、ここでは目標を少 し高く持って、どういうプログラムが良いかを考えてみましょう。

これはもちろん何を目的とするかにもよるのですが、ここではf, [a, b]

の変更が容易であること、つまり変更の際にあまり手間が増えないよう にすることを目指してみましょう。実際に計算機で仕事する時は、ただ 一つの場合について計算をすれば済むということは稀で、大抵は多くの 類似した場合についての計算を実行する必要がありますが、そういう際 に、少し問題の条件が変わっただけで大きな変更が必要となるプログラ ムは望ましくないでしょう。

reidai3-1.f の段階で注意していたことは、たとえ定数であっても、

名前をつけて、後で変更しやすいようにしていたことです。

real Pi,a,b,yoyuu

parameter (Pi = 3.1415926535) parameter (a = 0.0, b = 2.0 * Pi) parameter (yoyuu = (b - a) / 20) ...

h = (b - a) / N ...

(2)

call fspace(a-yoyuu, -3.0,b+yoyuu, 3.0) ...

x=a+i*h ...

例えばグラフの範囲を[0,2π] から[0,10] に変えようとする場合、一行だ け書き変えれば済むようになっていることを確かめてください(また倍 精度計算をするためにPiの桁数を増やす場合も簡単に出来ることが分か るでしょう)。これが

yoyuu=2.0*3.1415926535/20

call fspace(-yoyuu,-3.0,2.0*3.1415926535+yoyuu,3.0) ...

x=i*(2*3.1415926535)/N

となっていたとすると(行数は減りますが)、変更が面倒になることが分 かるでしょう。

この問題では、目盛や、軸上の点の座標を描くわけですが、以下では 二つの点について考察します。

(1) グラフを描く際の範囲の設定(fspaceに与えるデータ)をどうす るか?

xの範囲については、プログラムを使う人が指示するとしても、yの範 囲については事前に分からないこともあります。この問題の一つの解決 法は、最初に関数値をすべて計算して配列y(0:MAXN) に記憶しておいて から、最大値、最小値を求めて、それを元に描く範囲を決めるというも のです。サンプルプログラムmondai3-1.fでは

do 100 i=0,N

x(i) = a + i * h y(i) = f(x(i)) 100 continue

call maxmin(y,N,maxy,miny) ....

yoyuuy=(maxy-miny)/10 ....

call fspace2(a-yoyuux,miny-yoyuuy,b+yoyuux,maxy+yoyuuy) のようにしています。サブルーチンmaxminではy(0), y(1), ..., y(N) の最大値maxyと最小値minyを求めています(このサブルーチンの内容は

(3)

特に難しくはありませんので、読んでもらえれば分かると思います)。ウィ ンドウぴったりにグラフを描くと窮屈な感じがするので、上下に1/10 = 10% の余裕を持たせるようにしました。

(2) 目盛り、ラベル

提出されたレポートで多かったのは、目盛りやラベル(ここでは軸上 に記す座標などのこと)を描く命令を、その数だけプログラムの中に並 べるというものでした。プログラムの再利用性の観点からすれば、これ はループを作って扱うのが良いでしょう。サンプル・プログラムでは目盛 り、ラベルを最初に描く位置、間隔を使う人に入力してもらって、後は自 動的に処理しています。(mgraph などでは、目盛りやラベルの間隔決定 まで自動的に処理しまが、そこまでするのは面倒なので、サンプル・プ ログラムはそういう点は使う人任せにしています。)

注意. ここでは、なるべく自動的にやろうとしているわけですが、本当 に常にそれがいい結果を生むかどうかは別問題です。特にこの問題では、

関数が周期2πですから、ラベルの間隔を例えば πにして、piとか、2pi などのラベルを書く方が良いと思われますが、こういうことをプログラ ムで自動的に処理するのは難しいです。

ラベルについては、xclick のようなreal型の変数に収められた数値 データ(ここではreal型)をlabelサブルーチンで表示するのに工夫 が必要です。label サブルーチンは引数として文字列しか受け付けてく れませんから、xclick の内容を文字列に変換しないといけません。サン プル・プログラムでは、そのために「内部ファイルへの書き込み1という

Fortranの文字列処理機能を利用しています。

real xclick

character s*20 ← 長さ 20 の文字列変

数 s の宣言 ...

write(s,*) xclick ← s に xclick の10進 表示を納める

call delsp(s,length) ← 余分な空白(space0) を削除する

1内部ファイルとは要するに文字変数のことです。write文は「普通」は標準出力(お おざっぱに言ってディスプレイ画面のことだと思ってください)やディスク・ファイルな どの「外部にある」ファイルに出力するが、実は実行中のプログラム「内部」の文字変 数にも出力できるのだ、というニュアンスです。これは例えばC言語だったらsprintf 関数等で実現できる機能のことです。

(4)

...

call label(s) ← 文字列 s をウィンド

ウに表示する

write(s,*) xclickとしているのが「内部ファイルへの書き込み」です。

この時sの先頭には空白が入っているので、それを削除するために、サ ブルーチンdelsp を呼んでいます。delsp の中でも色々な文字列処理機 能を使っていますので、興味ある人は読んでみて下さい。

以下に示す図(左側)は、区間 [0,2π] で、x軸については 1 ずつ、y 軸については0.5ずつの間隔で目盛とラベルをつけたものです。

0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0

-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0

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

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

2 透明な地球 – 文字列変数の扱いの参考に

第一回レポートの範囲になりますが、問題1-5 のヒントとなるプログ

ラムをhint1-5.fを公開します。このプログラムでも文字列変数を使っ

ているので、興味のある人は参考にして下さい。コンパイルして実行す ると “mapdata” を読み込んで “mapdata.new” というファイルを作成し ます。これは経度・緯度のデータを直角座標系(北極を(0,0, R),南極を (0,0,−R), 緯度と経度が共に0の点を (R,0,0)としたもの。ここでRは 地球の半径をkm単位で表わしたもの値です。)のデータに変換して、y,z 座標を出力したものです。

waltz11% f77o hint1-5.f ← コンパイルする

waltz11% hint1-5 ← 実行する(画面

には何も出ない)

(5)

waltz11% ls mapdata.new ← mapdata.new が 出来たか?

mapdata.new → 出来た。

このデータをmgraph にかければ、「透明な地球」が表示されます。

waltz11% cat mapdata.new | mgraph -b | xplot

この問題のポイントの一つは、mgraph を用いるには、座標データの変換 だけをすればいいが、線を区切るために入っている“" "”という空ラベル をうまく扱うために工夫が必要だということです。率直に言ってFortran はこの種のデータの扱いが苦手です(Fortranで何か問題を解くに当たっ ては、形式がきれいに揃った行が整然と並んでいるようなデータ・フォー マットを設計するのが普通です)。サンプル・プログラムでは、一度行を文

字列変数“line”に読み込んで、引用符があるかどうかを判定しています。

....

character line*30 ← 長さ30の文字列

変数の宣言 ....

read(1,1000) line ← 文番号1000の形

式で入力

if (line(1:1) .eq. ’"’) then ← line の1文字目 は " か?

....

else

read(line,*) keido,ido ← line から二つの 数を得る

....

endif ....

1000 format(A20) ....

このプログラムのもう一つの要点は、経度、緯度のデータをデカルト 座標系に直すところでしょう。これは極座標の式とほぼ同様の変換式で す(興味があればプログラムを読んで下さい)。

(6)

3次元の対象物である球面を描くのに、単純に、一つの座標平面(ここ ではyz 平面)への投影を行いましたが、こういう 3次元グラフィックス の話は始めると長くなるのでカットします。

(プログラムの表題にした「透明な地球」は、裏側のものまで描いてし まったために出来た、いわば手抜きの結果です。「不透明な地球」や「回 る地球」等に挑戦するのも面白いと思います。そういうプログラムはレ ポートとして受け付けます。)

3 第 4 回のサンプル・プログラムの訂正

第4回目に配った、例題4-1 等の Euler 法のプログラムで

* Euler 法による計算

do 200 i=0,N-1 t=t+h

x=x+h*f(t,x) 200 continue

のように書いていたのですが、これは私の不注意で生じたミスで、正し くは(t と x の更新の順番を逆にした)

* Euler 法による計算

do 200 i=0,N-1 x=x+h*f(t,x) t=t+h

200 continue

とすべきでした。この回に扱った問題では関数 ft に依存していない ため、計算結果がおかしくならずに済んでいたのですが、それだけに気 付くのが遅れてしまいました。

Referensi

Dokumen terkait

盈進中学校 生徒会長 廣田 智紀 梅雨に入りじめじめとした蒸し暑い日が続く季節となりました。 今回が第 1 回目となるこの「Chorus Festival」は他の学校行事とは異なる大きな特徴があります。 それは、「生徒の力で成り立っている」ということです。運動会、感謝祭といった学校を代表する行事

④ ある学生が、自分の研究を始めるとします。卒業研究でもいいし、 (注4)修 しゅう士 しの研究でもいいです。すると、親に「あんた、何やってるの?」と言われます。たいていの学生は、必ず言われます。「⑤」って。それで、なかなか答えられな

問4.グラフの読みとりや分析にさらに興味を持った多摩子さんは、昭和時代に起 こったアメリカとの戦争がかなり厳きびしいものであったことを、以下の 資料 か ら説明しようと思いました。この 資料 は、何冊かの本から調べて、多摩子さ んが円グラフにまとめてつくったものです。アメリカとの戦争は、この 資料 で示してある 1940 年の翌年に始まります。 資料

が負担するのかなど毎回議論になりました。役員で補てんをしようではないかという話も あり、やっとまとまってきたというお話です。 入澤 補足ですが、行政とのかかわりは、伊藤先生を中心としたワークショップの時に清水さ んと先生の方から市の方もそこに参加してくださいと呼びかけられた時が一番強かったと

6 ①ロウソクの炎の性質についての問題です。ロウソクの炎は3つ の部分に分けられます。 ・外炎は一番温度が高い。また目には見えない。 ・内炎は一番明るい。 ・炎心は一番暗い。 アは「1番明るい」ではなく、1番温度が高いです。 ウは炎心が多く含んでいるのはすすではなく、ろうの気体で す。 エは温度が高いほどよく焦げるので炎心ではなく外炎です。

3単体の向きは図示しにくいのですが、やはり⟨a0a1a2a3⟩の4つの面そ れぞれの向きを考えてそれらの和をとったものが∂⟨a0a1a2a3⟩になりま す。−⟨a0a2a3⟩=⟨a0a3a2⟩,−⟨a0a1a2⟩=⟨a0a2a1⟩に注意すると、回転して 重ねたときすべての面に同じ向きがついていることを確かめてください。

ところが、答案には、証明すべき式を変形していくものが多かったです。それらには以下の ような問題が生じやすい。 i 変形が同値変形であることを明記していない。「ゆえに」はダメです。 「ゆえに」すら書かない、式の羅列という答案もありました。論外です。 ii 証明すべき不等式が例えば x−12 ≥0と同値であることを書いて、そこで終わりに している。x−12

ここでA はA のカリグラフィック・フォントの1つである。 これまで、集合は大文字capital letters, upper case,その要素は小文字small letters, lower case で表すという慣習に従ってきた。集合族を表す文字をどうするか迷うところ だが、カリグラフィク・フォントで書く人が結構いるので、真似してみた。 桂田 祐史