質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

4回答

1085閲覧

Newton法の実現について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/09/29 10:22

前提・実現したいこと

Javaのプログラミングについてです。
実数aと整数nを入力して、Newton法を実現するプログラミングを考えているのですが、正しい結果が出ません。

発生している問題・エラーメッセージ

例えば、a = 2,n = 2のとき
2.0の2乗根は1.8333333333333333
と出ます。

該当のソースコード

Java

1public class Newton { 2 static double root(double base, int index) { 3 double p = 1; 4 for (int i = 0; i < index; i++) { 5 p = p * base; 6 } 7 return p; 8 } 9 public static void main(String[] args) { 10 double a = Double.parseDouble(args[0]); 11 int n = Integer.parseInt(args[1]); 12 double xPrev = a + 1; 13 double x = a; 14 while (Math.abs(x - xPrev) >= 1e-6) { 15 x = xPrev-(root(xPrev,n) - a) / (n * root(xPrev,n-1)); 16 if (Math.abs(x - xPrev) < 1e-6) break; 17 xPrev = x; 18 } 19 System.out.println(a + "の" + n + "乗根は" + x); 20 } 21}

試したこと

補足情報(FW/ツールのバージョンなど)

コマンドプロンプト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/29 12:33 編集

蛇足ですが、rootという関数がありますが、実際は累乗しているのでpowのほうが良いと思います。
guest

回答4

0

改善案と、問題個所の解説を用意しました。Whileのところだけ抜粋しています。
コード内のコメントを読んでみてください。

Java

1 while (Math.abs(x - xPrev) >= 1e-6) { 2 // 次のxの値を計算したいので、今のxの値を退避させます 3 xPrev = x; 4 // 次のxの値を計算します 5 x = xPrev-(root(xPrev,n) - a) / (n * root(xPrev,n-1)); 6 // 廃止: whileでチェックしたいるため不要です 7 //if (Math.abs(x - xPrev) < 1e-6) break; 8 // 廃止: whileでチェックする際、xPrev = x のため差が0なので、即時終了してしまうため 9 //xPrev = x; 10 }

投稿2018/09/29 12:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

java

1package teratail; 2 3public class Newton { 4 static double DELTA = 1e-6; 5 6 static double f(double x, double a) { 7 return x * x - a; 8 } 9 static double df(double x) { 10 return 2 * x; 11 } 12 static double solve(double a, int n) { 13 double xPrev; 14 double x = a; 15 while (true) { 16 xPrev = x; 17 x = x - f(x, a) / df(x); 18 if (Math.abs(xPrev - x) < DELTA) { 19 break; 20 } 21 } 22 return x; 23 } 24 25 public static void main(String[] args) { 26 int n = 2; 27 for (int i = 1; i < 17; i++) { 28 System.out.println(i + "の" + n + "乗根は" + solve(i, n)); 29 } 30 } 31}

実行例
イメージ説明

参考情報

  • ニュートン法でx^2-2=0を解くアルゴリズム

https://teratail.com/questions/118562

  • BigDecimalで平方根を求めてみる

http://d.hatena.ne.jp/nowokay/20081122

投稿2018/09/30 04:18

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

検索したらありましたね。
【Python】ニュートン法のプログラム

解: 1.4142156862745099 (計算回数: 4 )

※上記コードを参考にjavaで書き直し

java

1public class memo_qa149182 { 2 // 解を求める関数 3 private static double f(double x) { 4 return x * x - 2.0; 5 } 6 7 // 導関数 8 private static double df(double x) { 9 return 2.0 * x; 10 } 11 12 // ニュートン法 13 private static double[] newton_method(double a, double eps) { 14 int i = 0; 15 for (i = 1; i < 1000; i++) { 16 //漸化式 17 double ah = a - f(a) / df(a); 18 // 収束条件(近似解の変化が十分小さい)を満たせば計算終了 19 if (Math.abs(ah - a) < eps) { 20 break; 21 } 22 // 近似解の更新 23 a = ah; 24 } 25 double[] result = new double[2]; 26 result[0] = a; 27 result[1] = i * 1.0; 28 return result; 29 } 30 31 public static void main(String[] args) { 32 double[] ans = newton_method(1.0, 0.0001); 33 System.out.printf("解:%s (計算回数:%s)%n", ans[0], (int) ans[1]); 34 // 解:1.4142156862745099 (計算回数:4) 35 } 36}

Python3

1# 解を求める関数 2def f(x): 3 return x*x - 2.0 4 5# 導関数 6def df(x): 7 return 2.0*x 8 9# ニュートン法 10def newton_method(a, eps): 11 for i in range(1000): 12 # 漸化式 13 ah = a - f(a)/df(a) 14 # 収束条件(近似解の変化が十分小さい)を満たせば計算終了 15 if abs(ah - a) < eps:break 16 # 近似解の更新 17 a = ah 18 return a, i 19 20 21def main(): 22 a , i = newton_method(1.0, 0.0001) 23 print("解:",a ,"(計算回数:", i+1, ")") # 解: 2.00000... (計算回数: 5 ) 24 25if __name__ == '__main__': 26 main() 27

投稿2018/09/29 19:28

編集2018/09/29 19:56
opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

opyon

2018/09/29 19:29

ごめんなさい。Pythonと勘違いしました。
guest

0

精度を求めるのなら、BigDecimalでしょうか。
まあ、2乗みたいなintでできるものなら行けるのでOKですが、
BigDecimalの値をint変換は確かできないので気を付けて、
やってみたらいかがでしょう?

投稿2018/09/29 14:17

yukkuri

総合スコア624

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/09/29 17:11

問題の本質を間違えている
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問