はじめMath! Javaでコンピュータ数学

第67回微分・積分の数学 ニュートン・ラフソン法 [前編]

離れたところに飛んでくるテニスボールに対して、プレイヤーは先ず大股で駆け寄ります。ボールの落下点が近くなったら次第にステップを小刻みに、いよいよと言うところではすり足、そして最後の一歩を大きく踏み出してインパクト。

かつてソフトテニス部の副顧問をしていた時、この練習を見ていてニュートン・ラフソン法を思い出しました。人間はこのような動作アルゴリズムを練習で身につければ、ほぼ無意識に実行し、ボールとラケットのインパクトという1つの解を得ます。人間の身体コントロール能力というのは、本当に素晴らしいものだと感じます。

今回学習するのは、微分とコンピュータを活用した方程式の近似解法です。原理は大変シンプルですから、気負わずに取り組んでください。そう。力んでラケットを振ると、空振りするのと同じだと思って。

図67.1 目的に向けて的確に歩みをすすめる
図67.1 目的に向けて的確に歩みをすすめる

ニュートン・ラフソン法とは

ニュートン・ラフソン法[1]とは、関数 f(x) がx軸と交わる点xa の近似値を反復計算により得る方法です。そもそもx軸との交点がない場合や、初期値の取り方を誤ると値が得られません。その点を理解し、上手に問題に適用すれば、きわめて効率よく解の近似値を得られます。

ニュートン・ラフソン法適用の条件は、解を得ようとする定義域[2]の範囲で微分可能なことです。微分可能とは、接線がひけるということです。更にその接線がx軸と交わることが必要です。

ニュートン・ラフソン法は、微分の性質とコンピュータの計算力を上手く活用した好例です。

ニュートン・ラフソン法のアルゴリズム

ニュートン・ラフソン法の仕組みは大変シンプルです。図67.2を見ながら読んでください。

ニュートン・ラフソン法のアルゴリズム

  • (1)目的の解にできるだけ近い初期値 x0 を与える。
  • (2)座標x0, f ( x0 ))における f(x) の接線を描く。
  • (3)接線とx軸との交点を得る。このときのx座標を x1 とする。
  • (4⁠x1の値を新しい初期値 x0 として、⁠2)にもどる。
  • (5)⁠2)から(4)のループは実行可能な限り繰り返し、 x の値を更新する。繰り返し回数が多いほど真の x の値に近くなる。
図67.2 ニュートン・ラフソン法のアルゴリズム
図67.2 ニュートン・ラフソン法のアルゴリズム

このアルゴリズムは、次の漸化式[3]に値を当てはめて計算することと同じです。

ニュートン法で解を求めるためには、導関数 f'(x) を導く必要があります。微分の公式を知らなければ、公式集が出版されていますからそちらを利用しましょう。Webにも数学公式を集めたサイトがたくさんありますが、出来ればしっかりした書籍にあたって確認することをお勧めします。

学生時代は記憶することが仕事でしたが、社会人になってしまえば、それをどこで探せばいいかを知っていることが大切なのです。遠慮無く、公式集にあたりましょう。

例題  f(x)=x2-2 の解をニュートン・ラフソン法で求めましょう。

漸化式をたてましょう

ニュートン・ラフソン法を使うために、先ずは漸化式をたてる必要があります。適当な初期値から、より解に近い次の値を求めるための式です。

この例題の意図するところは、の値を計算すると言うことです。共役[4]な解があるのですが、正の値のみ求めましょう。

ニュートン・ラフソン法の定義から、漸化式は次のように導きます。

漸化式からソースコードを作成しましょう

漸化式は次々と真の値に近づいていきます。理論的には、永遠に真の値には一致しません。ちょうど「アキレスと亀のパラドックス」のようです。しかしプログラムが永遠に終了しないというのは悪夢です。どこかで終了させなければなりません。今回は、結果を格納する変数の精度を超えたら終了する、という条件にしてみました。以下にそのソースコードを示します。せっかくなので、float型とdouble型両方を用いてみました。

ソースコード:NewtonMethodTest.java
01: //filename : NewtonMethodTest.java
02: 
03: import java.io.*;
04: import java.util.*;
05: import java.lang.*;
06: 
07: //-------------------------------------
08: public class NewtonMethodTest {
09: 
10:   //---------------------------------
11:   //データ宣言部
12:   static int ShokiTi=1;
13:   static int Kurikaeshi=10;
14:   //none
15: 
16:   /**
17:    * メインメソッド
18:    */
19:   public static void main (String args []) {
20:     NewtonMethod();
21:   }// end of main()
22: 
23: 
24: 
25:   //---------------------------------
26:   //メイン関数内で利用する関数宣言
27:   //- - - - - - - - - - - - - - - - -
28:   //
29:   static void NewtonMethod(){
30:     //float の精度で計算
31:     float x_p;//漸化式の初期値
32:     float x_s;//漸化式の計算結果
33:     x_p = ShokiTi;
34:     for(int i=0;i35:       x_s = x_p - (x_p*x_p-2) / (2 * x_p);
36:       System.out.println
37:          (i + " : " + x_p + " -> "+ x_s );
38:       if (x_s == x_p) {
39:         System.out.println
40:            ("精度の限界まで計算しました。");
41:         break;
42:       }// of if
43:       x_p = x_s;
44:     }// of for i
45: 
46:     //double の精度で計算
47:     double x_p2;//漸化式の右側のx値
48:     double x_s2;//漸化式の左側のx値
49:     double x_p3;//確認用
50:     x_p2 = ShokiTi;
51:     x_p3 = ShokiTi+1;
52:     for(int i=0;i<=Kurikaeshi;i++){
53:       x_s2 = x_p2 - (x_p2*x_p2-2) / (2 * x_p2);
54:       System.out.println
55:          (i+" : " + x_p2 + " -> "+ x_s2 );
56:       if ((x_s2 == x_p2) || (x_s2 == x_p3)) {
57:         System.out.println
58:            ("精度の限界まで計算しました。");
59:         break;
60:       }// of if
61:       x_p3 = x_p2;
62:       x_p2 = x_s2;
63:     }// of for i
64:   }// end of NewtonMethod
65: 
66: }// end of this file...NewtonMethodTest.java

以下はその実行結果です。

出力画面
0 :  1.0 -> 1.5
1 :  1.5 -> 1.4166666
2 :  1.4166666 -> 1.4142157
3 :  1.4142157 -> 1.4142135
4 :  1.4142135 -> 1.4142135
精度の限界まで計算しました。
0 :  1.0 -> 1.5
1 :  1.5 -> 1.4166666666666667
2 :  1.4166666666666667 -> 1.4142156862745099
3 :  1.4142156862745099 -> 1.4142135623746899
4 :  1.4142135623746899 -> 1.4142135623730951
5 :  1.4142135623730951 -> 1.414213562373095
6 :  1.414213562373095 -> 1.4142135623730951
精度の限界まで計算しました。

今回はここまで

今回は、微分を活用した数値計算のひとつ、ニュートン・ラフソン法を紹介し、例題を1つ解いてみました。導関数を簡単に得られるならば、x軸とグラフの交点を求める方法として大変便利な手段です。プログラミングしなくとも、電卓で十分実行可能なアルゴリズムですから、記憶しておかれると、何かと役にたつことがあるでしょう。

おすすめ記事

記事・ニュース一覧