数値解析法 (Fortran 編), 2006-06-02 質問とコメント, M は宮本によるコメント。 h03s2006: fortranの利用法として主に数値解析やその教育で使うことが多いという 内容を見ましたが、科学関係や数値を扱う関係の企業以外に将来私たちが勤める場合、 この内容はあまり役に立たないもの(プログラムに興味ある人は趣味)として終わって しまうものなんでしょうか?数値解析やその教育以外で使用する場合はどのような ことが考えられますか? M: そもそも知識なんて, 活用しようと思わない人にとっては無用の長物でしかありま せんね。しかし活用しようとする人にとっては, 常人には思いもつかない使い方をする ようです。言い換えれば「○○とハサミは使いよう」(一部自粛)。閑話休題。 一つの外国語をマスターしていれば, 二つ目三つ目の言語をマスターしやすいという 話があります。コンピュータ言語を一つマスターしていれば, 新しい言語を学ぶときに 必ず役に立つはずです。将来コンピュータと無関係な仕事につこうという人であっても, 石頭な人に何か仕事を頼む機会があるかもしれませんね。その時にどういう段取りで やればいいかを説明して教えてあげなければなりません。まるでプログラムするみたい というか, まさしくプログラムの名に恥じずに, あらかじめ手順を書くということ ですね。そもそもそれ以前に, 自分で仕事の段取りをするときに, 手順を色々と考える 訓練にもなるかもしれません。 h03s2011: 文法入門の前半のまるめ誤差について、2進数によって誤差がでると文章を 読んで受け止められたのですが、同じように計算機も2進数なのは分かりますが、 それで、誤差を感じたことがないのは、プログラムを複雑にすることで、まるめ誤差を 解決できるということでしょうか?それとも、まるめ誤差については小数何桁以下は 切って日常の計算機を使うことでうまく使えている状態あるということなのでしょうか? M: あなたがどういう場面で計算機を使い, その結果がどうであったから「誤差を感じた ことがなかった」のか, 私には不明です。したがってその理由を推定することもでき ません。あなたが必要な精度よりも誤差が小さかった可能性もあります。あるいは, 本当は誤差が含まれているのに, 気付かずにいたとか。 ちなみに, メールの宛先はきちんと確認しましょう。メールアドレスは液晶ディスプレイ に表示していたし, 取り違えるほどアドレスのつづりは似てないと思うのですが ... (2006-06-09 追記) h03s2069: fortranの言語はかなり英語そのままの感じで、プログラムを書きやすい ように思いました。C言語の言語は英語そのまま、という感じをあまり受けません でしたが、それはなぜでしょうか。 M: Fortran のキーワードのつづりが長くて煩雑なのに対して, C では短い略語や記号で 表現しているからでしょうか。いずれも手続き型の言語ですから, 言語に固有な細かい ところ以外は, 一方をマスターすれば他方の理解は簡単です。h04s2043 も参照。 h03s2090: Fortranはもっとも古くて、基本的な計算機言語でそれからいろいろな 計算機言語生まれてきて、BasicはFortranから進化したもので、両者の区別を 教えてください。 M: もちろん別の言語ですから, 文法規則は異なっています。似ているところも あるかもしれませんが ... h04s2005: テキストにあるListingをだいたい全て自分でできるようになったら プログラミングマスターできる可能性はでてきますか? M: 可能性だけならいつでもありますヨ。全て出来なくたって, マスター可能かもしれ ません。逆に, マスターしたならば全て出来るハズですね。 h04s2012: 人が作ったプログラムに人は勝てますか? M: 負けるように作れば良いっていう話じゃない ? 普通の人間には学習能力があるので, 数回対戦すればいずれは勝てるようになるのでは ?? もっともチェスとか将棋とかは, プロにも勝つ強さのプログラムがあるようですから, それに勝つのはムズカシイかも。 h04s2016: 四則計算の割算で2÷5をすると0.400006と出るのですが、 この誤差はどう対処すればよいですか? M: いくつかの方法があります。精度を上げて計算するとか, 十進で計算するとか。 もうちょっと複雑な計算では誤差が生じにくい計算手順がいろいろと工夫されて います。それを学ぶのが数値解析法の目的のひとつです。もう一つの非常に現実的な 対処の仕方は, 1e-6 の誤差を許容することです。 h04s2017: fortranでしかプログラムは作れないのですか? M: いいえ, 色々なプログラミング言語が, 開発されています。詳しくは自分で調べて みてください。 h04s2021: 初心者がプログラムを覚えるにはだいたいどれくらい時間が かかるのですか。 M: 何の初心者なのでしょうか ? この稚拙な質問の文面から推測するに, 頭で考える ことの初心者かな。その場合は, かなり難しそうですね。 h04s2022: フォートランに入らなければ何か不具合が生じるのですか? 普通にフォートランでなくても一応プログラムは作動してたのですが・・・。 M: ここの総合情報処理センターの計算機システムでは, Linux でログインした各自の ホームディレクトリのうち, windows ディレクトリ以下の部分しか, windows で ログインしたときに見えません。そういうシステムなんだから仕方ないです。 したがって作製したプログラムのソースファイルを windows のメールに添付して 送るためには, windows でログインしたときにアクセスできるところに Linux で 作製するファイルを置いておかなければ困ったことになるわけです。 h04s2024: Exercise2.2で修正したプログラムには不適切な結果を返す場合があるか という問題がわからなかったのですが、そのような場合があるのですか? M: あなたがどのような修正をほどこしたのか不明なので, 何とも言えません。 例えばテキストの注にあるような数値を入力して計算をさせるとどうなりますか ? 期待した通りの結果でしたか ?? h04s2027: 二乗の値を求めるときはプログラム上ではどのようにあらわせばいいので しょうか? M: x の y 乗というような指数の演算子は `**' だと資料に書いておいたのですが, あなたがやりたい計算は何だったのでしょうかね ? もしも違うことがしたかったの なら, きちんと文法書を見てくださいね。 または, 二乗とは同じ数を二回かけることですから, x を二回かけるように記述すれば 良いのでは ?? そういう工夫は苦手ですか ??? h04s2028: プログラムを組み立てるとき、先生はまずどのようなところから考えて 組み立てていますか? M: 場合によりますね。全体の構成を大まかに作るトップダウンと, ある計算手法の 要 (かなめ) となるサブルーチンを先に作るボトムアップと。いずれにしても, 目的の計算を行なうのにどのような手順でやるか, 要素が必要か, といったことを 考えるのが一番最初です。 h04s2030: Vineからメールを送ろうと試みましたが、初期設定の仕方がわかりません。 何を参考にすれば良いですか? M: わたしもわかりません。インストールされているメールソフトを用いるのであれば, そのマニュアルを見るのが最初じゃないでしょうか。とりあえず起動すると, ソフトが 自分の名称を名乗るでしょうから, それを元にしてググるという手もありますね。 ただし, Vine からメールを出す事の利点と欠点をきちんと理解してくださいね。 ていうか, あなた先週も同じような質問してますね。自分で調べて考えてやって みるってことをしないんですか ? h04s2031: implaicitやdouble〜など接頭にある言語の意味がよくわかりません。調べる ヒントをください。また、Linuxからメールを送りたいのですが、文字が英語でしか 打てません。過去の質問を見ると、Linuxでも日本語で打てるらしいですが、詳しく 方法を教えてください。 M: つづりを間違えているから調べても出てこないってオチは無しでお願いします。 えっと, 簡単な説明は資料に書いておいたつもりですが, それで不充分なら普通に 文法書を見たのではダメなのでしょうか ? またメールについては, 使うメールツールに依存する話とか, 使うかな漢字変換 プログラムに依存する話なので, 一般論は言えません。そもそも可能であるという ことと, わたしが設定手順を知っているということは全くの別問題です。 言い換えると, わたしはその方法を知りません。さらにまた, Linux からメールを出す ことの利点と欠点をわきまえて使ってねと助言しておきます。h04s2030 も参照して ください。 h04s2032: WidowsとLinux どっちが使う機会が多いですか? M: 私の場合は FreeBSD が最も多いです。その他には, 事務から送られてきた文書に 対応するために Windows を, 分子軌道計算の Gaussian を使うために Linux を 使いますね。 h04s2034: プログラミングをする時はfortranでしかできないのですか? M: あなたはこのメールを Fri, 02 Jun 2006 17:38:30 +0900 に出したつもりだったの かもしれませんが、私への着信は Fri, 9 Jun 2006 16:01:05 +0900 (JST) でした。 メールソフトの操作法を間違えたのかもしれませんね。今後は注意してください。 (2006-06-09 追記) h04s2036: 資料の11ページで、配列を利用するときは、あらかじめ配列の大きさを 宣言しなくてはいけなく、宣言の方法は2通りあり、前者が好ましいとありました。 その理由とは何ですか。 M: 一つの目的を達するために二カ所の記述を必要とするのは, プログラムを読んだ時の 理解のしやすさや, 後々のプログラムの修正などを考えると, 圧倒的に不利です。 その二カ所の記述が, 必ずしも隣り合わせに出てくるとは限らない, ということも 指摘しておきます。 h04s2038: Fortranで、文字を整数型にする、組み込み関数はありますか?? M: 文法書を見ると ichar という関数があるようです。あなたが期待したものなのか どうかや使い方などの詳しいことは, ご自分でお調べ下さい。 h04s2039: 分数表示しようとすると割り算の計算結果が表示されてしまいます。 割り算の式を分数表示する方法のヒントを下さい。 M: そもそも Fortran では数値を分数表示する標準的な機能は組み込まれていません。 ということで, そこが発想の転換で工夫のしどころなのですが ...... せっかく 取っておいた美味しい物を, 他人にさらわれてしまうみたいで, ここで教わって しまったら つまらなくないですか ? h04s2040: このようなプログラムを使うような難しい計算にはどんなものが ありますか?最近行った計算など M: 研究で電子常磁性共鳴のスペクトルのシミュレーションとか分子軌道計算とかを 行なっています。これらでは, Fortran 入門編として作製した資料に掲載した プログラムよりはるかにこみいった計算をしていますヨ。 h04s2042: リスト5の数の総和を1〜100,000にしたところ、答えが”〜4”という数字に なったのは二進法と十進法の違いのためですか?それと、こういった四則演算で計算 できなくなることはあるのですか?(数字があまりにも大きくなりすぎてエラーみたい になるなど。) M: 本当に "〜" と出てきましたか ? 本当はいくつになるのが正しいのでしょうか ? ではその値は整数 (4 バイト) で表現できるのでしょうか ? Fortran であつかえる 数値には, 何らかの制限があるのでしょうか ? と, 謎をかけておきます。 h04s2043: fortran言語とC言語比較すると先生の見解は? M: C でポインタを用いた込み入ったことをしたり, 割り込みや I/O ポートやメモリを 直接いじるなどのコンピュータの低レベルな層を操作したりしない限り, しょせんは手続き型の言語なので似たようなものだし。ということで適所適材でしょ。 h03s2069 も参照。 h04s2044: コンパイルしないでプログラムを実行時に解釈することは出来ないので しょうか? M: コンパイラ以外に インタープリタ 形式の言語処理系も, もちろん存在します。 Fortran でそういうのにお目にかかったことはありませんが。 h04s2046: テキストの文字が印刷のせいか読みにくいです。コンマかピリオドかの 使い分けの法則はありますか。 M: もちろんプログラムでは意味があります。間違えると意図しない動作をしたり 致命傷になったりすることでしょう。文字フォントの関係で解像度が合わないと ぼやけて表示されるみたいですので, そういうときは拡大表示するなどして確認して ください。 h04s2048: 課題でif文とgoto文を使わないとできないと考えたのですが、modという 剰余の関数を知っていればもっときれいに書けるときいたのですが、 どんなものですか?また、課題で使えますか? M: どの課題のことを言っているのでしょうか ? mod については, マニュアルとか 文法書を見てどんなものか詳しく調べれば, 期待した動作をするのか, あなたが目的と することに使えるのかどうか, わかるとおもいますが ? h04s2054: Cygwinとは何ですか? M: windows で unix like なコマンドをつかえるようにするパッケージですが。 ぜひぜひ, ご自分でお調べになってはいかがでしょうか。 h04s2057: 中学のとき、プログラミングで、いま、スペースを空けている6マスの ところに、010、020のような数字を入れてプログラミングをしていたのですが、 今回のスペースのところと、中学のときに入れていた数字は何か関係はあるんですか? M: Fortran ではない, 何か別の言語を使っていたのではないでしょうか ? それこそ, basic とか。違う言語であるならば, 書き方や文法が異なるのは, アタリマエですね。 h04s2058: Shisokuなどで、もし文字を入力してしまったとき、入力値を数かどうか 確かめて数でなかったとき、もう一度入力を求めるようなプログラムを作りたい。 それで入力値を確かめるにはどうしたらよいか? M: えっと (笑) これこそ典型的な, 正しい質問をすればほとんど解けたのと同じこと という例ですね。「入力値を数かどうか確かめて」と質問で述べていますが, 問題点は 「入力値」にあります。入力されるものは値 (すなわち数) と決まってるんですか ? 違うでしょうねぇ, だってそこのところを判断するようなプログラムを作りたいと 言うのですからね。じゃあ, 値以外のものは Fortran では取り扱えないのか ? と いうのが次の質問ですね。 h04s2059: 前回の質問の回答から、fortranの長所として文法が簡単で初心者も理解し やすいなどが挙げられていましたが、逆に短所はどのようなものがありますか。 M: 文字列操作, すなわち記号操作が不得意 (不可能ではないと思うが)。だから目的に 応じてそれぞれ特徴のある色々な言語が, 今でも開発されているのでしょう。必要は 発明の母と言いませんか ? そういう科学史・技術史的なものに興味を持たないのかな ? h04s2062: viを入力して端末に書き込む文字は、なぜxでないと消えないのですか? Escを押してから消すのは、時間の無駄です。 M: そりゃまぁ, vi というスクリーンエディタが, そのようにプログラムされて できているからとしか言いようが無いですね。文句があるなら別のエディタを使うか, カスタマイズするか, いっそのこと自分好みのエディタを自作するとか。Unix とは, そういうある意味でとても自由度の大きな文化圏です。 ちなみに, ESC を押してから x で一文字削除するのではありません。``i文字列ESC''で ``文字列''を挿入するというコマンドなのです。もっとも, たいていの vi についての 説明でモード変更と教え, みなさんそう考えちゃうから, 無用に混乱するのダ。 h04s2063: windowsやmacなどのOSは誰かがプログラミングして 作ったのですか? M: え ? まさか畑に生えているのを収穫したり, 海で釣り上げてきたりする物だと 思っていたわけじゃぁないよね ?? (笑) h04s2067: プログラムの最初に、四則計算の場合は program shisoku と打ち込み ましたが、数あての場合は、program hiloと打ち込みました。この program の後に、 入力する語句はどのように決めるのですか?  M: 制限などの詳しい解説は文法書に譲るとして, プログラムの識別名ですから, 人間が読んで分かりやすいものをつけると良いと思われます。そもそも副プログラムに おいても, function abc とか subroutine pqr とか任意の名称を入力するのに, そちらは気にならなかったのでしょうか ? h04s2070: Exercise2.1の※13でaaに50000、bbに60000を 入れると結果の部分に可笑しな「−」が付き、値が可笑しくなるのですがaaに 10002、bbに10000を入れるとちゃんと計算できました。この違いは どこから来るのでしょうか? M: まず, 入力値の違いに原因があるということは, 容易に想像できると思いますが ? なぜ差が出るのかについては, 文法書の「変数」の項目あたりを見てみれば良いんじゃ ないでしょうかと言ってみる。 h04s2071: 自分でかいたプログラムが、正確に作動して感動しました。先生も 感動するんですか?ガッツポーズとか取りましたか? M: ぎっ, ぎくぅっ。すっ, するどいですね。なかなか取れなかったバグがとれて, 期待どおりに動作したときなどは, うれしいものです。モノを作り完成させる喜びを 味わえます。 h04s2073: fortranはどのような分野で使うと便利でしょうか? M: まあ何と言うか, おおざっぱな質問ですね。しょせんは道具なので, 適所適材と 言うしかないじゃぁあ〜りませんか。 あ, でも, 「本当のプログラマは FORTRAN を使う」という話もあるか (笑)。 h04s2075: 二次方程式の式を、fx=a*x*x+b*x+c とプログラム内に書いて実行したら、 その部分が間違っているらしく実行されませんでした。ほかのlistのを見ても このような式になっていたのですが、どこが間違っているのでしょうか? M: あなたの言い分だけでは, 動くはずですねとしか言いようがありません。それ以上は エラーメッセージを見ないと原因が分かりません。正しい診断を下すには, 詳しくて 正確な検査結果が必要なのと同じことですね。 h04s2076: Linux はどこで、どうやってインストールするんですか? M: ちまたには Linux に関する書籍や雑誌が多数あるので, それらを参照して下さい。 あるいは CD-ROM イメージが Web 上に公開されているかもしれませんね。少なくとも FreeBSD は, そうです。この講義のサポート web ページのどこかにリンクを置いて おいたような気もします。 h04s2081: 人工知能とは具体的にどのようなものを言うのですか? M: ディスカバリー号に搭載されていた HAL のようなものとか, エンタープライズ号に 乗り組んでいるデータ少佐のようなもの (ひと ?) でしょうか。しかし当初言われて いたような人工知能は夢物語だったということが分かってきたようです。 h04s2085: 授業やHP上で紹介されている内容だけで、例題を解くことができるのか? また練習問題2.1で、分子・分母が0になる時の事も考えなければならないのか? (整数>0とか?) M: Fortran の文法はとてもシンプルなものなので, 資料で説明したことでほぼすべてを カバーしています。あとはそれをどう使うかという問題なのです。 英文法だけを習得しても英会話や英作文がうまくできないのは, 述べたい内容の理解や 述べるときの論理構成などがわかっていないからですね。数値計算の場合には少し 特殊な技法などもあるので, この「数値解析法」のような授業が成立する余地があると 言えるでしょう。しかし Fortran 入門編で与えている課題を解くのに必要な文法要素は すべて提示されているはずです。あとは道具の使い方の工夫が必要なのかもしれま せんが, それは「文法」ではありませんよねぇ。