Rainbow Engine

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

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

関連記事

double型で誤差が発生する件について+発生事例やサンプルプログラムも紹介

<目次> (1) double型では誤差が発生する事について  (1-1) double型は近似値を使用している  (1-2) double型の誤差の例 (1) double型で誤差が発生する件につい …

EARファイル・WARファイル・JARファイルの違いや特徴について

  <目次> (1) EARファイル・WARファイル・JARファイルの違いや特徴について  (1-1) JARファイルとは(.jar)  (1-2) WARファイル(.war)  (1-3) …

Andoroid StudioをLinuxにインストールする手順

  <目次> (1) Andoroid StudioをLinuxにインストールする手順  (1-1) Andoroid Studioとは?  (1-2) STEP0:前提条件(JDKのインス …

JavaのServletでフォーム認証(Form認証)をカスタム実装する方法

<目次> (1) JavaのServletでフォーム認証(Form認証)をカスタム実装する方法  (1-1) フォーム認証の概要  (1-2) フォーム認証をカスタムする際のポイント  (1-3) 構 …

Javaのstatic変数とは?その特徴及び付けた場合と付けない場合の違いを解説

(0)目次&概説 (1) static修飾子  (1-1) staticメンバとは?  (1-2) static変数   (1-2-1) static変数の説明と特徴   (1-2-2) static …

  • English (United States)
  • 日本語
Top