数値解析法 (Fortran 編), 2005-06-10 質問と回答, M は宮本による回答。 h03s2001: (1)Execise2.2、修正する時はintegerをdouble precisionにすればいいの ですか? (2)Execise2.3で変数cの値をいろいろと試しました。その時に「いちいちソース ファイルを変更し再コンパイルするのはめんどくさい」、と書いてあるので私の場合は 実数をa、b、c、d、としてdの値をインプットできるようにしました(リスト1 参照)。その時cの値をd*0.1とすることで丸め誤差・打ち切り誤差も出て きました。他にどの様にすれば簡単に出来ますか? M: (1) 2005-06-03 の h03s2008 (2) を参照してください。(2) [リスト1 とは, どれの ことでしょうか ?] 2005-06-03 の h03s2003 の (1) を参照してください。 h03s2002: Fortranは誰が作ったのか。Fortranを使えるようになることで、どんな メリットがあるのか。 M: (1) 言語の発明者ということでしょうか ? しかるべき本に (例えば参考書として Web ページで紹介している文法書にも) その歴史は簡単に紹介されています。現在では ISO とか JIS で文法が決められているようですが。それとも, ある特定の fortran コンパイラの作者のことを聞いているのでしょうか ? (2) 2005-06-03 の h03s2024を 参照してください。 h03s2003: 「Listing 2: 0.1 の百倍は?」のプログラムで、 4 double precision a, b, c …と、ありますが、b、c、まで含まれているのは、     double precision a real b, c …と、うつのは時間的、ファイルサイズ的に無駄だ。という理由に依るものですか? M: あなたのあげた二つは, 互いに意味が違うと思うのですが。また, 後者が時間的・ ファイルサイズ的にも不利だとお考えのようですが, その根拠はなんですか ? h03s2004: exercise2,2でのプログラムを作成して実行結果で0.1の百倍はというう ことで、確かに10,0000001とでて、これがコンピューターの精度の問題だということも わかりましたが、この0.0000001のずれをなくすためのプログラムのしかたというのは、 どのようなものでしょうか?また調べるとしたらどのような本がお勧めでしょうか? M: [メールソフトの設定が変なのでしょうか, 文字化けしてます。] (1) 本当に計算 結果の数値の出力が 10,0000001 と出たのなら, それは精度の問題ではないと思われ ます。(2) 2005-06-03 の h03s2008 (2) を参照してください。調べるとしたら 数値計算法とか数値解析法の本を見てはいかが ? そういう講義名なんだし。 h03s2005: Exercise2.2で工夫しようとするとaの値が10ちょうどになってしまう。 計算でemacsの画面上で数値を入れる場合とGNOME上の画面で数値を入れる場合では 違いはあるのですか? M: 「emacsの画面上で数値を入れる」と「GNOME上の画面で数値を入れる」とは, 何のことでしょうか ? emacs で M-x shell してから ./shisoku するのは, どう考え ればいいのでしょうね ? h03s2007: 先生の趣味は何ですか? M: 重度活字依存症, 美術館・博物館探訪 などと某所に公開されています。 h03s2008: Exercise2.6の二次方程式の解を求めるプログラムの作成において、判別式D の結果が0未満のときに解が二つの複素解になることを表現することができません。 なにかヒントをもらえませんか? また、微分方程式など、微分や積分が入る方程式の解を求めるプログラムを作成する ためにはどういう手法を用いればいいですか? M: (1) 「二つの複素解になることを表現する」というのは, どういう表現をしたいので しょうか ? (という質問返しの答えを fortran で書けばいいのでは ?) (2) どんな プログラムであっても, 作成法に特別なことは無いと思いますが。規模が大きいとか, 多人数で作成するとかの場合には, それなりにプロジェクトを管理する手法が必要に なる点が, 一人で作成するときと違うかもしれませんが。 h03s2009: 講義資料に、配列の大きさ(要素数)の宣言方法には、変数の過渡を宣言 するときに同時に配列の大きさをつける方法と、型宣言では変数名だけを用い、後の dimension文で配列の大きさを宣言する方法の二通りあるとありますが、なぜ前者の 方法が望ましいのですか? M: ある一つのことを成すのに複数の場所で類似のことを行わなければいけないという のは, 混乱・誤りの元だと思います。一カ所でも間違うと全体がおかしくなるし, 修正時にも訂正漏れが生じる恐れがあります。Fortran77 レベルでは dimension 文は 不必要なものですが, 過去の Fortran66 規格で作成されたソースプログラムも修正 せずに利用できるようにしておくために, 残されている物と思われます。 h03s2012: dimensionを用いずに配列の大きさを指定したほうが望ましいとありますが、 具体的にどうやるのですか? また、配列の大きさはコンパイラによって上限が設けられているのか、マシンの性能に よるのか、それとも無限に設定できるのでしょうか? M: (1) 変数の型宣言文で, 同時に配列の大きさも宣言できます。(2) 配列について, Fortran の文法で次元数や寸法についての規定があるようです。詳細は文法書を見て ください。...... 配列の大きさに関する制限はなさそう。ということは, システム 依存かなぁ。 h03s2017: GNOME端末内をきれいにして最初の状態に戻すのに鈴木先生はclearと命令を 出していましたが、宮本先生はメールの確認をしている時には一発できれいにしている ようでした。どうやっているのですか? M: そっか, clear 命令があったね。私は C-l (コントロール + エル) してますが。 h03s2018: 先週の質問の返答で、windowsには欠点がたくさんあるような答え方をして いましたが、ではどうしてwindowsは普及したのですか。 M: まあ長所・短所の評価は立場によって変わりますが。普及するかどうかは製品の 良し悪しとは違うところで決まるってことでしょう。カセット式のビデオテープも 最終的には VHS が β に勝ったようだけど, 性能は後者の方が良いとかいう話も 聞いたしね。 h03s2019: 2.5 配列で配列の大きさを宣言する方法が二通りあるとありますが、 この他にもなぜ同じ結果を示すのにわざわざ操作方法が幾通りも存在するのですか? M: h03s2009 の末尾の所を参照してください。 h03s2022: 課題の提出物についてですが、ある一つの問題に対して複数のプログラムを 製作して提出しても良いのでしょうか? M: 良いと考える理由・いけないと考える理由は, それぞれなんでしょうか ? そして あなたは何の目的で課題を提出するのでしょうか ? その目的を達成するために, どう すれば良いと思いますか ? h03s2023: ゲームのプログラムなどもこのようなプログラム入力の応用なのですか? M: 「プログラム入力」の応用かどうかは知りません。しかしある種のコンピュータ ゲームはプログラムにより作られていることは想像に難くないと思われます。あなた にはその様な想像はできないのでしょうか ? h03s2024: emacsで入力した命令は、必ず上から順番になされていくんですか?入力した 行を変えずにその命令を前に行ったり、後ろに行ったりすることはできないんですか? M: (1) 「emacsで入力した命令」って何でしょうか ? (2) 前後のどちらに行けばいい のか, どうやって決めるのですか ? h03s2025: 宮本先生はFortranでプログラムを作成するときに常に心がけていることは ありますか? また、我々がFortranを学んでいく上で心がけてほしいことはありますか? M: (1) 見て分かりやすく。 (2) 頭を使って考えてくれ〜。コンピュータの気持ちに なることがミソでしょうか。 h03s2027: Exercise2.4で制限された範囲を超える場所を参照するとと書いてあります が、場所ってどこですか?dimensionに段落ですか? あとわからないExerciseは飛ばして別の日に出して、次のExerciseをやってそれを提出 してもいいですか? M: (1) 記憶領域上の場所, コンピュータのメモリのこと。それ以外に変数 (配列) の 値をコンピュータが参照するときに見るべき場所があるのでしょうか ? (2) 何を提出 すればいいのかは, web ページ上に記載されています。そこに書いてあることの意味が わからないのでしょうか ? どこかにわかりにくい記述があるのなら, 教えて下さい。 h03s2028: 配列を利用するときには、あらかじめ配列の大きさを宣言しなければ ならず、その方法には2通りあることはわかった。型宣言では変数名だけを用い、 後のdimension文で大きさを宣言する方法を使うメリットは何か教えてほしい。 M: h03s2009 を参照してください。 h03s2029: windowsはいらない機能が満載だと言われていますが、先生が特にひどいな と思う部分は何ですか? M: 窓が開いたり, メニューが出たりするときに, アニメーション的に出てくるところ など, cpu パワーを無駄遣いしてるなと。チャラチャラと動画を表示してる暇がある なら, 目的の動作だけをサクサクとやって欲しい。 h03s2030: 練習2-2を問題を解いているのですがシステムはできたのですが割り算の ところがおかしいところだというのはわかるのですが計算してどうなおせばいいのか わかりません。整数のとこを実数になおしてもなおりません。どうすればよいので しょうか? M: あなたが何を期待していて, プログラムをどのように直したのか。そのプログラムの 実行結果がどのように期待ハズレだったのか。上記の文章からは, 全く分かりません。 そこで出来る返答は, 「へ〜」だけだと思いますが ? h03s2031: EXCISEの答えを知るためにはどうすればいいんですか?TAや先生に聞けば いいんですか? M: 2005-06-03 の h03s2003 の (1) とか h03s2008 の (2) とかを参照してください。 こういう状況下での「答」って, いったい何を期待しているのでしょうねぇ。 h03s2034: レッスン1・2ではプログラムの最後が     stop end だけだったのにレッスン3のプログラムの最後は     stop end program なのでしょうか。 M: そうかいてあるのなら, そうなのでしょう。または, 「2.1 節 まずはお約束」の 脚注を読んで理解しましたか ? h03s2035: 解の公式は「ーb±√D」でいいんですよね?コンピュータから文句言われ なかったので合っているということですよね? M: コンピュータはシンタックスの正否の判断は可能ですが, セマンティックスの判断は できません。 h03s2037: DIMENSION文が望ましくないのはなぜですか? M: h03s2009 を参照してください。 h03s2039: exercise2.4で、宣言された大きさの範囲を超えると、bの値が式と違うの ですが、どうしてでしょうか。 M: そこ (参照された記憶領域・メモリ) には, 何が記憶されているのでしょうか ? h03s2040: exercise2.6では二次方程式で二次の項が0の場合は計算しないプログラムに すればいいんでしょうか? M: 良し悪しは, あなたが何をしようとしたのかに依存する話です。 h03s2042: プログラムを打ち込むときに行をあけることに意味はあるのですか。 M: [メールソフトの設定が変なのでしょうか, 文字化けしてます。] 見やすくなる。 h03s2045: Exercise2.3で配列を多次元にできると書いてありましたが、実際にはどの ようにすればいいのでしょうか。 M: 詳しくは文法書を見てください。 h03s2046: FortranやC言語などたくさんのプログラミング言語がありますが、先生が 使用する頻度の高いものは何ですか? M: Fortran, C, awk, と少しだけ ruby, こんなところでしょうか。 h03s2048: 提出する課題は、ExerciseとProblemのどちらなんですか?それとも 両方ですか? M: h03s2027 の (2) を参照してください。 h03s2050: なぜ、FORTRAN95では整数以外をカウンタ変数に使用することが禁止された のか。FORTRANが二進数であるのはなぜか。 M: (1) カウンタ, すなわち数を数え上げるのには整数を用いるというのが自然では ありませんか ? もしも実数を使うと ... 例題のプログラム ten.f のような意図しない 不都合が生じる恐れがありますね。(2) 2005-06-03 の h03s2070 を参照してください。 h03s2051: 先生にとっていい質問とは何ですか?また、どのように発想すればいい質問 が出てくるとお考えですか? M: おやおや, 君はまだそんなことを言ってるの ? 半年たっても進歩がないねぇ。 想像力が必要とされる場面で, マニュアルを求めるなんて。 h03s2055: GNOME端末がなければemacsで書いたfoutranのプログラムを実行することは できないのですか? M: いいえ。別の端末 (kterm, rxvt などや console 自体) や, 他のプログラムや スクリプト中から呼び出して実行するとか, 最近流行りのデスクトップ環境では アイコンをクリックするとかも有るんじゃないの ? h03s2056: 私は計算をするプログラムで fortran よりも mathematica のほうが 使いやすいのですが、fortranでしかできないようなことはありますか? M: 両方を使い込んだわけではないので, わかりません。 h03s2057: emacsでコピー&ペーストはできるのでしょうか? M: もちろん可能です。そうでなければエディタとしては不便すぎます。 h03s2058: 私たちが間違ってプログラムを作成した場合、コンピュータには一個ずつ その間違いを直してあげないといけないわけですが、そうしなくてもできるように なりえますか? M: プログラムが間違っているかどうか, コンピュータはどうして知り得るのでしょう ? プログラム中で「a + b」と書いてあるところで, 本当は積が欲しいのだと, コンピュータはどうやって知ることができるのでしょうか ? h03s2060: 先生の公開しているxmolwtはCで書いてありますが、Cで書くよりもPerlなど のテキスト処理に特化した言語で書いた方が良いと思うのですが、先生がCで作ったのは 実効速度を重視した結果でしょうか?もしくは、MotifのGUIを使って誰でも使いやすい ようにと言う狙いでしょうか? M: Motif を使ってみたかったからです。しかし今にして思えば随分と変な使い方 ですし, 自分ではもっぱらコマンドラインから molwt として用いていますが。 h03s2064: キーボードのキーの並び順に何か意味はあるのですか?自分的には、 この並び順が使いやすいとは思えないのです。 M: そのとおり, 使いにくい配列になっています。例えば英文で多く用いられている e, a, s は左手にアサインされています。世の中には右利きの人が多いのにね。 何故なのかは, しかるべき本などを見てください。昔の機械ハンマー式のタイプライタ に由来するお話が書いてあることでしょう。 h03s2067: ファイル名に「 ’ 」をつけたら、そのファイルを開く等の動作ができ なくなってしまいました。なぜ動かせなくなってしまったのか、その理由を教えて いただきたいです。 M: 本当にその文字を用いたのであれば, shell が日本語の文字・記号をうまく扱えない からかもしれません。相当する英文字の記号のことであれば, たいていの shell は, その記号を特殊な意味に使っていると思います。そういう文字を含んだ名前の ファイルを扱うには, ちょっとしたテクニックが必要です。まあ shell のスペシャル キャラクタを理解していれば自明なのですが。 h03s2070: Exercise2.2の打ち切り誤差を出したくない場合は、どのようにしたらいいん ですか? M: 2005-06-03 の h03s2008 の (2) を参照してください。 h03s2071: end do でその後にプログラムが続くのがよくわからないです。 M: どこの「end do」の後に続いている, どのプログラムの話なのか, 全く分かりま せん。しかし例えそうであっても, フツーに続くだけでしょ, とは言える。 h03s2072: 前回の質問で「課題の提出方法に唯一の方法はないのでお好きなように」と いう答えが返ってきたので質問を変えます。「先生はどのような方法で課題を提出 されるのが好ましいですか?」また、その方法を教えてください。先生のわかる範囲で 結構ですし(提出方法がわからないのに課題をだしたとは思いませんが・・・)、 1つの質問のために本を買うのもどうかと思いましたので。 同じような質問を多々見かけました。この質問をHPにのせてもらうことでTAの方々 も楽になり、本を買う必要も無くなると思いますが? M: 「メールで」と web ページに明記しました。メールツールは個人の好みですから, お好きにどうぞ (という意味での 2005-06-03 の h03s2072 の (2) でした)。 h03s2073: FortranにはCやPascalで言うところのswitch文、case文は無いのでしょうか。 以下のプログラムではif文の羅列をせざるを得ず、非常にダサいです。 またWrite文において、ダブルコーテーションとシングルコーテーションを どう使い分ければ良いか判りません。違いを教えてください。 C ------------------- 2次方程式の解 program niji implicit none double precision a, b, c, d, tmp write(*,*) "Input a b c " read(*,*) a,b,c d = b * b - 4 * a * c if (a .EQ. 0) then write(*,*) "1ji Kansuu!!" elseif (d .LT. 0) then write(*,*) "Kai Nasi" elseif (d .GT. 0) then tmp = sqrt(d) write(*,*) 'KaiL= ',(-b+tmp)/(2*a),' KaiS= ',(-b-tmp)/(2*a) elseif (d .EQ. 0) then write(*,*) 'Juu Kai= ',-b/(2*a) endif stop end M: Fortran77 では論理的に等価な block if & else if の構文を用いるしかありま せん。ダサイかどうかは主観ですから何とも言えませんが。Fortran90/95 ならば select case 構文が用意されています。ダサイかどうかは ...... ;-p h03s2075: 多くの数値の中から一つの数値を出力したいとき、read には出力したい 数値をいれるといいのでしょうか? M: 質問の意味が分かりません。出力するには read ではなくて write を使うのだと 思います。また「read に数値を入れる」ということも, わけがわかりません。 h03s2077: Fortranではプログラムを書き込む行数に制限はあるのでしょうか? M: プログラムの行数に関する制限は, 文法上はなかったと思います。詳しくは文法書を 見てください。コンピュータの実システムによっては, 扱えるファイルの大きさに 制限があるかもしれず, それがコンパイラにとってのプログラムソースファイルの 大きさ上限, あるいは生成されるオブジェクトファイル・実行形式ファイルの大きさの 上限になるかもしれません。 h03s2080: 暗黙の型宣言とはなんですか!?!? M: 暗黙でない (明示的な) 型宣言の逆 (?)。詳しくは文法書を見てください。 [ちなみに, 添付されている あるプログラムの実行例で, integer を入力せよと いうのに 0.1 や 0.5 という実数を入力していたり, この二つの数の和が wa = 0.600000024 だったりすることは, 不都合には当たらないのでしょうか ?] h03s2081: 暗黙の型宣言はどんなローマ字から始まると整数型で、どんな数字から 始まると実数型になるのですか。 M: h03s2080 を参照してください。 h03s2082: なぜ、例題1なんですが少数点以下と小数点がない場合があるのはなぜです か? コンパイルできたとしても、そのプログラムが正常に働かない場合があります か?誤った結果がでたりするのですか。 M: (1) 小数点以下と小数点がある場合には, あるからでしょう。(2) 「正常に動く」の 定義は何ですか ? 「誤った結果」の定義は何ですか ? h01s2077: 配列がよくわからない。学級のメンバーの成績を扱うときのほかにはどんな 使い道があるんでしょうか。 M: 個人の五教科 (例えば国数英理社) の成績をまとめて扱うときにも使えますね ;-p もちろん三次元空間内での点の位置 ((x, y, z) とか (r, θ, φ) とか) や, その他 色々と使いでがあると思いますが。