2000 年度「計算機基礎論3B」 2000-12-15

課題2:Newton 法で五乗根を求めるCプログラムを書き、メールでレポートする

f が微分可能関数のとき、 方程式 f(x) = 0 の根を計算機で近似的に求める方法のひとつに 「Newton 法」があります。

※ 以下で 「a_n」は「an」、 「a_{n+1}」は「an+1」のこと。 これらの記法は TeX (「テフ」または「テック」)から借りてきたものだが、 コンピュータで添え字が使えない場合、 または添え字を使うのがめんどうな場合に、 もはや標準的と言っていいほどよく使われる。 TeX についてはそのうち実習する予定。

曲線 y = f(x) 上の点 (a_n, f(a_n)) におけるこの曲線の接線が x 軸に平行でないと仮定し、 その接線が x 軸と交わる点の x 座標を a_{n+1} とします。 f(x) = 0 の根αに近い数 a_1 から始めて上のようにして数列 a_1, a_2, ..., a_n, ... をつくると、 数列 {a_n} はαに収束します。 この原理で根αを求めるのが Newton 法です。 どのくらい a_1 が根αに「近い」と収束するのか、 の厳密な議論はちょっとおいておいて、 (紙に)グラフを書いてこの感じをつかんでください。

そこで課題です。 「あなたのログイン名の最後の二ケタに 32 を加えた数を a とするとき、 Newton 法で a の五乗根、 すなわち 「x^5 - a = 0」の根を求めるCプログラムを書いてください」。 以下でくわしく説明します。

※ 「x^5」は x の五乗。これも TeX の記号。 C言語では別の意味になる。

まず、 漸化式を求める計算は紙とエンピツでやってください。 紙はプリンタのそばにたくさん落ちています。 初期値 a_1 は、 プログラムが動き出してからユーザに入力を求めるようにしてください。 そうすることで、 どのように初期値を選んだらどのくらいの速さで収束するか実験することができます。 プログラムは a_1, a_2, ... を出力するようにしてください。 何項まで出すかは、実験しながら各自決めてください。 小数点以下何ケタ出力するかも、各自の判断にまかせます。 そして、最後の項 a_n を五乗したものも出力するようにしてください。 そうすることで、 結果が正しいかどうか確かめることができます。

できあがったら、次のような体裁でレポートにし、メールで送ってください。

※ 感想などがあれば添えてもよいが、 無理に書かなくてよろしい。

宛て先は私(岩瀬)の実習用アカウント cf1920 です。 実習用 WS からは To: のところに cf1920 と書くだけで届きます。 Subject は「kadai 2」 (すべて小文字、スペースにも注意!)にしてください。 自分の学籍番号、氏名をメールの本文内に書くのを忘れずに。 氏名はフルネームを大学に届けてある通りに書くこと。 私はメールを受けとったら(大学が休みの日を除いて)数日以内にプログラムを読み、 コンパイルし、 貼り付けてあった実行結果のとおり動くことをチェックして、 「OK」なり「やり直し!」なりの返事をメールで送ります。 「やり直し!」だった人は「OK」 がもらえるまでやり直して再提出しないと課題をこなしたことになりません。 また、 誰が「OK」で誰が「やり直し!」かは、 「課題2提出状況」 のページにも載せる予定です。 (その代わり、今回は数学科の掲示板への掲示はしません。)

締め切りは 2001 年 01 月 12 日(金)16 時 30 分とします。 これは、 その日時までに私にメールを送るように、 という意味です。 締め切り間際にメールを送ってくれた場合は私からの返事は締め切り後になるかもしれません。

※ それで「やり直し!」だとまずいので、できれば早めに提出するように!

※ Newton 法で x^3 - x = 0 の根を求めようとすると、 初期値 a_1 によっていろいろな根に収束するそうだ。 収束しない場合もあるらしい。 プログラムを書いて実験したうえで理論的にも考えてみるとおもしろいかもしれない。

課題1をまだ出していない人は、 今からでも出さないよりはましですから、 それも出してください。


岩瀬順一