Rainbow Planet

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Newton法で平方根を求めるJavaのサンプルプログラム+操作動画もご紹介

投稿日:2020年9月20日 更新日:

<目次>

(1) Newton法で平方根を求めるJavaのサンプルプログラム
 (1-1) Newton法の式を簡単に復習
 (1-2) Newton法のサンプルプログラム

(1) Newton法で平方根を求めるJavaのサンプルプログラム

一変数の非線形方程式の近似解を反復的に求めるアルゴリズムである「ニュートン法」のプログラムをJavaで実装した例を紹介します。

【おまけ】
特に今回はdouble型の誤差(double型で発生する誤差について)を解消し、より高精度に解を求めるために、doubleに代わりBigDecimalを使って実装しています。

(1-1) Newton方の式を簡単に復習


①一般的な直線の式

点\((x_{1}, y_{1})\)を通って傾きが \(a\) の直線の式は
$$
y-y_{1}=a(x-x_{1})
$$


②反復1回目の接線

方程式\(y=f(x)\)でニュートン法の初期値を\(x_{1}\)とすると、1回目の接線は点「\((x_{1},f(x_{1})\)」を通って傾きが\(f'(x_{1})\)の直線になります。 これらを①の式に代入すると
$$
y-f(x_{1})=f'(x_{1})(x-x_{1})
$$

③反復1回目の解(【★実装に使う式】)
上記の式で\(y=0\)を代入して\(x\)について解くと、反復1回目の解(\(x_{2}\)とする)が求まります
この反復1回目の解\(x\)を\(x_{2}\)と呼ぶとすると

$$
x_{2}=x_{1}-\frac {f(x_{1})}{f'(x_{1})}
$$

となり、同様に反復2回目の解を求める式は次の通りです。
$$
x_{3}=x_{2}-\frac {f(x_{2})}{f'(x_{2})}
$$

この計算を繰り返していく事で\(x\)がどんどん解に近づいていきます。
目次にもどる

(1-2) Newton法のサンプルプログラム

今回のプログラムは上記ニュートン法の式(【★実装に使う式】)に\(f(x)=x^2-a\)を適用した式で実装しています。
$$
x_{n}=x_{n-1}-\frac {(x_{n-1}^2-a)}{2x_{n-1}}
$$

x = x.subtract(x.multiply(x).subtract(a).divide(c2.multiply(x),51,RoundingMode.HALF_UP));
delta = x.multiply(x).subtract(a).abs();

(サンプルPG)
⇒BigDecimalの使い方を確認したい方は、こちらの記事「JavaのBigDecimalの使い方」をご参照ください。

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Newton1 {
        public static void main(String[] args) {

                //平方根を求める数字「a」を引数から取得
                BigDecimal a = new BigDecimal(args[0]);

                //引数から「x」の初期値を取得(一旦は「a」と同じ値にしています)
                BigDecimal x = new BigDecimal(args[0]);

                //「f(x)=x*x-a」を微分した結果「f'(x)=2x」の係数「2」をBigDecimalで定義
                BigDecimal c2 = new BigDecimal("2");
                //誤差の閾値をBigDecimalで定義				
                BigDecimal err = BigDecimal.valueOf(1E-50);
                //誤差の初期値をBigDecimalで定義
                BigDecimal delta = new BigDecimal("1");
                int count = 0;
                while (err.compareTo(delta)<0 ) {
                        //【★実装に使う式】に、今回の方程式「f(x)=x*x-a」を当てはめて計算した式
                        x = x.subtract(x.multiply(x).subtract(a).divide(c2.multiply(x),51,RoundingMode.HALF_UP));
                        //誤差の計算
                        // ⇒今回はaの平方根を求めているのでxを二乗したらaに限りなく近くなるはず
                        // ⇒よってx*x-aの絶対値を計算する
						delta = x.multiply(x).subtract(a).abs();
                        ++count;
                        System.out.println("Count="+count+" Error="+delta);
                }
                System.out.println("x = " + x);
                System.out.println("x * x = " + x.multiply(x));
        }
}

(実行時の注意点)
Eclipseで実行する場合は「Run Configurations」から実行時の引数を指定します。

(図121)

(実行結果例)
引数に「3」を与えて実行した例です(ルート3なので1.73205・・・を求める計算になります)。

(図122)

(操作動画)引数の操作からプログラム実行の簡単な動画です。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Javaのラッパークラスとは?使い方や一覧をご紹介

<目次> (1) Javaのラッパークラスとは?使い方や一覧をご紹介  (1-1) ラッパークラスとは?  (1-2) 構文(オブジェクト生成)  (1-3) 代表的なメソッド(Integerを例に) …

JSP/Servletで値を受け渡す方法(画面に入力された値を画面遷移で渡す方法)

<目次> (1) JSP/Servletで値を渡す方法(画面に入力された値を画面遷移で渡す方法)  (1-1) 構文  (1-2) サンプルプログラム (1) JSP/Servletで値を渡す方法(画 …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

Javaの型とは?ジェネリクスの基本や使い方をご紹介

<目次> (1) Javaの型とは?ジェネリクスの基本や使い方をご紹介  (1-1) <T>とは?ジェネリクスとは?  (1-2) ジェネリクスを使う利点  (1-3) ジェネリクスをクラ …

APサーバ(Java)⇒DBサーバ(OracleDB 11g)へJDBC接続する方法まとめ

(0)目次 (1) 前提条件 (2) JDBCドライバーのインストール  (2-1) JDBCドライバーをダウンロード  (2-2) APサーバにアップロード・解凍 (3) プログラムの実装  (3- …

  • English (United States)
  • 日本語
Top