数値解析法 (数値計算 編), 2004-07-02 質問と回答, M は宮本による回答。 h02s2002: 家庭でLinuXを入れるとどのようなメリットがあるのでしょうか? M: 当然, 自宅で Linux が使えるようになります。 h02s2004: パソコンの元々のプログラムはどうやって作るのですか? M: 「元々のプログラム」って何のことを指しているのだろう。 h02s2007: ローレンツ関数のプログラムをするとき、なぜlorenやlorentzと違う 表記なのに読み取れるのですか? M: 質問の意味が不明です。 h02s2009: この授業で行っているプログラミングは、実用する上でどのように 役立っているのでしょうか。 M: あまりにもプリミティブすぎて, 実用の役には立たないでしょう。 しかし「実用の役に立つ」ものって, 社会や技術などが変わるとたちどころに陳腐に なって, 役に立たなくなりますよね。大学で学ぶ事っていうのは, そういう変化に 耐えて残る基本事項, いろいろなところへの応用の核となる事項, なのだと思います。 h02s2010: 二進数にすると丸め誤差などが生じて、計算によっては結果がに誤差が 生じてしまいます。今日、Fortranの課題について調べていたら、Javaでは進数を 変換してその誤差を取り除けるというようなことが書いてありました。fortranでも 進数の変換は可能なのでしょうか? M: 不可能のようです。 h02s2014: 自分のパソコンにLinuxをどうやってインストールするのですか? M: Distribution (配布元) によって異なります。 例えばこちらを参照 http://www.linux.or.jp/link/distributions.html h02s2015: プログラムを実行した後にアボートとでることがありますが、なぜでて くるのかわかりません。また、アボートの意味もわからないのですが。 M: この二行の情報からだけでは, 「プログラムがおかしいからでしょ」という以上は 何とも言えません。abort という単語の意味がわからなければ, 辞書で調べれば よろしいのではないでしょうか。 h02s2016: どうしても文字を表示させることができないです。 M: この一行の情報からだけでは, 「プログラムがおかしいからでしょ」という以上は 何とも言えません。出席確認メールにこんな質問をして, こんな返答をもらって, 効率が悪すぎると思いませんか ? h02s2018: この講義が終わった後で、レポートとして課題にされたexerciseの模範 解答は提示してもらえますか? M: いいえ。この授業のこのパートの主題は考えることです。考える訓練ですから たとえ結論にあやまりがあっても致命傷とまでは言えません。自分の考えを持って, それを論理的に他人に (レポートという形で) 説明することに意義があります。 論理的でさえあれば, その思考過程はひとそれぞれであり, 「模範」はありません。 h02s2019: 考えたのですが、プログラムが難しすぎて上手く作れません・・・・ 努力不足でしょうか? M: ひとことで答えれば, イエス。もう少し親切に答えれば, 必要な努力には 分量と方向性があります (そうか, 努力ってベクトル量だったんだ !)。 たくさん努力しても方向性が間違っていれば, それは無駄な努力というものです。 それから, 難しいのは本当に「プログラム」ですか ? 何がわからないのかを 正しく把握しないと, 正しい対処ができず, 解決に至りませんよ。 h02s2020: プログラム中で演算をしているうちに誤差が発生していくことがあり ますが、この誤差に関してはプログラム作成者が有効桁数以下切り捨てと定めて、 有効桁数空間のみでの演算をさせると演算誤差は出ないと考えられますが、この 方法は可能なのでしょうか? また、32ビットOSで扱える最大bit数は32bitであるように、32bitOS内で動くプロ グラムでの扱えるbit数についてfortranでは数値列のbit限界はいくらなのでしょ うか? またそのことによって、bit範囲を超えない数値列を扱う上では演算誤差は発生し ないと思われますが、実際のところはどうなのでしょうか? M: (1, 3) だから演算によってはその有効桁数自体が減ってしまうっていうこと なのだが。(2) Fortran での数値の精度は文法で決められています。 h02s2021: 今、数値積分のところをやっているのですが、無限遠に対して積分で、 積分範囲を0からinfinityとしたり、0から1/0(0割り)といったことを試して みたのですが、どうもうまくいきません。 何か、ヒントをもらえないでしょうか。 M: 有限の資源しか持っていない現実の計算機で, 普通の数値と同様に無限を扱う ことはできるはずがありません。では何をもって無限と見なすのか, そこが工夫の しどころです。 h02s2024: 便利なプログラムができて、難しい計算があっという間にできてしまうと いうのは、とてもすばらしいことだと思います。しかし、自分でその計算法を理解 しないままに、プログラムを使って答えを出すのは本当によいことなのか? M: 私には良いこととは思えません。だから中身を考えるような課題を設定している のです。 h02s2026: ミスが多くてコンパイルできないことが多かった。コンパイルできない ときはどうやって見直しをしたらいいですか? M: この二行の情報からだけでは, 「その多いというミスをなくすようにすれば」 としか言いようがありません。まずは最初のエラーメッセージに注目してはいかが でしょうか。 h02s2028: exercise3.5についてですが、∞を表す方法はあるのですか? ちなみに g(x)の積分を行うと思われるプログラムを作って計算をしてもらうと、常に ndiv=10000とし、積分区間を変えてみたところ計算結果は、[0, 10]で0.249989、 [1,20]では既に0.25(筆算で計算した結果=1/4)となりました。このことから、 これ以上積分区間を広くとっても筆算の結果が1/4である以上、プログラムによる 計算結果は常に0.25となるであろうと考えられます。 …と考えたのですが、これはプログラム自体が∞を計算したことにはならないような 気がするので。 M: 積分区間が [1, 20] で本当に 0.25 になったんですか ? [0, 20] でなくて ? いずれにしても上端が 20 では, 無限の範囲での積分とは言えませんが, 積分値は 必要な値が得られていますね。ところで ndiv が 10000 で無い場合にはどうで しょうか。筆算による答えがわからない場合 (だから数値計算しようとしている) にはどうすればいいでしょうか。 h02s2029: xの印字したやつががでてこないのですが、でてこないのですがどのように すればよいですか (20040709 追記) M: 日本語が壊れている上に, このたった二行の情報だけからでは, 何とも言えません。 h02s2031: Unixはどの様な場所で使われるのでしょうか? M: 6/25 の分の h02s2019 とか [3] とか。 h02s2032: 授業の最初で宮本先生が「授業評価が云々」と言っておられましたが、 数値解析法では自分から主体的に取り組む授業なので現行のマークによる評価が そのまま授業の良し悪しを表すとは思えないのです。むしろ論理的に授業の意見を 書かせるほうが教える側も今後どのように授業をやっていいかを考えやすいと思う のです。 今期もマーク評価だということですが、宮本先生はこの点数評価をどのように扱おう と考えていますか? M: 政治向きの話題にはノーコメントとさせていただきます(笑)。評価については, 点数を見ていないのでわかりません。ただし「難かしすぎる」とか「答えを教えて くれない」という批判があることは予想していますが, それに対して「あなたは いったいどれほど血のにじむような努力をしたのか, 大学での勉強を何と心得ている のか」と反論したい気持で一杯です。 h02s2039: 今回の課題をやるにあたり、参考になる本はありますか?今までなじみの ない分野なので、とっかかりに戸惑っています… M: 「数値計算法」とか「数値解析法」といったたぐいの題名の書籍は, 世の中に 掃いて捨てるほどあるかと思います。万人に有効なものは, おそらく無いでしょう。 あなたにふさわしいものは, 図書館や書店で手にとって見て, 自分で判断してくだ さい。 h02s2040: Ex3.3の近似解が真の値に近づいていく様子を見れるようにプログラムを 作ったら間違っていたらしくNONが永遠に続いてしまいました。そんなときはどう やれば抜けれるんですか? M: C-c (コントロール C), C-d, または C-z など。またはプロセス番号を調べて kill する (ps コマンド, kill コマンドについては man 参照のこと)。 h02s2042: プログラムをコンパイルするとき、g77 ファイル名.f -o ファイル名 と 入力しますがこれにも意味があるのでしょうか?たとえば、mkdir fortran が  make directory fortran(fortranというディレクトリをつくりなさい。)のように… 宮永先生のときの数値解析で、最初コンパイル文がf77 ファイル名.f -o ファイル名 だと言っていました。しかし後にg77〜のほうへ訂正して「これじゃgortranだね!」 と言っていたのできっとコンパイル文にも意味があると思って質問してみました。 M: Unix ではアルファベット数文字のコマンドを用いますが, 当然それらは無作為で でたらめな文字列ではありません。内容を表わす英単語 (米単語かもしれない) に 由来があると考えるのが自然でしょう。そうでなければ連想記憶が働かず使いにくい。 Fortran 77 のコンパイラだから f77 だったのですが, FSF が作成した GNU の fortran コンパイラなので g77 というコマンドの名前にしたのでしょう。GNU の 作品は g で始まる名前をつけることがおおいですね。 コマンドラインで info g77 するか, http://www.gnu.org/ 参照。 h02s2045: 今日、心身ともにおかしいので早退します。 M: そうですか, お大事に。ところで質問が書いてありません。 h02s2046: パソコンにLINUXをインストールする際には容量はどのくらいあれば足り ますか? 最低限の機能さえあれば構いません。 M: LiveLinux とか Knoppix とかなら, ハードディスクにインストールすることなしに CD-ROM から起動してそのまま Linux が使えます。一般には, 導入するパッケージに 依存して必要なディスクの容量が変わりますが, 少なくとも Windows などよりも はるかにディスクに優しい (お財布にも) と思われます。 h02s2048: いつもあまり気にせずにimplicit noneと入力していたのですが意味は 何ですか? M: 文法書を参照してください。 h02s2049: この授業で使用しているテキストの文章表現が好きなのですが、先生の 完全自作ですか? M: 厳密に完全とは言えないかもしれないけど, 実際上はそう考えていただいても さしつかえないでしょう。もちろん参考にした本はあるし, 計算方法の説明などの 数式が羅列されているところは, 誰が書いても似てくるとは思いますが。 h02s2050: プログラムには「〜法」と名前がついているものがありますが、それは その名前の人がそのプログラムを作ったということなのですか。 M: プログラムを作ったわけではないでしょう。ガウスさんの時代にコンピュータなど ありませんでしたから。むしろ算法を発案したという意味なのではないでしょうか。 h02s2051: 課題の最終提出日はいつですか? M: 8/10 ということにしました。 h02s2052: プログラムで使う顔文字はどういう意味があるのですか? M: 「顔文字」ですか ? 文法書を参照してください。 h02s2053: 今学習していることは将来どのようなときに役に立ちますか? M: 自分が役に立てようと思えばいつでも。大学で勉強するとはそういうことなのです。 h02s2054: プログラムを実行させ数などを入力したら、何も反応しなくなったり noneが連続して出たりした時に、そのプログラムを終了させるのにはどうすれば いいのかがわからない。 M: h02s2040 参照。 h02s2055: 課題の最終締め切りがいつなのか聞いた覚えがないので教えてください。 M: すばらしい記憶力ですね。h02s2051 参照。 h02s2057: c−−−−−−−−−−は何を表しているんですか。桁落ちや表現誤差を 防ぐための表記の仕方がよくわかりません。 M: (1) 文法書を参照してください。(2) 「表記の仕方」とは何のことでしょうか。 h02s2059: オイラー法よりルンゲ‐クッタ法のほうが精度がよいという理由がわかり ませんでした。 M: どのくらい真剣に考えましたか ? どこまでわかったのでしょうか ? h02s2062: List15のニュートンラフソン法による方程式の解で10行目の1.0e-5と いうのが何を表しているのかわかりません。教えてください。 M: その変数はどこで使われているのか, Newton 法の仕組みはどうなっているのか, どのくらい真剣に考えましたか ? h02s2064: 作ったプログラムで、数値を入力すると、エラーが出るでもなく、期待 した処理をしてくれるでもなくそのまま止まったようになるんですがどうして でしょうか? M: この二行の情報からだけでは, 「プログラムがおかしいからでしょ」という以上は 何とも言えません。コンピュータの気持になってプログラムを一行づつ順に追いかけて いってはどうでしょうか。 h02s2065: realやintegerなどの宣言文には、どのような違いがありますか?また、 それによって結果がどのように変わりますか? M: 文法を理解していますか ? 結果の違いについては, 自分で試してみれば良いのでは ないでしょうか。 h02s2067: 数値解析法をなんのために習うのですか? M: 数値計算をする必要が生じたときに, 利用可能な既存のプログラムが無いなら, 自分で作る必要があります。または利用可能なプログラムがあったとしても, そこで どんな計算が行なわれているのか, その信頼性はどの程度か, などに注意をはらう のが, 科学者・技術者として好ましい態度です。中味のわからない Black Box の 出力を信用する科学的・合理的な理由はありません。 h02s2068: 二次方程式の複素数解を求めるには、どのようなアルゴリズムを考え、 どうプログラムを組めよいでしょうか。その考え方を教えて下さい。また、よい 参考書があったら、教えて下さい。 M: あなたの頭と紙と鉛筆とで解く場合には, どういう手順でやりますか ? なるべく 細かく詳しく書き出してみましょう。それがここで必要なアルゴリズムです。もし どうしても二次方程式の解法についてのわかりやすい参考書が必要ならば, 高校の 数学の参考書でも見てはいかがでしょうか ? h02s2069: BASICやC言語でプログラミングをしていた時によく使ったのですが、変数に 格納されている値が偶数であるか奇数であるかを判別する時にその変数に格納されて いる値を2で割った余りを用いて判別する、という方法があります。これは、C言語 では、 x\2 (xは変数) >>2で割った余りを返す といった形で、余りを得るという命令が演算子レベルで提供されているため、手軽に できる方法であったことからよく使っていました。そこで質問なのですが、Fortranでは このように「余りを得る演算子」やそれに類する標準で使用できる関数といったものは あるのでしょうか? M: Fortran 77 でも「剰余」を与える組み込み関数はあります。文法書を参照して ください。もしなくても自分でそのような関数を作ればいいですよね。 h02s2071: 今回、宮本先生の授業では、黒板を使ったり、液晶ディスプレイを使った りして、何かすごいものとかは教えてくれないんですか?もしくは見せてくれないん ですか? M: この「数値解析法」ではありません。なおこの時間は私が教える時間ではなくて, みなさんが自ら学習する時間です。「すごいもの」って, 何を期待しているのだろう ? h02s2074: 丸め誤差などさまざまな誤差の要因がありますが最高精度の計算システムは いったいどれくらいの誤差ですむものなのでしょうか?どんな場合でも誤差を全く ださないというのは不可能なのでしょうか。 M: πの値数百万桁を計算するなどというときには「多倍長計算」という手法を用い ます。これなら精度(有効数字)は, メモリと時間の許す限りいくらでも。 また金融業界では計算誤差は許されないので, 十進で計算するのだと聞いたことが あります。すなわち誤差は全くない。 h02s2083: fortran77とfortran90に大きな違いはあるのですか? また,現在のバー ジョンはどうやったら確かめれますか? それと,fotranの入手方法はどうなってい ますか?(自宅のパソコンに入れる場合) M: オオアリです。g77 --version する。PC-Unix なら開発環境 (エディタ, コンパイラ, など) はシステムの一部として初めからついています。特別に入手する 必要はありません。Windows なら例によって市販品を買う。 h00s2071: 今回の質問ですが計算結果にて「NAN」と出た場合アルゴリズムと式 (変数など)のどちらか、又は両方が原因なのでしょうか? M: この二行の情報からだけでは, 「プログラム (アルゴリズムまたはその実装) が おかしいからでしょ」という以上は何とも言えません。何を期待していましたか ?