こんにちは、
問題を見る限りニュートン法を用いることはわかりました
まず3乗根を求める前に上記のコードについて訂正すべきコードがあるので説明させてください。
delta = Math.abs(x * x - 2);
とありますが2のところをaにすべきです。
このままだと2の平方根以外を求めることはできません。
(2以外を入力すると無限ループになります。)
次に本題の3乗根について説明します。
aの3乗根を求めたいので 与えられる方程式はx^3- a = 0です。
ニュートン法に従って 分母はx^3-aを微分した3*x^2となります。
分子はx^3 - aとなります。
後はdeltaがx^3-aの絶対値をとりwhile文を抜け出すまで計算をします。
以下 ソースコードとなります。
試しに、5などを代入すると5の3乗根が求まります。
Java
1import java.util.Scanner;
2
3public class Main {
4
5 public static void main(String args[]) {
6
7 Scanner sc = new Scanner(System.in);
8 String line = sc.nextLine();
9
10 double a = Double.parseDouble(line);
11 double x = a + 1;
12 double delta = 1;
13 double sisu = 1.0E-15;
14 int count = 0;
15 while (sisu < delta) {
16 double f = x * x * x - a;
17 double df = x * x * 3; // x ^ 3を微分すると3 x ^ 2
18 x = x - f / df;
19 delta = Math.abs(x * x * x - a);
20 count++;
21 System.out.println(count + "回目 誤差=" + delta);
22 }
23 System.out.println("x = " + x);
24 System.out.println("x * x * x = " + x * x * x); }
25
26}
<追記>
BigDecimalを使ったときのソースです。
Java
1
2
3import java.util.Scanner;
4import java.math.BigDecimal;
5
6public class Main {
7
8 public static void main(String args[]) {
9
10 Scanner sc = new Scanner(System.in);
11 String line = sc.nextLine();
12
13 double number = Double.parseDouble(line);
14 BigDecimal a = new BigDecimal(number);
15 BigDecimal x = new BigDecimal("2.0");
16 BigDecimal delta = new BigDecimal("1.0");
17 BigDecimal sisu = new BigDecimal(1.0E-15);
18 int count = 0;
19 while (sisu.compareTo(delta) == -1) {
20
21 BigDecimal f = (x.multiply(x.multiply(x))).subtract(a);
22 BigDecimal df = x.multiply(x).multiply(new BigDecimal("3.0"));
23 x = x.subtract(f.divide((df),BigDecimal.ROUND_HALF_UP));
24
25 delta = ((x.multiply(x.multiply(x))).subtract(a)).abs();
26
27 count++;
28 System.out.println(count + "回目 誤差=" + delta);
29 }
30 System.out.println("x = " + x);
31 System.out.println("x * x * x = " + x.multiply(x.multiply(x)));
32 }
33
34}