解答例 - j1.lesson10.Newton

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 &quot;実数を入力:&quot;
     * c = コンソール入力 (実数)
     * print &quot;cの立方根はnewton(c)&quot;
     </pre>
     @param args 無視される
     @throws IOException 入力時に例外が発生した場合
     */
    public static void main(String[] argsthrows 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 * x * x;
    }
}