数値解析法 (数値計算 編), 2004-06-25 質問と回答, M は宮本による回答。 h02s2002: 初心者でもわかりやすい入門書を教えてください。できればプログラム例が 多く載っているものがありがたいです。 M: どの本が *自分に* ふさわしいかは, 本人にしかわからないことです。 ああそうだ, 「何の入門書」を希望しているのでしょうか ? 実はこの点について 誤解している人が多数いるのかもしれない。 h02s2004: この授業ではviを使って作業を行いますが、プログラムを入力する際 「+」、「−」、「*」、「/」等の記号をうつとこの記号どうりに実行します。 viは何からつくるんですか? M: vi に限定されているわけではない。「記号どうりに実行」ってどういう意味で しょうか ? vi もプログラムですから, 何からつくるかと問われても, どんな答えを 期待していたのでしょうね。 h02s2007: 二次方程式の解を求めるプログラムで、文章のどの部分をD=0,D<0の場合の プログラムに書き換えればいいかわからないので教えてください。 M: あれこれプログラムをいじってみるのではなくて, 筆算でやる場合にどうするで あろうかと, 自分で手順をじっくり分析して考えてみましょう。 h02s2009: 今、自分たちはviやemaxでプログラムを作っていますが、この他にも プログラムを作るソフトはどのようなものがあるのですか? M: この質問の文脈に於て, 「プログラムを作る」とは何を意味しているのだろうか ? h02s2010: fortranはプログラミング言語としてあまり聞くことは少ないのですが、 それは理系のひとしかこの言語を使わないからでしょうか? それとも、より有用なプログラミング言語があるのでしょうか? M: プログラム言語は種々の目的に応じて設計されてきました。またプログラミングに 関するパラダイムの変遷に応じても, 新しい言語が設計されたり, 従来のものが 改良されたりしてきました。それらの中でも Fortran は最も初期に設計された言語の 一つです。同じくらいの古さを持つ言語に COBOL, LISP, Algol 等があります。 Fortran は formula translation (数式翻訳) から命名された通り, 数式をそのまま 記述することにより, 科学・技術系の数値計算を簡単に記述できることに特徴が あります。現代では新しいプログラミングパラダイム「構造化プログラミング」 「オブジェクト指向プログラミング」などを取り入れた言語に人気があるようです。 h02s2015: 複素数のiを後に付け足す方法しかわからないのですが、直接複素数として 表示する方法が知りたいです。 M: 「直接複素数として表示する」とは, 何を意味しているのでしょうか ? write 文で 表示させること以上に直接の表示はないと思いますが, それとは違うのでしょうか ? h02s2016: ニュートン・ラフソン法により方程式の解を求めるプログラムで、 最初に適当な値を打ちますが、その数字は何を表しているのですか? M: 手法に関する説明を読み, 理解しましたか ? プログラムの論理を追って みましたか ? h02s2018: 二次方程式の虚数解をiを使って表す方法を教えてもらえませんか。 M: 「iを使って表す」って, 具体的に何をどうすることなのでしょうか ? それを他人に きちんと順を追って論理的に説明できるのであれば, それを Fortran 語で記述すれば プログラムは完成です。 h02s2019: 自分的にはまだUNIXに慣れていないために非常に使いにくいですが・・・・ やっぱり慣れも必要ですか? また、最新のCGの処理、計算なんかにもUNIXは使われたりするんですか? M: 何事にも, それを習得するためには訓練が必要です。学生時代は訓練期間です。 また, CG の分野では以前から SGI 社のワークステーション (もちろん Unix 系 OS 使用) が用いられていました。しかし最近では映画「マトリックス」では FreeBSD, 「タイタニック」では Linux という PC-Unix マシンが使われたことが話題に なりました。 h02s2020: 自分はVisualBasicを使用しているのですが、型宣言をする際に型のなかで 使える範囲が決まっているのですがFOTRANではどうなのでしょうか? 例:VBにおけるINTEGER -65536〜65536 M: Fortran の文法書を見る。あるいは, 変数のために確保されるメモリの領域の 大きさが有限であることから想像する。 h02s2021: ニュウートン−ラフソン法中のプログラム中にある 『esp』という言葉は 何の略なのでしょうか? M: esp など見当たりませんが ?? もし eps のことであれば, epsilon (ε) のつもりです。 h02s2024: 少しでも記述に間違いがあると起動しないプログラムを、手間をかけ、 時間をかけてまで作って計算することにはどんなメリットがありますか? M: 具体的な作業を指しているのですか ? この演習の時間中にテキストに書いてある プログラムリストの通りに入力したつもりなのに, なかなか思った通りに計算結果を 出してくれないとか。 もし一般論を言っているのであれば, 世の中ってそういうものでしょ ? 手間をかけて いったんプログラムを作成すれば, 二度目以降何度でも好きなだけ計算することが できる。そのために道具を作るのではないかい ? 苦労して道具を作れば, その後の 作業が楽になる。 h02s2026: わざわざwindowsに切り替えなくてもメールを送ることは可能ですか? M: [3] 参照。 h02s2028: プログラムリスト13の七行目の「write」の後に、「(5,*)」とあります が、普段は「(*,*)」と打っているのに、どうしてここだけ違っているのですか? ちなみに試してみたところ、「write(5,*)」はうまく実行できますが、「read(5,*)」や 「write(*,5)」はできませんでした。 「(*,*)」はコンピュータの都合のいいように判断してくれることを表わすといって いたような気がしますが。 M: いろいろと試してみたとのこと, スバラシイです。[5] 参照。 h02s2029: 問題を与えられても、打ち込むプログラムが浮かんでこないのですが、 数をこなせばできるものなのでしょうか? M: 論理的に考える訓練が必要です。例えば紙と鉛筆を使って解く手順を考えて, それを日本語で説明してみなさい。この手順を Fortran 語で記述すれば, それが プログラムです。 h02s2031: プログラムを入力するとき初めの6行を空けるのは何故でしょうか? M: Fortran の文法書をご覧下さい。 h02s2032: 宮本先生はfortranを研究においてどのような使用をしておられるので しょうか。具体例をひとつあげてください(スペースがないから省略ということは しないでください)。 M: 日本語の文章として, 変です。 研究において, もちろんプログラム記述言語として用いています。具体的には 電磁常磁性共鳴 (EPR) のスペクトル線形のシミュレーションプログラム。 h02s2034: プログラムが間違っていたときのエラーメッセージの意味がよくわからない のですが。 M: 英単語の意味がわからないのであれば, 英和辞典などで調べれば良いのでは ないでしょうか。 h02s2036: fortranを具体的にどんな計算に使うのか、 例を挙げてくれませんでしょうか。 M: [1] 参照。 h02s2039: 実際に今学んでいるようなプログラムを組むようなことが、化学なり物理の 分野において扱うことはあるんですか? あるならば、具体的にどのような例があるの ですか? M: 日本語の文章として, 変です。[1] 参照。 h02s2040: 数値解析法をやっているとなんでもプログラムできてしまうような気が するんですが、これは絶対できないっていうプログラムはあるんでしょうか? M: 「プログラムの停止問題」というものがあります。任意のプログラムが正常に 実行終了するかどうかを確認する一般的な手法はない, というものです。すなわち 任意のプログラムが正常終了するかどうかを確かめるプログラムを作成することは できない。その他に, プログラム言語といえども論理を記述する言語の一種である ことから, 「不完全性定理」に縛られているとも言えるのではないでしょうか。 h02s2042: Mozilaの語源はなんですか?なにかの接頭文字とか?Gozilaをなぞっている ところが気になります。 M: URL 入力窓に about:mozilla と入力してみたらどうでしょうか :-p おぉ, こんなところに詳しい由来が ...... http://www.mozilla.gr.jp/docs/beginmoz-1.0/whatismozilla.html h02s2045: fortranは、いろんなことを命令できることはなんとなく漠然としりました。 ならこれをつかって円周率が求められているのですか?しかし精度がよくなるよに していかないけないと... M: その前に日本語を何とかしないと ...... 単純に精度を良くすると言っても, それでは 100 万桁もの計算はできませんね。 「多倍長計算」という特殊な方法を用います。あとは自分で調べてね。 h02s2046: Unixでの日本語入力のやり方が分かりません。 M: [2] 参照。 h02s2048: linaxから印刷しようしでも印刷ができなかったり画面の保存ができなかった んですが、それはなんでですか?できるけど使い方が間違ってるんですかね? M: たぶんそうでしょう。これらはシステムに依存する話です。センター演習室の システムについては, センターの職員に聞いてください。あるいは http://www.stu.hirosaki-u.ac.jp/ h02s2049: ニュートン−ラフソン法は具体的にどのような場合の方程式の解を もとめるのに使うのですか? M: 具体的に例を挙げるのに困るほど, 汎用的な方程式の解法です。あなたが科学上の 問題について方程式を立てて, それを数値的に解く必要があったときには, たいてい利用可能です。 h02s2050: プログラムを作成しているときに日本語入力をすることはできるのですか。 M: [2] 参照。 h02s2051: FORTRANで学んだことが役に立つ分野はどんなものがありますか? M: [1] 参照。 h02s2053: プログラムを作れる人は日本ではどのくらいいるんですか M: 私は数えたことが無いので, わかりません。 h02s2054: 一々Windowsに移動せずにメールを打ち、送信することはできるのか。 又、できる場合はどのようにすればいいのかが知りたい。 M: [3] 参照。 h02s2055: メールに書く質問は講義と関係がないことでもいいですか? M: 特に制限を設けてはいません。また, この様に質問とその回答が公開されることを 考慮しても良いし, しなくてもいい。自己責任でどうぞ。 h02s2057: どうして解と係数の関係を使うと解の公式だけのときより解の精度が上がる のか。よくわかりませんでした。fortran言語は今でも結構使われているんですか。 M: [4] 参照。 後半については, 「結構」というのは主観的であり相対的な表現だと思うので, 答えにくい聞き方です。[1] 参照。 h02s2059: 二次方程式の解を出す際、一方の解X1を解の公式で出し、一方を X1×X2=c/aから出すと桁落ちを防止できるという理由がわかりませんでした。 M: [4] 参照。 h02s2062: Linuxは実際の生活にどのように活用されているのか知りたいです。Linuxは 一般の人は使う必要があるのでしょうか。 M: あなたのこのメールの配送には, Linux で動いているサーバが使われています。 あなたが見ているこの Web ページは, Linux で動いているサーバによって提供されて います。あなたが見たかもしれない映画やテレビ広告の CG は Linux マシンで作成 されているかもしれません。 さてところで, あなたは自分が「一般の人」だと思いますか ? 理工系大学に通って 勉強している大学生は, 同年代の人口のうちの何パーセント程度だと思いますか ? h02s2064: 計算させた結果、答えが複素数だったときは、どのようにして複素数だと 認識させたらよいですか? M: だれが認識するのでしょうか ? もし人間が認識するとしたら, 答えが複素数で あると判断する, その基準は何ですか ? そのようにプログラムを作成すれば良いの ではないでしょうか ? h02s2065: ホームページで紹介している参考書以外で、読んでおいた方がいい 文法書には他に何がありますか? M: 読み物というよりも, Reference Manual の意味が強いです。あとは自分に合う ものを探せば良いかと思います。なお「サルにもわかる〜」などというものは, しょせんサルのレベルであって, 理工系大学生にふさわしいかどうかは疑問です。 h02s2067: UNIX を使うときに、日本語の入力ができますか? M: [2] 参照。また別便でソースファイルが送られてきましたが, どういう意味なの だろう ?? h02s2068: 今までの講義で(*,*)の( )内には制御情報並びを書く学びました。 また、*,* にしておくのは、コンピュータの中でよきにはからってくれるからだと 聞いた。では、講義資料の中のアルゴリズムのListing13の7行目にread(5,*) nと あるりますが、この5,*は何を制御しているのか教えていただけたらお願いします。 M: [5] 参照。 h02s2069: 複素数を一つの変数で扱うためにComplexという型が用意されているのが Fortranの特徴の一つだと思います。私が独学で学んでいたC言語やPerlといった言語 にはなかった型なので興味を持ちました。 そこで、Exercise2.6の「二次方程式の解を求めるプログラム」で使ってみようと試み ました。しかし、出力されたComplex型の中身は"(実部, 虚部)"といった形で、使おう にも使いきれませんでした。 そこで質問なのですが、このComplex型の実部のみ、あるいは虚部のみを取り出す方法 というのはあるのでしょうか? M: たいへんすばらしい着眼点です。われわれが分子科学・電子状態の研究分野で Fortran を用いているのは, 一つには複素数型が容易に使えるからです。 ハミルトニアンの行列要素は複素数ですからね。また電磁気の分野でも, 複素数を 使うのは常識のようです。 さて「使おうにも使いきれませんでした」とのことですが, 何をどうしたかったの でしょうか ? というのが率直な疑問です。 複素数型の数の実部あるいは虚部を取り出す関数は, もちろんあります。使い方を 含めて詳しいことは, Fortran の文法書を参照してください。 h02s2071: よく映画などで出てくる、他のコンピュータを操作したり、ハッキング したりするプログラムは作れるのですか?それとも、あれは架空の技術なのですか? M: コンピュータ・ウイルスや, 某 MS 社製品の欠陥について, 最近ようやく一般の マスコミも報道するようになりましたね。見たことありませんか ? h02s2074: ’演算回数と計算結果の文章でExercise3.2に対応するように改造する ことは困難です。’とありますがなぜですか、文章が少ないのでなぜ困難なのか わかりません。 M: 自分で改造してみましたか ? その時の労力の違いについて考えてみましょう。 h02s2083: linuxでメールはどうやって送るのでしょうか? M: [3] 参照。 h02s2083: 高級言語も最後は機械語に変換して実行しますが,機械語は強くハードに 依存します.異なるハードで高級言語を正常に動かすためにどのような工夫を行ってる のでしょうか? また,高級言語の元になるプログラム(コンパイルのプログラム)は やはり機械語で書くのでしょうか? M: システムの違いは, コンパイラや OS が適切に処理してくれるように出来ていると 思います。そのようなシステム依存部分を気にすること無くプログラムが作成できる ことこそ, 高級言語の「高級」たるゆえんでしょう。またコンパイラもプログラムです から, その記述には高級言語を使ってもさしつかえないと思われます。 h01s2072: いまやっているプログラムの作成は化学の分野で使われることはあるん ですか? M: [1] 参照。 h00s2071: 複素数を上手く扱うことができないのですがどうしたら良いでしょうか? M: 一番の解決方法は, どうしたいのか, そのためには手持ちの道具をどう組み合わせ ればいいのか, じっくりと考えることです。なお「上手く扱う」とは, どんなことを 想定していますか ? ===== [1] プログラムの作成が, 何の役に立つのか ? あなたが役立てようと思えば, どの分野でも役立てることが可能だと思われます。 ある知識(道具)は特定の分野でしか使えないなどと, いったい誰が決めたのだろうか ? 最先端の研究で, だれもやったことがない新しいことを既製品だけを用いて出来ると, 本気で考えているのでしょうか ? なお, 最も著名な分子軌道計算のプログラムである Gaussian シリーズは, Fortran で記述されています。Gaussian の開発者である Pople 教授は 1998 年の ノーベル化学賞を受賞しました。 [2] Unix で日本語をあつかう。 厳密にはシステムに依存した話です。センター演習室のシステムがどうなっている のか, 私にはよくわからないので何とも言えません。 emacs であれば C-\ または C-o でかな漢字変換できませんか ? それ以上のことは, センター職員に聞くか, アプリケーションの設定方法について Web ページなどを自分で調べて設定してください。Vine Linux というのも調べる ときのキーワードになるかもしれません。 [3] Unix でメール Unix でもメール送信は可能です。というか, 電子メールって Unix で実装・発展して きました。センター演習室の Windows でのメールクライアント AL-Mail も, メール サーバ (Unix で稼働) と通信しているだけです。 ユーザが直接目にするのは メールクライアント のソフトですが, Windows で出来る ことのほとんどは, Linux でも出来ることです。演習室のシステムにインストール されているアプリケーションが何であるか, どのように使えばいいのかは, センター 職員に聞いてください。あるいはこちら: http://www.stu.hirosaki-u.ac.jp/ [4] 二次方程式の解 桁落ちがなぜ生じるか, きちんと理解しましたか ? 理解したのであれば, どうしたらそれを避けることができるのか, 考えてみましょう。 説明を読んで, よーく考えても, それでもわからないということでしょうか ? 説明のどこかがわかりにくいという意味でしょうか ? 具体的にどこ ? 書き直す参考に なるかな。 [5] read 文, write 文の制御並び read 文, write 文の丸カッコの中には「制御並び」を記述します。 プログラムから見て, データを入出力するときの相手はどこなのか ? そして その時のデータの形式をどうするのか ? これらを制御するのが, 制御並びです。 詳細は Fortran の文法書を参照してください。