数値解析法 (Fortran 編), 2007-06-08 質問とコメント, M は宮本によるコメント。 h04s2019: 授業は、自習のように自分で勉強するだけですか? M: 基本的には, そうです. でも教員も TA もいますから, そこが自習とは異なります. そもそもガイダンスの時に, 「この授業は実質は `演習' です」と言ったし, 授業概要 (シラバス)にも記載されています. すなわち, 学生が知識などを与えられるのを待ち 構えていて, それを受け取り, 暗記する, というスタイルの講義でないことは, 最初から自明なわけです. h05s2001: 提出するプログラムですが、多少長かろうが実行したときのパソコンの 表示をわかりやすいようなプログラムにした方がいいのですか?それとも、パソコンの 表示がわかりにくかろうがプログラムを短くした方がよいのですか? M: どちらでもお好きな方を, どうぞ. ちなみに, 資料の 2.1 節で強調していたのは, 何だったでしょうかね ? h05s2002: windowsには欠点が多いと聞きますが、 先生が最も使うFreeBSDは欠点 なんかはありますか? M: もちろん何にでも利点と欠点があるでしょう. FreeBSD の欠点は, Unix 系である ことでしょう. 初心者には取っ付き難いかもしれない. h05s2003: 7ページ 2.1まずはお約束 にある小技を利用してemacsに桁表示をつけよう としてコピーしたのでが、emacs上で右クリックしても何も表示されず、はりつけられ ませんでした。emacsではりつけ操作は行えないのですか? M: Emacs の fortran モードで C-c C-r して表示されるルーラーは, 一時的に表示 されるだけのもので, ファイルに入力されるものではありませんから, カットバッファ にコピーすること自体ができない相談なのだと思われます. もちろん普通にファイルに 入力されている文字ならば, cut & paste できますよ. h05s2007: 現在自分たちが作っている簡単なプログラムでも、多くの桁数を入力すると 応答に多少時間がかかるようになりますが、先生が使うプログラムで応答に時間の かかるものはどのくらいの時間を要しますか? M: まず, 時間がかかるかどうかは, 必ずしも桁数に依存するとは限りません. まあ アルゴリズムしだいですね. わたしが研究で使っている, 分子の電子状態を計算する 量子化学計算プログラムでは, 分子の大きさや計算方法によっては, 日の単位で計算 時間がかかる場合もあります. h05s2009: Fortranのプログラムを実行する際に、 g77 -o (ファイル名) (ファイル名).f と入力しますが、サポートページにf77 -o (ファイル名) (ファイル名).fと書いて ありました。何が違うのでしょうか? M: あなたの「Fortranのプログラムを実行する」でいう所の「Fortranのプログラム」 とは何でしょうか ? わたしがイメージするものと違うものを指しているように思われて ならないのですが...... などというツッコミは置いといて. 見てのとおり, g と f が 違うと思います. (コンパイラの)名前が異なるのだから, ちがうモノなのでしょう. モノが異なっていても, fortran の文法はそれらとは独立ですから, そのコンピュータで 使えるものを使えばいい. という話は, 資料の p.7 の脚注 *8 あたりに書いてあるの ですが, 理解できませんでしたか ? 記述の表現が分かり難かったのでしょうか ?? h05s2011: 前回も今回の停電の後もインターネットにいこうとするとfirefoxを閉じて くださいという説明が出てきました。このことが起こらないように事前に何かやること はありますか? M: メモを作成して Web 上に置きました. 授業のサポートページを参照してください. h05s2012: 前回の質問の返答に書かれていたFreeBSDっていうのは何ですか? M: せっかく授業時間中は on line なのだから, ググるとか, あるいは授業サポート ページの Top ページに置いてあるリンクをたどるとかすれば, 次のサイト http://www.jp.freebsd.org/ あたりへと辿り着いたのではないでしょうか ? h05s2013: 今日、Firefoxが開かない大事件が起きました。WindowsならCtrl+Alt+Delete でアクセスをぶった切ることができるのですが、Linuxはちょっと不便ではないでしょう か? Windowsでは英数字を全角で入力したときF8で半角になるのですがLinuxではでき ないんですか? M: 「アクセスをぶった切る」の意味がよくわかりません. Windows でそんなことを したらシステムの再起動になりませんか ? あぁ, 最近はプロセスの終了とかもできる のでしたっけか. Linux (Unix) でしたら, もちろん ps コマンドで当該プロセス番号を 調べて, kill コマンドでそのプロセスにシグナルを送ることができますよ. もちろん 端末から起動したプログラムなら, 端末で C-c とか C-d とかすればプログラムを 終了させられます. 変に Gnome 環境みたいなのがあってランチャーから起動するから, かえってわかりにくい. まあ普通の OS が備えるべき機能を, Windows は 98 段階では 備えていなくて, (Win2k とか WinXP とかの) WinNT 系列が普及して初めて, 一般 ユーザがその存在を認知したということですか, Unix ではほとんど初めから有ったの ですけどね. また, 英数字の全角/半角ですが, そんなの日本語入力のフロントエンドの仕事でしょ. それを OS にやらせるなんて, Windows にはシステムの階層化という概念が無いので しょうか ? なんだかなぁ. すなわち Unix では, 日本語入力系の仕様と設定しだいで なんとでもなることでしょう. たぶん. h05s2014: 講義の内容とは直接関係ないのですが、なぜ毎回質問しなくてはいけないの ですか? わからないことがあったらその都度質問、もしくは聞きたい事があるひとはメール などで聞けばいいんじゃないでしょうか?講義中にわからないことがあってもそのとき 聞くべきか、メールで聞くか迷います。回答がくるまで数日かかるメールよりはわから ないことをその都度解決していく方が自分的にはためになると思うのですが・・・。 M: なにか大変な勘違いがあると思われます. メール以外での質問を禁止した覚えはあり ませんヨ. また, 疑問があるたびにメールで質問することも, 禁止していませんし, 任意の時間やオフィスアワーに研究室に質問しにくることも禁止していません. まさか, こんな箸の上げ下げみたいなことまでいちいち指示されないと, 何ひとつ できないなんてことは, ありませんよね, もちろん. なお, 質問することがいかに重要かという点については, 「勉強」に関する本質的な 問題を含んでいると考えていますので, その訓練を兼ねています. h05s2030 の 4. も 参照. そしてここは学校ですから, 訓練の成果は評価の対象とさせてもらっています. h05s2015: implicit noneというのはどういう意味ですか? M: 英単語の意味としては, implicit は「暗黙の」で, none は「何もない」ですね (by 英辞郎), と類推のきっかけが得られることが, 高級言語の利点でもあります. まあそれは余談として, 資料の p.10 あたりの記述で意味がわからなければ, きちんと した文法書を見てください. h05s2016: ループのカウンタ数は、整数じゃなくても実数でも良かったのにFortran90 からは整数が推奨され、Fortran95からは絶対整数になったことにたいして先生はどう 考えてますか?私は整数に限ることは無いと思います。 M: 実数くらいは使えてもいいじゃん, と初めは思いました. なにせ, スピンをあつかう プログラムで, 半整数であるスピン量子数をカウンタとしたプログラムを作っていた からです. しかし例えば, ``do delta = 0, 10, 0.1'' などとしたときに, delta の 値が常に期待通りの値であるか, 予定どおりの回数だけループを回してくれるか, すなわち最終回で delta は精確に 10 であるのかどうか, リスト2 のような簡単な プログラムの結果で明らかなように, 何の保証もないわけです. これでは意図した処理 をしてくれるプログラムとはいえず, ツカエナイですね. h05s2019: どうしたら理解しやすいかと言う質問の解答に「コンピューターの気持ちに なると理解しやすい」と言う返事をもらったのですが、コンピューターの気持ちになる と言うのは、簡単なようでとても難しいことだと思いました。特にこの授業でやって いることは、私たちの身体で言う『脳』のような働きの部分を学んでいる気がするので 普段何気なくやっていることも考えながらやっていかないといけなくてすごく頭を使う 作業だと感じました。 私はものすごい機械音痴なのですが、この授業が終わったころにはコンピューターの 内部事情がわかり、コンピューターが壊れたり誤作動を起こしたりしたとき少しは 自分で対処できるようになりますかね? M: コンピュータの気持ちになって, プログラムを読めばいいのです. do 文による繰り 返し処理があるものなら, 初めは変数の値がこれこれで, するとこういう処理に なって, で end do だから do 文の先頭に戻って, そしてカウンタ変数の値がそう 変わって, すると二回目の実行ではそういう処理になって, ...... などと考えてみれば いいのです. (下の二つも参照) h05s2024: プログラムを実行したときの  input a= 2 このような入力のとき、 a=2 のように、同じ行に出力するにはどうすればいいんですか? write (*,*) 'a=' ; read (*,*) a とやってもいきませんでした。 M: ということで(?), これはコンピュータの気持ちに成りきれていませんね. Fortran の入出力 (そもそもプログラム自体も) は, 原則として行単位です. 入力は パンチカードだし, 出力はラインプリンタが基本です. 上記の例では, 出力の write 文で `a=' の一行, 入力の read 文で `2' というまた別の 一行, というわけですね. もしも `a=2' という一行を *表示* したければ, そういう 処理をするひとつの write 文を書くのが, 素直な解決策ではないでしょうか ? きれいな出力が欲しければ, 標準入出力 (装置番号5, 6) ではない別の出力装置 (例えば 7 番とか) に整理された内容を出力するというのが, Fortran の発想です. h05s2025: 先生のホームページで公開されているFortran入門編の資料で、”空白は無視 される”と書いてありますが、この意味がよくわかりません。空白が無視されるの ならば、do i =という文はすべてdoi=とみなされているということでしょうか? M: `do i =' という部分だけでは何とも言えません. それに続く所まで含めて, do 文 として解釈できるならば do 文だし, 代入文として解釈できるならば doi という変数 への代入文とみなされるのでしょう. それ以外は, 文法的に正しく解釈できませんから, コンパイル時にエラーになると思われます. この辺もまた(!), コンパイラというプログラムの気持ちになって, ソースを眺めれば いいのではないでしょうか. h05s2026: fortranの他にプログラムを簡単に作成できるものはありますか? M: 「プログラムを簡単に作成」するということの意味がわかりません. Fortran を 用いてそれができると暗に言っているようにも見えるのですが, この意味もわからん. そもそもプログラムは計算/仕事の手順書なのだが, 仕事には単純素朴なものもあれば 複雑なものもあり, また処理すべきデータも, 少量の場合と膨大な場合とがあるかも しれない. そういう仕事内容の軽重に応じて, 手順を記述するプログラムの規模や 複雑さもいろいろで, 作成する手間もいろいろでしょう. よって, ある道具を用いると, 作ろうとしているプログラムの規模や複雑さにかかわらず, 簡単にできてしまうなどと いうモノがあるとしたら, そりゃいったいどういうことですか ? と聞きたくなります. そうは思いませんか ? h05s2028: 2.4変数のところで、単精度や倍精度実数とあるのですが、これらはどういう 事を表しているのですか。 M: 「これら」の指すものは, 「単精度」と「倍精度実数」でしょうか ? 言葉どおり, 精度の異なる実数変数があるということです. 詳しくは文法書を参照してください. h05s2029: Fortranはどのような職業で使われますか?また、学生生活で有効に使う なら、どのようなときに使うのが便利ですか? M: 2007-06-01 の h05s2063 とか h05s2079 とかを参照してください. h05s2030: 1、全ての変数は型宣言してから用いるべき、とありますがどうして ですか。 2、doという変数が出てきました。後の方の説明を参照にとのことですが、英語の動詞 のdoのようなニュアンスで使っていけばいいのでしょうか。 3、前回の質問の解答で文法書を参考にするようにとの解答をいただきました。現在 購入は考えていません。単位習得のためには必要でしょうか。 4、質問が評価の対象になっています。前回の解答を見ると学生の質問に対して自分で 調べるようにとの内容が目立ちます。評価の目を気にしながら出した質問に対して自分 で調べろ。答えられたら その学生は今後何を質問すればいいのでしょうか。 M: 1. 変数の使いかたにある種のミスがあると, コンパイラが警告してくれます. 暗黙の型宣言にしたがっていると, 変数の型に由来するバグは, 得られた計算結果の 正当性を吟味して, それでようやく有ることがわかります. このバグ発見作業の一部を コンパイラにやってもらおうというわけです. 2. `do' というのは, 普通は予約語であって変数ではありません. 予約語とその機能は, 英語の単語を模していると思われますが, それが高級言語というものです. 3. あなたにとって必要かどうか, わたしには判断できません. それができるのは, あなただけだと思うのですが...... 4. 文法書などの *基本的な* 資料を見ればわかるようなことは, いちいち質問しないで 自分で調べてほしいと思います. 教科書類とはそのためのモノでしょ ? そしてその方が, 遥かに習得効率が良いハズです. それから, 「調べ方」が実践的に身につくという, 非常に重要なメリットもあります. 「文法書参照」と, それを誘導しているのですが, いけませんか ? では何を質問すべきか ? h05s2014 の末尾も参照. h05s2034: プログラムリスト2で、cを0.1とし、それを100倍した数字を表示 させた結果が 10.0000001 となりました。0.1の1000倍は10であるはずなのに、誤差が 出ていた。この0.00000001の誤差が二進法で表せきれない「丸め誤差」の ことでしょうか? M: YES または NO という答えを期待されているような質問に見えます. しかしここで, わたしがそのような返事をすることに, どんな意味があるのでしょうか ? このような ことは, 数値計算にかんする書籍とか, 資料の p. 25, 3.1.2 節とかに書いてある ので, そういったものを読んで, 自分の頭で考えればいいのではないでしょうか ? h05s2036: 前回で質問した実行結果の提出の仕方なのですが、メールで提出するのは わかりますが、どのようなファイル形式で提出すればいいのかがわかりません。 GNOME端末を保存することができるのですか? Exercise 2.3で、最後に「ちょっと工夫してみようか?」というのはどういうこと ですか?色々試すのにいちいちソースファイルを変更して再コンパイルしなくても済む ような方法を考えるということですか?もしそうだとすれば、どのように工夫すれば よいのですか?よくわからないのでヒントをください。 M: 提出すべきモノは, サポート Web ページに記載されています. ファイル形式には, それほど多数の選択肢があるとは思えないのですが. もしも送られてきたファイルを わたしが読めなければ, 「読めない」と言うだけのことです. そしたら, より一般的な 形式で出し直せば良いだけのことじゃありませんか ? そのための授業サポート Web ページだったり, 「提出状況」のリンクだったりもするのですけど...... 見てほしくて提出する人が, わざわざ特殊な形式のファイルで提出してどうするよ, というのが正直な感想ですが. h05s2039: 講義資料P11のExercise2.3の最後の文において「ちょっと工夫してみよう か?」とあります。これは工夫することにより、ソースファイルを変更しなくて、保存 して再コンパイルしなくても良いと言っているように思えるのですが、そんな画期的な 方法があるのですか?あるなら教えて頂たいのですが・・・。 再コンパイルする前に一度ソースファイルを保存して、その際に自分は元のファイルを 残して置きたいため、上書き保存を使わずに保存するので、ファイルが多くなって整理 するためにそれを消して・・・と面倒くさいので・・・。 M: もちろんプログラムを改造するのですよ, 仕様書を変更する程度の飛躍を含んだ 改造かもしれませんが. そしてその「画期的な方法」というのは, えてして非常に単純な ことであり, わかってしまえば「なんだそんなクダラナイことか」と思うものです. h05s2049: fortranを使いこなせるようになれば、かっこを使った計算など関数電卓と 変わらず使えるのですか?それともfortranにはできないことが出てくるのでしょうか? M: えっと, 質問の主旨が, いまいちわかりません. Fortran (の文法) と関数電卓とで, 「かっこを使った計算」とやらの取扱いに, 何か *本質的な* 違いがあると考えている のでしょうか ? h05s2050: 鈴木先生の授業ではコンパイルのとき、g77 -o ファイル名 ファイル名.f と習ったのですが、Exercize2.1の実行例では、g77の部分がf77になっていました。 この2つはどう違うのですか?またg77やf77の他にもあるのですか? M: h05s2009 参照. h05s2051: 参考資料を見ていて思ったのですが、資料はtexを使ってつくったのですか? M: どのへんから, そう思えたのでしょうか ? チョットだけ興味があります. h05s2052: どんなプログラムを入力するにも、まずある程度のキーボード操作能力 (ブラインドタッチ程度)があることが、大切だと自分は考えています。この自分の 考えについて、先生は同意?それとも反対ですか? また、先生のタイピング速度を教えて ください。(例えば、一分間に何文字程度うてる。みたいな感じで教えてください。) M: 本当のブラインドタッチ (PCな表現としてはタッチタイプだが) は, おそらく多数の 人がやっている程度のモノとは雲泥の差がありますよ. すなわち「ある程度」と簡単に 言ってしまえるレベルじゃない. だって, あなたは数字キーをシフトして入力する記号 !@#$%^&*()なども, タッチタイプ入力できますか ? まあしかし, 自分の思考を妨げない 程度の速度での入力が可能な程度のタッチタイプであれば, それは重要かもしれない. 自分の思考をこういう文章として, あるいはプログラムとして入力するにあたり, いちいちキーを探していたのでは, 灰色の脳細胞の働きに水をさすようなものです. h05s2053: Fortranでは七桁目か七十二桁目までが実行文を書く場所、七十三桁目以降に 書いてある文字は無視され、実行されない、とあります。もしプログラムが七十二桁で 収まらないときはどうするのですか。 M: 継続行という仕組みがあります. しかし無限に継続できるわけではなく, ひとつの 文は最高で 20 行という上限があります. 詳しくは文法書を参照してください. h05s2055: 先生の説明の‘Fortran に固有なお約束’に「 空白は無視されるうっかり   do i = 1. 10 と書くと, 変数 doi に数値 1.10 を代入する意味になる。」とありますが、それでも スペースを空けてGNOME端末に打ち込むことがあるのはなぜですか? M: GNOME 端末に打ち込むのではないと思うのですが...... それはさておき, あってもなくても同じ意味の空白文字や空白行ならば, それを適切に 用いることでプログラムの可読性を上げましょう, というのが資料 p. 7, 2.1 節前半の 囲み部分の主張です. h05s2058: 宮本先生は数値解析法の授業でやっていることを普段の研究やいろいろな ことに使っていると思うのですが、Fortranを使っていて何か困ったことなどがあり ましたか? M: むかーし (MS-DOS とか PC-9801 とかの時代) は, パソコンで利用可能な Fortran の コンパイラが非常に高価でした. あ, これは「使う前」の困ったことか. 今は, できる 範囲でどうするかという発想になっているので, あまり困ることはありません. h05s2062: [本文空白] M: 提出物が要件を満足していません. h05s2063: パソコンを使いこなせるようになりたいと思ってこの授業を受けてみたの ですが、私には難しすぎて気遅れしてしまいました。FORTRANに限らず、パソコンを使い こなせるようになるにはやっぱり「習うより慣れろ」が一番なんでしょうか? M: それもあると思います. でもそれより重要なのは, 「好きこそ物の上手なれ」だと 思います. 好きになるためには, 「コンピュータの気持ちになって考える」が合言葉 です. h05s2019 あたりも参照. h05s2064: list9のプログラムで自身で関数を定義できることがわかりました。量子力学 に出てくる演算子を含むような複雑な関数も定義できますか? M: Fortran の関数は, 変数の値となるもの (数値か文字) が引数であり, 返り値です. 量子力学で出てくる演算子(作用素ともいう)は, 関数に作用して別の関数を与えるモノ ですから, 引数がある関数で返り値が別の関数と見ることもできます. さて, 関数を 引数とする関数 (後者を汎関数と呼ぶらしい) を, 定義することは可能と思われます. だってそもそも量子力学で演算子が定義できているでしょ. しかし, 言外の質問である ところの, それを Fortran という言語で記述できるかというと, それはかな〜り困難 だろうと思われます. まあ, dungeon すら Fortran で記述されていたのだし, 「本物の プログラマは FORTRAN を使う」のだそうだから, 全くムリとは言いませんが. h05s2069: LinuxはWindowsに慣れていると扱いづらいと感じるのですが、Linuxが Windowsよりも優れている点はどこなのでしょうか? M: 手に馴染むツール的なところ (小回りが効く software tool), オープンなところ, 堅牢なところ (unix 系と言えるので), そしてフリーなところ (自由かつ無料), かな. h05s2073: 講義では数値の解析のプログラムづくりですが、他にも音声や映像を処理 するプログラムづくりは可能ですか?もし作れるのならプログラムが複雑になるん ですか? M: 音声や映像をコンピュータから出力する方は, シンセサイザや CG だし, 入力する 方は, 音声認識や画像認識のためのデータ処理ということになるでしょう. それぞれの プログラムの複雑さを理解するためには, まずは問題自体の複雑さの理解する必要が あると思われます. h05s2075: 今日のような落雷等で停電がおこり、データを作成途中に保存されずに パソコンが切れてしまった時の話なのですが、データが消えないための保存法はないの でしょうか?やはりデータをこまめに保存する以外ないのでしょうか? M: Emacs では C-x C-s でファイルの保存ができるので, 入力の手が止まったら とりあえず C-x C-s するというのもひとつの方法ですね. 設定によっては, 一定時間 ごとに auto save されますので, 復帰した後に #filename# というファイルを覗いて みるとうれしいことがあるカモ. h05s2077: 授業で自分が作成したプログラムにミスがあるか無いかを知るには、「その プログラムを知っている人に作ったプログラムを見せてミスがあるかを教えてもらう」 くらいしか方法がないのですか? M: もしそうなら, 全く新しいプログラムは, それを知っている人が作者以外にいません. 作者は作者自身にミスを教えてもらうことができないので, ミスの有無を知ることは できないことになってしまいます. というように, もしもこういうデータが来たら, プログラムはどう動作するだろうか, この変数の値はいくつになるだろうか, と プログラムをトレースしプログラムの動作をなぞって, 「コンピュータの気持ちに なって考える」ことです. h05s2079: UNIXは融通もきかないし頑固なので使いづらいと思うのですが、他にもっと 使い易いと思えるようにはならないのでしょうか? M: あなたにとって, 使い易いコンピュータとはどういうものですか ? さて, Unix のシステム自体やアプリケーションは, 単機能の小さなプログラムを組み 合わせて使用することで, さまざまな仕事をこなすことができますし, オプションを 付けることで動作を細かく色々と変えることができます. またシステム自身や最近の 大きな GUI 系のアプリでさえ, 一般に設定ファイルをいじってカスタマイズすることが 可能です. これらをして「融通がきく」と言わずに何というのでしょうか.