package j1.lesson10;
import java.io.*;
/**
* 課題1003 - 解答例.
* @author s.arakawa
* @version $Id: Newton_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
*/
public class Newton {
/**
* コンソールから0以外の実数値cを入力させ、
* cの立方根をニュートン法によって計算して結果を表示するプログラム。
* 以下の擬似コードで表される。
* <pre>
* print "実数を入力:"
* c = コンソール入力 (実数)
* print "cの立方根はnewton(c)"
* </pre>
* @param args 無視される
* @throws IOException 入力時に例外が発生した場合
*/
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// print "実数を入力:"
System.out.print("実数を入力:");
// c = コンソール入力 (実数)
double c = Double.parseDouble(reader.readLine());
// print "cの立方根はnewton(c)"
System.out.println(c + "の立方根は" + newton(c));
}
/**
* ニュートン法により <code>f(x) - c = 0</code> の <code>x</code> を求める。
* 以下のような擬似コードで表される。
* <pre>
* newton(c)
* xc = c
* do
* xp = xc;
* xc = xp - (f(xp) - c) / g(xp)
* while |xc - xp| が 0.0001 * |xp| より大きい
* 結果は xc
* </pre>
*
* @param c 定数
* @return c の立方根
*/
// newton(c)
public static double newton(double c) {
double xp;
// xc = c
double xc = c;
// do
do {
// xp = xc;
xp = xc;
// xc = xp - (f(xp) - c) / g(xp)
xc = xp - (f(xp) - c) / g(xp);
// while |xc - xp| が 0.0001 * |xp| より大きい
} while (Math.abs(xc - xp) >= 0.0001 * Math.abs(xp));
// 結果は xc
return xc;
}
/**
* <code>f(x) = x^3</code>.
* <pre>
* f(x)
* 結果は x * x * x
* </pre>
*
* @param x xの値
* @return f(x) の値
*/
// f(x)
public static double f(double x) {
// 結果は x * x * x
return x * x * x;
}
/**
* <code>g(x) = f'(x) = 3x^2</code>.
* <pre>
* g(x)
* 結果は 3 * x * x
* </pre>
*
* @param x xの値
* @return g(x) の値
*/
// g(x)
public static double g(double x) {
// 結果は 3 * x * x
return 3 * x * x;
}
}
|