ニュートン法による平方根の計算

ニュートン法は、関数 f(x) とその導関数 f'(x) が与えられたとき、方程式f(x)=0 の解を求めるといったもの。
x_n+1 = x_n - f(x)/f'(x) に f(x) = x^2 - a を代入して簡約すると x_n+1 = (x_n + a / x_n) / 2 となり、これを指定した誤差以内になるまで反復することで平方根を得ます。

Javaで書くと、以下のようになります。

import java.io.*;
import java.lang.Math;

/**
* ニュートン法による平方根の計算
*
*/
public class Newton {
private static final double EPS = 1.0e-5; // 収束条件

public static void main(String[] args) {
double input = 0.0;
double new_x = 0.0;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("ニュートン法による平方根を求めます。");
System.out.print("正の実数を入力してください。>>");
input = Double.valueOf(br.readLine()).doubleValue();
if(input == 0.0){
System.out.printf("%6.2fの平方根は%6.2fです。", input, 0.0);
return;
}else if(input < 0){
System.out.println("負の数なので、実数の平方根はありません。");
return;
}
}catch(IOException e){
e.printStackTrace();
}
new_x = new Newton().sqrt(input);
System.out.printf("%6.2fの平方根は%15.8fです。\n",input, new_x);
}

private double sqrt(double input){
double old_x = 0.0;
double new_x = 0.0;

new_x = input;
while(Math.abs(new_x - old_x) > EPS){
System.out.printf("%15.8f\n", new_x);
old_x = new_x;
new_x = (old_x + input / old_x) / 2.0;
}
return new_x;
}

}

この問題は、計算機科学の古典として有名なSICPに載っているらしいです。。